# Operating System

image-20210416030912362

  • OS provides user interface to the user.
  • shell program provides the interface
    • Could be either CLI or GUI.
    • image-20210416032132175
  • OS also provides user interface to the application.
  • API provides the interface
    • In the form of function.
  • You could say that shell is one type of application.

# System Call

  • System call is a function provided by the OS.
  • It can be called to use the OS.
  • Majority of APIs are made to call these system calls. ex) open()
  • Types
    • POSIX API : Used by unix styled OS such as Linux, MacOS ...
    • Window API

# OS development order

  1. Make an OS. (kernel).
  2. Develop system call.
  3. Develop API (library).
  4. Develop shell
  5. develop applications.

# kernel? shell?

  • kernel : OS의 핵심 부분. 알맹이란 뜻을 갖고 있다.
  • shell : 껍데기. kernel의 껍데기

# CPU Protection Rings

  • CPU도 권한모드가 있다.
    • user mode : used by applications
    • kernel mode : used by OS
  • 사용자 모드와 커널 모드의 뒤에는 cpu protection ring이라는 개념이 있다.

# Process Scheduling

  • Process : application
  • Scheduling : 배치처리, 시분할, 멀티태스킹 같이 application을 cpu에 배치하는 방법

# Batch Processing

  • 큐 방식과 비슷한 FIFO
  • 하나의 프로세스가 끝나면 그 다음것을 실행시킨다.

# 배치 처리 시스템 / 시분할 시스템 / 멀티 프로그래밍

  • 배치 처리는 더이상 안쓰이고 뒤 두개가 쓰이게 되었다.
    • FIFO로만 하면 어떤 프로그램은 시간이 너무 오래 걸려서 병목이 생긴다.
    • 음악을 재생하면서 워드를 작성하고 싶다면? (동시성)
    • 여러 사용자가 하나의 컴퓨터를 쓴다면? (다중 사용자)
    • -> 멀티 프로그래밍/시분할 시스템이 나왔다.

# 시분할 시스템

  • 다중 사용자 지원을 위해 컴퓨터 응답시간을 최소화 한다.
  • image-20210416040343481

# 멀티 태스킹

  • 단일 cpu에서 여러 응용 프로그램이 동시에 실행되는 것처럼 보이도록 하는 시스템. (현재의 멀티코어와 다르다)
    • 음악을 들으며 문서 작성을 한다.
    • image-20210416040659049
    • 매우 짧은시간동안 각각의 프로그램을 바꿔가면서 실행한다.
      • 10~20ms 단위로 application 이 바뀐다.
      • 사용자에게는 동시에 실행되는 것처럼 보인다.
      • 기본적으로는 시분할 시스템과 원리가 비슷하다.

# 멀티 태스킹 vs 멀티 프로세싱

  • 멀티 태스킹 : 단일 cpu
  • 멀티 프로세싱 : 여러 cpu
  • image-20210416040931900

# 멀티 프로그래밍

  • 최대한 cpu를 많이 활용하도록 하는 시스템
  • cpu에 응용프로그램이 있다고 하더라도 다른 작업을 한다고 cpu를 활용하고 있지 않을때가 있다.
    • 응용 프로그램이 실행되다가 파일을 읽는다. 저장매체는 cpu에 비해 굉장히 느린 아이다. 이 과정에서 cpu는 쉬게 된다.
      • image-20210416054451017
      • ssd만 되더라도 몇만 싸이클을 대기해야 된다.
    • 프린팅을 한다. 프린터가 끝날때까지 작업을 못한다면? cpu는 그냥 쉬는것이다.
  • 이 때에 작업 바꿔치기를 통해서 지금 필요한 응용 프로그램을 cpu에 넣어서 작업처리 속도를 빠르게 할 수 있다.

# Process

# Process

  • 실행 중인 프로그램
  • 응용 프로그램 != 프로세스
    • 응용 프로그램은 여러 개의 프로세스로 이루어질 수 있음
  • 하나의 응용 프로그램은 여러개의 프로세스와 상호작용을 하면서 실행 될 수 있다.
    • IPC

