자료 출처 : HPC Lab 운영체제 강의 + 구글링
프로세스는 실행중인 프로그램이라고 정의할 수 있다.
맥에서 활성 상태 보기에 들어가면 이렇게 프로세스를 볼 수 있다.

프로그램
프로세스
PCB는 프로세스 생성시 생성된다.
각 프로세스들에 대한 중요한 정보를 관리하며, 커널공간 내부에 존재한다.
운영 체제는 PCB를 통해 프로세스를 제어하고 스케줄링한다.
참고 - PCB 정보는 OS마다 조금 다르다.

자원(Resource)
커널의 관리 하에 프로세스에게 할당/반납 되는 수동적 개체
H/W resource -> processor, memory, keyboard...
S/W resource -> Message, signal, files ...

프로세서 외에 다른 모든 자원을 할당 받은 상태
Dispatch
준비 → 실행 : 우선순위가 높은 프로세스 선정하여 명령어 실행
프로세서와 필요한 자원을 모두 할당 받은 상태
Preemption(Time out)
실행 → 준비 : 클럭이 인터럽트를 발생시켜 제어권을 빼앗음(Preemption, 독점 방지)
Block / Sleep
실행 → 대기 : 프로세서가 입출력, 자원 등을 기다리기 위해 대기로 전환
Wake Up
대기 → 준비 : 입출력이 완료되거나 자원이 할당되어 다시 실행
메모리를 할당 받지 못한(빼앗긴) 상태
커널 또는 사용자에 의해 발생
Swap-out(Suspended)
준비(대기) 상태에서 기억 장치를 반납하고 지연 준비(지연 대기) 상태로 전이
Swap-in(Resume)
지연 준비(지연 대기) 상태에서 기억 장치를 할당받아 준비(대기) 상태로 전이
프로세스 수행이 끝난 상태
모든 자원 반납 후, 커널 내에 일부 PCB 정보만 남아있는 상태
예상치 못한, 외부에서 발생한 이벤트
I/O interrupt
Clock interrupt
Console interrupt
Program Check interrupt
Machin check interrupt
...
Context
프로세스와 관련된 정보들의 집합
현재 프로세스의 레지스터 Context를 저장하는 작업
레지스터 Context를 프로세스로 복구하는 작업
두 작업을 합치면 Context Switching이 된다.
즉 실행중인 프로세스의 Context를 저장하고,
앞으로 실행 할 프로세스의 Context를 복구하는 일
이러한 Context Switching은 자주 발생하기 때문에
OS의 성능에 큰 영향을 준다.
따라서 불필요한 Context Switching을 줄이는 것이 중요하다.
이때 스레드를 사용해 줄일 수 있다.
프로세스가 할당받은 자원을 이용하는 실행흐름의 단위
프로세스는 자원과 제어를 모두 독립적으로 가지고,
스레드는 자원을 같은 프로세스 내의 다른 스레드와 공유하지만 제어는 독립적으로 가진다.
스레드는 Single-thread와 Multi-threads가 있는데 아래의 그림은 멀티스레드..

사용자 응답성 : 일부 스레드의 처리가 지연되어도,
다른 스레드의 작업은 계속 처리 가능
자원공유 : 자원을 공유해서 효율성 증가 (커널의 개입을 피할 수 있음)
경제성 : 프로세스의 생성, Context Switch에 비해 효율적
멀티 프로세서 활용 : 병렬처리를 통한 성능 향상
식당(프로세스)을 운영하는데 직원(스레드)이 여러명 존재
직원1 -> 주방에서 요리
직원2 -> 서빙
직원3 -> 계산
만약에 직원(스레드)가 하나뿐이라면..
모든 업무를 혼자서 수행해야하기에 매우 비효율적이다.
스레드에는 User Thread와 Kernel Thread가 있다.
사용자 영역의 스레드 라이브러리로 구현된다.
스레드의 생성, 스케줄링 ...
커널은 스레드의 존재를 모른다.
즉 커널의 개입을 받지 않기 떄문에 생성과 관리의 부하가 적고 유연한 관리가 가능하다. 또한 이식성이 높다
커널이 각 스레드를 개별적으로 관리하기 때문에 프로세스 내 스레드들이 병행 수행 가능하다.
OS가 직접 관리, 커널 영역에서 스레드의 생성/관리를 수행하기 때문에 오버헤드가 크다.
다대일(n:1) 모델 - 사용자 수준 스레드
일대일(1:1) 모델 - 커널 수준 스레드
다대다(n:m) 모델 - 혼합형 스레드
n개의 사용자 수준 스레드 - m개의 커널 스레드(n>m)
사용자는 원하는 수만큼 스레드를 사용할 수 있다.
커널 스레드는 자신에게 할당된 하나의 사용자 스레드가 block 상태가 되어도, 다른 스레드 수행 가능