스레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고 한다.
멀티프로세스와 멀티스레드는 양쪽 모두 여러 흐름이 동시에 진행된다는 공통점을 가지고 있다. 하지만 멀티프로세스에서 각 프로세스는 독립적으로 실행되며 각각 별개의 메모리를 차지하고 있는 것과 달리 멀티스레드는 프로세스 내의 메모리를 공유해 사용할 수 있다(즉, 변수를 공유한다). 또한 프로세스 간의 전환 속도보다 스레드 간의 전환 속도가 빠르다. (아마도, 프로세스 간 전환은 하나의 프로세스가 점유하고 있던 자원을 반납하고 재할당하는 과정이 포함되어 있기 때문에 프로세스 간 전환은 느리고, 스레드의 경우 자원을 공유하고 있기 때문에 스레드 간 전환은 빠르다는 추론이 가능할 것이다.)
멀티스레드의 다른 장점은 CPU가 여러 개일 경우에 각각의 CPU가 스레드 하나씩을 담당하는 방법으로 속도를 높일 수 있다는 것이다. 이러한 시스템에서는 여러 스레드가 실제 시간상으로 동시에 수행될 수 있기 때문이다.
멀티스레드의 단점에는 각각의 스레드 중 어떤 것이 먼저 실행될지 그 순서를 알 수 없다는 것이 있다.
예를 들어, 두 스레드가 특정 공유 변수 i의 값을 1 증가시키는 명령을 실행할 때, 다음과 같은 방식으로 수행될 수 있다.
- 공유되는 변수 i의 값을 레지스터(임시저장소)에 저장
- 레지스터의 값을 1 증가시킨다.
- 변수 i에 그 값을 저장한다.
이때 두 스레드가 실행될 때 어떤 스레드가 먼저 실행될지는 보장되지 않으며, 만약 다음과 같은 순서로 실행된다면:
최종 결과로 i는 2가 증가된다.
하지만 다음과 같이 실행된다면:
최종 결과로 i는 1이 증가되고, 이것은 원래 프로그램의 의도(각각의 스레드가 i를 1씩 증가하는 동작)와 다를 수 있다. 또한 이러한 문제는 스레드의 실행 조건에 따라 결과가 다르게 나오므로, 오류가 발생했을 때 원인을 찾기가 힘들다. 이러한 문제를 경쟁 조건이라고 하며, 문제를 막기 위해 세마포어와 같은 방법을 통해 공유 데이터에 접근하는 스레드의 개수를 한개 이하로 유지하는 방법을 사용할 수 있다.
Reference
'Development > CSE' 카테고리의 다른 글
경쟁 조건 (0) | 2019.12.22 |
---|---|
레지스터 (0) | 2019.12.22 |
튜링 동치(Turing equivalence) (0) | 2019.12.22 |
개념 증명(槪念證明, POC, Proof of Concept) (0) | 2019.12.22 |
Top down Approach (0) | 2017.04.20 |