프로세스의 개념
프로세스는 실행중인 프로그램이다.
프로세스의 문맥(context)
특정 시점에서 프로세스가 어디까지 수행했는지를 나타냄
- CPU 수행상태를 나타내는 하드웨어 문맥
- Program Counter가 어딜 가리키고 있는가
- 각종 register에 어떤 내용이 담겨있는가
- 프로세스의 주소 공간
- code, data(특정 변수의 값이 얼마인가), stack(함수 호출 순서)에 어떤 내용이 담겨있는가
- 프로세스 관련 커널 자료 구조
- PCB (커널 주소 공간의 데이터 영역에 저장됨)
- Kernel stack (커널 주소 공간의 스택 영역에 저장됨)
프로세스의 상태 (process state)
프로세스는 상태(state)가 변경되며 수행된다.
- Running
- CPU를 잡고 instruction을 수행 중인 상태
- Ready
- CPU를 기다리는 상태(메모리 등 다른 조건을 모두 만족하고 ex) 당장 instruction 실행에 필요한 부분이 메모리에 올라와있어야 함.)
- Blocked(wait, sleep)
- CPU를 주어도 당장 instruction을 수행할 수 없는 상태
- Process 자신이 요청한 event(예: I/O)가 즉시 만족되지 않아 이를 기다리는 상태
- ex) 디스크에서 file을 읽어와야 하는 경우
- 하드웨어 자원에서 줄 서 있는 경우도 있지만, 소프트웨어 자원인 공유 데이터의 resource queue에서 줄 서 있는 경우도 있다. (여러 프로세스가 동시에 접근하면 일관성이 깨지므로 queue가 있는 것임.)
- 자신이 요청한 event가 만족되면 ready 상태로 돌아감.
- Suspended(stopped)
- 외부적인 이유로 프로세스의 수행이 정지된 상태
- 프로세스는 통째로 디스크에 swap out된다.
- ex)
- 사용자가 프로그램을 일시 정지 시킨 경우 (ctrl + z)
- 시스템이 여러 이유로 프로세스를 잠시 중단시킴 (메모리에 너무 많은 프로세스가 올라와 있을 때)
- 외부에서 resume해주어야 active 상태로 돌아갈 수 있다.
- New
- Terminated
Process Control Block

이미지 출처: https://prepinsta.com/operating-systems/process-control-block/
운영체제가 각 프로세스를 관리하기 위해 프로세스 당 유지하는 정보
다음의 구성 요소를 가진다 (구조체로 유지)
(1) OS가 관리 상 사용하는 정보
- process state(ready, running, blocked...), PID
- scheduling information, priority
(2) CPU 수행 관련 하드웨어 값
- Program counter, registers
(3) 메모리 관련
(4) 파일 관련
문맥 교환(Context Switch)
-
CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정
-
CPU가 다른 프로세스에게 넘어갈 때 운영체제는 다음을 수행

