> For the complete documentation index, see [llms.txt](https://real-dev.gitbook.io/real-library/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://real-dev.gitbook.io/real-library/os_with_joonion/7-.-thread.md).

# 7강. Thread의 이해

* 쓰레드 개념이 도입되면, CPU를 점유하는 가장 작은 단위가 프로세스가 아닌 쓰레드로 변화하게 됨
* 프로세스 안에 여러 개의 쓰레드가 존재한다면 PID → TID가 CPU를 점유함
* 멀티 쓰레드 컨트롤을 위해선 동일한 코드, 데이터, 파일 영역을 공유하고, 개별적인 레지스터 스택, PC 영역을 갖는다. 따라서 동일한 작업이 멀티 프로세스로 수행되는 것보다 경량으로 동작할 수 있다.

### 멀티 쓰레드 장점

* 반응성이 좋다. Blocking이 강제되지 않음
* 자원 공유: 쓰레드는 code, data 영역을 공유하기 때문에 shared memory 같은 영역이 없어도 된다. 리소스를 공유하기 편함
* 경제성이 좋다. 쓰레드 스위칭이 컨텍스트 스위칭보다 빠르다.
* 확장성이 좋다.

<br>

#### Java 멀티 쓰레드 특징

* Thread, Runnable, Lambda를 사용하여 실행할 수 있다.
* Thread.join() 을 사용하여 자식 쓰레드의 동작이 종료될 때까지 부모 쓰레드의 동작을 제한할 수 있다.
* Thread의 종료는 stop()이 아닌 interrupt()를 통해 수행한다. stop()은 쓰레드가 점유하는 자원에 대한 해소 없이 즉시 쓰레드를 종료하기 때문에 Deprecated되었다.

<br>

#### 멀티 쓰레드 프로그래밍의 도전과제

* 독립적인 N개의 작업으로 분할하기
* 각 쓰레드 별로 할당되는 작업량의 균형을 맞추기
* CPU 코어에 따른 데이터 분할
* 데이터 독립성을 확인하고 동기화하기
* 테스트와 디버깅의 난이도 증가

<br>

#### 암달의 법칙

* 코어는 무조건 많으면 좋은가?
* 병렬처리가 불가능한 작업의 비율이 높아질수록 코어가 많아지더라도 효율 증가폭이 감소한다.
* 즉, 무조건 많은게 좋은 것은 아니고 트레이드오프가 존재한다.