# Scheduler

  • 프로세스를 실행시킨다.

  • 어느 순서로 실행하고 교체할지 스케쥴링 알고리즘에 의해 결정된다.

  • Goal :

    • 프로세스 응답 시간을 짧게 : 시분할 시스템
    • CPU 활용도를 높인다 : 멀티 프로그래밍
  • 기본적인 스케쥴링 알고리즘들

    • FIFO : 저장매체, 외부장치와 상호작용 없이 쭉 CPU를 사용한다. 가장 간단하고 배치처리 시스템과 유사하다.

    • SJF : shortest job first. 실행시간이 가장 짧은것부터 먼저 실행.

    • Priority Based :

      • 정적 우선 순위 : 프로세스마다 우선순위를 미리 지정. 모든 프로그램에 우선순위 미리 주는게 쉽지 않다.
      • 동적 우선 순위 : 스케쥴러가 상황에 따라 우선순위를 동적으로 변경
    • Round Robin Scheduler :

      image-20210416090855978

      시분할 시스템을 위한 스케쥴러. 특정 시간이 안끝났더라도 다시 큐 뒷편으로 보내고 다음것을 한다.

# 멀티프로그래밍과 wait

image-20210416091702020

  • 위와 같은 효율적인 배치를 위해서는 cpu가 각 프로세스의 상태를 알고 있어야 한다.
  • image-20210416091810207

# Process Scheduling

image-20210417101432286

  • 무엇부터 실행할 것인가?
  • 시간차에 의해 먼저 들어온쪽이 Ready State Queue에 들어온다.
  • ready state에서 fifo해서 running으로 들어가고 cpu에 할당된다.
  • 단위가 1을 넘어가면 꼬리는 ready의 제일 끝으로 들어간다
  • wait가 걸리면 block 으로 들어간다
  • block이 끝나면 ready로 다시 들어간다.
  • image-20210417191317699

# 프로세스 구조

  • Stack
  • Heap
  • Data
    • BSS : 초기화 되지 않은 전역 변수
    • DATA : 초기값이 있는 전역 변수
  • Text

# 스택 오버플로우

해킹 기법 중 하나

# 컨텍스트 스위칭

  • cpu에서 돌아가는 프로세스를 바꿔주는 것을 컨텍스트 스위칭 이라고 한다.
  • Context
    • Program Counter : CODE 부분에서 다음 실행될 라인을 가르킴
    • Stack Pointer : STACK에서 다음 실행될 빈 공간을 가르킴
    • image-20210423150048743
    • PCB(Process Control Block)라는 특수한 공간에 Context가 저장되어 프로세스가 바뀔대마다 위치를 알려준다.
      • Process ID
      • Register 값 (Program Counter, Stack Pointer)
      • Scheduling Info(Process State)
      • Memory Info
      • 와 같은 값들, 즉 프로세스 실행 상태를 캡처/구조화해서 저장

# 컨텍스트 스위칭의 과정

  • 컨테스트 스위칭은 ms 단위로 일어난다.
  • 컨텍스트 스위칭이 짧아야지 전체 작동시간을 줄일 수 있다.
  • 그래서 컨텍스트 스위칭은 이식성은 떨어지더라고 속도를 높이기 위해 어셈블리어로 작성하기도 했다. 단점은 서로 다른 cpu 아키텍처가 등장할때마다 새로운 프로그램을 작석해야하고 시간이 굉장히 오래 걸렸다.
  • 컴파일러 등장으로 이식성을 높일 수 있었다. 속도는 조금 떨어짐
  • 리눅스는 각각의 cpu별로 컨텍스트 스위칭하는 프로그램을 어셈블리어로 다 짜놨다.

# Inter-Process Communication

프로세스간 통신하기 위한 방법 : IPC

  • 프로세스는 다른 프로세스의 공간을 직접적으로 접근 할 수 없다.

  • 메모리 주소는 자기 프로세스의 공간만 가르킬 수 있다.

  • 프로세스간 통신이 필요한 경우?

    • cpu core가 여러가지여서 동시에 실행 하는 경우(병렬처리)
  • shared.txt : 저장매체는 공유하기 때문에 파일을 하나 만들어서 업데이트 하면서 사용하는 방법이 있다. 그러나 실시간 update여부를 다른 프로세스에 알려주기 어렵고 저장매체를 굉장히 느린 방법이기 때문에 한계가 있다.

# 실제 프로세스 : Linux

  • 리눅스의 경우 4기가 프로세스를 사용
  • 3~4기가 공간은 운영체제가 사용(kernel space).
  • 0~3기가를 프로그램이 사용(user space).
  • user space는 kernel space도 접근할 수 없다.
  • 프로세스를 띄울때마다 운영체제를 불러오면 용량 낭비가 심하다
  • 그래서 사실 주소는 가상메모리고 실제 물리 메모리의 커널은 동일한 곳에서 꺼내서 쓴다.
  • 이러한 커널 공간을 이용해서 IPC 기법들이 나온다.

