1. Thread
스레드란, 프로세스 내부에서 실행되는 작은 작업 단위를 말합니다.
(1) Thread가 쓰이게 된 배경
프로세스가 하나 생기면 code, data, stack으로 구성된 주소 공간이 프로세스 별로 메모리에 만들어집니다. 그리고 그 프로세스 하나를 관리하기 위해서 운영 체제 내부에 PCB라는 것을 두고 있습니다.
PCB에는 사진과 같이 프로세스의 상태, 식별 ID, 현재 메모리의 어느 부분을 실행하고 있는지 가르키는 program counter 등이 있습니다.
만약 동일한 일을 하는 프로세스가 여러 개 있다고 가정하면, 프로세스마다 별도의 주소 공간이 만들어져서 메모리가 낭비됩니다.
같은 일을 하는 프로세스를 여러 개 띄워놓고 싶으면, 메모리 공간만 하나 띄워놓고 각 프로세스마다 다른 부분의 코드를 실행할 수 있게 해주면 메모리를 보다 효율적으로 사용할 수 있습니다. 하나의 주소 공간에 CPU 수행 정보에 관련된 것들은 여러 개를 두는 것입니다.
(2) Thread의 구성
CPU 수행을 위해서는 현재 이 코드의 어느 부분을 실행하고 있는지를 가르키는 program counter와 CPU에서 실행되면서 메모리의 어떤 레지스터 값들을 세팅해서 실행하고 있는지에 대한 정보가 필요합니다. 그래서 각 스레드마다 위와 같은 CPU의 수행 정보는 별도로 유지합니다.
만약 스레드 하나가 코드의 어떤 부분을 실행하다가 함수 호출을 하게 되면, 함수 호출과 리턴 값에 대한 정보들을 스택에다가 쌓게 됩니다. 그렇기에 CPU 수행 단위가 여러 개 있다면 스택도 별도로 존재하게 됩니다.
다시 말해 스레드는 프로세스 하나에서 공유할 수 있는 것(메모리 주소 공간, 프로세스 상태, 프로세스가 사용하는 자원 등)은 최대한 공유하고 CPU 수행과 관련된 정보는 별도로 갖게 됩니다.
즉, 스레드란 CPU를 수행하는 단위를 말하는 것이고 스레드를 구성하는 것은 Program counter, Register set, Stack으로 정리 할 수 있습니다. 그리고 스레드끼리 공유하는 부분(code section, data section, OS resources)는 task라고 부릅니다.
하나의 프로세스 안에는 여러 개의 스레드, 하나의 태스크가 있는 것입니다.
(3) Multi-Threaded Processes의 장점
스레드의 장점은 네 가지가 있습니다.
- 빠른 응답성 제공 (Responsiveness)
- 자원 공유 (Resource Sharing)
- 경제성 (Economy)
- Utilization of MP Architectures
우선, 빠른 응답성 제공입니다. 하나의 서버 스레드가 blocked(waiting) 상태인 동안에도, 동일한 태스크 내의 다른 스레드가 실행(Running)되어 빠른 처리를 할 수 있다는 장점이 있습니다.
예를 들어 웹 브라우저에서 네이버를 실행한다고 가정해보면, 네트워크를 통해서 웹 페이지를 읽어오게 되고 이 과정은 I/O 작업이기에 읽어오는 시간이 오래 걸리게 됩니다. 그 동안 웹 브라우저는 Blocked 상태가 되고 그렇게 되면 웹 페이지를 모두 읽어오기 전까지는 화면에 아무것도 보여줄 수 없게 됩니다.
그런데 만약 웹 브라우저를 여러 개의 스레드를 이용해 프로그램을 만들어 놓게 되면, 하나의 스레드가 웹 서버에서 페이지의 그림을 불러오는 동안 이 프로세스를 Blocked 시키지 않고 또 다른 스레드가 빨리 읽어온 텍스트를 먼저 홈페이지에 표시해줄 수 있습니다. 즉 빠른 응답성을 사용자에게 제공합니다.
두 번째 장점은 자원 공유입니다. 동일한 프로세스가 하나 만들어지면 그 프로세스 만의 독자적인 공간을 만들어주어야하고, 그러면 그만큼 메모리를 더 쓰게 됩니다. 멀티 쓰레드는 자원을 공유하여 효율적으로 자원을 관리할 수 있습니다.
세 번째 장점은 경제성, 즉 여러모로 효율적이라는 것입니다. 프로세스를 새로 하나 만드는 것보다 프로세스 안에 스레드를 하나 추가하는 것은 overhead가 작습니다. 또 문맥 교환 시에도 스레드간의 스위치는 동일한 주소를 쓰고 있어 대부분의 문맥은 그대로 사용하기에 overhead가 작습니다.
네 번째 장점은 이전 장점과는 달리 여러 개의 CPU를 사용할 때(멀티프로세스) 얻는 장점입니다. 프로세스는 하나지만 그 안에 스레드가 여러개 있으면 각각의 스레드가 서로 다른 CPU에서 병렬적인 수행이 가능해 빠른 결과를 얻을 수 있습니다.
참고자료
[KOCW 이화여대 반효경 교수님 - Process Management 1]
https://core.ewha.ac.kr/publicview/C0101020140321144554159683?vmode=f
[ Chapter3 Operating System Concepts - Abraham Silberschatz ]
https://www.yes24.com/Product/Goods/89496122