프로세스란?
프로세스의 문맥(context)
- CPU 수행 상태를 나타내는 하드웨어 문맥
- Program Counter
- 각종 register
- 프로세스의 주소 공간
- code, date, stack
- 프로세스 관련 커널 자료 구조
- PCB(Process Control Block)
- Kernel stack
프로세스의 상태(Process state)
프로세스는 상태가 변경되며 수행된다
- Running
- CPU를 잡고 instruction을 수행중인 상태
- Ready
- CPU를 기다리는 상태(메모리 등 다른 조건을 모두 만족하고)
- Blocked(wait, sleep)
- CPU를 주어도 당장 instruction을 수행할 수 없는 상태
- Process 자신이 요천한 event가 즉시 만족되지 않아 이를 기다리는 상태
- 예) 디스크에서 file을 읽어와야 하는 경우
- Suspended(stopped)
- 외부적인 이유로 프로세스의 수행이 정지된 상태
- 프로세스는 통째로 디스크에 swap out 된다
- 예) 사용자가 프로그램을 일시 정지시킨 경우 (break key)
- 시스템이 여러 이유로 프로세스를 잠시 중단시킴 (메모리에 너무 많은 프로세스가 올라와 있을 때)
New: 프로세스가 생성중인 상태
Terminated: 수행(execution)이 끝난 상태
Blocked: 자신이 요청한 event가 만족되면 Ready
Suspended: 외부에서 resume해 주어야 Active
PCB
문맥 교환(Context Switch)
- CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정
- CPU가 다른 프로세스에게 넘어갈 때 운영체제는 다음을 실행
- CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장
- CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어옴
- System call이나 Interrupt 발생 시 반드시 context switch가 일어나는 것은 아님
프로레스를 스케줄링하기 위한 큐
- Job Queue
- 현재 시스템 내에 있는 모든 프로세스의 집합
- Ready Queue
- 현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
- Device Queues
- I/O Device의 처리를 기다리는 프로세스의 집합
- 프로세스들은 각 큐들을 오가며 수행된다
스케줄러
- Long-term scheduler(job scheduler)
- 시작 프로세스 중 어떤 것들을 ready queue로 보낼 지 결정
- 프로세스에 memory를 주는 문제
- degree of multiprogramming을 제어
- time sharing system에는 보통 장기 스케줄러가 없음(무조건 ready)
- Short-term scheduler(CPU scheduler)
- 어떤 프로세스를 다음번에 running 시킬 지 결정
- 프로세스에 CPU를 주는 문제
- 충분히 빨라야함(ms)
- Medium-Term scheduler(swapper)
- 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫒아냄
- 프로세스에게서 memory를 뺏는 문제
- degree of multiprogramming을 제어
프로세스 상태도
Thread
Thread는 CPU사용의 가장 기초단위
Thread의 구성
- Program counter
- register set
- stack space
Thread가 동료 Thread와 공유하는 부분(task)
- code section
- data section
- OS resources
전통적인 개념의 heavyweight process는 하나의 thread를 가지고있는 task로 볼 수 있다
다중 스레드로 구성된 테스크 구조에서는 하나의 서버 스레드가 blocked 상태인 동안에도 동일한 테스크 내의 다른 스레드가 running되어 빠른 처리를 할 수 있다
동일한 일을 수행하는 다중 스레드가 협력하여 높은 처리율과 성능 향상을 얻을 수 있다
스레드를 사용하면 병렬성을 높일 수 있다
Thread의 장점
- 응답성 - 웹브라우저가 여러개의 쓰레드를 갖고 있으면 network가 block되더라도 다른 쓰레드가 display를 계속 진행함
- 자원공유 - 쓰레드끼리는 code, data, resource를 공유할 수 있다. 하나의 프로세스를 만들고 그 안에 여러 쓰레드를 넣으면 효율적
- 경제성 - 프로세스를 만들거나 CPU switching보다 효율적이다. Solaris의 경우 overhead가 각각 30배, 5배 더 많다.
- CPU가 여러개 있는 경우에서의 활용 - 각각의 쓰레드는 다른 프로세서에서 병렬적으로 실행된다.
- 오버헤드(overhead): 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간 · 메모리 등을 말한다.
예를 들어 A라는 처리를 단순하게 실행한다면 10초 걸리는데, 안전성을 고려하고 부가적인 B라는 처리를 추가한 결과 처리시간이 15초 걸렸다면, 오버헤드는 5초가 된다. 또한 이 처리 B를 개선해 B'라는 처리를 한 결과, 처리시간이 12초가 되었다면, 이 경우 오버헤드가 3초 단축되었다고 말한다
쓰레드의 구현
출처 :
- ABRAHAM SILBERSCHATZ ET AL., OPERATING SYSTEM CONCEPTS, NINTH EDITION, WILEY, 2013
- 반효경, 운영체제와 정보기술의 원리, 이화여자대학교 출판부, 2008
- 반효경, 운영체제, 이화여대 강의, 2014-1