EH 운영체제 강의

5. 프로세스 - 스레드

킹차니 2022. 6. 21. 22:05

"thread (or lightweight process) is a basic unit of CPU utilization"

 

thread의 구성 :

- program counter

- regiter set

- stack space

 

thread가 동료 thread와 공유하는 부분(=task) :

- code section

- data section

- OS resources

 

스레드는 프로세스 내부에 CPU의 수행 단위가 여러 개 있는 것이다.

 

운영체제는 각 프로세스 마다 하나씩 프로세스를 관리하기 위해 PCB를 만든다고 하였다. 여러 개의 스레드를 둔다는 것은 아래와 같이 하나의 PCB는 그대로 사용하고, PC, register, stack space는 각 스레드마다 두고 나머지는 공유한다.

프로세스가 하나 만들어지면 프로세스의 주소 공간(데이터, 스택, 코드 세그먼트)가 만들어지고 PCB도 만들어진다.

스레드는 위의 그림에서 보이듯이 하나의 프로세스 안에서 PC응 여러 개 만들어 하나의 프로세스에 CPU 수행 단위를 여러개 만드는 것이다. 또한 각 스레드마다 레지스터도 필요하다.

스레드는 프로세스 내에서 공유할 수 있는 것들은 최대한 공유한다. 메모리 주소 공간(데이터 세그먼트), process state 등 프로세스가 사용하는 각종 자원들을 여러 개의 스레드가 공유한다. 

다만 CPU 수행과 관련된 정보인 PC, 레지스터, 스택 같은 것들은 별도로 가지는 것이다.

 

스레드는 lighrweight process라고 부르는 이유는 어떤 프로그램을 여러 개 실행시킬 때, 해당 프로그램을 여러 개의 프로세스로 띄우는 것 보다는 여러 개의 스레드를 띄우는 것이 훨씬 가볍기 때문이다.

 

스레드의 장점 1 :

1. 다중 스레드로 구성된 태스크 구조에서는 하나의 서버 스레드가 blocked(waiting) 상태인 동안에도 동일한 태스크 내의 다른 스레드가 실행(running)되어 빠른 처리를 할 수 있다.

예를 들어 웹브라우저로 네이버 웹사이트에 접속한다고 해보자. 이때 컴퓨터는 네트워크 접속을 해서 멀리 있는 네이버의 서버로 부터 html파일을 불러오고, 또 이미지 역시 받아와야 한다. 그런데 이때 이미지를 모두 불러올 때까지 기다리는 것은 너무 오래걸리기에 이미 받아온 html의 텍스트라도 특정 스레드가 사용자의 화면에 띄어주고, 그 동안 다른 스레드는 이미지를 불러오는 작업을 한다면 사용자가 느끼기에 훨씬 빠를 것이다.

 

2. 동일한 일을 수행하는 다중 스레드가 협력하여 높은 처리율과 성능 향상을 얻을 수 있다.

같은 일을 하는 여러 개의 프로세스가 아닌 스레드를 띄워 메모리 낭비를 줄이고 자원을 절약할 수 있다.

 

3. 스레드를 사용하면 병렬성을 높일 수 있다.

멀티 코어 CPU에서 병렬성을 높일 수 있다. 만약 1000x1000 행렬의 곱을 한다고 해보자. 이때 각 스레드들이 나눠져서 계산을 하고 계산을 한것들을 마지막에 더하면 훨씬 빠른 연산 결과를 얻을 수 있을 것이다.

 

 

 

 

 

 

 

아래 그림의 빨간색 부분은 스레드마다 각자 하나씩 가지고 있는 부분이다.

 

 

 

스레드의 장점 2 :

1. 응답성 (responsiveness)

Ex) multi-threaded web을 사용하명 사용자의 입장에서 매우 빠르게 느낌

 

2. 자원 공유 (resource sharing)

스레드들이 코드, 데이터, 각종 자원들을 공유한다. 만약 스레드가 아닌 프로세스로 만들었다면 코드, 데이터 각종 자원들을 새로 만들었어야 할 것이다.

 

3. 경제성 (economy) 

프로세스를 하나 만드는 것은 오버헤드가 크다. 컨텍스트 스위칭을 하는 것은 오버헤드가 크다. 하지만 스레드를 하나 더 만드는 것은 간단한 일이고, 프로세스 내부에서 스레드 간에 CPU 스위칭이 일어나는 것은 아주 간단한 일이다.

 

4. CPU가 여러 개 있는 경우에 각 스레드가 서로 다른 CPU에서 일을 할 수 있다.

 

 

 

 

스레드의 구현 방법 :  

1. 커널 스레드

이는 운영체제가 지원하는 방법이다. 즉 운영체제가 스레드가 여러 개 있다는 사실을 알고 있는 경우이다.

 

2. 유저 스레드

이는 프로그램에서 사용한 라이브러리가 제공하는 방법으로 운영체제는 해당 프로세스가 멀티 스레드라는 사실을 모른다. 득 유저 프로그램이 스스로 여러 개의 스레드를 관리하는 것이다. 해서 커널이 볼때는 그냥 일반적인 스레드로 보인다.

 

 

 

 

 

출처 : 이화대학교 반효경 교수님의 운영체제 강의
http://www.kocw.net/home/search/kemView.do?kemId=1046323