# MultiThread

## 멀티 쓰레드 프로그래밍의 장점은 무엇인가요?

* 프로세스를 이용하여 동시에 처리하던 일을 쓰레드로 구현할 경우 **메모리 공간과 시스템 자원 소모가 줄어들게 된다.**
* 쓰레드 간의 통신이 필요한 경우에도 별도의 자원을 이용하지 않고, **전역 변수의 공간 또는 동적으로 할당된 공간인 `Heap` 영역을 이용하여** 데이터를 주고 받을 수 있다.
* 때문에 프로세스 간 통신 방법에 비해 쓰레드 간의 통신 방법이 훨씬 간단하다.
* 쓰레드의 `context switch`는 프로세스의 `context switch` 와는 달리 **캐시 메모리를 비울 필요가 없기 때문에** 더 빠르다.
* 따라서 시스템의 성능이 향상되고, 자원 소모가 줄어들며 프로그램의 응답 시간이 단축된다.
* 이러한 장점 때문에 여러 프로세스로 할 수 있는 작업들을 하나의 프로세스에서 여러 쓰레드로 나눠 수행하는 것이다.

**정리**

* **사용자의 반응을 향상시킨다.**(응답성이 좋다.)
  * 하나의 프로세스에 여러 쓰레드를 생성하여 쓰레드에 각기 다른 작업을 하게 함으로써 특정 작업을 하면서도 사용자로부터 명령을 입력받게 할 수 있다.
* **프로세스 내 리소스를 공유하여 경제적이다.**(자원공유를 효율적으로 할 수 있다.)
* 작업이 분리되어 코드가 간결해진다.

\\

## 멀티 쓰레드 프로그래밍의 단점은 무엇인가요?

* 멀티 프로세스 기반으로 프로그래밍할 때는 **프로세스 간 공유하는 자원이 없기 때문에 동일한 자원에 동시에 접근하는 일이 없다.**
* 하지만, 멀티 쓰레딩을 기반으로 프로그래밍할 때는 이 부분을 신경써줘야 하는데, 서로 다른 쓰레드가 **힙 영역을 공유하기 때문에** 어떤 쓰레드가 다른 쓰레드에서 사용중인 변수나 자료구조에 접근하여 예상치 못한 값을 읽어오거나 수정할 수 있다.
* 때문에 멀티 쓰레딩 환경에서는 **동기화 작업**이 필요하다.
* 동기화를 통해 작업 처리 순서를 제어하고 **공유 자원에 대한 접근을 제어**하는 것이다.
* 하지만 이로 인해 **병목현상**이 발생하여 성능이 저하될 수 있으므로, 과도한 락으로 인한 병목현상을 줄여야 한다.

**정리**

* 구현하기 어렵고, 테스트와 디버깅이 어렵다.
* 전체 프로세스에 영향을 줄 수 있다.
* 성능 저하가 동반된다.
* [동기화 작업](https://github.com/genesis12345678/TIL/blob/main/interview/os/11_20/Sync.md)이 필요하다.
* [교착상태](https://github.com/genesis12345678/TIL/blob/main/interview/os/1_10/DeadLock.md)가 발생하지 않도록 주의해야 한다.
