컴퓨터에서 실행되고 있는 프로그램.
CPU 스케줄링의 대상이 되는 Task를 의미.
프로세스 내 작업의 흐름
프로그램 - 컴파일러가 컴파일 과정을 거쳐 기계어로 번역되어 실행될 수 있는 파일
소스 코드 파일 - 전처리 - 컴파일러 - 어셈블리어 - 어셈블러 - 링커
전처리
소스 코드의 주석을 제거하고 #include 등 헤더 파일을 병합.
컴파일러
오류 처리, 코드 최적화 작업 후 코드를 어셈블리어로 변환
어셈블러
어셈블리어로 변환한 코드를 object code로 변환.
링커
프로그램 내 라이브러리 또는 다른 object code와 결합하여 실행 파일 제작
+) 정적 라이브러리와 동적 라이브러리
정적: 프로그램 빌드 시 라이브러리 모든 코드를 실행 파일에 넣음 (외부 의존도, 메모리 효율성 낮음)
동적: 프로그램 실행 시 필요할 때만 함수를 참조(외부 의존도 높고 메모리 효율성 좋음)

생성 상태
프로세스가 생성된 상태
fork(): 부모 프로세스 주소 공간 복사해 자식 프로세스 생성
exec(): 새로운 프로세스 생성
대기 상태
메모리 공간이 충분하면 할당받고 아니면 대기하는 상태(CPU 소유권 기다림)
대기 중단 상태
메모리 부족으로 일시 중단된 상태
실행 상태
CPU 소유권과 메모리를 할당받고 작업을 수행 중인 상태.
CPU burst 일어났다고도 한다.
중단 상태
어떤 이벤트가 발생한 후 기다리며 프로세스가 차단된 상태.
I/O 디바이스 인터럽트에 의해 주로 발생함
일시 중단 상태
대기 중단과 유사하나, 중단된 상태에서 재실행하려 했으나 메모리가 부족한 상태
종료 상태
메모리와 CPU 소유권을 모두 놓고 가는 상태. 자발적 종료와 비자발적 종료(부모 프로세스가 자식 프로세스 강제로 종료)가 있음.

PCB(Process Control Block): 프로세스에 대한 메타데이터를 저장한 데이터.
프로그램 실행되면 프로세스 생성 - 메모리 할당 - PCB 생성해 관리 (커널)
PCB의 구조
컨텍스트 스위칭
PCB를 교환하는 과정으로 프로세스 할당된 시간 끝나거나 인터럽트에 의해 발생
어떠한 시점에서 실행되고 있는 프로세스는 하나이며 (싱글코어 기준) 빠른 속도로 컨텍스트 스위칭이 발생함

여러 개의 프로세스, 즉 동시에 두 가지 이상의 일을 수행할 수 있는 것.
하나 이상의 일을 병렬로 처리할 수 있으며 프로세스 중 일부에 문제가 생겨도 다른 프로세스로 처리 가능해 신뢰성 높음
ex) 웹 브라우저
IPC - 프로세스끼리 데이터 주고받고 공유 데이터 관리하는 매커니즘
ex) 공유 메모리, 메시지 큐, 소켓, 익명 파이프, 명명 파이프 등
스레드 - 프로세스의 실행 가능한 가장 작은 단위. 코드, 데이터, 스택, 힙 영역을 각각 생성하는 프로세스와 달리 스레드를 서로 공유함.
멀티 스레딩 - 프로세스 내 작업을 여러 개의 스레드로 처리하는 기법.
장점: 자원 효율성 높고 한 스레드 중단되어도 다른 스레드로 처리 가능
단점: 한 스레드에 문제 생기면 다른 스레드에도 영향 - 프로세스에 영향
공유 자원 - 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 자원이나 변수
경쟁 상태 - 공유 자원을 두 개 이상의 프로세스가 동시에 읽고 쓰는 상황
임계 영역 - 접근 순서 등의 이유로 결과가 달라질 수 있는 영역
해결 방법: 뮤텍스, 세마포어, 모니터.
조건
뮤텍스
공유 자원 사용 전에 설정하고 사용 후에 해제하는 잠금장치 역할.
하나의 잠금 상태만을 가짐
세마포어
일반화된 뮤텍스.
wait() - 자신의 차례까지 기다림.
signal() - 다음 프로세스로 순서 넘김.
모니터
공유 자원을 숨기고 해당 접근에 대한 인터페이스만 제공
상호 배제가 자동으로 됨(모니터 내부 큐에 작업 추가 방식)
교착 상태 - 두 개 이상의 프로세스들이 서로의 자원을 기다리며 중단된 상태
원인
해결 방법