이미지 출처: https://www.scaler.com/topics/operating-system/context-switching-in-os/
- CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장
- CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어옴.
-
시스템 콜이나 인터럽트 발생 시 반드시 문맥 교환이 일어나는 것은 아니다.
- (1) 문맥 교환이 일어나지 않는 예시: 사용자 프로세스 A가 유저모드에서 실행 중이다가 interrupt 또는 시스템콜로 인하여 커널 모드로 전환됨. ISR 또는 시스템 콜 함수를 실행하다가 문맥 교환 없이 유저모드로 복귀하고 다시 프로세스 A를 실행
- (2) 문맥 교환이 일어나는 예시: 사용자 프로세스가 A가 유저모드에서 실행 중이다가 timer interrupt 또는 I/O 요청 system call을 걸어서 커널 모드로 전환됨. 이때 유저모드로 복귀하고 다른 프로세스인 프로세스 B가 실행되기 시작.
(1)의 경우에도 CPU 수행 정보 등 context의 일부를 PCB에 save해야 하지만 문맥교환을 하는 (2)의 경우 그 부담이 훨씬 큼(eg. cache memory flush - 문맥 교환이 일어날 때 프로세스 A가 사용하던 캐시 데이터를 모두 지워야 하지만, 커널 모드로 전환되었다가 다시 프로세스 A로 복귀하면 캐시 데이터를 지울 필요는 없다.)
프로세스를 스케줄링하기 위한 큐
- Job queue: 현재 시스템 내에 있는 모든 프로세스의 집합
- Ready queue: 현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
- Device queues: I/O device의 처리를 기다리는 프로세스의 집합
프로세스들은 각 큐들을 오가며 수행된다.
스케줄러
- Long-term scheduler(장기 스케줄러 or job scheduler)
- 시작 프로세스 중 어떤 것들을 ready queue로 보낼지 결정
- 프로세스에 memory(및 각종 자원)을 주는 문제
- degree of Multiprogramming을 제어
- time sharing system에는 보통 장기 스케줄러가 없음(무조건 ready. 대신 중기 스케줄러 사용)
- Short-term scheduler(단기 스케줄러 or CPU scheduler)
- 어떤 프로세스를 다음번에 running 시킬지를 결정
- 프로세스에 CPU를 주는 문제
- 충분히 빨라야 함 (milisecond 단위)
- Medium-Term scheduler(중기 스케줄러 or Swapper)
- 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아냄
- 프로세스에게서 memory를 뺏는 문제
- degree of Multiprogramming을 제어
스레드의 개념
스레드(=lightweight process)는 CPU 이용의 기본 단위이다.
스레드의 구성
- program counter (커널 주소 공간의 데이터 영역 내부의 PCB에서 관리되는 CPU 관련 정보)
- register set (커널 주소 공간의 데이터 영역 내부의 PCB에서 관리되는 CPU 관련 정보)
- stack space (프로세스의 stack 부분은 스레드 별로 별도로 둠)
스레드가 동료 스레드와 공유하는 부분
- code section
- data section
- OS resources
전통적인 개념의 heavy weight process는 하나의 thread를 가지고 있는 task로 볼 수 있다.
멀티 스레드의 장점
1. 응답성(Responsiveness)
다중 스레드로 구성된 태스크(=프로세스) 구조에서는 하나의 서버 스레드가 blocked(waiting) 상태인 동안에도 동일한 태스크 내의 다른 스레드가 실행(running) 되어 사용자 입장에서 빠른 처리를 할 수 있다.
- ex) multi-threaded web: HTML을 파싱하다가 한 스레드가 image 파일을 네트워크 요청하는 동안 blocked되면, 다른 스레드가 HTML 텍스트라도 먼저 display함으로써 응답 처리 속도를 높임. (비동기식 입출력: I/O를 던져놓고 다음 명령어를 바로 수행)
- Resource Sharing
n개의 스레드가 코드, 데이터, 프로세스 자원(파일 등)을 공유할 수 있다.
동일한 일을 수행하는 다중 스레드가 협력하여 높은 처리율(throughput)과 성능 향상을 얻을 수 있다.
- 같은 일을 처리하는 각각의 프로세스를 메모리에 별도로 올리면 메모리 낭비가 심해질 것임. 스레드끼리 코드와 데이터 부분을 공유할 수 있으면 메모리 낭비를 줄일 수 있다.
- ex) chrome을 여러 개 띄워놓고 하나는 검색, 하나는 이메일을 사용.
- 경제성
프로세스를 생성하는 것에 비해 스레드를 생성하는 것의 오버헤드는 그렇게 크지 않음.
context switch의 경우에도 프로세스끼리의 경우에는 오버헤드가 크지만, 스레드의 경우 스레드끼리 동일한 주소 공간에서 코드와 데이터를 공유하므로 CPU switch 오버헤드가 훨씬 작음.
- Utilization of MP Architectures
스레드를 사용하면 병렬성을 높일 수 있다.(멀티 프로세서에서만 해당되는 말)
- ex) 1000 * 1000 행렬의 곱셈을 할 때, 각 행과 열의 곱셈은 독립적인 연산임(더해주기 전까지는). CPU가 여러개 있으면 독립적인 행과 열 곱셈을 서로 다른 CPU에서 병렬적으로 수행하여 속도를 높일 수 있다.