운영체제에서 프로세스(Process) 는 실행 중인 프로그램을 의미한다. 프로세스는 단순한 코드 덩어리가 아니라, 프로그램 실행을 위한 여러 정보와 자원을 포함한다.
프로세스(Process): 실행 중인 프로그램의 인스턴스
프로세스는 운영체제에 의해 관리되며, 각 프로세스는 독립적인 실행 단위로서 시스템 자원을 할당받아 사용한다.
프로그램은 일반적으로 하드디스크 등과 같은 저장장치에 저장되어 있는 실행코드를 뜻한다.
프로세스는 프로그램을 구동하여 프로그램 자체와 프로그램의 상태가 메모리 상에서 실행되는 작업 단위를 지칭한다.
예를 들어, 하나의 프로그램을 여러 번 구동하면 여러 개의 프로세스가 메모리 상에서 실행된다.
일반적으로 프로세스는 다음과 같은 네 가지 주요 부분으로 구성 된다.
| 구조 | 설명 |
|---|---|
| 코드 (Code) | 실행할 프로그램의 명령어가 저장되는 영역 |
| 데이터 (Data) | 초기화된 전역 변수와 정적 변수가 저장되는 영역 |
| 스택 (Stack) | 함수 호출 시 사용되는 지역 변수, 매개변수, 반환 주소 등이 저장되는 영역 |
| 힙 (Heap) | 동적으로 할당된 메모리가 저장되는 영역 (malloc, new 등) |

프로세스는 실행 중 여러 상태를 가진다.
상태 전환은 운영체제의 스케줄러에 의해 관리 된다.

프로세스 제어 블록은 운영 체제가 모든 프로세스에 대해 유지 관리하는 데이터 구조다.
PCB는 정수 프로세스 ID(PID)로 식별된다.
PCB는 프로세스의 수명 동안 유지되며 프로세스가 종료되면 삭제된다.
PCB는 아래 표에 나열된 대로 프로세스를 추적하는 데 필요한 모든 정보를 보관한다.
| 구조 | 설명 |
|---|---|
| 프로세스 상태 (Process State) | 프로세스의 현재 상태. 예: 준비(Ready), 실행(Running), 대기(Waiting) 등 |
| 프로세스 권한 (Process privileges) | 시스템 자원 접근을 허용하거나 거부하기 위한 권한 정보 |
| 프로세스 ID (Process ID) | 운영체제 내에서 각 프로세스를 고유하게 식별하기 위한 ID |
| 포인터 (Pointer) | 부모 프로세스를 가리키는 포인터 |
| 프로그램 카운터 (Program Counter) | 다음에 실행될 명령어의 주소를 가리키는 포인터 |
| CPU 레지스터 (CPU registers) | 실행 상태를 유지하기 위해 프로세스가 사용하는 다양한 CPU 레지스터 |
| CPU 스케줄링 정보 (CPU Scheduling Information) | 프로세스 우선순위 및 스케줄링을 위한 기타 정보 |
| 메모리 관리 정보 (Memory management information) | 페이지 테이블, 메모리 한계, 세그먼트 테이블 등 메모리 관련 정보 |
| 회계 정보 (Accounting information) | CPU 사용량, 실행 시간 제한, 실행 ID 등 실행에 대한 통계 정보 |
| 입출력 상태 정보 (IO status information) | 프로세스에 할당된 입출력 장치 목록 |

프로세스 스케줄링은 제한된 CPU 자원을 여러 프로세스에 효율적으로 분배하는 메커니즘이다.
운영 체제는 한 번에 여러 프로세스를 실행 가능한 메모리에 로드할 수 있으며 로드된 프로세스는 시간 멀티플렉싱을 사용하여 CPU를 공유한다.
| 장기 스케줄러 (Long-Term Scheduler) | 단기 스케줄러 (Short-Term Scheduler) | 중기 스케줄러 (Medium-Term Scheduler) |
|---|---|---|
| 작업 스케줄러 | CPU 스케줄러 | 프로세스 교체 스케줄러 |
| 속도는 단기 스케줄러보다 낮다 | 속도는 다른 두 가지 중에서 가장 빠르다 | 속도는 단기 스케줄러와 장기 스케줄러 사이에 있다 |
| 멀티프로그래밍의 정도를 제어한다 | 멀티프로그래밍의 정도에 대한 제어력이 약하다 | 멀티프로그래밍의 정도를 줄인다 |
| 타임쉐어링 시스템에서는 거의 없거나 최소한으로 존재한다 | 타임쉐어링 시스템에서도 최소화된다 | 시간 공유 시스템의 일부다 |
| 풀에서 프로세스를 선택하여 실행을 위해 메모리에 로드한다 | 실행할 준비가 된 프로세스를 선택한다 | 프로세스를 메모리에 다시 등록하고 실행을 계속할 수 있도록 한다 |

