- 하나의 프로그램이 여러 프로세스를 가질 수 있다.
- 하나의 프로세스로 여러 프로그램을 실행할 수 있다.
- 프로그램과 프로세스는 일대일 관계가 아니다.
- 실행 속도: Multiprocess < Multithread
- Thread는 프로세스 하나에 포함된 것이다.
Process and Threads
- Unit of Scheduling/Execution
- Unit of Resource Ownership
- 위 2가지 특성은 OS 에 의해 독립적으로 처리된다.
- Thread -> Dispatching 의 단위
- Process -> 자원 할당의 단위
- Thread는 프로세스의 자원을 공유하여 사용할 수 있다.
Multithread Environment
- Process
- 자원 할당과 Protection 의 단위
- 프로세스 이미지가 저장되는 가상 주소 공간
- Protected access to processors, other processes, files, and I/O resources
- Thread
- 실행의 단위로, 실행 상태를 가지고 있다.
- Running 상태가 아닐 때 Thread context 를 저장한다.
- Thread마다 실행되는 함수가 다르므로 각 Thread 마다 실행 스택을 가지고 관리한다.
- 지역 변수에 대한 정적 저장 공간을 별도로 관리한다.
- Thread가 포함된 프로세스의 메모리와 자원을 다른 Thread와 공유한다.
Multithreaded Process Model
- TCB + PCB = PCB
- PCB: Process Identification + Process Control Information 의 자원 관련 정보
- TCB: Processor State Information + Process Control Information 의 실행 관련 정보

- Benefits of Threads
- 새로운 프로세스를 생성하는 것보다 새로운 Thread를 생성하는 것이 시간이 적게 걸린다.
- 프로세스보다 Thread를 종료하는 것이 시간이 적게 걸린다.
- 동일 프로세스 내에서 Thread switching을 하는 데에 시간이 짧게 걸린다.
- 동일 프로세스 내의 Thread 들이 서로 데이터를 공유하기 때문에, OS 의 개입 없이 통신이 가능하다.
- Thread State
- Spawn: 새로운 Thread 생성
- Ready
- Running
- Blocked
- Finish
- 동일한 프로세스 내의 모든 Thread 들은 같은 주소 공간을 공유하기 때문에 Suspend 는 프로세스 단위의 상태이다.
- 프로세스가 종료되면 모든 Thread 도 종료된다.
- Suspend 종류에 따라 Thread 전체(프로세스)가 Suspend 될 수 있고, Thread 하나만 Suspend 될 수 있다.
- User-level threads
- User Space 의 Threads Library 를 통해 Thread 관련한 모든 작업이 가능하다.
- Thread switching 에 커널 모드가 불필요하다.
- User-level 에서는 여러 개의 Thread 가 실행되고 있지만 커널 입장에서는 하나의 프로세스가 실행된다고 인식한다.
- 어떤 OS 에서든지 실행될 수 있다.
- 사용자 수준에서 스케줄링 제어가 가능하다.

- Kernel-level threads
- 커널에 의해 모든 Thread 관리 작업이 처리된다.
- 커널이 같은 프로세스 내의 Thread 들을 여러 프로세서에게 동시에 스케줄링시키는 것이 가능하다.
- 한 Thread 가 Blocked 되어도 다른 Thread 는 스케줄링 될 수 있다.
- Thread 간의 switching 도 커널에 의해 수행되어 User-level 보다 cost 가 크다.
- OS 자체가 Multithread 로 동작할 수 있다.

- Combined Approaches for Threads
- User-level 에서 몇 개의 Thread 를 생성하는지에 상관 없이 실제로 동시에 실행시키는 Thread 들만 Kernel-level Thread 로 매핑한다.
- 필요한 만큼의 Kernel-level Thread 를 유지하고 불필요한 User-level Thread 생성을 방지한다.

Windows: Kernel-level Thread
- Process and Thread
- 프로세스와 Thread 가 오브젝트로 구현된다.
- 프로세스는 새로운 프로세스나 기존의 프로세스를 복사한 형태로 생성될 수 있다.
- 모든 프로세스는 하나 이상의 Thread 를 포함하고 Thread 가 다른 Thread 를 생성할 수 있다.
- Thread 는 dispatching 의 단위이다.
- 프로세스와 Thread 모두 동기화 기능을 보유한다.
- Process Attributes (major)
- Base priority: 프로세스에 속한 Thread 의 최소 우선선위 값
- Default processor affinity: Thread 가 실행될 수 있는 프로세서의 기본값
- Thread Attributes (major)
- Thread context: Thread 실행을 중단했을 때 저장할 레지스터 값들
- Base priority: 프로세스의 Base priority 값을 상속 받는다.
- Dynamic priority: 상황에 따른 우선순위 값
- Thread States Diagram
- Ready -> Standby -> Running
- Running -> Ready: Timeout, 우선 순위 밀림
- Waiting: Block, Suspend(Swapping X)
- Waiting -> Ready: I/O 작업 종료, Resource Available
- Waiting -> Transition: Resource Unavailable
- Thread 가 포함된 프로세스가 swap out 되어 하드디스크에 존재할 때 transition 으로 상태가 전이된다.

Solaris: User-level Thread + Kernel-level Thread
- Process and Thread
- User thread 는 커널이 만든 Lightweight process 와 매핑된다.
- Lightweight process 는 kernel thread 와 매핑되어 실행된다.
- Lightweight process 와 매핑되지 않은 kernel thread 는 OS 작업을 수행한다.
- State Diagram
- IDLE: Lightweight process 와 매핑되지 않은 상태
- RUN: Lightweight process 와 매핑된 후 Ready 상태
- ONPROC: Running
- SLEEP: Blocked
- STOP: Thread suspend
- ZOMBIE: 실행 종료 후 부모 프로세스에게 정보 전달 외에 모든 작업을 마친 상태
- FREE: 종료
- PINNED: interrupt 가 발생했을 때 실행 중이던 프로세스를 특정 프로세서에게 꽂아둔 상태
- 불필요한 프로세스 switching 이나 캐싱을 안해도 된다.
- 멀티 프로세서 시스템에서는 캐싱 중요!

Linux: Multithread?
- Task
- 프로세스와 Thread 를 서로 구분하지 않고 Task 로 통일한다. 프로세스 개념에 더 가깝다.
- 상태, 스케줄링 정보, Identifier, IPC 등의 정보를 가진다.
- Thread
- Linux 는 Thread 와 프로세스 사이의 차이를 인식할 수 없다.
- User-level Thread 는 Kernel-level 프로세스로 매핑된다.
- 새로운 프로세스는 기존의 프로세스를 복사하여 생성된다. (= Task 생성)
- 새로운 프로세스는 클론 명령으로 생성될 수 있는데, 이 방식으로 생성된 Task 는 모든 자원을 공유한다.
- 클론 명령은 각 프로세스에게 개별적 스택과 PCB 를 제공한다.
- State Diagram
- Executing: Running
- Stopped: Suspend
- Zombie: Exit
- Interruptible: 이벤트 발생 뿐만 아니라 시그널을 통해 Ready 로 전환 가능하다.
- Uninterruptible: 이벤트에 의해서만 Ready 로 전환 가능하다.