# 다양한 IPC 기법들

대부분이 커널 공간을 활용한다.

  1. file 사용

  2. Message Queue : FIFO 정책으로 데이터 전송하기 때문에 순서가 중요하다. 동일한 키값을 써야 메시지를 주고 받을 수 있다. 부모/자식 뿐만 아니라 어느 프로세스간에도 괜찮다.

    image-20210425074843968

  3. Shared Memory : 커널에 메모리 공간을 만들고 해당 공간을 변수처럼 사용. FIFO가 아니고 메모리주소로 변수처럼 접근한다.

  4. Pipe : 단방향 통신. fork할때 부모와 자식간 통신

    image-20210425074804231

  5. Signal : Unix에서 30년 이상 사용된 전통적 기법. 커널 또는 프로세스에 이벤트 발생을 알린다.

    image-20210425080115253

  6. Semaphore

  7. Socket: 네트워크 통신을 위한 기술. 기본적으로는 클라이언트와 서버등 두개의 다른 컴퓨터간의 네트워크 기반 통신 기술. 그렇지만 컴퓨터내에서 플세스간 통신에도 사용될 수 있다.

    image-20210425080958077

# Thread

# Thread

  • Light weight process

  • 프로세스 : 프로세스 간 데이터 접근 불가(ipc 사용해야함)

  • 쓰레드 :

    • 하나의 프로세스에 여러개의 스레드 생성 가능.
    • 여러개의 스레드 동시에 실행 가능
    • 프로세의 데이터를 모두 접근 가능

    image-20210425083110141

    • 스택과 힙사이에 공간을 만들어서 쓰레드를 위한 스택을 따로 만들수 있다. 각각의 쓰레드 스택을 위한 Stack Pointer, Program Counter들이 다 생긴다.

    image-20210425083302967

    • 나머지 영역들은 다 공유하고 있기 때문에 쓰레드는 별도의 ipc가 필요 없다.

# Multi Thread

image-20210425083512555

image-20210425083534747

  • multi tasking : 하나의 cpu에 여러가지 프로세스를 바꿔가면서 실행하면서 여러개가 동시에 실행되는 느낌을 준다.
  • multi processing : 여러 cpu에 여러 프로세스를 나눠주면서 병렬 실행을 통해 실행속도를 높인다.
    • 여기서 하나의 job을 여러 cpu에 나눠주는 방법이 thread를 활용한다
    • thread를 여러개 만들어 멀티 코어의 활용도를 높일 수 있다.

# Thread의 장점

  1. 사용자에 대한 응답성 향상

    image-20210425084417304

  2. 자원 공유 효율 : 프로세스는 IPC가 필요한데 쓰레드는 필요 없다. 프로세스는 각각 생성하면 메모리를 차지하는데 쓰레드는 하나의 프로세스안에서일어나기 때문에 효율적이다.

  3. 작업이 분리되어 코드가 간결하다. 쓰레드 하나가 함수 하나처럼 작성되기 때문이다.

# Thread의 단점

  1. 쓰레드 중 하나만 문제가 있어도 전체가 영향을 받는다.

    image-20210425084808527

  2. 쓰레드가 많으면 context switching이 잦아져서 성능이 저하된다.

    ex) 리눅스에서는 thread를 process와 동일하게 스케쥴링해서 쓰기 때문에 context switching이 자주 일어난다.

# Thread vs Process

  • 프로세스는 독립적, 스레드는 프로세스의 서브셋
  • 프로세스는 독립 자원, 스레드는 공유 자원
  • 프로세스는 자신만의 주소영역, 스레드는 주소영역 공유
  • 프로세스는 ipc 통신 사용, 스레드는 안 사용

# Synchronization 이슈

  • 스레드는 스케쥴러에 의해서 실행이 번갈아가면서 일어나는데 변수값 접근할때 순서가 엉키면 동기화 이슈가 발생하게 된다.
  • 디버깅이 굉장히 어렵다
  • Mutual Exclusion (상호 배제)를 통해서 막는다.
    • 임계 자원(critical resource) : 막아야되는 변수
    • 임계 영역(critical section) : 막아야 되는 코드 영역

