본문 바로가기
ComputerScience/OS

스레드 Thread

by whitele 2021. 9. 5.
반응형

현대의 프로세서들은 보통 다중 스레드를 지원합니다. 프로세서의 이용률을 높이기 위해 병렬 처리의 기회를 잡는 것인데 커널 수준의 스레드와 사용자 수준의 스레드로 나뉩니다. 스레드에 대한 기초와 개념에 대해서 설명합니다.

 

스레드 TRHEAD

 스레드는 프로세서에서 아주 작은 단위이며 프로세스 실행 흐름에 아주 작은 단위이기도 합니다. 스레드의 구성은 TID, PC, 레지스터, 스택을 가집니다. 스레드는 단일, 다중 스레드일 수 있으며 단일의 경우 하나의 코어와 같습니다. 다만 뒤에서 설명하겠지만 사용자 수준에서 다중 스레드는 구현할 수 있습니다. 스레드를 이용하여 하나의 응용프로그램이 여러 가지 작업을 할 수 있도록 돕습니다.

 다중 스레드의 경우 어느 정도 오버헤드를 감수해야 합니다. 그럼에도 다중 스레드는 매우 효율적이기 때문에 가치가 있습니다. 프로세스가 작업을 끝낼 때까지 기다리는 것보다 여러 개의 스레드를 준비상태에서 스레드를 처리하기 때문에 효율적입니다. UNIX(or LINUX) 계열에서는 ps 명령어에 -ef 옵션을 넣어 커널 수준의 스레드를 확인할 수 있다.

아래는 스레드의 대략적인 형태입니다. 스레드는 스레드 자체 인식을 위한 id와 레지스터 집합, 스레드 스택과 현재 코드 위치를 알려주는 PC(프로그램 카운터)가 있고 코드, 데이터, 파일들은 다른 스레드와 자원을 공유합니다.

스레드 모델

스레드 장점

 스레드의 장점은 운영체제적, 운용 효율의 관점에서 4가지 정도 장점이 있습니다.

규모 적응성

 스레드로 어느 정도의 처리량이던 유동적으로 조절할 수 있습니다.

빠른 응답 

 응용프로그램이 작업 중이더라도 다른 응답이 가능하게 합니다. 예를 들면 실행 중일 때 취소를 선택할 수 있거나 닫기 같은 경우입니다.

효율성

 스레드는 프로세스를 새로 할당하는 것보다 경제적이고 효율적으로 운용할 수 있습니다. 자원 공유와 이어지는 내용인데 프로세스 내에서 자원 공유가 가능하기에 효율적이라 할 수 있습니다. 일반적으로는 스레드 생성 속도는 프로세스 생성 속도보다 빠릅니다.

자원 공유

 프로세스는 램을 통한 공유 메모리나 메시지 전달 기법을 통해  자원을 공유 그리고 소통합니다. 하지만 스레드는 기본적으로 코드, 데이터들을 공유합니다. 서로 소통할 필요가 있을 경우 전역 변수를 통해 소통이 쉽게 가능합니다. 

 

 

 

커널 - 사용자 간 스레드 모델

 스레드에는 커널, 사용자 수준 사이로 스레드 모델을 가지고 있습니다. 스레드 구현을 사용자 수준과 커널 수준으로 나눕니다. 커널 수준은 직접 운영체제가 관리하며 사용자 수준의 커널은 API가 관리합니다. 때문에 커널 수준의 스레드는 사용자 수준의 스레드 존재를 모릅니다.

N:1 모델

N:1 모델

 여러 개의 사용자 수준 스레드를 하나의 커널 수준의 스레드로 대응합니다. 인터럽트, 봉쇄형 시스템 콜이 발생할 경우 전체가 마비가 되는 단점이 있습니다.

1:1 모델

1:1 모델

 일반적으로 사용되는 모델입니다. API가 직접 사용자 수준의 스레드를 관리하면서 커널 수준의 스레드를 대응합니다.  하나의 커널 수준의 스레드가 봉쇄되더라도 다른 스레드에는 영향이 가지 않습니다. 다만 많은 수 의 스레드가 필요한 것이 단점입니다.

