Operation System

프로세스와 쓰레드의 차이

프로세스는 프로그램의 실행되고 있는 상황으로 OS로부터 메모리, register, 등의 system 자원을 할당받아서 메모리에 적재되게 됩니다. 이때 각각 프로세스는 Stack, Heap, Data, Code와 같은 메모리 영역을 가지고 있으며 이는 다른 프로세스와 독립적인 환경에서 동작합니다.

쓰레드는 프로세스 내부에서 동작하는 실행 흐름으로, 프로세스와 달리 각 쓰레드는 stack을 가지고 나머지 Heap, Data, Code에 대해서는 서로 공유하게 됩니다. 즉, 쓰레드는 프로세스의 자원을 활용해서 실행됩니다.

멀티프로세스와 멀티쓰레드의 차이

멀티프로세스는 여러 개의 프로세스가 CPU에 동작되는 상황을 의미하는데, 각각의 프로세는 서로 독립된 메로리 공간을 통해 서로 영향을 받지 않고 실행할 수 있다는 장점이 있지만, 프로세스 1개에 필요한 메모리가 4KB 씩 차지 하기 때문에 system resouce를 많이 차지 하게 됩니다.

멀티쓰레드의 경우 프로세스 내부에서 여러 개의 실행 흐름을 가지는 구조로 process resource를 할당받아서 사용한다는 점에서 메모리 효율이 좋고, 메모리 공간도 작기 때문에 context switching에 소요되는 시간이 적습니다. 다만, Heap 메모리를 서로 공유하기 떄문에 동기화에 관련된 처리를 진행해야합니다.

동시성과 병렬성의 차이

서로 여러개의 작업이 이루어지는 것을 의미하지만, 동시성의 경우 싱글 코어에서 여러 개의 작업이 번갈아가면서 수행되는 것을 의미합니다. 반면 병렬성의 경우 멀티 코어를 통해 여러 개의 작업이 동시에 실행되는 개념을 의미합니다.

데드락

둘 이상의 프로세스가 자원을 요청하였는데, 다른 프로세스에 의해 점유되고 있는 자원에 대한 요청으로 인해 자원을 할당 받을 수 없는 상태를 의미합니다. 즉, 모든 프로세스가 서로 자원을 무한정 기다리고 있는 상황을 의미합니다. 이러한 데드락이 발생하기 위한 조건은 아래의 4가지 경우입니다.

데드락 조건

  1. 상호배제: 한번에 하나의 프로세스만 공유자원을 가질 수 있다.
  2. 비선점형: 자원은 강제로 반환할 수 없다.
  3. 점유대기: 프로세는 하나 이상의 자원을 보유한 채로 다른 자원을 요청해야한다.
  4. 순환대기: 프로세스 A는 프로세스 B가 가진 자원을 프로세스 B는 프로세스 A가 가진 자원을 요청하는 것처럼 하나의 프로세스가 요청하는 자원이 다른 프로세스에 의해 점유 되고 있는 이러한 관계가 순환적인 구조를 이루는 경우를 의미한다.

데드락 회피

resource-allocation graph을 통해 사이클이 있는지 여부를 판별하거나, 은행원 알고리즘을 통해 safe-sequence가 있는 지 여부를 판단해서 해당 자원의 요청이 safe-state인지 판단한다.

콘보이 현상

FCFS 방식의 CPU scheduling에서 발생되는 문제로 하나의 긴 Process가 처리되는 동안 다른 작은 처리 시간을 가지는 process가 기다리는 것을 의미한다.

convoy effect을 통해 평균적인 대기시간이 늘어나게 된다.

선점형 스케쥴링 vs 비선점형 스케쥴링

선점형 스케쥴링의 경우 하나의 프로세스가 실행을 다 끝내지 않고 다른 프로세스에 의해 대체될 수 있는 방식의 스케쥴링으로 SRF, Round-Robin, Multi-level Queue 방식이 존재한다.

비선점형 스케쥴링의 경우 하나의 프로세스가 모두 실행이 완료된 후 다음 프로세스가 실행되는 방식을 의미한다. 대표적으로 FCFS, SJF, Priority 방식이 존재한다.

CPU Scheduler의 동작과정

  1. 단기 스케쥴러 ready queue -> running queue에서 실행할 프로세스를 선택한다.

  2. 중기 스케쥴러 memory -> disk 간에 메모리 swapping 과정에서 동작한다. 메모리에 너무 많은 양의 페이지가 적재되어 있는 것을 방지한다.

  3. 장기 스케쥴러 ready queue에 들어가는 프로세스의 종류를 배합할 때 활용되는 스케쥴러로 I/O Burst, Cpu Burst를 균등하게 처리할 수있도록 프로세스의 종류를, 구성한다. multi-programming의 degree를 결정하는 스케쥴러이기도 하다.

동기 vs 비동기

동기 방식의 경우 모든 작업을 순차적으로 진행한다는 점이 특징이다. 하나의 작업이 완료되기 전까지 다른 작업이 실행되지 않는다. 그렇기 때문에 작업 시간이 오래 걸리는 작업이 먼저 실행되는 경우 다른 작업은 이를 기다리는 동안 실행되지 않고 blocking 된다.

비동기 방식의 경우, 하나의 작업이 진행되는 동안 다른 작업을 처리 하므로써, 전체적인 작업 시간을 줄일 수 있다는 장점이 있다. 실행흐름을 여러 군데에서 분할해서 가져갈 수 있기 때문에 작업이 오래 걸리는 작업에 대해서는 외부에서 실행되게끔 할 수 있다. 이를 이용하는 것이 Node.js 의 비동기 처리이다. 비동기 처리가 완료되면 콜백 함수를 통해 처리가 완료되면 실행될수 있도록 한다.