# Semaphore

  • locking mechansim에는 크게 두가지가 있다.

    • Mutex(binrary semaphore) : 임계구역에 하나의 스레드만 들어갈 수 있게
    • Semaphore : 임계구역에 여러 스레드, counter를 통해 동시에 리소스 접근 가능한 스레드 수 제어
  • 순서

    • S : 세마포어 값. 초기값만큼 여러 프로세스가 동시 임계 영역 접근 가능
    • P(검사) : 임계 영역에 들어가면서 S값을 1차감. S가 0이면 대기.
    • V(증가) : 임계 영역에서 나올때 S값을 1증가
  • 대기

    • Busy waiting(바쁜 대기) : 프로그램에는 대기가 없기 때문에 for loop을 돌면서 대기하는 수밖에 없다. 이로인해 cpu를 사용하게 되어 성능이 저하된다.
    • Waiting queue(대기 큐) : 특별한 큐를 만들어서 넣음으로써 for loop을 사용하지 않을 수 있다. sleep을 시켜놓고 s가 0보다 커지면은 wake를 시킬 수 있다.

# Deadlock & Starvation

# Deadlock

두 개 이상의 작업이 서로 상대방의 작업이 끝나기만을 기다려서 진행이 안되는 상태

image-20210425093154896

  • Deadlock 발생 조건
    1. Mutual Exclusion : 프로세스들이 자원에 대한 배타적 통제권 요구
    2. Hold and wait : 프로세스들이 할당된 자원을 가진상태에서 다른 자원을 요구하며 대기
    3. No preemption : 프로세스들끼리 자원을 뺏을 수 없다.
    4. Circular wait : 각프로세스는 순환적으로 자원을 요구한다.

# Starvation

프로세의 우선순위가 낮아서 자원을 계속 할당 받지 못하는 상태

  • Deadlock은 여러 프로세스가 동일 자원 점유를 요청할때 발생

  • Starvation은 동일 자원 점유를 위해 경쟁시 특정 프로세스는 영원히 자원할당이 안되는 경우를 의미.

  • 우선순위를 수시로 변경 or 오래 기다리면 우선순위를 높여주는 방법으로 해결 가능.

# 가상 메모리

  • 리눅스는 하나의 프로세스가 4gb

  • 통상 메모리는 8gb, 16gb

  • 그러면 멀티프로세싱을 어떻게 하는가? 한번에 두개, 네개밖에 불가능?

  • 실제로는

    image-20210425095224562

    이런식으로 쓴다. 이것을 가상메모리라고 한다.

  • 여러 프로세스를 동시에 실행하는 경우에 필요하다.

  • 기본 아이디어

    image-20210425095543296

    • 프로세스는 가상 주소를 사용하고 실제 해당주소에서 IO/write할때 물리주소로 바꿔주면 된다
    • 가상 주소 : 프로세스가 참조하는 주소
    • 가상 메모리 : 가상 주소와 물리 주소를 변환해 준다.
      • MMU (Memory management unit) : 가상주소 물리주소를 변환해주는 하드웨어를 제공해서 속도를 빠르게 한다.
    • 물리 주소 : 실제 메모리 주소

# 페이징 시스템

가상 메모리에서 가장 많이 쓰이는 메커니즘 중 하나

  • 페이징 개념

    • 크기가 동일한 페이지로 가상주소와 물리주소를 관리
    • 하드웨어 지원이 필요
      • intel x86에서는 4kb, 2mb, 1gb 지원
    • 리눅스에서는 4kb 페이지 사용
    • 페이지 번호 기반으로 가상/물리 주소 매핑한다.
  • PCB에 Page Table 구조체를 가르키는 주소가 있음

    image-20210425100138224

  • image-20210425100919954

# 다중 단계 페이징 시스템

  • 4kb 짜리 c프로그램을 만들었는데 4기가를 다 써야 하는가?
  • 데이터가 있는 영역만 페이지를 만드는 것을 다중 단계 페이징 시스템이라고 한다.
  • image-20210425195819753
  • image-20210425195855733
  • 메모리 접근 무려 세번이나 해야돼서 굉장히 느리다.
  • image-20210425195955130
  • Translation Lookalike Buffer : 캐쉬. 최근 변환한 가상메모리-물리메모리가 저장돼있어서 page table 위해 메모리 접근 없이 바로 메모리에 갈 수 있다.

# 페이징 시스템과 공유 메모리

