개발자 공부하기/운영체제

[운영체제] 스레드의 개념 정리하기

스윗 앨리스 2020. 10. 5. 23:32

지금까지는

1. 프로세스의 개념과

2. 프로세스 내에서 메모리 구조와,

3. 프로세스 간에는 어떻게 통신할 수 있는지,

4. CPU에 어떤 프로세스를 할당할지를 운영체제가 어떻게 결정하고 스케줄링하는지

 

등등을 공부했다.

 

공부했던 내용이 기억나지 않을 땐, 리마인드를 위해 포스팅 다시 읽기!

 

[운영체제] 프로세스 개념 정복하기
[운영체제] 프로세스 생성과 종료 / 요약 정리
[운영체제] 프로세스 스케줄링 개념 정리

 

스레드 (Thread) : 바늘질할 때 쓰는 실을 뜻함

프로세스 내에서 실행되는 프로그램 코드의 흐름을 말한다.

하나의 프로세스 내에는 반드시 하나 이상의 스레드가 존재한다.

각 스레드는 스레드ID, 프로그램 카운터(PC), 레지스터 집합, 스택을 독립적으로 소유한다.

같은 프로세스 내에 스레드들은 서로 텍스트 영역(코드), 데이터 영역, 열린 파일 등의 시스템 자원을 공유한다.

 

싱글스레드 vs 멀티스레드

위 그림을 통해 각 스레드들은 code, data, files 영역은 공유하지만 각자 registers, stack 영역이 분리되어 있는 것을 다시 확인!!

 

프로세스 메모리 for thread

MainThread, thread1, thread2, thread3 을 비교해보면,

1. 프로그램 코드상으로 현재 실행위치가 서로 다르다. => 프로그램 카운터(다음에 실행될 명령어의 포인터)가 다르다

2. 독립적인 Stack 영역을 갖는다.

 

스레드는 왜 필요한가?

여러개의 단위 작업으로 구성된 프로그램에서 요청을 동시에 처리하기 위해서다.

 

예) 웹 브라우저 

이미지/텍스트를 표시하는 스레드, 네트워크에서 데이터를 가져오는 스레드, 파일 다운로드 받는 스레드 등등

한 프로세스 내에서 여러개의 작업을 해야하는 경우가 생긴다. 

 

응답성 (Responsiveness) 다른 스레드의 실행 시간이 길거나 입출력 요청으로 인해 block 되더라도 계속 실행되는 것을 허용한다.
자원 공유 (Resource sharing) 프로세스 내 자원(코드, 데이터)를 자동적으로 공유한다.
경제성 (Economy) 만약 각각의 작업을 위해 별도의 프로세스를 생성한다면,
프로세스 생성 및 문맥 교환(Context switch)으로 인해 overhead가 발생한다.
이에 비해 멀티 스레딩 방식은 훨씬 경제적이다.
확장성 (Scalability) 멀티 프로세서 시스템에서 병렬성이 증가한다.
(하나의 프로세스라 Context Switch될 일이 없기 때문에 CPU가 여러개일 때 병렬적으로 사용될 수 있음)

 

멀티 스레딩 모델

1. 사용자 스레드 (User Thread)

커널의 지원/인식 없이 사용자 공간에서 실행되며 스레드 라이브러리를 통해 제공된다. (예. Pthread, Java 스레드)

커널의 관여없이 스레드 생성, 스케줄링, 관리를 수행한다.

스레드의 멈춤은 프로세스 자체의 blocking을 유발한다. 

 

2. 커널 스레드 (Kernel Thread)

커널이 스레드를 인식하고 프로세스와 유사하게 스케줄링한다.

Windows, Linux, macOS 등 대부분의 운영체제가 지원하고 있다.

각 커널 스레드는 CPU 스케줄링을 통해 병렬적으로 실행된다.

 

사용자 스레드와 커널 스레드의 관계

사용자 스레드가 CPU를 할당 받아 실행되기 위해서는 커널 스레드에 연결되어야 한다.

 

1. 다대일(M:1) 모델

2. 일대일(1:1) 모델