Thread는 프로세스 내에서 실제로 작업을 수행하는 주체를 의미한다.
모든 프로세스에는 1개 이상의 Thread가 존재한다.
프로세스에 Thread가 1개 존재하면 Single-Threaded, 여러 개 존재하면 MultiTreaded라고 한다.
각각의 Thread는 별도의 레지스터와 스택을 가지고 있지만, Heap 메모리는 서로 읽고 쓸 수 있다.
Thread 사이에서도 Switching이 일어나므로(Thread Switch),
Switching 직전의 상태를 저장하기 위해 각자의 레지스터를 사용한다.
또한, Thread 사용 시 임시 정보를 저장하기 위해 Stack을 사용한다.
Thread를 생성 및 제거하기 위해서는 별도의 레지스터와 스택만 만들거나 삭제하면 되므로,
프로세스 생성 및 제거에 비해 시간이 적게 걸린다.
Thread Switch와 Process Switch를 비교했을 때와 Thread, Process 간의 Communication의 경우에도 Thread가 시간이 더 적게 걸린다.
이는 Thread가 프로세스 내부의 데이터를 공유하기 때문이다.
User level Thread란 쓰레드를 생성할 때,
User space에 존재하는 Thread library를 포함해서 컴파일하고 실행함으로써 User space에서 쓰레드를 생성하는 방법을 말한다.
이 방법은 Kernel level Thread에 비해 빠르다는 장점이 있다.
그러나 만약 여러 개의 쓰레드를 User level Thread로 생성한다면,
Kernel 입장에서는 하나의 쓰레드로 인식하기 때문에 하나의 Thread에서 blocked가 발생했을 때 전체 프로세스를 blocked 시키게 된다.
Kelrnel level Thread란 쓰레드를 생성할 때,
Kernel space에서 생성하는 방법을 말한다.
이 방법에서는 Kernel에서 Thread를 생성하기 때문에,
mode Change를 통해 Thread를 생성해야 하므로 속도가 느리다는 단점이 있다.
그러나 Kernel 입장에서 각각의 쓰레드를 따로 인식하기 때문에,
하나의 쓰레드에서 Blocked로 상태가 변경되더라도 다른 쓰레드들은 영향을 받지 않는다.
Race Condition은 둘 이상의 입력 또는 조작의 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태이다.
Race Condition이 발생하게 되면 예기치 못한 결과가 일어날 수 있으므로, 이를 지양해야 한다.
Race Condition을 예방하는 방법 중 하나로는 Mutual Exclusion이 있다.
Mutual Exclusion (상호 배체)는 하나의 프로세스가 공유 리소스에 접근하고 있을 때, 다른 프로세스가 해당 리소스에 동시에 접근할 수 없게 하는 것을 의미한다.
프로세스가 공유 리소스에 접근하게 되는 코드를 Critical Section이라고 하며,
개발자는 Race Condition을 예방하기 위해 Critial Section에 Mutual Exclusion을 잘 구현해야 한다.