프로세스 내부에서 실행 흐름을 분할한 단위를 말한다.
같은 프로세스 내부에서 여러 스레드가 실행되므로, 코드, 데이터, 힙(Heap) 등은 공유하지만 스택(Stack)은 스레드마다 별도로 유지된다.
각 스레드는 정확히 하나의 프로세스에 속하며, 프로세스 외부에 스레드가 존재할 수 없다.
각 스레드는 별도의 제어 흐름을 나타낸다.
하나의 프로세스가 다수의 스레드를 가질 수 있으며, 이를 ‘멀티스레딩(Multi-threading)’이라고 한다.
아래 이미지는 단일 스레드 및 멀티스레드 프로세스의 작동을 보여준다.

| 프로세스 | 스레드 |
|---|---|
| 프로세스가 무겁거나 리소스를 많이 소모한다. | 스레드는 가벼워서 프로세스보다 리소스를 덜 사용한다. |
| 프로세스 전환에는 운영 체제와의 상호 작용이 필요하다. | 스레드 전환은 운영 체제와 상호 작용할 필요가 없다. |
| 여러 처리 환경에서 각 프로세스는 동일한 코드를 실행하지만 각자의 메모리와 파일 리소스를 갖는다. | 모든 스레드는 동일한 열린 파일 집합과 자식 프로세스를 공유할 수 있다. |
| 한 프로세스가 차단되면 첫 번째 프로세스의 차단이 해제될 때까지 다른 프로세스는 실행될 수 없다. | 한 스레드가 차단되어 대기하는 동안 동일한 작업에 있는 두 번째 스레드가 실행될 수 있다. |
| 스레드를 사용하지 않는 멀티 프로세스는 더 많은 리소스를 사용한다. | 멀티 스레드 프로세스는 더 적은 리소스를 사용한다. |
| 멀티 프로세스에서 각 프로세스는 다른 프로세스와 독립적으로 작동한다. | 한 스레드는 다른 스레드의 데이터를 읽고, 쓰고, 변경할 수 있다. |
스레드는 다음 두 가지 방법으로 구현된다.
사용자 수준 스레드는 커널이 아닌, 사용자 공간(Application 영역)의 라이브러리나 런타임에서 직접 스레드를 생성·관리하는 방식이다.
사용자 수준 스레드는 스레드 관리 커널에서 스레드의 존재를 인식하지 못한다.

커널 수준 스레드는 운영체제 커널이 직접 스레드를 생성하고 스케줄링(관리)하는 방식이다.
각 스레드는 커널의 스케줄러에서 개별적인 실행 단위로 인식된다. 따라서 운영체제는 여러 코어(멀티코어 CPU)를 사용할 때, 스레드를 병렬로 실행할 수 있다.

| 사용자 수준 스레드 | 커널 수준 스레드 |
|---|---|
| 사용자 수준 스레드는 만들고 관리하는 것이 더 빠르다. | 커널 수준 스레드는 생성하고 관리하는 데 시간이 더 걸린다. |
| 구현은 사용자 수준의 스레드 라이브러리를 통해 이루어진다. | 운영체제는 커널 스레드 생성을 지원한다. |
| 사용자 수준 스레드는 일반적이며 모든 운영 체제에서 실행될 수 있다. | 커널 수준 스레드는 운영 체제에 따라 다르다. |
| 멀티스레드 애플리케이션은 멀티프로세싱의 이점을 활용할 수 없다. | 커널 루틴 자체도 멀티스레드가 될 수 있다. |
참고자료
tutorialspoint