image-20210425200219393

  • 프로세스마다 1기가씩 운영체제 메모리를 가지고 있다면 굉장히 아깝다

  • 그렇지만 물리메모리를 가르키는 부분은 동일하기 때문에 사실 아깝지 않다.

  • 이런것이 페이징 시스템을 통해서 구현이 될 수 있다.

  • 또한 forking을 할때 실제로 복사하지 않고 그냥 page table을 통해서 동일 부분을 가르키게 한다.

  • write를 하게 된다면 그때서야 복사 후 page pointer를 변경하는 방법으로 진짜 복사를 시작한다

    image-20210425200450527

# Demand Paging

  • 프로세스의 모든 데이터를 메모리에 적재하지 않고 실행 중 필요할때만 메모리에 적재함.
  • anticipatory paging(선행 페이징)과 반대개념이다.

# Page fault interrupt

  • 페이지가 물리 메모리에 없을 때 발생
  • page fault 인터럽가 일어나면 해당 페이지를 물리 메모리에 올림
  • demand paging을 위한 기본 기술임

# 전체 과정

image-20210425200915539

  1. cpu가 virtual address 요청
    1. 먼저 TLB를 확인한다
  2. 없다면 CR3 레지스터를 이용해서 page table에 접근
  3. page table에서 valid/invalid 비트를 통해 물리 메모리 저장여부를 확인한다
    • 저장이 돼있다면 물리메모리 주소를 리턴하고 메모리에 접근가능
    • 없다면은 page fault interrupt가 일어난다
      • IDT에 간다
      • page fault번호를 통해 os의 함수를 갖고온다
  4. OS가 실행 프로세스에서 데이터를 갖고와서
  5. 데이터를 메모리에 올려준다
  6. page table을 업데이트 해준다.
  7. cpu에 다시실행하라고 알려준다

딱 봐도 tlb에서 바로 하는것보다 매우 느리다. 페이지 폴트가 자주 일어나면 시간이 오래 걸린다. 그렇지만 미리 예측해서 물리 메모리에 올리는 것은 신의 영역이다. 이를 해결하기위한 여러 알고리즘이 있다.

# 페이지 교체 정책

여러 프로세스가 있을때 물리메모리를 누가 쓸 것인가?

  • 다양한 알고리즘이 가능하다. 단순하게 FIFO를 생각할 수 있다.
  • 최적 페이지 교체 알고리즘 : 불가능하다. 이상향.
    • image-20210425201905203
    • 이때 3번을 4번으로 교체하는 것이 가장 이상적이다.
    • 그렇지만 예측 불가.
  • LRU : 가장 오래전에 쓴 페이지를 없앤다.
  • LFU : 가장 적게 사용된 페이지를 없앤다.

# Thrashing

image-20210425202411015

  • page fault, page swap만 자주일어나서 실제로는 뭔가를 하지 못하는 단계
  • 프로그램을 너무 많이 띄워놓으면 안된다.
  • 많이 하고싶으면 메모리를 추가로 달아줘야한다.

# Segmentation

  • 가상 메모리를 서로 크기가 다른 논리적 단위인 세그먼트로 분할
  • 이에 비해 페이징은 같은 크기의(4kb) 블록으로 분할
  • 80296이라는 cpu가 보호모드(protection ring)을 지원하고 kernel/user를 지원하게 됐다.
  • 이로 인해 기존의 cpu소프트웨어는 지원하지 않게 됐다.
  • 이를 실행하기위해서 호환모드를 만들었다.
  • 부팅시에 운영체제가 리얼모드로 실행이되고 그 이후 보호모드가 된다.
  • 이게 인텔의 x86이며 최대 1gb 프로세스 사용, 세그먼트로 나누게된다.
  • image-20210425202749098
  • 페이징 시스템과 거의 유사하다.
  • image-20210425202845806
  • 페이징 기법은 4kb를 다 채우지 못하면 공간 낭비가 발생
  • 세그멘테이션 기법은 물리 메모리가 원하는 크기의 연속 메모리를 제공해주지 못하면 문제가 생긴다.
  • 리눅스는 다양한 cpu를 다 지원하기 때문에 기본인 페이징 기법을 기반으로 구현돼있다.

# File system

운영체제가 저장매체이 파일을 쓰기위한 자료구조/알고리즘

