[운영체제(OS)] 쓰레드(Thread)와 멀티 쓰레드 프로그래밍(Multi Thread Programming) 이란?
resilient
·2021. 12. 22. 22:54
지난 시간에는 프로세스와 컨텍스트 스위치에 대해서 알아봤습니다. 다시한번 정리해보면 프로세스는 '실행 중인 프로그램' 이라고 할 수 있죠.
하나의 프로그램에서 여러 가지 일을 동시에 실행한다면 일 처리를 위해 부모 프로세스는 자식 프로세스를 계속 생성하고 없애고를 반복할텐데요, 생성하고 없애는 과정에서 자원의 공유와 비용이 문제가 생길 수 있습니다.
그렇다면 프로세스를 생성하지 않고 어떻게 자원 공유를 쉽게 효율적으로 할 수 있을까요?
여기서 바로 쓰레드가 나옵니다.
쓰레드, 멀티쓰레드 프로그래밍 이란?
쓰레드는 프로세스의 실행 단위입니다. 프로세스와 마찬가지로 CPU의 작업 단위 중 하나이지만 프로세스와는 다르게 굉장히 가볍습니다.
하나의 프로세스는 여러개의 쓰레드로 구성이 가능하고, 같은 프로세스 내의 쓰레드끼리는 메모리, 자원등을 공유하게 되죠.
멀티쓰레드 프로그래밍은 말 그대로 쓰레드를 여러개 사용해서 실행하는 프로그래밍 기법을 의미하죠.
위에서 쓰레드는 프로세스 프로세스의 실행 단위 라고 언급했는데요, 좀 더 구체적으로 말해보자면 쓰레드는 하나의 프로세스 내에서 동작되는 실행 흐름이고 프로세스 내의 주소 공간이나 자원을 공유할 수 있습니다. 이 경우에 쓰레드는 각각 독립적인 작업을 수행해야 하기 때문에, 위 사진에서 볼 수 있듯이 각각 쓰레드 내부의 스택과 프로그램카운터(PC) 레지스터 값은 고유한 값을 가지고 있습니다.
여기서 알 수 있는 프로세스와 쓰레드의 차이를 알아볼까요?
만약 하나의 프로세스가 실행되다가 오류가 발생해서 프로세스가 강제로 종료되는 일이 발생했다고 가정해보겠습니다.
그럼 다른 프로세스에도 영향을 미칠까요? 정답은 아니요 입니다. 공유하고 있는 파일을 손상시키는 경우만 아니라면 아무런 영향을 미치지 않게 되죠.
하지만 쓰레드의 경우는 다릅니다. 스레드는 프로세스의 Code, Data, Heap 메모리 영역을 공유하기 때문에 한 쓰레드가 실행 도중 오류가 발생한다면 같은 프로세스 내의 모든 쓰레드가 강제로 종료하게 되죠.
그렇다면 프로세스 메모리 구조에서 스택을 쓰레드마다 독립적으로 할당해주는 이유가 뭘까요?
스택은 함수를 호출할 때 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수들을 저장해놓는 메모리 공간입니다. 따라서 독립적인 스택 메모리 공간을 할당해준다 라는 건 독립적인 함수호출이 가능하다는 의미이고 이는 독립적인 작업 실행을 가능하게 합니다.
따라서 독립적인 작업 실행을 위한 최소한의 조건으로 스택을 독립적으로 할당해 주는 것이죠.
(스택에 대해서는 아래 게시물에 자세하게 정리해놓았습니다. 궁금하신 분들은 참고해주시면 감사하겠습니다.)
이번에는 프로그램카운터(PC) 레지스터를 쓰레드마다 독립적으로 할당해주는 이유에 대해서 알아볼까요?
프로그램 카운터(PC)는 쓰레드가 어디까지 실행되었는지에 대한 정보를 기억합니다. 쓰레드는 CPU를 할당 받았다가 CPU스케쥴러에 의해 다시 실행 순서가 변경 됩니다. 이러한 이유로 명령어가 연속적으로 실행되지 못하고, 때문에 어디까지 실행되었는지를 기억할 필요가 생기기 때문입니다. 따라서 PC레지스터를 독립적으로 할당하는 것이죠.
이번엔 멀티쓰레드에 대해서 알아보겠습니다.
위에서 잠깐 설명 했듯이, 멀티쓰레드는 하나의 프로세스가 여러 쓰레드를 통해 동시에 여러 작업을 처리하는 것을 의미합니다.
멀티쓰레드 프로그래밍은 멀티쓰레드를 이용한 프로그래밍이겠죠?
위에서 설명한 쓰레드에 대한 개념을 어느정도 익혔다면, 멀티쓰레드의 장단점도 유추해 볼 수 있습니다.
멀티쓰레드의 장점
- Context Swtiching을 할 때, 공유하고 있는 메모리만큼의 자원을 아껴 효율적인 프로그래밍이 가능합니다.
- 쓰레드가 프로세스 내의 여러 쓰레드와 Stack 영역을 제외한 모든 메모리 영역을 공유하기 때문에 통신이 적어지고 응답시간이 빨라집니다.
멀티쓰레드의 단점
- 하나의 쓰레드가 자원을 망치면 프로세스 전체가 종료 되는 대참사가 발생합니다.
- 자원을 공유하기 때문에 장점도 있지만 동기화 문제를 피할 수 없습니다.
자 이제 쓰레드에 대해서 정리를 한 번 해보겠습니다.
먼저 프로세스와 쓰레드를 헷갈리시는 분들이 많은데요, 개념의 범위 부터 다릅니다. 쓰레드는 프로세스 안에 포함되어 있다고 생각하면 되죠.
운영체제는 프로세스가 실행될 때 Code, Data, Stack, Heap 메모리 영역을 할당해주고, 프로세스를 최소 작업 단위로 정해주는 반면
쓰레드는 프로세스 내에서 Stack 메모리 영역을 제외한 모든 메모리 영역을 다른 쓰레드와 공유하면서 멀티 쓰레딩이 가능합니다.
프로세스가 프로세스와 통신을 하기 위해서는 IPC 등 까다로운 방법의 과정을 거쳐야 하지만, 쓰레드는 기본적으로 메모리를 공유하는 구조이기 때문에 다른 쓰레드와 통신이 쉽습니다. 때문에 멀티태스킹(멀티프로세스 프로그래밍) 보다 멀티쓰레드(멀티쓰레드 프로그래밍) 이 자원을 아낄 수 있고 효율적인 프로그래밍이 가능합니다.
이번 시간에는 쓰레드에 대해서 알아보았습니다. 다음 운영체제 시간에는 CPU 스케쥴링에 대해서 정리해보도록 하겠습니다. 감사합니다!
'CS & Network > 운영체제(OS) & 컴퓨터구조' 카테고리의 다른 글
[운영체제(OS)] 동기화(Synchronization) 와 임계구역 문제(Critical Section Problem) - 1 (0) | 2022.01.09 |
---|---|
[운영체제(OS)] CPU스케쥴링(CPU Scheduling) - 1 (0) | 2021.12.31 |
[운영체제(OS)] 프로세스와 컨텍스트 스위칭(Context Switching)이란? (0) | 2021.12.15 |
프로세스 메모리 구조 에서의 스택(Stack) 이란? (0) | 2021.12.05 |
[컴퓨터구조] 메모리2 (0) | 2021.05.06 |