본 내용은 Operating System Concepts 8th Edition 번역본 책을 읽고 공부한 내용입니다.
목차
1. 다중 스레드
1) 배경
2) 개념
3) 장점
2. 사용자 레벨 스레드와 커널 레벨 스레드
3.Process 100개에 thread 한 개 있는 모델 vs Process 1개에 thread 100개 있는 모델
1) 메모리 영역의 차이
2) 각 방식의 장점과 단점 비교
3) PCB와 TCB 개수 비교
1. 다중 스레드
1. 배경
앞에서 우리는 다중프로그래밍에 대한 개념을 언급했다. 다중 프로그래밍은 쉽게 말해 아래 그림처럼 프로세스 중 아무도 놀지 못하도록 프로세스들을 조정한다는 개념이다.
하나의 응용 프로그램이 여러 개의 비슷한 작업들을 실행해야 하는 상황이 여럿 존재한다.
예를 들자면, 웹 서버는 클라이언트로부터 웹 페이지 / 이미지 / 소리 등에 대한 요청을 받는다. 하나의 분주한 웹 서버는 여러 클라이언트의 접근을 처리해야 한다. 그런데 이 때 단일 프로세스로 한 번에 하나의 클라이언트만 처리할 수 있다면 매우 비효율적이게 될 것이다.
그래서 예전에 채택한 해결책은, 해당 서버에게 서비스 요청이 들어오면 프로세스는 그 요청을 실행할 별도의 프로세스를 또 생성하는 방법이었다. 하지만 프로세스 생성 작업은 매우 많은 시간과 자원을 필요로 하고, 새 프로세스가 하는 일이 기존 프로세스와 동일하다면 큰 오버헤드가 생긴다.
하지만 웹 서버가 다중 스레드화 된다면, 서버는 클라이언트의 요청을 listen하는 별도의 스레드를 생성한다. 요청이 들어오면, 다른 프로세스를 생성하는 것이 아니라 요청을 서비스할 새로운 스레드를 생성하고 추가적인 요청을 listen하기 위한 작업을 재개할 수 있다.
아래에서도 확인할 수 있듯이 다중스레드 방식은 code, data, file 등의 자원을 공유할 수 있어 오버헤드가 적
2. 개념
기존 모델에서는 Process가 a unit of resource ownership, a unit of scheduling 역할을 전부 도맡았다.
하지만 멀티 스레드 방식을 사용하여 process는 unit of resource ownership의 역할만 하고, thread에게 unit of scheduling 역할을 하도록 처리하였다.
각 스레드는 자신의 function 내에서만 돈다. 또한 같은 프로세스 안에 있는 스레드들은 자신이 속한 프로세스의 메모리를 공유할 수 있다.
3. 장점
1. 응답성 : 사용자에 대한 응답성을 증가시킨다. 위에서 봤던 예시처럼, 웹 브라우저는 한 스레드가 이미지 파일을 로드하고 있는 동안 다른 스레드에서 사용자와의 상호작용이 가능하다.
2. 자원 공유 : 스레드는 프로세스와 달리 그들이 속한 프로세스의 자원들과 메모리를 공유할 수 있다.
3. 경제성 : 프로세스 생성을 위해 메모리와 자원을 할당하는 데에는 비용이 많이 든다. 스레드를 생성하고 문맥을 교환하는 것이 보다 더 경제적이다.
4. 규모 가변성 : 다중 처리기 구조에서는 다중 스레딩은 병렬성을 증가시킨다.
4. 스레드와 프로세스의 차이
프로세스가 메모리에 올라갈 때 OS는 프로세스마다 각각 독립된 메모리 영역을 Code, Data, Stack, Heap 형식으로 각각 할당해준다. 따라서 각 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없다.
아래 그림에서 text가 Code 부분입니다.
Data에는 전역변수(global), 정적변수(static), 배열(array), 구조체(structure) 등이 들어갑니다. Data는 data, bss로 나뉘는데, data에는 초기화된 데이터가, bss에는 초기화되지 않은 데이터가 들어갑니다.
Heap에는 new, malloc과 같이 동적으로 할당되는 값들이 들어갑니다.
Stack에는 지역변수, 매개변수, 복귀 번지 등 임시로 사용되는 값들이 들어갑니다.
하지만 스레드는 Stack 영역만 따로 할당받고 나머지 Code/Data/Heap 형식으로 할당된 메모리 영역을 공유한다. 따라서 별도의 스택을 갖고 있으나 힙 메모리는 서로 읽고 쓸 수 있다.
정의로만 이 둘을 풀어보자면, 프로세스는 운영체제로부터 자원을 할당받은 작업의 단위, 스레드는 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위라고 말한다. 정확히는, 스레드는 CPU 입장에서의 최소 작업단위를, 프로세스는 운영체제 관점에서의 최소 작업 단위라고 생각하면 된다.
2. 사용자 레벨 스레드와 커널 레벨 스레드
스레드를 위한 지원은 사용자 스레드를 위해서는 사용자 수준에서, 커널 스레드를 위해서는 커널 수준에서 제공된다.
사용자 스레드는 커널 위에서 지원되며 커널의 지원 없이 관리된다. 반면 커널 스레드는 운영체제에 의해 직접 지원되고 관리된다.
다양한 형태의 모델이 있는데, 다-대-일 모델은 여러 개의 사용자 스레드를 하나의 커널 스레드로 사상하고, 일-대-일 모델은 각 사용자 스레드를 그에 대응하는 커널 스레드로 사상한다. 다-대-다 모델은 많은 사용자 스레드를 그보다 적은 수 또는 같은 수의 커널 스레드로 멀티플렉스한다.
3. Process 100개에 thread가 한 개씩 있는 모델 vs Process 1개에 thread 100개 있는 모델
1.메모리 영역의 차이
왼쪽 상황에서는 각각의 프로세스마다 별도의 text, data(data, bss) stack, heap 영역이 존재한다. 하지만 프로세스 한 개에 스레드 100개가 있는 오른쪽 상황에서는, 메인 쓰레드만 text, data(data, bss), heap을 모두 가지고 있고, 그 아래 쓰레드들에는 stack만 존재한다. 즉 text, data(data,bss), heap 영역은 메인스레드에만 존재하며 다같이 공유하고, stack만 스레드당 하나씩 존재하여 독립적으로 사용한다. !!
2. 각 방식의 장점과 단점 비교
왼쪽 방식은 각 프로세스마다 독립적인 메모리 공간을 가지기 때문에, 하나의 프로세스나 스레드에 문제가 생겨도 다른 프로세스/스레드에 영향을 미치지 않는다. 하지만 프로세스들을 죄다 복사해야 하므로 Context-switching 시 오버헤드가 매우 크다는 문제가 있다.
오른쪽 방식은 쓰레드들 간 자원공유 때문에 동기화 등 문제가 있다는 단점이 있지만 active, sleep .. 등의 명령어를 사용해 주는 방식으로 극복한다. 이 방식의 장점은 Context-switching 시 TCB 안에 레지스터 값들만 가져오면 되므로 오버헤드가 훨씬 적다.
3. PCB와 TCB 개수 비교
TCB(Task Control Block)와 PCB(Process Control Block)은 각각 스레드와 프로세스의 상태 정보를 저장하는 자료구조이다. PCB에는 프로세스와 연관된 정보가 저장되어 있다면, TCB에는 레지스터 값들만 저장된다는 특징이 있다.
왼쪽 상황에서는 프로세스 하나당 PCB가 하나씩 필요하고, 각 프로세스당 스레드가 1개씩이므로 PCB는 100개, TCB는 100개가 필요하다. 오른쪽 상황에서는 PCB 1개에 TCB가 100개가 필요하다.
'CS > OS' 카테고리의 다른 글
[OS] CPU Scheduling (0) | 2023.06.09 |
---|---|
[OS] 프로세스 동기화 (0) | 2023.04.13 |
[OS] 프로세스 간 통신 IPC (0) | 2023.04.11 |
[OS] UNIX로 알아보는 PROCESS (3) | 2023.04.11 |
[OS] 운영체제 개념 및 프로세스 (6) | 2023.04.11 |