Light weight process라고도 불린다.
각기 고유의 Stack, Counter, Register set을 가지는 실행 단위이다.
Thread가 실행되면 각기 고유의 Counter, Stack, Register set을 참조해 프로세스를 실행한다.
아래 그림을 보자.
좌: 프로세스 / 우: 쓰레드의 그림으로 보면 된다.
Thread는 Process 내에 존재하며, 해당 Process에 속한다.
다시 말해, 몇 가지 고유의 영역을 제외하면 해당 Process의 Code (Text), Data (.data, .bss, Heap memory), File descriptors를 그 Process에 속하는 Threads 사이에 공유한다.
장점
- 성능: 프로그램의 전체 성능(처리량, 계산 속도, 응답성)을 향상시킴.
- 리소스 공유: 모든 프로세스의 메모리와 리소스를 공유할 수 있으므로 모든 애플리케이션이 동일한 주소 공간 내에서 여러 활동을 수행할 수 있음.
- 멀티 프로세서 구조의 활용: 서로 다른 스레드가 서로 다른 프로세서에서 병렬로 실행될 수 있으므로 멀티 프로세서를 최대한 효율적으로 사용할 수 있음.
- 컨텍스트 스위칭 시간 감소: 스레드는 프로세스 내에서 동작하므로 컨텍스트 스위칭 시간을 최소화하고 가상 메모리 공간은 동일하게 유지.
- 병렬성: 병렬 프로그래밍 기술을 구현하기가 더 쉬움
- 멀티 프로세싱은 처음 구조를 잡을 때 만들어야 하지만, 멀티 쓰레딩은 프로그램의 일부 동작에서만 사용하도록 하는 일부의 코드 수정으로 가능하기 때문
- 간결성: 작업이 분리되어 코드가 간결해 짐.
단점
- 스레드 중 한 스레드만 문제가 있어도 전체 프로세스가 영향을 받음
- 멀티 프로세스
- 멀티 쓰레드
- 스레드 많이 생성 시, 시스템에 따라 (e.g. Linux) 컨텍스트 스위칭이 많이 일어나 성능 저하
- 동기화 이슈로 Running condition 발생 가능 : 동기화 코드를 추가해줘야 함 (Mutual exclusion, Semaphore)
User-level Thread
Kernel-Level Thread
프로세스1이 자원1을 할당 받은(lock) 상태에서 자원2의 활용 가능 상태를 기다리고 있는데,
프로세스2는 자원2를 할당 받은 상태에서 자원1의 활용 가능 상태를 기다리고 있다면
어느 하나가 할당 받은 자원을 unlock하지 않는 이상 이 상태는 영영 끝이 나지 않는다.
이 상황을 Deadlock이라고 한다.
Deadlock은 다음의 4가지 조건이 동시에 성립하면 발생할 수 있다.
그렇기 때문에, Deadlock 발생을 억제하려면 위 4가지 조건 중 하나를 제거하면 된다. 하지만 Mutual Exclusion를 제거하면 동기화 이슈가 발생해서 곤란하고, Circular form은 강제적으로 없애기엔 너무 억지스럽고 프로그램 설계를 정교하게 하는 방법이 최선이다. 그래서 보통 2가지 방법이 해결책으로 등장하는데,
이 외에도 Deadlock 방지법으로 Banker's Algorithm이라는 것이 있다.
하지만,
등의 이유 때문에 현실적인 적용이 어려워 현재 채택하고 있지는 않다.
아무튼 알아는 보자.
Maximum: 각 프로세스가 작업을 마치기 위해 필요한 총 자원 수
Allocated: 현재 각 프로세스에 할당 된 자원 수
Needed: 작업을 마치기 위해 각 프로세스가 필요한 자원 수 (Maximum - Allocated)
Available: 시스템이 프로세스에 할당 가능한 자원 수
Banker's Algorithm의 목적은 적어도 하나의 프로세스가 작업을 끝마치기 위해 필요한 자원은 시스템이 항상 보유하고 있게 하는 것이다.
위 목적이 성립 된 상태를 안정 상태,
그렇지 못한 상태를 불안정 상태라고 한다.
그래서 위 표를 보면 프로세스 0의 Needed보다 Available이 크므로 안정 상태라고 할 수 있다.
Banker's Algorithm은 다음 두 조건 하에서 자원 할당을 허용한다