-
CS : OS : ProcessComputer Science/OS 2021. 3. 25. 12:08728x90
Process
- 메모리에 올라와 실행되고 있는 프로그램의 인스턴스
- 운영체제로부터 시스템 자원을 할당받는 작업의 단위
- 프로세스는 각각 독립된 메모리 영역을 할당받는다.
- 각 프로세스는 별도의 주소 공간에서 실행되고, 한 프로세스는 다른 프로세스의 변수나 구조에 접근할 수 없다.
- 접근하려면, IPC(프로세스 간 통신)를 사용해야 한다. (pipe, file, socket 등)
Thread
- 프로세스 내에서 실행되는 여러 흐름의 단위
- 프로세스가 할당받은 자원을 이용하는 실행의 단위
- 각각의 스레드는 code, data, heap 영역은 공유하고, stack 영역은 따로 할당받는다.
- 각각의 스레드는 힙 메모리는 서로 읽고 쓸 수 있고, 레지스터와 스택을 별도로 가진다.
Multi-Processing
- 하나의 응용 프로그램을 여러 개의 프로세스로 구성하여, 각 프로세스가 하나의 작업(task)을 처리하도록 하는 것
- 장점
- 여러 개의 자식 프로세스 중 하나에 문제가 발생하면, 그 자식 프로세스만 죽는 것 이상으로 다른 영향이 확산되지 않는다.
- 단점
- context switching 과정에서 오버헤드가 발생한다.
- 프로세스는 각각 독립된 메모리 영역을 할당받기 때문에, 이러한 프로세스 사이에서 공유하는 메모리가 없다. 때문에, context switching 발생 시 cache의 모든 메모리를 모두 reset하고 다시 불러와야 한다.
- context switching에 대한 설명은 아래 참조
Multi-Thread
- 하나의 프로세스를 다수의 실행 단위로 구분하여, 자원을 공유하고, 자원의 생성과 관리의 중복성을 최소화하여 수행 능력을 향상시키는 것
- 사용자와 상호작용을 하는 application에서 single-thread로 network. DB와 같은 긴 작업(long-running task)을 수행하는 경우, 해당 작업을 처리하는 동안 사용자와 상호작용이 불능인 상태가 될 수 있다. 때문에 multi-thread 방식이 선호된다.
- multi-thread로 구성된 프로그램은 multi-core 구조에서 core 1개 당 thread 1개가 할당되어 병렬처리 된다. single-thread의 경우 multi-core여도 1개의 core만 사용한다.
- 사용 이유
- 프로세스 개념으로 동시에 처리하던 일을 스레드 개념을 사용할 경우, '메모리 공간'과 시스템 자원의 소모'가 줄어든다.
- 공유 메모리, 메시지 파싱, 파이프라인 등 IPC 방식을 활용하여 통신하는 프로세스의 방식에 비하여 스레드의 통신 방법은 훨씬 간단하다.
- 스레드는 'data', 'code', 'stack' 영역을 공유하기 때문에, 'stack' 영역에 대해서만 context switching이 이뤄지기 때문에, 프로세스보다 빠르고 간단하지만, 에 대한 동기화 작업이 별도로 필요하다.
- 장점
- 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어, 자월을 효율적으로 관리할 수 있다.
- 스레드 간 데이터를 주고 받는 것이 간단해져, 시스템 자원 소모가 줄어든다.
- 스레드 간 작업량이 작기 때문에, context switching이 빠르다. 시스템 처리량이 증가한다.
- 스레드 간 통신의 부담이 적다.
- 단점
- 설계가 어렵고, 디버깅이 까다롭다.
- 단일 프로세스 시스템의 경우, 효과를 기대하기 어렵다.
- 해당 프로세스 밖에서 해당 스레드를 제어할 수 없다.
- 자원 공유에 있어 동기화 문제가 발생한다.
- 하나의 스레드의 문제는, 전체 프로세스에 영향을 미친다.
Multi-Thread의 동기화 문제
- 서로 다른 스레드가 일부 영역을 공유하기 때문에, 동기화 작업이 필수적으로 필요하다.
- 동기화를 통해 작업 순서와 공유 자원에 대해 컨트롤 한다.
- 동기화 작업 시, 과도한 lock으로 인한 병목 현상, 성능 저하 현상을 방지해야 한다,
- 따라서, 동기화가 필요한 부분에 대해 'synchronized' 키워드를 활용한다.
- 특정 메소드에 대해 메소드 전체를 동기화 할 것인지, 메소드 내부의 특정 부분에 대해서만 동기화 할 것인지 등에 대해 고민이 필요하다.
Multi-Threaded Server
- 계속 request를 만들어내는 클라이언트가 존재한다고 가정할 때, 이 클라이언트의 요청을 수행하는 서버는 스레드를 생성해서 요청을 받아들인다.
- single-processor를 사용하는 서버이고, 프로세싱에 2ms, input-output delay에 8ms가 소요된다고 가정하면 하나의 스레드는 1초에 100개의 요청으로 처리할 수 있다.
- 스레드가 2개라고 가정할 때, 1번 스레드가 프로세싱을 마치고 8ms 동안의 input-output delay가 있는 동안 2번 스레드가 2ms의 프로세싱을 수행할 수 있다. 이 경우 1초에 125개의 요청을 처리할 수 있게 된다.
- 이번엔 I/O에 걸리는 시간을 줄이기 위해 cache를 사용한다고 가정할 때, hit ratio가 75%라고 가정하면, 평균 I/O 시간은 (0.75x0 + 0.25x8)로 2ms가 된다. input-output delay가 2ms가 되는 것이다. 이때에는 1초에 500개의 요청을 처리할 수 있다.
- 결과적으로, 여러 개의 스레드를 사용하면 요청을 처리하는 데에 걸리는 시간을 크게 단축시킬 수 있다.
Context Switching (문맥 교환)
- CPU가 한 개의 task(or process or thread)를 실행하고 있는 상태에서 interrupt 요청에 의해 다른 task로 실행이 전환되는 과정에서, 기존의 task 상태 및 register 값에 대한 정보(context)를 저장하고 새로운 task의 정보(context)로 교체하는 작업
- 이 때 context란, CPU가 다루는 task에 대한 정보이며, 대부분의 정보는 register에 저장되고, PCB(Process Control Block)으로 관리된다.
- 프로세스의 경우, 운영체제에 의해 PCB라는 구조로 관리되고, 스레드의 경우, 프로세스 내의 TCB라는 구조로 관리된다.
- PCB의 주 저장 내용
- Process State : 프로세스 상태
- Program Counter : 다음에 실행할 명령어 address
- Register : 프로세스 레지스터 정보
- Process number : 프로세스 번호
- context switching이 필요한 이유
- 컴퓨터가 한 번에 하나의 task만 처리할 수 있다면, 반응 속도가 매우 느리고 사용하기 불편할 것이다. 이를 해결하기 위해 multitasking 개념이 필요하고, CPU는 여러 개의 task를 번갈아가며 실행하게 된다. 이 때 task의 이전 상태를 저장하고 불러오는 과정을 거쳐야 하고 이를 context switching이라고 한다.
- context switching cost
- Cache 초기화
- Memory Mapping 초기화
- Kernel이 항상 실행되어야 한다.
Critical Section (임계 영역)
- 다중 프로그래밍 시스템에서, 여러 프로세스들이 공유하고 있는 자원을, 한 시점에 하나의 프로세스만 접근할 수 있도록 지정된 영역을 의미힌다.
- 한 번에 한 프로세스만 접근 가능하다.
- 한 프로세스가 임계 영역의 자원을 독점할 수 없다.
- thread-safe 하지 않는 code
- thread-safe 한 code
Mutex (Mutual Exclusion, 상호 배제)
- 여러 프로세스들이 동시에 독립적으로 진행됨으로 인해, 발생하는 자원 사용의 문제점을 해결하는 기법 중 하나
- 자원에 대한 접근이나 공유 데이터에 대한 접근 시 발생하는 문제이며, 커널 내에서 해결하여야 한다.
- 키(key)가 두 개 이상인 뮤텍스를 세마포어(semaphore)라고 한다.
Deadlock (교착 상태)
- 상호 베제에 의해 나타나는 문제점이다.
- 하나의 프로세스가 일부 자원을 독점하고, 다른 프로세스가 이를 무한히 기다리고 있는 상태이다.
- deadlock 발생 조건
- Mutual Exclusion (상호 배제) : 한 자원에 대한 여러 프로세스의 동시 접근 불가
- Hold and Wait (점유와 대기) : 자원을 가지고 있는 상태에서 다른 프로세스가 자원의 반납을 기다리는 것
- Non Preemptive (비선점) : 다른 프로세스의 자원을 강제로 가져올 수 없음
- Circle Wait (순환대기) : 각 프로세스가 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있는 것
- deadlock 해결 방법
- Prevention (예방) : 위 네가지의 발생 조건 중 하나만 해결해도 교착 상태는 예방 가능하다.
- Avoidance (회피) : 교착 상태의 가능성을 배제하지 않고 적절하게 피한다. (예 : 은행원 알고리즘)
- Detection (탐지) : 교착 상태 발생 시, 원일을 해결한다. (예 : 자원할당 그래프)
- Recovery (복구) : 교착 상태 발생 시, circle wait를 배제하고나, 자원을 중단하는 등의 메모리 할당 기법을 사용한다. (예 : 프로세스 선점, 프로세스 중지)
- Ignorance (무시) : 교착 상태 발생 시, 이를 무시한다. 대부분의 운영체제에서 사용하는 방식이다.
- 예방과 회피의 차이점
- 예방 : deadlock 발생 조건 4가지 중 하나를 아예 불가능하게 바꿔버리는 것이다.
- 회피 : deadlock 발생 여부를 계속해서 check하여 deadlock의 가능성을 검사하고 이에 따라 작업을 회피하는 등의 조치를 취한다.
- 예방과 회피보다, 탐지와 복구를 더 많이 사용하는 이유
- 예방과 회피를 사용할 경우, deadlock을 방지할 수 있지만, 자원을 효율적으로 사용하지 못한다.
- 또한, 특히 회피의 경우 특정 알고리즘을 통해 계속해서 check 해야 하는데 이는 많은 overhead가 발생하는 조건이다.
** 수정중 **
CPU Scheduling (스케줄링)
- 선점 스케줄링 (Preemptive)
- 우선 순위가 높은 프로세스가 CPU를 차지한다.
- 우선 순위가 높은 프로세스가 빠르게 처리될 필요가 있다면, 이러한 방식이 유용하다.
- 선점이 일어날 경우 오버헤드가 발생되고, 처리 시간을 예측하기 어렵다.
- SRT (Shortest Remaining Time)
- 현재 처리 중인 프로세스의 남은 시간보다 더 짧은 프로세스가 ready queue에 들어오면, 해당 프로세스가 바로 선점된다.
- RR (Round-Robin)
- 비선점 스케줄링 (Non-Preemptive)
- 프로세스가 스스로 CPU를 놓아줄 때(=작업이 완료될 때), 다음 프로세스가 CPU를 차지할 수 있다.
728x90'Computer Science > OS' 카테고리의 다른 글
CS : OS : Memory (0) 2021.03.25 CS : OS : Kernel (0) 2021.03.25 Pintos Project #3 : Thread scheduling (2) 2020.05.29 Pintos Project #2 : Alarm Clock의 개선 (0) 2020.05.29 Pintos Project #1 : Pintos 환경 구축 (3/3) (0) 2020.05.29