OS는 각 대기열을 관리하기 위해 다양한 알고리즘(FIFO, 라운드 로빈, 우선순위 등)을 사용할 수 있다.
운영 체제는 다음과 같은 알고리즘으로 CPU를 효율적으로 분배한다.
| 알고리즘 | 특징 | 장점 | 단점 |
|---|---|---|---|
| FCFS (First Come First Serve) | 먼저 도착한 프로세스를 먼저 처리 | 구현이 간단 | 긴 작업이 먼저 실행되면 대기 시간이 길어질 수 있음 |
| Round Robin | 모든 프로세스에 동일한 시간 할당 (시간 퀀텀 사용) | 공정한 분배, 멀티태스킹에 적합 | 시간 퀀텀 선택이 어려움, 컨텍스트 스위칭 오버헤드 발생 |
| Priority Scheduling | 우선순위가 높은 프로세스를 먼저 처리 중요한 작업을 빠르게 처리 가능 | 낮은 우선순위 | 작업이 기아(starvation)에 빠질 수 있음 |
| SJF (Shortest Job First) | 가장 짧은 작업부터 처리 | 평균 대기 시간 감소 | 작업의 실행 시간을 미리 알아야 함 |
| SRTF (Shortest Remaining Time First) | 남은 실행 시간이 가장 짧은 작업부터 처리 (SJF의 선점형 버전) | 효율적 자원 활용 가능 | 잦은 컨텍스트 스위칭으로 오버헤드 증가 |
컨텍스트 전환(Context Switching) 은 운영체제가 CPU를 하나의 프로세스에서 다른 프로세스로 전환할 때, 현재 프로세스의 상태(컨텍스트)를 저장하고, 새로운 프로세스의 상태를 복원하는 메커니즘이다.
이 기능은 멀티태스킹 운영체제의 핵심 요소로, 단일 CPU가 여러 프로세스를 마치 동시에 실행하는 것처럼 보이게 만드는 기반 기술이다.

작동 방식
- 현재 실행 중인 프로세스(P1)가 CPU를 사용 중
- 스케줄러가 새로운 프로세스(P2)를 실행할 차례라고 판단
- 운영체제는 다음을 수행:
- P1의 컨텍스트를 PCB(Process Control Block)에 저장
- P2의 컨텍스트를 PCB에서 복원
- CPU 레지스터, 프로그램 카운터(PC), 상태 레지스터 등을 업데이트
- 이제 P2가 CPU에서 실행을 시작함
- 이 과정을 통해 P1은 “멈췄던 지점”에서 언제든지 다시 실행될 수 있다.
| 항목 | 설명 |
|---|---|
| 프로그램 카운터 (PC) | 프로세스가 다음에 실행할 명령어 주소 |
| CPU 레지스터 | 일반 목적 및 특수 목적 레지스터 (예: RAX, RBX 등) |
| 스택 포인터 & 베이스 포인터 | 함수 호출/복귀와 관련된 스택 메모리 위치 |
| 스케줄링 정보 | 우선순위, 스케줄링 큐 정보 등 |
| 메모리 관리 정보 | 페이지 테이블, 세그먼트 테이블, 기준/한계 레지스터 등 |
| I/O 상태 정보 | 열린 파일, 장치 상태, 대기 중인 I/O 요청 등 |
| 회계 정보 (Accounting Info) | CPU 사용 시간, 프로세스 ID, 사용자 ID, 메모리 사용량 등 |
| 프로세스 상태 | 실행 중(Running), 대기(Waiting), 준비(Ready) 등 |
참고자료
tutorialspoint