XI : 쓰레드의 이해
뇌를 자극하는 윈도우즈 시스템 프로그래밍 을 읽고 정리한 문서입니다 ;)
쓰레드란 무엇인가
오래 전에는 프로그램 내 실행 흐름을 다양화하기 위해서, 하나의 프로그램에서 둘 이상의 프로세스를 생성하는 일은 아주 빈번하였다.
하지만 이런 식으로 추가적으로 프로세스를 생성하는 작업은 상당히 부담스럽다. 빈번한 컨텍스트 스위칭을 유발시키기 때문이다.
저장하고 복원하는 컨텍스트 정보의 개수를 줄일 수 있다면, 컨텍스트 스위칭의 부담을 덜 수 있을 것이다.
프로세스는 완전히 독립된 둘 이상의 프로그램 실행을 위해 사용되고, 쓰레드는 하나의 프로그램 내에서 둘 이상의 프로그램 흐름을 만들어 내기 위해서 디자인되었다.
쓰레드들 사이에는 공유하는 요소들이 많기 때문에 컨텍스트 스위칭 부담이 비교적 적다.
쓰레드를 생성할 때마다, 해당 쓰레드만을 위한 스택을 생성할 뿐, 코드 영역과 데이터, 힙 영역은 동일 프로세스끼리 공유하게 된다.
쓰레드의 특성
- 쓰레드마다 스택을 독립적으로 할당해 준다.
- 실행 흐름의 추가를 위한 최소 조건이 독립된 스택의 제공이기 때문이다.
- 코드 영역을 공유한다.
- 이 덕분에 프로그램에서 선언된 어떤 함수 기능이라도 자유롭게 사용할 수 있게 된다.
- 데이터 영역과 힙 영역을 공유한다.
- 즉, 전역변수와
malloc
함수를 통해서 동적 할당된 메모리 공간은 공유가 가능하다.
- 즉, 전역변수와
Windows에서의 프로세스와 쓰레드
Windows 입장에서 프로세스는 단순히 쓰레드를 담는 상자에 지나지 않는다.
사실 Windows 운영체제에 있어서 프로세스는 상태를 지니지 않는다. 상태를 지니는 것은 프로세스가 아니라 쓰레드이다. 스케줄러가 실행의 단위로 선택하는 것 또한 쓰레드이기 때문이다.
프로세스가 생성됨과 동시에 main
함수를 실행해 줄 쓰레드가 기본적으로 생성되며, 이를 main 쓰레드라고 부른다.
쓰레드 구현 모델에 따른 구분
커널 레벨 쓰레드와 유저 레벨 쓰레드
쓰레드를 생성해 주는 대상은 커널일 수도, 혹은 유저가 직접 만들고 관리할 수도 있다.
이에 따라 서로간의 성격과 장단점이 확실하다.
- 커널 레벨 쓰레드
- 커널에서 직접 제공되므로 안전성과 다양한 기능성이 제공된다.
- 유저 모드에서 커널 모드로의 전환이 빈번해지기 때문에 성능 저하가 유발된다.
- 유저 레벨 쓰레드
- 유저 모드에서 전적으로 관리되므로 커널 모드 전환이 필요 없어진다.
- 쓰레드 A가 블로킹 상태인 경우 B, C 또한 블로킹되게 되며 안전성이 낮다.
커널 모드와 유저 모드
유저 영역은 사용자가 구현한 프로그램 동작 시 사용하게 되는 메모리 영역이고, 커널 영역은 운영체제 동작 시 사용하게 되는 메모리 영역이다.
일반적인 프로그램은 기본적으로 유저 모드에서 동작한다. 그러다가 Windows 커널이 실행되어야 하는 경우에는 커널 모드로의 전환이 일어난다.
타임 슬라이스마다의 컨텍스트 스위칭을 위한 스케줄러 동작은 커널 모드에서 실행되는 것이다.
Windows에서 운영체제 차원에서 제공되는 시스템 함수들 중 상당수가 커널의 구동을 필요로 하기에, 이를 인지하고 있어야 한다.
단, 커널 모드와 유저 모드를 제공하는 대상은 운영체제가 아닌, 프로세서이다. 커널모드와 유저모드를 구분시키는 메모리 보호 기능은 CPU가 제공하는 것이다.
이것만은 알고 갑시다
- 프로세스와 쓰레드의 차이점
- 프로세스는 다른 프로세스와 메모리를 공유하지 않지만, 프로세스 내에 존재하는 둘 이상의 쓰레드들은 스택을 제외한 나머지 메모리 공간을 공유한다.
- 커널 영역과 유저 영역
- 메모리 공간은 커널 영역과 유저 영역으로 나뉜다. 커널 영역은 커널이 올라가 있으며 커널의 실행을 위한 메모리 영역이고, 유저 영역은 운영체제 이외의 프로그램이 올라가 실행되는 영역이다.
- 커널 모드와 유저 모드
- 일반적인 응용프로그램 실행은 유저 모드 상태에서 제한된 메모리 접근 상태로 동작하다가, 필요 시에 커널 모드로 전환되어 커널 영역의 코드를 실행시키게 된다.
- 커널 레벨 쓰레드와 유저 레벨 쓰레드
- 쓰레드를 지원하는 운영체제의 기능을 통해서 생성된 쓰레드가 커널 레벨 쓰레드이고, 라이브러리 형태로 제공되는 기능을 통해 생성된 쓰레드를 유저 레벨 쓰레드라고 한다.
'공부한 이야기 > 윈도우 OS' 카테고리의 다른 글
XIII : 쓰레드 동기화 기법 I (0) | 2023.04.29 |
---|---|
XII : 쓰레드의 생성과 소멸 (0) | 2023.04.29 |
X : 컴퓨터 구조에 대한 세 번째 이야기 (0) | 2023.04.29 |
IX : 스케줄링 알고리즘과 우선순위 (0) | 2023.04.29 |
VIII : 프로세스간 통신 (IPC) 2 (0) | 2023.04.29 |