M:N 모델

M:N 모델

 사용자 수준의 스레드가 커널 수준 스레드보다 많거나 같은 수를 멀티플렉스 합니다. 필요한 만큼 스레드를 생성하여 커널 수준 스레드에 대응시켜 병렬로 수행됩니다. 그러나 이러한 구현이 복잡하고 어렵다는 것이 단점이며 현재는 다수의 커널 스레드, 다중 코어가 기본적으로 갖춰져 있기 때문에 이런 모델의 장점이 어느 정도 줄어들었습니다.

 

 

스레드 라이브러리

 스레드를 관리하고 생성, 사용하기 위한 API가 있습니다. JAVA 같은 경우는 자바 가상 머신이 존재하기 때문에 자바 가상 머신이 돌아가는 곳이라면 어디든 간에 상관이 없습니다. 유닉스 리눅스 계열 POSIX의 pthread, 윈도우의 Windows API가 있습니다. 아쉽게도 pthread는 윈도우에서 바로 사용할 수 없습니다.

 

Pthreads

 pthread는 POSIX가 제정한 스레드 표준 API입니다. Windows는 타사가 구현한 것을 통하여 비슷하게 적용시킬 수는 있습니다. 자세한 pthread는 이 블로그에서 작성한 pthread 글을 참조하시기 바랍니다.

https://codedatasotrage.tistory.com/46

 

스레드와 C언어 스레드 pthread

스레드 개념  스레드는 fork 함수가 하는 것처럼 자식 프로세스처럼 역할을 하지만 경량화된 형태이다. 새로운 프로세스에 비해 적은 비용으로 생성과 관리가 가능하다. 스레드는 하나의 실행

codedatasotrage.tistory.com

pthread_t 타입으로 스레드 id를 통해 스레드 자체를 인식합니다. pthread_attr_t로 속성을 정하고 pthread_create로 스레드를 생성합니다. pthread_join을 통해 스레드가 종료되기 전 응용프로그램이 끝나는 것을 방지합니다.

 

Windows API 

windows의 API를 사용하여 스레드를 다룬다 windows.h 헤더 파일을 포함해야 사용할 수 있다.

 

 

실제 운영체제의 스레드 구현

 지금까지의 스레드는 원론적인 내용을 다뤘다면 이번 내용은 실제 운영체제가 스레드를 어떻게 사용하고 있는지에 대한 내용입니다.

 Windows

 프로세스처럼 실행하며 스레드는 사용자-커널 수준 간 일대일로 대응됩니다. 스레드의 구성요소는 다음과 같습니다.

  • THREAD_ID
  • Registers
  • Stack
  • Data
  • PC

스레드 구성요소는 그 스레드의 문맥이라 합니다. 그것의 자료구조는 다음이 있습니다.

EThread : 실행 스레드 블록

KThread : 커널 스레드 블록

TEB : 스레드 환경 블록

 

Linux

리눅스는 따로 스레드와 프로세스를 구분하지 않습니다. fork 시스템 콜은 프로세스를 복제하고 clone 시스템 콜로 스레드를 복제 생성합니다. clone이 호출될 때 얼마나 공유할지 플래그를 설정합니다.

 리눅스 커널에서는 프로세스, 스레드를 구별하지 않기 때문에 task라 부르는데 이러한 이유 때문에 작업마다 커널 자료구조가 존재합니다. 이곳에는 데이터를 가리키는 포인터를 포함합니다.

 

 

정리

 스레드는 프로세서를 효율적으로 사용하기 위해 사용합니다. 가장 큰 장점으로 경제성과 자원 공유가 있습니다. 스레드는 다양한 모델이 있으며 그중 일대일 모델을 사용하고 개발자들은 스레드를 API를 통해 스레드를 사용합니다.

728x90
반응형

댓글