윈도우즈 시스템 프로그래밍

윈도우즈 시스템 프로그래밍 11장 - 쓰레드의 이해

111-000-111 2021. 8. 1. 18:59

 

 

 

윈도우즈 시스템 프로그래밍이라는 책과 해당 책의 저자이신 윤성우님의 강의를 통해 공부한 내용을 정리하는 글입니다.

 

 

 

 


 

 

 

 

쓰레드란?

 

⦁ 쓰레드는 하나의 프로그램 내에서 여러 개의 실행 흐름을 두기 위한 모델

⦁ 쓰레드는 프로세스처럼 완벽히 독립적인 구조가 아니다. 쓰레드를 사이에는 공유하는 요소들이 있다.

⦁ 쓰레드는 공유하는 요소가 있는 관계로 컨텍스트 스위칭에 걸리는 시간이 프로세스보다 짧다.

 

 

 

 

메모리 구조 관점에서 본 프로세스와 쓰레드

 

자식 프로세스 생성 후 메모리 구조

 

 

 

자식 프로세스는 부모 프로세스와 독립적인 메모리 구조를 가지고 있으므로 프로세스간 데이터를 주고 받기 위해서는 IPC라는 매커니즘이 필요하다.

 

 

 

쓰레드 생성 후 메모리 구조

 

 

쓰레드는 생성할 때마다 해당 쓰레드만을 위한 스택이 생성되고, 그 외의 영역은 프로세스 영역을 공유하고 있다.

 

 

 

 

 

쓰레드의 특성

 

⦁ 쓰레드마다 스택을 독립적으로 할당 : 실행 흐름의 추가를 위한 최소 조건이 독립된 스택의 제공이다.

⦁ 코드 영역 공유 : 쓰레드는 자신을 생성한 프로세스가 가지고 있는 함수 호출이 가능하다.

⦁ 데이터 영역과 힙을 공유 : 전역변수와 malloc 함수를 통해서 동적 할당된 메모리 공간이 공유 가능하다.

 

 

 

 

Windows에서의 프로세스와 쓰레드

 

Windows 입장에서 프로세스는 단순히 쓰레드를 담는 상자이다. 그러므로 프로세스는 사실, 상태(Running, Ready, Blocked)를 지니지 않고 쓰레드가 지닌다.

스케줄러가 실행의 단위로 선택하는것도 쓰레드이다.

프로세스 컨텍스트 스위칭은 프로세스 A의 쓰레드가 실행되는 도중에 프로세스 B의 쓰레드로 실행을 옮기는 과정에서 발생하는 컨텍스트 스위칭이다.

main 함수의 호출도, 프로세스가 생성됨과 동시에 main 쓰레드가 생성되어 main 함수를 호출한다.

 

 

 

 

 

커널 레벨(Kernel Level) 쓰레드와 유저 레벨(User Level) 쓰레드

 

프로그램이 동작하기 위해 사용되는 메모리 공간. 즉, 코드 영역, 데이터 영역, 스택 및 힙 영역을 가리켜 유저(User) 영역이라 한다.

운영체제를 실행시키기 위해서 필요한 메모리 공간을 커널(Kernel) 영역이라고 한다.

 

⦁ 커널 레벨 쓰레드 모델

프로그래머 요청에 따라 쓰레드를 생성 및 스케줄링 하는 주체가 커널일 경우이다.

쓰레드 A, B, C가 있다고 가정할 경우에, 이 쓰레드들의 실행코드는 유저 영역에 존재한다. 그리고 스케줄러와 쓰레드 정보는 커널 영역에 존재하는 것을 가리켜 커널 레벨 쓰레드라고 한다.

 

⦁ 유저 레벨 쓰레드 모델

커널에서 쓰레드 기능을 지원하지 않을 때 고려할 수 있는 방법이다.

커널에서 지원해주지 않기 때문에 커널에 의존적이지 않은 형태로 쓰레드 기능을 제공하는 라이브러리를 활용할 수 있는데, 이러한 방식으로 제공되는 쓰레드가 유저 레벨 쓰레드이다.

때문에 실행 시 유저 영역에서 실행된다.

 

⦁ 하이브리드(Hybrid) 쓰레드 모델

유저 레벨 쓰레드와 커널 레벨 쓰레드 모델의 중간 정도에 해당하는 모델로서 각각의 장점만을 모아서 디자인된 쓰레드 모델이다.

 

 

 

 

커널 모드(Kernel Mode)와 유저 모드(User Mode)

 

⦁ 일반적인 프로그램은 유저 모드에서 동작한다. Windows 커널이 실행되어야 할 경우에는 커널 모드로 전환이 일어난다.

⦁ 스케줄러의 동작도 커널 모드로의 전환이 필요하다.

⦁ 유저 모드에서는 유저 영역에만 접근이 가능하고, 커널 모드에서는 유저 영역과 커널 영역 모두 접근이 가능하다.

⦁ 모드의 전환은 시스템에 부담을 주는 작업이다.

⦁ 유저 모드와 커널 모드를 제공하는 주체는 프로세서이다. 즉, 메모리 보호 기능이 CPU에 달려 있다.

 

 

 

 

커널 레벨 쓰레드와 유저 레벨 쓰레드의 장점 및 단점

 

⦁ 커널 레벨 쓰레드의 장점 및 단점

장점 : 커널에서 직접 제공해주므로 안정성과 기능성이 제공된다.

단점 : 커널에서 제공해주므로 유저 모드에서 커널 모드로의 전환이 빈번하므로 성능의 저하가 야기된다.

 

⦁ 유저 레벨 쓰레드의 장점 및 단점

장점 : 유저 모드로 동작하기 때문에 모드의 전환이 일어나지 않으므로 모드 전환으로 인한 성능 저하가 발생하지 않는다.

단점 : 프로세스 내에 A, B, C라는 쓰레드가 존재한다고 가정하자. A 쓰레드가 시스템 함수를 호출했는데 커널에 의해 블로킹 될 경우에는 A 쓰레드가 속해있는 프로세스 자체가 블로킹 된다는 문제가 있기에 프로그래밍이 어려워지고 커널 레벨 쓰레드에 비해서 결과 예측이 어려워진다.