본문 바로가기

운영체제

[OS] 쓰레드와 멀티쓰레드

[쓰레드]

쓰레드란?

프로세스(프로그램) 실행의 단위이며 하나의 프로세스는 여러개의 쓰레드로 구성이 가능하다.

하나의 프로세스를 구성하는 쓰레드들은 프로세스에 할당된 메모리, 자원 등을 공유한다.

프로세스와 같이 실행, 준비, 대기 등의 실행 상태를 갖으며 실행 상태가 변할때마다 쓰레드 문맥교환(context switching)을 수행한다.

각 쓰레드별로 자신만의 스택과 레지스터를 갖는다.

쓰레드는 프로세스보다 생성 및 종료시간, 쓰레드간의 전환 시간이 짧다.

쓰레드는 프로세스의 메모리, 자원등을 공유하므로 커널의 도움없이도 상호간의 통신이 가능하다.

PC Resister를 쓰레드마다 독립적으로 할당하는 이유

PC 값은 쓰레드가 명령어의 어디까지 수행하였는지를 나타나게 한다.

쓰레드는 CPU를 할당받았다가 스케쥴러에 의해 다시 선점당하기 때문에 명령어가 연속적으로 수행되지 못하기 때문에

어느 부분까지 수행되었는지 기억할 필요가 있어 독립적으로 할당한다.

 

스택을 쓰레드마다 독립적으로 할당하는 이유

스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간으로 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다.

따라서 독립적인 실행 흐름을 위한 최소 조건으로 독립된 스택을 할당한다.

 

[멀티쓰레드]

하나의 프로세스를 다수의 실행 단위로 구분하여 자원을 공유하고 자원의 생성과 관리의 중복성을 최소화하여 수행 능력을 향상 시킨다.

하나의 프로그램이 동시에 여러 개의 일을 수행할 수 있도록 해준다.

장점

응답성 : 쓰레드가 중단되거나 긴 작업을 수행하더라도 프로그램의 수행이 계속 되어 사용자에 대한 응답성이 증가한다.

경제성 : 프로세스 내 자원들과 메모리를 공유하기 때문에 메모리 공간과 시스템 자원 소모가 줄어든다.

멀티프로세서의 활용 : 다중 CPU 구조에서는 각각의 쓰레드가 다른 프로세서에서 병렬로 수행될 수 있으므로 병렬성이 증가한다.

자원 공유

단점

context switching(문맥교환), 동기화 등의 이유 때문에 싱글 코어 멀티 쓰레딩은 쓰레드 생성 시간이 오버헤드로 작용해 단일 쓰레드보다 느리다.

공유하는 자원에 동시에 접근하는 경우, 프로세스와는 달리 쓰레드는 데이터와 힙 영역을 공유하기 때문에 어떤 쓰레드가 다른 쓰레드에서 사용 중인 변수나 자료구조에 접근하여 엉뚱한 값을 읽어오거나 수정할 수 있다. 👉 동기화 필요

멀티 쓰레딩을 위해서는 운영체제의 지원이 필요하다.

멀티 쓰레드 모델은 프로그래밍 난이도가 높으며 쓰레드 수만큼 자원을 많이 사용한다.

 

[사용자 수준 쓰레드와 커널 수준 쓰레드의 차이]

사용자 수준 쓰레드

사용자 영역의 쓰레드 라이브러리로 구현한다.

쓰레드와 관련된 모든 행위를 사용자 영역에서 하므로 커널이 쓰레드 존재를 알지 못한다.

쓰레드 라이브러리는 쓰레드의 생성과 종료, 쓰레드 간의 메시지 전달, 쓰레드의 스케쥴링과 컨텍스트 등 정보를 보관한다.

사용자 수준 쓰레드에서는 쓰레드 교환에 커널이 개입하지 않아 커널에서 사용자 영역으로 전환할 필요가 없다.

커널은 쓰레드가 아닌 프로세스를 한 단위로 인식하고 프로세서를 할당하므로 다대일 쓰레드 매핑이 된다.

(장점)

이식성이 높다.

오버헤드가 작다.

유연한 스케쥴링이 가능하다.

(단점)

동시성을 지원하지 않는다.

확장에 제약이 따른다.

커널 수준 쓰레드

커널이 쓰레드와 관련된 모든 작업을 관리한다.

한 프로세스에서 다수의 쓰레드가 프로세서를 할당 받아 병행으로 수행하고, 쓰레드 한개가 대기 상태가 되면 동일한 프로세스에 속한 다른 쓰레드로 교환이 가능하다.

이때도 커널이 개입하므로 사용자 영역에서 커널 영역으로 전환이 필요하다.

 

 

Reference.
http://www.kocw.net/home/search/kemView.do?kemId=1046323