# 파일 시스템이 만들어진 이유?

  • 0과 1을 어떻게 저장할 것인가?
    • 비트로 관리하기에는 너무 양이 많다.
    • 블록 단위(4kb)로 관리하기로 한다.
  • 사용자가 블록 고유 번호 관리할수없다.
  • 추상화를 통해 파일을 만들어야 한다. 파일은 블록단위를 관리한다.
  • 저장의 효율적 방법?
    • 연속적인게 좋을 것 같았다
    • 근데 보니까 파일 사이즈가 변경되기때문에 불연속 공간 저장 기능 지원이 필요하다. ->외부 단편화 문제
      • 블록 체인 : 블록을 링크드 리스트로 연결. 첫번째 블록의 주소를 갖고있으면 그 블록에 다음 블록의 주소가 저장돼있어서 찾을 수 있다. 문제는 끝 블록을 찾으려면 처음부터 다 가야되기 때문에 단점이 있다.
      • 인덱스 블록 기법 : 각 블록의 주소를 별도로 저장해놔서 원하면 바로 갈수있게 저장

# 다양한 파일 시스템

  • Windows : FAT, FAT32, NTFS

    • 블록 위치를 FAT이라는 자료구조에 저장.
  • Linux(unix) : ext2, ext3, ext4

    • 인덱스 블록 기법인 inode 방식을 사용
  • 그러나 시스템콜이 파일 시스템에 따라 바뀌면 너무 복잡하기 때문에 시스템함수는 동일하게 호출하면 알아서 처리해준다. 내부적으로는 파일 시스템 마다 다르다.

    image-20210425205812306

# inode 파일 시스템

  • 기본 구조
    • 수퍼 블록 : 파일 시스템 정보
    • 아이노드 블록 : 파일 상세 정보 (메타데이터라고도 함. pcb에 저장)
    • 데이터 블록 : 실제 데이터 (4kb 단위)
  • 파일은 inode 고유값에 의해 관리된다. 파일 이름은 inode 번호와 매칭.
    • 프로세스 생성 -> 프로세스 id 생성 -> pcb에 저장 -> 관리
    • 파일 생성 -> inode 번호 생성 -> inode블록 생성 -> 관리

# inode 구조

image-20210425210232793

  • inode 기반 메타 데이터 : 권한, 소유자, 사이즈, 생성시간, 저장 위치 등 (위쪽 네블록)
  • direct block : 데이터 블록의 주소를 갖고 있다. 12개.

image-20210425210501207

  • direct block은 12개. 가르키는 data는 1kb~4kb정도다. 그러면 전체용량이 48kb밖에 안된다고? 동영상 파일은 몇기간데 어떻게 하는가. 그래서 아래 세가지 블록들이 있다.

image-20210425210802435

  • direct block pointer에는 pointer를 1024개 저장함으로써 1000배의 데이터를 저장할 수 있다.
  • 이를 반복하는 double과 triple을 통해 큰 용량을 저장할 수 있다.

# directory entry

/home/ubuntu/link.txt

  • dentry라고 한다.
  • 각 엔트리는 해당 디렉토리 파일/ 디렉토리 정보를 갖고 있다.
  • 이를통해 해당파일의 inode를 얻게 된다.

# 가상 파일 시스템

  • 전통적 unix에서 파일 시스템 인터페이스르 확장해서 네트워크까지 적용한다.

image-20210425211126049

  • 모든 디바이스를 파일처럼 다룰수있게 만들었다.
  • 마우스, 키보드, 모든 자원을 추상화시켜서 파일 인터페이스로 활용한다.
  • 모든 인터렉션은 파일을 읽고 쓰는 것처럼 이루어져있다.

# Booting

컴퓨터를 키는 동작