Critical Section

race condition의 가능성이 있는 영역으로 반드시 하나의 프로세스만 동작할 수 있도록 보장해줘야하는 공간이다.

race condition: 프로세스 실행 순서에 따라 값이 달라지는 현상

이러한 임계 영역관련 문제를 해결하기 위해 아래의 3가지 조건을 만족해야한다.

Synchronization 문제

  1. 상호 배제: 항상 critical section에는 하나의 프로세스만 존재애햐한다.
  2. 진행: 임계 영역에 프로세스가 없는 상황에서 들어가고자 하는 프로세스가 여러개 인경우 이에 대한 결정을 진행해야한다.
  3. 유한 대기: 임계 영역에 들어가고자 하는 프로세는 제한된 시간 내에 들어갈 수 있어야한다.

Mutex & Semaphore

두 가지 방식 모두 critical section에 접근하는 프로세스의 개수를 제한하기 위해 사용되는 방식이다.

Mutex은 하나의 실행 주체(프로세스, 쓰레드)에 의해서 사용가능하고, Mutex을 통해 락을 설정하게 되면 다른 프로세스는 임계영역에 접근하지 못한다. 이후 락을 반환하게 되면 다른 프로세스는 Mutex로부터 락을 할당받아서 임계영역 처리를 진행한다. 오직 락을 설정한 프로세스만 락을 해제할 수 있다.

Semaphore는 Mutex와 달리 2개 이상의 프로세스에 대한 접근을 제어할 수 있다. binary semaphore을 활용하게 되면 mutex와 유사하게 1개의 락을 활용해서 진행하지만, counting semaphore을 활용하면 n개의 process을 통제할 수 있다. 또한 semaphore은 signaling 매커니즘을 통해 락을 걸지 않은 쓰레드가 락을 해제할 수 있다는 점에서 mutex와 차이 있다.

Paging

프로세스가 사용하는 메모리 영역을 page 단위로 분할하고, 실제 메인 메모리는 같은 크기의 frame 단위로 나눠서 불연속으로 page를 frame에 할당하는 방식으로 외부 단편화를 문제를 해결한 방식이다.

하지만, 정해진 크기의 메모리 조각을 이용한다는 점에서 내부에서 해당 영역을 다 사용하지 못하는 내부 단편화 문제가 발생할 수 있다.

Segmentation

Paging과 같이 프로세스의 메모리를 비연속적으로 저장하는 방식이지만 page와 달리 서로 다른 segment 크기로 분할하여 메모리에 저장한다. 세그멘트 테이블을 통해 각 세그먼트가 저장되는 기준 및 세그먼트 크기를 관리한다. 이러한 세그먼트는 각각의 크기를 달리하여 내부 단편화는 발생하지 않지만 메모리 적재 삭제 과정을 거치게 되면서 세그먼트 사이에 빈공기가 생겨 외부 단편화 문제가 발생한다.

Page Replacing Algorithm

Page Fault가 발생하게 되면 disk에 있는 page를 메모리로 적재해야하는데, 메모리에 빈 frame이 없는 경우 대체할 page를 찾아서 비워줘야하는데, 이를 교체하는 방법을 페이지 교체 방법이라고 한다.

FIFO

메모리에 저장된지 가장 오래된 페이지를 선택해서 제거한다.

Optimal Page 교체

앞으로 가장 오랫동안 사용되지 않을 페이지를 골라서 제거한다. 하지만 프로세스가 이용할 모든 페이지 목록을 알아야한다는 점에서 구현이 불가능하다. 그렇지만 이를 다른 알고리즘과 비교해서 성능의 수치 기준으로 삼는다.

LRU

가장 오랫동안 사용되지 않는 페이지를 선택해서 제거한다. LRU를 구현하기 위해 Couting을 통해 해당 페이지가 참조되고 있는 지 여부를 기록한다.

가상 메모리

M 크기는 매우 한정되어 있기 때문에 무작정 메모리를 할당할 수는 없다. 그래서 이때 가상 메모리 방식을 활용한다. 프로세스의 경우 할당된 메모리 양보다 많은 양의 메모리를 요구하는 경우가 발생하지만, 동시에 모든 메모리를 활용하는 것은 아니기 때문에, Virtual Memory를 활용해서 실제 할당되는 것보다는 큰 메모리인 것 처럼 보이게 하며, 해당 메모리를 필요로 할때 disk 로 부터 가져오는 작업을 수행한다.

대신, 가상메모리와 물리메모리 간에 주소가 서로 다르기 때문에 base regsiter와 offset을 통해 주소 변환 과정이 필요하다.

Context Switching?

CPU scheduling, Systemcall, 등과 같이 interrupt가 발생되면 기존에 실행되는 process가 교체되고 우선순위가 높은 프로세스가 먼저 처리되야한다. 이때 기존에 처리되고 있던 Process 관련 process의 상태, register을 이전 PCB에 저장하고 실행하고자 하는 Process의 PCB에서 register 정보를 뽑아서 CPU register에 할당해준다.

캐시?

캐시는 상위 계층에 메모리에 하위 계층의 메모리를 복사해놓는 방식으로 지역성의 원리에 의해 진행됩니다.

시간의 지역성: 최근에 접근한 메모리 영역에 대해서는 다시 접근할 가능성이 높다. 반복문에서 반복 변수의 경우 매 반복마다 접근한다는 것은 시간의 지역성에 해당한다.

공간의 지역성: 이전에 접근한 메모리 영역과 인접한 영역에 접근할 가능성이 높다. 배열에 연관된 처리를 수행할때, 특정 배열의 원소에 접근하게 되면 다른 배열의 원소도 나중에 접근할 가능성이 높다는 것은 공간의 지역성을 의미한다.

댓글남기기