봉황대 in CS

[Chapter 4. 스레드] Windows 스레드와 Linux 스레드 본문

Computer Science & Engineering/Operating System

[Chapter 4. 스레드] Windows 스레드와 Linux 스레드

등 긁는 봉황대 2022. 7. 16. 17:17

* 본 글은 '운영체제(Operating System: Concepts) 9th edition'의 내용과 2021학년도 1학기에 수강한 '운영체제' 과목 강의 내용을 함께 정리하여 작성하였습니다.

 

Windows 스레드


각 프로세스는 한 개 또는 그 이상의 스레드를 가질 수 있다.

 

CreateProcess() API를 통해서 스레드를 생성하며,

* 참고 : 2022.07.09 - [Computer Science/Operating System] - [Chapter 3. 프로세스] 프로세스 생성과 종료

 

일대일 대응을 통해 사용자 수준 스레드 하나마다 커널 스레드 하나가 대응된다.

 

 

Windows 스레드는 3가지 자료구조를 가지며, 다음의 항목들에 대한 정보를 저장하고 있다.

 

1. ETHREAD (executive thread block) : 실행 스레드 블록

해당 스레드가 속한 프로세스를 가리키는 포인터, 스레드가 실행을 시작해야 할 루틴의 주소, KTHREAD에 대한 포인터 등

 

2. KTHREAD (kernel thread block) : 커널 스레드 블록

스레드의 스케줄링 & 동기화 정보, 커널 스택 (커널 모드에서 실행될 때 사용됨), TEB에 대한 포인터 등

 

3. TEB (thread environment block) : 스레드 환경 블록

스레드 식별자, 사용자 스택 (사용자 모드에서 실행될 때 사용됨), 스레드 국지 저장소를 저장하기 위한 배열 등

 

 

 

Linux 스레드


fork() 시스템 호출을 통해 프로세스를 복제, clone() 시스템 호출을 통해 스레드를 생성할 수 있다.

 

Linux에서는 프로세스와 스레드를 구별하지 않으며,

프로그램 내의 제어 흐름을 나타내기 위해 태스크라는 용어를 사용한다.

 

clone() 시스템 호출을 부를 때 플래그의 집합이 전달된다.

이때 플래그는 부모와 자식 태스크가 자료구조를 얼마나 공유할 지에 대한 정보이다.

 

아래 표는 플래그들의 일부를 나타낸 것이다.

 

플래그 의미
CLONE_FS 파일 시스템 정보가 공유된다.
CLONE_VM 같은 메모리 공간이 공유된다.
CLONE_SIGHAND 신호 처리기가 공유된다.
CLONE_FILES 열린 파일의 집합이 공유된다.

 

만약 clone()이 표에 있는 플래그를 전부 전달 받았다면

부모 태스크와 자식 태스크는 파일 시스템 정보(ex. 현재 작업 디렉토리), 메모리 공간, 열린 파일의 집합(ex. 신호 처리기)을 공유하게 되는 것이다.

 

아무런 플래그 없이 clone() 시스템 콜을 불렀다면 자원들에 대하여 부모 태스크와는 아무 공유가 없는 자식 태스크가 생기는 것이므로

결과는 fork() 시스템 콜을 부른 것과 유사하게 된다.

 


이렇게 다양한 공유 수준은 어떻게해서 가능한 것일까?

 

시스템의 태스크마다 고유한 커널 자료 구조(struct task_struct)가 존재하기 때문이다.

 

이 자료 구조는 데이터가 저장되어 있는 다른 자료 구조를 가리키는 포인터를 저장한다. (데이터를 직접 저장하는 것이 아님)

여기서 '다른 자료 구조'는 열린 파일의 리스트를 나타내는 자료 구조, 신호 처리 정보, 가상 메모리 등을 말하는 것이다.

 

fork() 시스템 호출이 불리면 부모 프로세스의 관련된 자료 구조를 복사하는 것을 통해 새로운 태스크를 생성한다.

clone() 시스템 호출을 통해서도 새로운 태스크를 생성할 수 있는데, 이때는 전달된 플래그에 따라 부모 태스크의 자료 구조를 가리키게 된다.

 

 

반응형
Comments