
스레드 (Thread) 란?
스레드는 프로세스 내에서 프로세스의 자원을 이용하여 실행되는 여러 흐름들의 단위가 되며,
프로세스 내에서 실제로 작업을 수행하는 주체이다.


프로세스 내에서 작업하는 주체가 스레드이므로, 밀접한 관계를 가지고 있다.
이전에 프로세스에 대해서 살펴보았을 때, 위 왼쪽 그림과 같이 프로세스는 4개의 메모리 영역을 할당받는데
이 할당받은 메모리 영역은 프로세스에서만 가지고 있으므로 독립적인 특성을 가진다.
그리고, 이러한 프로세스들의 작업이 동시에 실행될 수 있는데 (멀티 프로세싱),
프로세스 내에도 이런 식으로 여러 작업을 동시에 처리할 수 있도록 해주는 것이 스레드이다.
하나의 프로세스에는 하나 이상의 스레드가 존재할 수 있으며
다수의 스레드를 생성해 병렬처리 하는 것이 프로세스를 새로 생성하는 것보다 비용(메모리, 시간 등)이 저렴하다.
한 프로세스 내의 스레드들은 위 오른쪽의 그림과 같이 Code / Data / Heap 영역을 공유하면서 실행되고,
각 스레드 내에 Stack만 따로 할당 받는다.
여기서 프로세스와의 차이라면, 프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없는 반면,
(프로세스가 다른 프로세스의 자원에 접근하려면 IPC를 사용해야한다. ex. 파이프, 파일, 소켓 통신 등)
스레드는 프로세스 내의 다른 스레드들과 같은 공유자원들을 공유하며 실행된다는 것이다.
한 스레드가 프로세스 자원을 변경할 시, 다른 이웃 스레드들은 그 변경 결과를 즉시 볼 수 있다.
스레드의 구성
스레드는 크게 프로그램 카운터 / 레지스터 집합 / 스택 으로 구성이 되어 있다.
- 프로그램 카운터 (Program Counter) : 스레드가 다음에 실행할 명령어의 주소를 가리키는 포인터
- 레지스터 집합 (Register Set) : 스레드가 현재 실행되는 상태를 저장할 때 쓰는 용도
- 스택 (Stack) : 스레드에서 함수 호출 및 반환을 관리하는 용도
(추가로 스레드ID / 상태 / 우선순위 / 지역변수 등도 포함하고 있음.)
스레드의 특징
- 메모리 공유 (Shared Memory) : 위에서 언급한대로 Code / Data / Heap 영역을 공유하며 실행되는 특징이 있다.
- 경량성 (Lightweightness) : 프로세스에 비해 더 적은 자원을 사용하며, 프로세스 간 전환보다 스레드 간 전환이
더욱 빠르다. 또한 생성에서도 더 적은 메모리를 사용한다.
- 상호 협력성 (Cooperativeness) : 스레드는 다른 스레드와 상호 협력으로 작업 수행이 가능하다.
데이터를 자원 공유로써 주고 받으므로, 프로세스보다 더 높은 수준의 동시성을 제공하므로 협력성이 좋다.
멀티 프로세싱 vs 멀티 스레딩
멀티 프로세싱 (Multi-Processing)
: 다수의 프로세서가 협력하여 다수의 작업을 함께 처리.
하나의 프로세서가 고장이 나도 작업이 정지되지 않음.
각 프로세스가 각각 고유한 자원을 관리하고 있어 문제 발생시 영향이 확산되지 않음.
IPC라는 어렵고 복잡한 통신 기법이 있어야 프로세스간 통신이 되며, 프로그램 응답 시간이 길다.
멀티 스레딩 (Multi-Threading)
: 하나의 프로세스를 다수의 스레드로 구분하여 자원을 공유하여 수행 능력 향상과 비용을 절감함.
공유자원을 스레드끼리 공유하므로 메모리 부분에서 효율적이다.
간단한 통신 방법으로 프로그램 응답 시간이 단축된다.
하지만, 자원을 공유하기 때문에 하나의 스레드에 문제가 생기면 나머지 스레드들도 영향을 받을 수 있다.
또한 여러 스레드가 서로 대기하면서 무한으로 기다리는 교착상태의 상황이 발생할 수도 있다.
'프로그래밍 > CS' 카테고리의 다른 글
[study] 서브넷 마스크 (Subnet mask) (0) | 2025.02.20 |
---|---|
[study] IP (Internet Protocol) (0) | 2025.02.20 |
[study] 뮤텍스 (Mutex) (1) | 2024.09.19 |
[study] 프로세스 (Process) (2) | 2024.06.02 |
[study] Virtual box server 구축 개념 정리 (1) | 2024.05.08 |