✏️ 프로세스
프로세스는 실행 중인 프로그램을 의미하며, 다음과 같은 특징을 가집니다
- 실행 시작 시 독자적인 주소 공간 생성 (stack, data, code)
- CPU를 할당받으면 프로그램 카운터(PC)가 코드의 특정 부분을 가리킴
- 매 순간 명령어(인스트럭션)를 하나씩 읽어 CPU에서 처리
- 레지스터에 값을 저장하고 연산 후 결과를 다시 레지스터나 메모리에 저장
문맥의 종류

프로세스 문맥이란 프로세스가 현재 어떤 상태에 있는지를 정확하게 규명하는 정보입니다. 이는 프로세스가 어디까지 실행되었는지를 나타내며 다음과 같은 정보를 포함합니다
문맥의 종류
-
하드웨어 문맥
- CPU 레지스터 값들
- 프로그램 카운터(PC) 상태
- 현재 실행 중인 명령어 위치
-
프로세스 주소 공간
-
커널 관련 문맥
- PCB(Process Control Block)와 커널 스택
- 프로세스가 시스템 콜 등으로 커널 모드에서 수행한 작업 정보
프로세스의 상태

-
실행(Running): CPU를 잡고 명령을 수행 중인 상태
👉 커널모드에서 러닝중이라고 표현, 운영체제가 running 한다고 표현하지 않는다.
-
준비(Ready): 메모리에 프로그램이 올라가 있지만, CPU가 없어서 기다리는 상태
-
봉쇄(Blocked(wait, sleep)): CPU를 할당받더라도 당장 명령을 실행할 수 없는 상태, 프로세스 자신이 I/O 요청했기 때문에 기다리는 상태.
-
정지(Suspend): CPU뿐 아니라 외부에서 이프로세스를 강제로 정지한 상태 프로세스가 통째로 Swap-out된 상태.
-
시작(New): 프로세스가 생성중인 상태
-
완료(Terminated): 수행이 끝난 상태
✏️ Process Control Block (PCB)

프로세스 제어 블록이란 운영 체제가 시스템 내의 프로세스들을 관리하기 위해 프로세스마다 유지하는 정보들을 담는 커널 내의 자료 구조
PCB 구성요소
OS가 관리 상 사용하는 정보
- 프로세스 상태, 프로세스 ID, CPU 스케줄링 정보, 프로세스 우선 순위 등
CPU 수행 관련 하드웨어 값
메모리 관련
- code, data, stack의 위치 정보 등
파일 관련
✏️ 문맥교환
CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정
CPU를 뺏기면 정보를 세이브하고 넘겨줄 때도 정보를 세이브해뒀던것을 복원해서 넘겨준다.
OS가 CPU를 다른 프로세스에게 넘겨주면 문맥교환이 일어난다.
👉 시스템 콜이나 인터럽트가 발생하면 항상 문맥 교환이 일어나는가?
정답은 ❌❌❌
- 시스템콜이 발생하면 유저모드 -> 커널모드로의 전환을 수반하지만, 현재 프로세스가 계속 CPU를 사용하는 경우에는 문맥 교환이 발생하지 않는다.
- 또한 대부분의 인터럽트의 경우에도 처리 후 원래 실행 중이던 프로세스로 다시 돌아가므로 문맥 교환은 발생하지 않는다.
✏️ 프로세스를 스케줄링하기 위한 큐
Job Queue
- 현재 시스템 내에 있는 모든 프로세스 집합이다. (Ready Queue + Device Queues)
Ready Queue
- 현재 메모리에 있으면서 CPU를 잡아서 실행되기를 기다리는 준비 상태의 프로세스 집합이다.
Device Queues
- I/O 디바이스의 처리를 기다리는 봉쇄 상태의 프로세스 집합이다
✏️ 스케쥴러
Long-term schedular
어떤 프로세스를 실행할지 결정하는 스케줄러
- 디스크 등에 있는 Job(작업)을 메모리로 올릴지 결정한다.
- 실행빈도가 매우낮고, 현대에는 거의 사용되지 않는다.
📌 degree of multiprogramming 제어
- 메모리에 동시에 존재하는 프로세스의 수를 의미한다.
- CPU와 I/O 자원을 최대한 활용하기 위한 기법으로, 여러 프로세스를 메모리에 적재해 CPU가 놀지 않도록 하는 것이 목적
Long-term Scheduler의 역할
- 새로운 프로세스를 메모리에 적재할지 결정.
- 시스템이 과부하 상태라면, 새로운 프로세스의 진입을 제한하여 degree를 낮춘다.
- 반대로 프로세스가 너무 적어 CPU가 놀고 있다면, 새로운 작업을 허용해 degree를 높인다.
Medium-term Scheduler(=swapper)
일시 중단된 프로세스를 메모리에서 제거하거나 다시 복귀시키는 스케줄러
- 스왑 아웃(Swap Out): 메모리 부족 시 프로세스를 디스크로 내림
- 스왑 인(Swap In): 다시 실행할 때 메모리로 복귀
- Suspended(stopped)상태 관리
👉 메모리 관리와 관련이 깊으며, 멀티태스킹 성능 최적화에 사용된다.
short-term schedular
어떤 프로세스에게 CPU를 줄지 즉시 결정하는 스케줄러
- Ready Queue에 있는 프로세스들 중에서 선택
- 문맥 교환을 유발할 수 있음
👉 가장 핵심적인 스케줄러이며, 우리가 흔히 말하는 "CPU 스케줄링"을 뜻한다.
✏️ Thread란?
- 프로세스 내에서 실행 되는 여러 흐름의 단위 혹은 프로세스가 할당 받은 자원을 이용하는 실행 흐름의 단위
Thread의 구성

- program counter: 명령어 실행을 위해 code의 어느부분을 실행하고 있는지 가리킨다.
- register set
- stack space
Thread가 다른 Thread와 공유하는 부분

Thread 끼리 주소영역의 data, code 영역은 공유하되 stack은 별도로 할당 받는다. PCB에서는 program counter와 register set을 제외한 프로세스 관련 정보 및 자원을 모두 공유한다.
Thread의 장점
응답성
- 다중 쓰레드로 구성된 Task 구조에서 하나의 thread가 blocked되어도 동일한 Task내의 다른 thread는 실행된다.
자원 공유 (Resource Sharing)
- 하나의 프로세스 안에 CPU 수행 단위인 쓰레드를 두게 되면 code, data, resource 자원을 공유하여 효율적으로 자원 활용이 가능
경제성
- 동일한 일을 수행하는 다중 쓰레드가 협력하여 높은 처리율(throughput)과 성능 향상을 얻을 수 있다.
- 새로운 프로세스 하나를 만드는 것 보다 기존의 프로세스에 쓰레드를 추가하는 것이 오버헤드가 훨씬 적다.
멀티 프로세서 아키텍처에서의 이용성
- 각 스레드는 각각 다른 CPU를 가지고 병렬적으로 수행가능
Thread의 단점
- 자원의 공유로 인한 동기화 문제가 발생할 수 있다.
- 디버깅이 까다롭다.
Thread의 구현
Kernel Threads
User Threads