# Thread와 Process의 차이는 무엇인가요?

* [쓰레드와 프로세스](https://github.com/genesis12345678/TIL/blob/main/OS/process/process.md#process---%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4)는 컴퓨터의 작업을 분리하여 수행하는 단위이다.
* **프로세스는** 메모리 상에서 실행 중인 프로그램을 말하며, **쓰레드**는 이 프로세스 안에서 실행되는 흐름 단위를 말한다.
* **프로세스**는 **최소 하나의 쓰레드**를 보유하고 있으며, 각각 별도의 주소공간을 **독립적**으로 할당 받는다.(`code`, `heap`, `data`, `stack`)
* **쓰레드**는 이 중에 **stack**만 따로 할당 받고 나머지 영역은 쓰레드끼리 공유한다.

**프로세스는 자신만의 고유 공간과 자원을 할당 받아 사용하는 것이고, 쓰레드는 다른 쓰레드와 공간과 자원을 공유하면서 사용하는 것이다.**

> **꼬리 질문**
>
> * **프로세스의 단점**
>   * 프로세스는 자신만의 고유 공간과 자원을 사용하기 때문에 생성할 때 많은 시간이 소요되고, 프로세스 사이에 통신이 어렵다.
>   * [프로세스 컨텍스트 스위칭](https://github.com/genesis12345678/TIL/blob/main/OS/PCB_and_ContextSwitching/pcb.md#pcb--context-switching)이 비율적이고, 오버헤드가 크다.
> * **쓰레드 출현 목적**
>   * 프로세스의 단점을 보완하기 위해서 출현
>   * 프로세스의 생성 및 소멸에 따른 오버헤드 감소와 빠른 컨텍스트 스위칭, 프로세스간 통신시간과 방법을 해소하기 위해서이다.
>   * **맹목적으로는 프로세스보다 크기가 작은 실행 단위가 필요했던 부분도 있다.**

## Threading와 Processing을 각각 어떤 상황에서 해야 하나요?

* `Threading`은 작업이 많은 상황에서 사용되어 병렬 처리와 작업 순차적 수행을 가능하게 한다.
* `Processing`은 메모리와 자원이 많이 필요한 상황에서 사용되어 메모리 공간과 자원을 분리하여 사용할 수 있게 한다.

## Thrashing 이란 무엇인가요?

* `Thrashing`은 메모리 관리 부족으로 인해 메모리에 페이지 부재(=페이지 폴트(`Page fault`))율이 높아지면서 시스템의 성능이 급격히 저하되는 현상을 말한다.
* 일반적으로 컴퓨터 시스템은 한정된 양의 물리적인 `RAM`을 사용하여 메모리를 관리하고, 프로그램이 실행되면 메모리에서 페이지로 나뉘어져서 로드되고 실행된다.
* 그러나 메모리 부족 상황에서는 시스템이 페이지 폴트를 발생시켜서 메모리를 할당하려고 할 때, 필요한 페이지가 물리적 메모리에 없어서 디스크로부터 읽어오게 된다.
* `Thrashing`이 발생하면 페이지 폴트가 지속적으로 발생하고, CPU는 페이지 폴트를 처리하느라 대부분의 시간을 소비하게 된다.
* 따라서 실제 작업에 필요한 계산이 제대로 이루어지지 못하게 되어 시스템의 성능이 급격히 저하된다.
* `Thrashing`을 방지하기 위해서는 메모리 사용량을 모니터링하고, 메모리 사용량이 증가할 때 적절히 대응하는 것이 중요하다.(메모리 추가 할당, 적당한 알고리즘 선택 등)
