프로세스의 개념
프로세스란 실행중인 프로그램을 의미한다.
프로세스의 문맥(context)
- CPU 수행 상태를 나타내는 하드웨어 문맥
- Program Counter
- 각종 register
- 프로세스의 주소 공간
- 프로세스 관련 커널 자료 구조
- PCB(Process Control Block)
- Kernel stack

프로세스의 상태 (Process State)
프로세스는 상태(state)가 변경되며 수행된다.
- Running
- CPU를 잡고 instruction을 수행중인 상태
- Ready
- CPU를 기다리는 상태(메모리 등 다른 조건을 모두 만족하고)
- Blocked(wait, sleep)
- CPU를 주어도 당장 instruction을 수행할 수 없는 상태
- Process 자신이 요청한 event(예: I/O)가 즉시 만족되지 않아 이를 기다리는 상태
- (예) 디스크에서 file을 읽어와야 하는 경우
- Suspended(stopped)
- 외부적인 이유(중기스케줄러)로 프로세스의 수행이 정지된 상태
- 프로세스는 통째로 디스크에
swap out이 된다
- (예) 사용자가 프로그램을 일시 정지 시킨 경우(break key) 시스템이 여러 이유로 프로세스를 잠시 중단시킴(메모리에 너무 많은 프로세스가 올라와있을 때)
- New: 프로세스가 생성중인 상태
- Terminated: 수행이 끝난 상태
blocked: 자신이 요청한 event가 만족되면 Ready
↕️
Suspended: 외부에서 resume해 주어야 Active
프로세스 상태도


Process Control Block(PCB)
운영체제가 각 프로세스를 관리하기 위해 프로세스당 유지하는 정보
구성 요소
- OS가 관리상 사용하는 정보
- Process state, Process ID
- scheduling information, priority
- CPU 수행 관련 하드웨어 값
- Program counter, registers
- 메모리 관련
- 파일관련
문맥 교환(Context Switch)
CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정
CPU가 다른 프로세스에게 넘어갈 때, 다음을 수행한다.
- CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장
- CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어옴
그러나 System call이나 Interrupt 발생시 반드시 Context switch가 일어나는 것은 아니다.

즉, 위 그림과 같이 사용자 프로세스 A에서 다시 사용자 프로세스 A로 복귀한다면, Context switch가 발생하지는 않음
1번의 경우에 CPU 수행 정보 등 context의 일부를 PCB에 save해야 하지만, 문맥 교환을 하는 2번의 경우 그 부담이 훨씬 크다(eg. cache memory flush ⬅️ 캐시 메모리를 다 비우는것)
프로세스 스케줄링하기 위한 큐
- Job queue
- Ready queue
- 현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
- Device queues
- I/O device 처리를 기다리는 프로세스의 집합
프로세스들은 각 큐들을 오가며 수행된다.
Ready Queue와 다양한 Device Queue

스케줄러(Scheduler)
Long-term scheduler(장기 스케줄러 or job scheduler)
- 시작 프로세스 중 어떤 것들을
ready queue로 보낼지 결정
- 프로세스에
memory(및 각종 자원)을 주는 문제
degree of Multiprogramming을 제어
time sharing system에는 보통 장기 스케줄러가 없음(무조건 ready)
현대의 컴퓨터는 new -> ready로 바로 보냄
Short-term scheduler(단기 스케줄러 or CPU scheduler)
- 어떤 프로세스를 다음번에 running 시킬지 결정
- 프로세스에 CPU를 주는 문제
- 충분히 빨라야 함 (millisecond 단위)
Medium-Term Scheduler(중기 스케줄러 or Swapper)
- 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아냄
- 프로세스에게서
memory를 뺏는 문제
degree of Multiprogramming을 제어
현대의 운영체제에서는 중기 스케줄러로 메모리 관리를 함
중기 스케줄러를 위한 상태로 Suspended(stopped) 상태가 있음

Thread
스레드는 프로세스의 실행 단위
➡️ 스레드를 lightweight process라고 부르기도 한다.

스레드의 구성
- program counter
- register set
- stack space
스레드가 동료 스레드와 공유하는 부분(=task)
- code section
- data section
- OS resources
전통적인 개념의 heavyweight process는 하나의 thread를 가지고 있는 task로 볼 수 있다.

같은 일을 하는 프로세스가 여러개 있다면, 프로세스를 하나만 띄워두고(code, data, stack) 스레드를 이용하여 각기 다른 부분을 실행시키도록 함 -> 메모리 절약(중복된 프로세스의 code, data, stack을 여러개 띄워두지 않아도 되기 때문)
스레드의 공유
별도로 가지고 잇는 것은 프로그램 카운터나 레지스터와 같은 CPU 수행과 관련된 정보
스레드의 장점
- 다중 스레드로 구성된 태스크 구조에서는 하나의 서버 스레드가 blocked (waiting) 상태인 동안에도 동일한 태스크 내의 다른 스레드가 실행(running)되어 빠른 처리를 할 수 있다.
- 동일한 일을 수행하는 다중 스레드가 협력하여 높은 처리율(throughput)과 성능 향상을 얻을 수 있다. ➡️ 메모리 절약 가능
- 스레드를 사용하면 병렬성을 높일 수 있다.

스레드의 구현
스레드가 여러개 있다는 사실을 운영체제 커널이 알고 있음. 하나의 스레드에서 다른 스레드로 CPU가 넘어가는 것도 커널이 CPU 스케줄링을 하듯이 넘겨줌
라이브러리를 통해 지원하며 프로세스 안에 스레드가 여러개 있다는 사실을 운영체제는 모름. 유저 프로그램이 스스로 스레드 관리
참고사이트
http://www.kocw.net/home/cview.do?cid=3646706b4347ef09