image-20210425211943467

  • Boot program : 운영체제 커널을 Storage에서 물리 메모리로 복사하고 커널의 처음 실행위치로 pc를 가져다 놓는 프로그램
  • pc 부팅시 메모리는 텅 비어 있다.
  • 그렇지만 모든 프로그램은 메모리에서 cpu로 가면서 실행된다.
  • 텅비어있으면 어떤 프로그램이 운영체제를 메모리로 가져온단 말인가?
  • ROM : 특별한 램으로 컴퓨터가 꺼져도 메모리가 남아있으며 BIOS 프로그램이 들어있다.
  • 컴퓨터가 켜지면 cpu는 rom의 특정 주소를 실행한다. 미리 매핑이 되어있다. (FFFF0H 라고 설정돼있음)
  • 그러면 bios의 일부가 실행된다. (느림)
  • 이게 bios프로그램 전체를 메모리에 올리게 된다. (이제 빨라짐)
  • bios 프로그램은
    • 하드웨어 초기화
    • 저장매체(hdd, ssd) 맨앞의 MBR(Master Boot Record)를 찾아가서 읽어온다. 이게 부트 로더 라는 프로그램이다.
    • 부트 로더를 이제 메모리에서 실행시킨다. 여기엔 파티션 테이블이란게 들어가있다.(C:/, D:/, /). 드라이브 정보들을 갖고와서 메인 파티션이 뭔지 알게된다.
    • 부트 로더는 메인 파티션의 부트 섹터라는 주소로 간다. 이안에 부트 코드가 있다.
    • 부트 코드를 갖고와서 해당 파티션의 커널 이미지(실행파일)을 메모리에 갖고온다.
    • 그뒤 커널이미지가 실행되면서 윈도우 로딩화면이 시작된다.

# 가상 머신

  • 하드웨어를 emulate하는 기술

  • 종류는 두가지로 나뉜다

  • Type 1 : 하드웨어 위에 VMM(혹은 하이퍼 바이저)라는 SW가 설치되어있고 그 위에 VM들이 돌아간다.

    image-20210508233302147

  • Type 2 : 하드웨어에 일반적 OS가 설치돼 있고 거기에 VMM이 설치되어 있다.

    image-20210508233343867

  • 역시 Type 1 이 더 성능이 좋다.

  • 전가상화 반가상화로 나눌 수 있다.

    • 전가상화 : VMM(하이퍼바이저)이 하드웨어처럼 동작. 가상머신 os는 자기가 가상머신인줄 모름. 따라서 VM의 os는 기존의 os를 사용한다.
    • 반가상화 : VM의 OS가 자기가 가상머신인걸 인지한다. 하드웨어와 직접 통신이 가능하다. VMM이 통역사가 아니라 리소스 관리만 하게 된다.
    • 반가상화가 성능이 더 좋지만 OS를 수정해야되고 복잡도가 올라간다. 최근에는 전가상화가 선호된다.
  • VMWare : Type2 소프트웨어인데 인기가 좋다.

  • KVM : AWS에서 자주 쓰이는 Type1 소프트웨어. AWS에 100대의 컴퓨터를 10000명의 사용자가 쓰려면 10000개의 가상머신을 띄우게 된다.

    image-20210508233854386

    • 리눅스커널에서 ioctl이라는 명령어로 하드웨어에 직접 명령어를 내린다. 그래서 가상 cpu, 즉 vCPU를 만들 수 있다.

# Docker

  • 가상 머신은 HW를 가상화 했다.
  • Docker는 커널을 추상화 한다.
    • 리눅스를 처음 설치했을때와 유사한 실행환경을 만들어 주는 리눅스 컨테이너 기술 기반
    • 경량 이미지로 실행 환경을 통째로 백업, 실행 가능

# Java Virtual Machine

  • 가상 머신과 달리 응용 프로그램 레벨에서 가상화 한다.
  • 자바 컴파일러는 cpu dependency 가 없는 bytecode를 만든다.
  • JVM은 이 바이트 코드를 각 운영체제에 맞게 해준다.

# Linux

image-20210509001731349

  • shell : 사용자의 명령을 해석해서 커널에 명령을 요청해주는 역할.
    • Bourne-Again Shell(bash) : 리눅스의 디폴트
    • Bourne Shell : sh
    • C Shell : csh
    • Korn Shell : ksh 유닉스에서 많이 사용됨
  • process management
    • 멀티 프로세싱
    • 스케쥴러
  • memory management :
    • 가상메모리 : page기반 메모리 관리
  • IO device management :
    • virtual file system을 통해 외부장치를 관리한다.

# Android

image-20210509005145075

  • 리눅스 기반
  • 자바를 쓰기 때문에 JVM이 필요하다 = 런타임
  • 2번과 3번을 합쳐서 안드로이드라고 볼 수 있다.
  • OS는 리눅스OS에 안드로이드 플랫폼을 합친것이 안드로이드 스마트폰이라고 할 수 있다.

# IOT

image-20210509005648543

  • 초소형이며 기능 최소화
  • 멀티태스킹, 보호모드, 커널모드, 가상메모리, 파일시스템 모두 없을 수 있다.