● Thread (스레드)
프로세스 내부에 CPU 수행 단위가 여러 개 있는 경우에 Thread라고 말한다. 프로세스가 생기면 각각의 프로세스마다 메모리에 주소 공간(Code, Data, Stack)이 만들어지며, 프로세스 하나를 관리하기 위해서 Kernel data 영역에 PCB를 두고 있다.
위 그림과 같이 PCB에는 프로세스 상태, 프로세스 ID, 메모리의 어떤 부분을 실행하고 있는가를 가리키는 Program Counter... 등이 있다. 그렇다면 스레드(Thread)를 사용하는 이유는 뭘까? 프로세스를 만들 때마다 각 프로세스만의 주소 공간이 만들어진다고 했다. 만약 어떤 동일한 일을 하는 프로세스가 여러 개 있다고 가정하면, 각각의 프로세스마다 별도의 주소가 만들어져 메모리가 낭비된다. 같은 일을 하는 프로세스를 여러 개 만들고 싶다고 할 때, 메모리를 효율적으로 사용하고 싶다면, 주소 공간 하나만 띄워놓고 현재 각 프로세스마다 다른 부분을 실행시켜주면 된다. 하나의 주소 공간에 현재 CPU가 Code의 어느 부분을 실행하고 있는지 가리키는 Program Counter 등 CPU 수행 정보에 관련된 것들만 여러 개 두는 것이다. 프로세스 하나에 CPU 수행 단위만 여러 개 두고 있는 것을 스레드라고 부른다.
Thread 마다 현재 레지스터에 어떤 값을 넣고, Program Counter가 코드의 어디 부분을 가리키면서 실행하고 있는지에 대한 정보를 별도로 유지한다. CPU 수행 단위가 여러 개 있으면, 스택도 별도로 존재한다. 코드를 실행하다가 함수 호출을 하면 스택에 쌓아야 하기 때문이다. 이 처럼 프로세스 하나에서 공유할 수 있는 것(메모리 주소 공간, 프로세스 상태도, 각종 자원)들은 최대로 공유하면서 CPU 수행과 관련된 정보(Program Counter, Register, Stack)들은 별도로 갖고 있는다.
- Thread : CPU를 실행하는 단위 (Lightweight Process)
- Process : Heavyweight Process
- Tread의 구성 : Program Counter, Register set, Stack 영역 (Thread끼리 공유 하지 않음)
- Thread 간의 공유하는 부분(task라고 부름) : Code, Data, OS resource
● Single and Multi-Threaded Processes
하나의 프로세스에 여러 개의 Thread를 두면 Thread 하나가 Blocked가 되었을 때, 다른 Thread가 CPU를 잡고 Running을 할 수 있어서 응답시간이 빨라지는 장점이 있다. 예를 들어, 네이버를 본다고 했을 때, 네트워크를 통해서 웹페이지를 읽어온다. 웹페이지를 읽어오는(I/O작업) 시간이 오래 걸리기 때문에 내 웹브라우저는 Blocked 상태가 된다. Blocked 상태가 되면 웹페이지를 다 읽어오기 전까지는 화면에 아무것도 보여주지 못하기 때문에 사용자 입장에서는 매우 답답하게 느껴질 것이다. 웹브라우저 프로세스에 여러 개의 Thread를 만들어 놓게 되면, 웹페이지의 그림을 불러오는 한 개의 Thread가 그림을 불러오는 동안 웹페이지의 텍스트를 불러오는 다른 Thread가 이미 읽어 들인 텍스트를 표시를 할 수 있다. 이렇게 되면 Thread를 사용하지 않았을 때 보다 응답속도가 더 빠르기 때문에 사용자 입장에서는 결과를 더 빨리 볼 수 있게 된다.
Thread의 장점
- 빠른 응답성 제공
- Resoruce Sharing, 각종 자원 공유
- Economy :Thread를 생성하는 일은 프로세스를 만드는 것보다 overhead가 상당히 작다. Context Switching 할 때에도 Thread 간의 CPU 스위칭은 동일한 주소를 사용하고 있기 때문에 Process 간의 스위칭보다 오버헤드가 작다
- Utilization Of MP(Multi Processer) Architecture : 프로세스는 한 개지만 그 안에 Thread가 여러 개 있으면 각각의 Thread가 서로 다른 CPU에서 병렬적으로 수행할 수 있어 결과를 더 빨리 얻을 수 있다.
→ 1~3은 CPU가 하나만 있는 환경에서의 스레드 장점이고, 4번은 여러 개의 CPU(멀티 프로세서)를 쓸 때 얻는 장점
Thread는 커널의 지원을 받아 구현될 수도 있고, 라이브러리 형태로도 구현이 가능하다. 커널의 지원을 받아 생성하면 Kernel Thread라고 부르며 라이브러리 형태로 구현했을 경우에는 User Thread라고 부른다. Kernel Thread가 여러 개 있으면 운영체제 커널이 해당 사실을 알고 있어서 하나의 Thread에서 다른 Thread로 CPU가 넘어가는 것도 커널이 CPU 스케줄링하듯이 넘겨준다. User Thread가 여러 개 있다면, 여러 개 있다는 사실은 운영체제 Kernel이 알지 못한다. 그래서 User Program 스스로 Thread를 관리해야 한다. 한 개의 Thread가 I/O작업을 할 때, 비동기식 입출력을 통해 다른 Thread가 CPU를 사용한다. Real-Time Thread라고 하는 Real Time 기능을 지원하는 Thread도 있다.