스레드 Thread
CPU를 수행하는 단위

동일한 일을 하는 프로세스가 여러 개 있다고 하면, 별도의 주소공간을 사용하게 되어 메모리 낭비
같은 일을 하는 프로세스를 여러 개 띄울 경우 주소 공간을 하나만 사용하도록 하고, 각 프로세스마다 다른 부분의 code를 실행하도록 하는 것
각 스레드(=각 CPU 수행 단위)마다 현재 레지스터에 어떤 값을 넣고, 코드의 어느부분을 실행하는지 Program Counter에 별도로 유지
Thread의 구성(각 스레드가 독립적으로 갖고있는 것)
- program counter
- register set
- stack space
Thread 간 공유하는 부분(=task)
- code section
- data section
- OS resources
Thread = Lightweight process
- 프로세스를 별도로 두는 것보다, 프로세스 내부에 스레드를 여러 개 두는 것이 더 가볍다
- 전통적인 방식 = heavyweight process
Thread의 장점
- 다중 스레드로 구성된 태스크 구조에서는 하나의 서버 스레드가 blocked(waiting)상태일 때 동일한 태스크 내의 다른 스레드가 running되어 응답시간이 빠르다(빠른 응답성)
- 동일한 일을 수행하는 다중 스레드가 협력하여 높은 처리율과 성능 향상을 얻을 수 있다(자원 공유)
- 오버헤드가 큰 작업인 프로세스 생성, context switching에 비해 한 프로세스 안에서 thread를 만들고 thread들 간 CPU switching 작업은 오버헤드가 적다.(경제성=빠르다)
- 스레드를 사용하면 병렬성을 높일 수 있다; CPU가 여러개인 PC에서만 얻을 수 있는 장점. -> 각 스레드들이 서로 다른 CPU에서 병렬적으로 실행되어 결과를 빨리 얻을 수 있다.(멀티프로세서 환경에서 효율적)

- 각 스레드마다 프로세스가 가지고 있는 정보 중 CPU관련 정보만 별도로 갖게 된다.
Thread의 실행
1. Kernel Threads
- 운영체제 커널을 통해 지원된다
- 스레드의 스케줄링을 커널에서 관리
2. User Threads
- 라이브러리를 통해 지원된다
- 커널의 지원을 받지 않고 사용자의 수준에서 스레드를 구현
3. Realtime Threads