- 프로그램
- 파일 시스템에 파일 형태로 존재하는 실행 파일- 프로세스
- CPU와 메모리를 사용하여 실행 중인 프로그램
- OS에서 하나의 작업(job) 단위로써 태스크(task)라고도 함
- Process = job = task
- 각 프로세스가 생성될 때 프로세스를 제어하는데 필요한 정보인 PCB(process control block)가 생성됨

new (생성)
- 프로그램이 메모리에 올라와 프로세스가 생성되는 상태
- PCB가 생성됨
ready (준비)
- 준비 큐(queue)에서 프로세스가 CPU를 할당 받기위해 기다리는 실행 준비 상태
running (실행)
- 프로세스가 CPU를 사용하여 실행 중인 상태
- 문맥 교환이 이뤄짐
예) 시분할 시스템에서 프로세스에게 할당된 CPU 사용시간(time slice)이 완료(timeout, interrupt의 일종)되면 실행이 다 끝나지 않아도 프로세스는 준비 상태로 되고 다음에 실행 상태가 될 차례를 기다림 -> 준비 상태에 있는 다른 프로세스가 실행 상태로 바뀌어 작업을 수행함
terminated (완료)
- 프로세스의 실행이 완료된 상태
- PCB가 삭제됨
waiting (대기)
- 실행 중인 프로세스가 데이터 I/O를 처리해야 하는 경우, I/O controller를 사용하여 I/O가 완료될 때까지 대기하는 상태
- CPU는 실행 중인 프로세스에서 I/O를 처리해야 하는 경우 직접 I/O를 처리하지 않고 I/O controller에게 요청한 다음 다른 프로세스를 처리함
-> I/O를 처리해야 하는 프로세스는 I/O controller의 I/O 처리가 완료될 때까지 대기해야함
-> I/O 처리가 완료되면 해당 프로세스는 준비 상태가 되고 다음에 실행 상태가 될 차례를 기다림

admitted (승인)
- 새롭게 생성된 프로세스들이 승인 받아 준비 상태에 이르는 과정
scheduler dispatch (스케줄러 디스패치)
- CPU 스케줄러에 의해 준비 상태의 준비 큐(queue)에서 프로세스 중 하나를 선택하여 실행시키는 것
interrupt (인터럽트)
- 예외, 입출력, 이벤트 등이 발생하여 현재 실행 중인 프로세스를 준비 상태로 바꾸고, 발생한 작업을 먼저 처리하는 것
I/O wait (입출력 대기)
- 실행 중인 프로세스가 입출력을 처리해야 하는 경우, 입출력 처리가 모두 끝날 때까지 대기 상태로 만드는 것
I/O completion (입출력 완료)
- 입출력이 끝난 프로세스를 준비 상태로 전환하여 스케줄러에 의해 선택될 수 있도록 만드는 것
- OS가 프로세스를 제어하는데 필요한 정보를 담고 있음
- 프로세스가 생성될 때 메모리의 OS영역에 생성됨
- 프로세스 상태 전이와 문맥 교환(context switch)을 위해 사용됨


Pointer
- 준비상태(ready state)의 준비 큐(ready queue)와 대기상태(waiting state)의 대기 큐(waiting queue)내에서 다음 프로세스의 PCB를 가리키는 포인터로 사용됨
Process state
- 프로세스 상태인 생성(new), 준비(ready), 실행(running), 대기(waiting), 종료(terminated)를 나타냄
Process number (PID)
- OS 내에서 여러 프로세스를 구분하기 위해 사용됨

Program counter (PC)
- 다음에 실행될 명령어의 주소 또는 코드의 행 번호가 저장됨
Registers
- 프로세스가 실행되는 중에 사용하던 register 값이 저장됨
- 예 (시분할 시스템에서 문맥 교환 시)
- 시분할 시스템에서 각 프로세스는 프로세스에게 할당된 CPU 사용시간(time slice 또는 time quantum) 동안 작업을 마치짖 못하면 다른 프로세스에게 CPU를 넘겨줌
- 이때, 프로세스 A가 103번 행까지 작업한 후 다른 프로세스에게 CPU를 넘겨준 다음 시간이 흘러 다시 프로세스 A의 차례가 되면 104번 행부터 작업을 시작해야 한다.
- 이를 위해, 프로세스 A가 실행상태에서 준비상태로 전환될 때 프로세스 A의 PCB내에 다음과 같이 저장됨
-> PC에는 다음에 실행될 코드의 행 번호 (104번 행)가 저장됨
-> Register 정보에는 프로세스가 실행되는 중에 사용하던 register 값이 저장됨
Memory management information
- 프로세스의 메모리 시작 주소를 저장하고 있는 경계 레지스터(boundary register) 값과 프로세스가 차지하고 있는 메모리의 크기를 저장하고 있는 한계 레지스터(limit register) 값이 저장됨
CPU scheduling information
- 프로세스 우선순위(process priority) 정보가 저장됨
- 준비 큐와 대기 큐에서 높은 우선순위의 프로세스가 낮은 우선순위의 프로세스보다 먼저 실행됨
I/O status information
- 프로세스를 실행하기 위해 사용된 입출력 장치이나 파일에 대한 정보가 저장됨 (예: file list)
Accounting information
- 프로세스 실행을 완료하기 위해 사용된 총 CPU 시간 및 이 시간의 한도가 저장됨
PPID & CPID
- 부모 프로세스(parent process)의 PID(PPID)와 자식 프로세스(child process)의 PID(CPID)가 저장됨
- Timeout 또는 인터럽트에 의해 CPU에서 현재 실행 중인 프로세스를 다른 프로세스로 전환하는 과정
- Context: CPU가 프로세스를 실행하기 위해 필요한 정보로써 CPU의 register에 저장됨
- 프로세스의 PCB를 통해 CPU의 register를 다시 설정함(context switch)
- 예: 프로세스 P1과 P2의 문맥 교환
-> Timeout 또는 인터럽트에 의해 실행상태에 있는 P1의 register 값은 P1의 PCB에 저장되고 P1은 준비상태가 됨
-> 준비상태에 있는 P2의 PCB에 저장된 register 값을 register로 읽어와서 P2은 실행 상태가 됨

