싱글스레드와 멀티스레드(Single Thread & Multi Thread)
프로그램 내의 처리 실행 단위 혹은 CPU의 이용 단위를 나타내는 단어에 스레드(Thread)가 있다.
일련의 처리를 단일 스레드만으로 직렬 처리하는 프로그래밍 방법을
싱글 스레드 프로그래밍(Single Thread Programming)이라고 한다.
반면, 동일 어드레스 공간의 메모리를 공유하면서 병렬로 처리하는 방법을
멀티 스레드 프로그래밍(Multi Thread Programming)이라고 한다.
복수의 cpu를 탑재한 컴퓨터에서 각각의 방법을 채용한 프로그램을 실행하면,
일반적으로는 멀티스레드 쪽이 혜택을 받기 쉽다.
싱글 스레드의 작동 방식
싱글 스레드는 프로세스 내에서 하나의 메인스레드만으로 작업을 처리한다.
그러므로 작업을 차례대로 처리할 수 밖에 없다.
만약 선행 스레드의 작업이 매우 길어진다면,
후행 스레드는 선행 스레드의 작업이 끝날때까지 기다릴 수밖에 없다.
멀티 스레드의 작동 방식
멀티스레드는 CPU 활용을 최대로 끌어내기 위해서 둘 이상의 스레드를
동시에 실행시키는 기술이다.
이러한 작업은 문맥교환(Context Switching)을 통해서 이루어진다.
사실 말로는 스레드를 동시에 실행시키는 기술이라고 했지만,
빠른 시간안에 문맥교환을 실시하면서
각 스레드의 작업을 조금씩 처리하는 방식이라고 생각하면 된다.
싱글스레드의 장점
1. 문맥 교환(context switch) 작업을 요구하지 않는다.
문맥 교환은 여러 개의 프로세스가 하나의 프로세서를 공유할 때 발생하는 작업으로 많은 비용을 필요로 한다.
2. 자원 접근에 대한 동기화를 신경 쓰지 않아도 된다.
여러 개의 스레드가 프로세스의 자원을 공유할 경우,
각 스레드가 원하는 결과를 얻게 하려면 공용 자원에 대한 접근을 제어해야 한다.
쉽게 말해서, 모든 스레드가 일정 자원에 동시에 접근하거나, 똑같은 작업을 실행하려는 경우,
에러가 발생하거나 원하는 값이 나오지 않는다.
그래서, 스레드들이 동시에 같은 자원에 접근하지 못하도록 제어해줘야만 한다.
이 작업은 프로그래머에게 많은 노력을 요구하고 비용을 발생시킨다.
3. 단순히 CPU만을 사용하는 계산작업이라면,
오히려 멀티스레드보다 싱글스레드로 프로그래밍하는 것이 더 효율적이다.
a) 두 개의 작업을 하나의 스레드로 처리하는 경우 vs b) 두 개의 스레드로 처리하는 경우
b의 경우는 짧은 시간 동안 2개의 스레드가 번갈아가면서 작업을 수행한다.
그래서 동시에 두 작업이 처리되는 것과 같이 느끼게 된다.
하지만, 오히려 두 개의 스레드로 작업한 시간이 싱글스레드로 작업한 시간보다 더 걸릴 수도 있는데,
그 이유는 스레드 간의 작업전환(context switching)에 시간이 걸리기 때문이다.
4. 프로그래밍 난이도가 쉽고, CPU 메모리를 적게 사용한다. (코스트가 적게 든다)
싱글스레드의 단점
1. 여러 개의 CPU를 활용하지 못한다.
프로세서를 최대한 활용하게 하려면 cluster 모듈을 사용하거나
외부에서 여러 개의 프로그램 인스턴스를 실행시키는 방법을 사용해야 한다.
이때 고려해야 할 문제가 있는데, 바로 다수의 프로그램 인스턴스가
어떻게 상태를 공유할 것인가에 대한 문제다.
2. 연산량이 많은 작업을 하는 경우,
그 작업이 완료되어야 다른 작업을 수행할 수 있다.
싱글 스레드 모델은 에러 처리를 못 하는 경우 멈춘다.
멀티 스레드 모델은 에러 발생 시 새로운 스레드를 생성하여 극복한다.
다만, 새로운 스레드 생성이나 놀고 있는 스레드 처리에 비용이 발생한다.
멀티스레드의 장점
1. 사용자의 대한 응답성이 싱글스레드에 비해 증가한다.
프로그램의 일부분(스레드 중 하나)이 중단되거나 긴 작업을 수행하더라도
프로그램의 수행이 계속되어 사용자에 대한 응답성이 증가한다.
다시 말해서, 멀티 스레드 모델은 에러 발생 시 새로운 스레드를 생성하여 극복한다.
다만, 새로운 스레드 생성이나 놀고 있는 스레드 처리에 비용이 발생한다.
(싱글 스레드는 프로그램 일부분이 중단되거나, 에러가 발생하면 프로그램이 멈춘다.)
2. 프로세스 내 자원들과 메모리를 공유하기 때문에
메모리 공간과 시스템 자원 소모가 줄어든다.
스레드 간 통신이 필요한 경우에도 쉽게 데이터를 주고받을 수 있으며,
프로세스의 context switching과 달리
스레드 간의 context switching은 캐시 메모리를 비울 필요가 없기 때문에 더 빠르다.
3. 다중 CPU 구조에서는 각각의 스레드가 다른 프로세서에서
병렬로 수행될 수 있으므로 병렬성이 증가한다.
멀티스레드의 단점
1. 싱글스레드 프로그래밍에 비해 오버헤드가 클 수 있다.
context switching, 동기화 등의 이유 때문에 싱글 코어 멀티 스레딩은
스레드 생성 시간이 오히려 오버헤드로 작용해 단일 스레드보다 느리다.
2. 동기화가 필수적이다.
공유하는 자원에 동시에 접근하는 경우,
프로세스와는 달리 스레드는 데이터와 힙 영역을 공유하기 때문에
어떤 스레드가 다른 스레드에서 사용 중인 변수나 자료구조에 접근하여
엉뚱한 값을 읽어오거나 수정할 수 있다.
따라서 동기화가 필요하다.
3. 멀티 스레딩을 위해서는 운영체제의 지원이 필요하다.
4. 멀티 스레드 모델은 프로그래밍 난도가 높다. 또한, 스레드 수만큼 자원을 많이 사용한다.
'컴퓨터 구조' 카테고리의 다른 글
RAID (0) | 2022.01.20 |
---|---|
OLTP 와 OLAP (0) | 2022.01.20 |
HDD 구조 (0) | 2022.01.13 |
문맥교환(context switching) (3) | 2021.12.15 |
프로세스(Process) 와 쓰레드(Thread) 란? (0) | 2021.12.15 |