본문 바로가기
IT/CS 노트

"스레드"에 대한 기본 지식

by hatnim 2022. 10. 11.
반응형

1. 정의

스레드는 CPU 이용의 기본 단위이다. 스레드는 스레드 ID, 프로그램 카운터, 레지스터 집합, 그리고 스택으로 구성된다. 스레드는 같은 프로세스에 속한 다른 스레드와 코드, 데이터 섹션 그리고, 열린 파일이나 신호와 같은 운영체제 자원들을 공유한다. 전통적인 중량 프로세스는 하나의 제어 스레드를 가지고 있다. 만일 프로세스가 다수의 제어 스레드를 가진다면, 프로세스는 동시에 하나 이상의 작업들을 수행할 수 있다. 현대의 컴퓨터에서 동작하는 거의 모든 소프트웨어 응용들은 다중 스레드를 이용한다. 다중 스레드 프로그래밍의 이점은 크게 4가지로 나눌 수 있다. 첫 번째, 응답성이 있다. 응답성은 대화형 응용을 다중 스레드처럼 적용하면 응용 프로그램의 일부분이 봉쇄되거나, 응용 프로그램이 긴 작업을 수행하더라도 프로그램의 수행이 계속되는 것을 허용함으로써 사용자에 대한 응답성을 증가시킨다. 이 특징은 사용자 인터페이스를 설계하는 데 있어 특히 활용도가 높다. 두 번째로, 자원 공유가 있다. 프로세스는 공유 메모리와 메시지 전달 기법을 통해서만 자원을 공유할 수 있다. 이러한 기법은 프로그래머에 의해 명시적으로 처리되어야 한다. 그러나 스레드는 자동적으로 그들이 속한 프로세스의 자원들과 메모리를 공유한다. 코드와 데이터 공유의 이점은 하나의 프로그램이 같은 주소 공간 내에 여러 개의 다른 작업을 하는 스레드를 가질 수 있다는 것이다. 세 번째로 경제성이 있다. 프로세스 생성을 위해 메모리와 자원을 할당하는 것은 비용이 많이 든다. 스레드는 자신이 속한 프로세스의 자원들을 공유하기 때문에 스레드를 생성하고 문맥 교환하는 것이 훨씬 더 경제적이다. 보통 스레드를 사용하는 것보다 새로운 프로세스를 생성 및 관리하는 것이 더 까다롭고 시간을 많이 소모한다. 마지막으로 규모 적응성이 있다. 다중 처리기 구조에서 각각의 스레드가 다른 처리기에서 병렬로 수행될 수 있기 때문에 다중 처리기 구조에서 훨씬 더 유리하다. 

2. 세 가지 모델

사용자 수준에서는 사용자 스레드를, 커널 수준에서는 커널 스레드를 지원한다. 사용자 스레드는 커널 위에서 지원되며 커널의 지원 없이 관리된다. 그러는 반면에 커널 스레드는 운영체제가 직접 관리한다. 현재 거의 모든 운영체제들은 커널 스레드를 지원한다. 사용자 스레드와 커널 스레드에는 어떤 연관 관계가 존재한다. 이 관계는 크게 세 가지 모델로 나눌 수 있다. 먼저, 다대일 모델이 있다. 이 모델은 많은 사용자 수준 스레드를 하나의 커널 스레드로 수반한다. 스레드 관리는 사용자 공간의 스레드 라이브러리가 관리한다. 따라서 효율성이 높다. 하지만 한 스레드가 봉쇄형 시스템 호출을 한다면 전체 프로세스가 봉쇄된다는 단점이 있다. 또한 한 번에 하나의 스레드만 커널에 접근 가능하기 때문에 다중 스레드가 다중 코어 시스템에서 병렬로 실행될 수 없다. 이러한 단점으로 이 모델을 사용 중인 시스템은 요즘 거의 찾아볼 수 없다. 다음으로 일대일 모델이 있다. 이 모델은 사용자 스레드를 각각의 커널 스레드로 이어진다. 이 모델은 하나의 스레드가 앞의 모델과는 달리 봉쇄적 시스템 호출을 하더라도 다른 스레드가 실행될 수 있기 때문에 더 많은 병렬성을 제공한다. 또한 이 모델은 다중 처리기에서 다중 스레드가 병렬로 수행될 수 있다. 그러나 이 모델에도 단점은 있는데, 그것은 바로 사용자 수준 스레드를 생성할 때 그에 맞는 커널 스레드를 생성해야 한다는 것이다. 커널 스레드를 생성하는 오버헤드가 프로그램의 품질을 저하시킬 가능성이 있어 이 모델의 구현은 대부분 시스템에 의해 지원되는 스레드의 숫자를 제한한다. 마지막으로, 다대다 모델이 있다. 이 모델은 여러 개의 사용자 수준 스레드를 작거나 같은 수의 커널 스레드로 다중 방식으로 송신한다. 커널 스레드의 숫자는 프로그램이나 특정 기기에 따라 결정된다. 이 모델은 앞의 두 모델의 단점을 어느 정도 해결할 수 있다. 개발자는 필요한 만큼 사용자 수준 스레드를 많이 생성할 수 있으며 상응하는 커널 스레드가 다중 처리기에서 병렬로 수행이 가능하다. 또한 스레드가 봉쇄형 시스템 호출을 발생시켰을 때, 커널이 다른 스레드의 수행을 스케줄이 가능하다는 점도 있다. 다대다 모델의 변형은 아직도 많은 사용자 스레드를 그보다 작은 수 혹은 같은 수의 커널 스레드로 다중 방식으로 송신할 수 있지만 한 사용자 스레드가 하나의 커널 스레드에만 연관되는 것을 허용해준다. 이러한 변형은 두 수준 모델이라고 불린다.

3. 스레드 라이브러리

이 라이브러리는 프로그래머에게 스레드를 생성 및 관리하기 위한 API를 제공한다. 스레드 라이브러리를 구현하기 위한 방법이 두 가지가 있다. 첫 번째 방법은 온전히 사용자 공간에서만 커널의 지원 없이 라이브러리를 제공하는 것이다. 라이브러리의 모든 코드와 자료 구조는 사용자 공간에 존재한다. 라이브러리의 함수를 호출하는 것은 시스템 호출이 아니라 사용자 공간의 지역 함수를 호출한다는 것을 의미한다. 두 번째 방법은 운영체제가 지원하는 커널 수준 라이브러리를 구현하는 것이다. 이러한 경우에는 라이브러리를 위한 코드와 자료 구조는 커널 공간에 존재한다. 라이브러리 API를 호출하는 것은 커널 시스템 호출을 부르는 결과를 낳는 것과 같다. 현재 Windows, POSIX Pthreads 그리고 Java의 세 종류 라이브러리가 가장 많이 사용된다. 

반응형

댓글