- 프로세스가 생성될 때
- 메모리의 OS 영역: PCB가 할당 됨
- 메모리의 사용자 영역: 코드 영역, 데이터 영역, 힙 영역, 스택 영역이 할당됨- 코드 영역
- 디스크에서 읽어온 실행하려는 빌드된 프로그램이 저장됨- 데이터 영역
- 전역(global) 변수 또는 정적(static) 변수가 저장됨- 스택(stack) 영역
- 지역(local) 변수가 저장됨
- 변수는 범위 밖으로 이동하면 스택에 할당된 변수는 소멸됨- 힙(heap) 영역
- 프로세스 실행 중에 동적으로 메모리를 할당 및 해제하기 위해 사용됨
- malloc() 과 free() 함수를 사용하여 동적으로 메모리를 할당하고 해제함


- 프로세스를 복사하는 함수
- 실행 중인 프로세스는 부모 프로세스가 되고 이 프로세스를 복사한 것은 자식 프로세스가 됨
- 부모 프로세스와 자식 프로세스의 코드, 데이터, 힙, 스택 영역은 모두 같음
- 부모 프로세스와 자식 프로세스의 PCB는 아래의 정보만 다르고 모두 같음
-> PID, PPID, CPID
-> 메모리 관련 정보(자식 프로세스는 메모리에서 부모 프로세스와 다른 위치에 생성되기 때문임)

- 프로세스에서 프로그램(실행파일, 유틸리티, 명령어)을 실행하도록 하는 함수
- 프로세스에서 PCB는 변경되지 않고 프로그램을 실행시키기 위해 코드, 데이터, 힙, 스택영역이 변경됨

- 자식 프로세스의 실행이 완료되면 자식 프로세스가 사용한 자원을 부모 프로세스가 회수함
- 그러나, 아래의 경우 부모 프로세스는 자식 프로세스의 자원을 회수하지 못함
- 자식 프로세스보다 부모 프로세스가 먼저 종료된 경우
- 자식 프로세스가 비정상적으로 종료된 경우- 이러한 경우, 자식 프로세스는 종료되었으나 프로세스에 대한 자원이 사라지지 않고 남아있는 좀비 프로세스(zombie process 또는 defunct process)가 됨
- 부모 프로세스가 먼저 종료된 경우 발생하므로 고아 프로세스(orphan process)라고도 함
- 좀비 프로세스는 kill 명령어를 이용하여 종료시켜야 함

- 프로세스 내에서 실행되는 흐름의 단위
- 프로세스에서 실질적인 작업 실행은 스레드에 의해 이뤄짐- 한 프로세스 내의 메모리를 공유함
- 싱글 스레드(single thread): 한 프로세스에서 하나의 스레드를 가지고 실행하는 방식
- 멀티 스레드(multithread): 한 프로세스에서 둘 이상의 스레드를 동시에 실행하는 방식


Pointer
- 준비상태(ready state)의 준비 큐(ready queue)와 대기상태(waiting state)의 대기 큐(waiting queue)내에서 다음 프로세의 TCB를 가리키는 포인터로 사용됨
Thread state
- 생성(new), 준비(ready), 실행(running), 대기(waiting), 종료(terminated) 상태
Thread number (TID)
- 프로세스 내의 여러 스레드를 구분하기 위해 사용됨
Program counter (PC)
- 다음에 실행될 명령어의 주소 또는 코드의 행 번호가 저장됨
Register
- 스레드가 실행되는 중에 사용하던 register 값이 저장됨
- 싱글 스레드를 이용한 순차 프로그램
- 하나의 코어에서 하나의 스레드를 통해 실행됨
- 2개의 코어를 가진 CPU에서 ½의 자원만 사용하는 것이고 4개의 코어를 가진 CPU에서 ¼의 자원만 사용하는 것- 멀티 스레드를 이용한 병렬 프로그램
- 2개의 코어를 가진 CPU에서 2개의 스레드를 생성하면 병렬 구간의 데이터 처리량은 2배로 증가하여 처리시간은 ½로 감소할 수 있음
- 4개의 코어를 가진 CPU에서 4개의 스레드를 생성하면 병렬 구간의 데이터 처리량은 4배로 증가하여 처리시간은 ¼로 감소할 수 있음

- 공통점: 양쪽 모두 한 프로그램이 여러 흐름으로 동시에 실행됨
- 차이점
- 멀티 프로세스
-> 각 프로세스는 독립적으로 실행되며 각각 별개의 메모리를 차지하고 있음
-> Distributed-memory 방식
-> 구현방법: MPI를 이용한 병렬 프로그래밍
- 멀티 스레드
-> 각 스레드는 독립적으로 실행되지만 한 프로세스 내의 메모리를 공유함
(공유 변수를 여러 스레드가 동시에 참조하거나 쓰기를 실행하기 때문에 문제가 발생할 수 있음)
-> Shared-memory 방식
-> 구현방법: 윈도우의 CreateThread, 리눅스의 pthread, OpenMP를 이용한 병렬 프로그래밍
