[Operating System ④] 스레드 개념 잡기
[Operating System ④ 스레드 개념 잡기 ]
HPC Lab 김덕수 교수님의 운영체제 강의를 정리한 내용입니다.
목차
[1] 스레드의 개념
[2] 스레드 구현
스레드의 개념
1-A. 스레드?
프로세스가 변화하는 과정 == Context Switching
비용이 큰 작업이기 때문에, 이 작업을 최소화 하는 것이 중요하다.
Context Switching을 줄이기 위한 하나의 방법 thread(스레드) == 실
1-B. 프로세스와 스레드의 차이
Process
는 작업을 위한 자원
을 할당받고, 해당 자원을 제어
함으로써 작업을 진행한다.
따라서, Process
에 필요한 요소를 크게 자원
과 제어
로 나눌 수 있다.
-
자원
: 작업을 위해 필요한 리소스들 -
제어
: 자원을 이용하여 실제 작업을 실행하는 것
이 때, Process의 제어
부분만을 분리해놓은 것을 Thread
라 부른다.
-
Thread
는 실로 많이 설명된다. - 하나의
Process
안에 여러개의Thread
가 존재할 수 있다.-
Process
는 하나지만, 할당받은 자원을제어
하는 것이 여러 개인 경우.
-
Process
는자원
과제어
를 모두 포함하는 개념이다
-
자원
- 코드
- 데이터
- 힙: 프로세스가 사용하는 메모리 공간(new 등을 통해서 힙영역에 공간을 할당받게 됨)
-
제어
- 제어정보
- Stack Pointer
- Program Counter : 내가 어디까지 제어를 하고 있었는지
- 상태
- 지역 데이터
- 예를 들어, for문 내부에서 변수를 선언에서 사용하면
- 해당 변수는 for문 안에서만 유효한 데이터(지역 데이터)이다
- 이러한 지역데이터는 stack영역에 저장된다
- 제어정보
Thread
는제어
기능만을 수행한다
-
Process
내부에 생성된Thread 1~n
은제어
역할만을 담당하며, - 하나의
Resource
영역을 공유한다. - 즉, 하나의
Process
에서제어
하는 역할은 여러개일 수 있다.
Process
의 메모리 공간
같은 Process
에 속한 Thread
들은 동일한 주소공간을 공유한다.
-
공유 자원
: Heap, 데이터, 코드 -
고유한 영역
: Stack에 할당되는 자신만의 작업 영역
1-C. 스레드란
-
Thread
는 쉽게 말해서 가벼운 무게의 Process다.
-
Process
는자원
과제어
를 모두 가지고 있어야 하지만,Thread
는자원
을 공유하고제어
만 가지고 있기 때문에 일반 프로세스보다 가볍다.
-
-
CPU를 활용하는 기본단위이다
-
Thread
가 여러개라면, 동시에 여러개의 CPU를 사용할 수 있다
-
-
구성요소
- 스레드를 구별하는 id
- 레지스터 셋
- 자기만의 작업 영역인 stack
- Single-thread와 Multi-thread가 있다
1-D. 스레드의 장점
-
자원을 공유할 수 있다. 2개의
Process
가 하나의자원A
를 사용한다면,Kernel
이 개입하여Context switching
이 발생하고Overhead
가 커진다.
반면, 하나의Process
내부의 2개의Thread
가자원A
를 사용한다면,Kernel
개입 없이 프로세스 내부의 자원을 공유할 수 있기 때문에Context switching
이 발생하지 않는다.
즉,멀티 스레드
환경에서 자원 공유가 가능하기 때문에멀티 프로세스
환경보다 효율성이 증가. -
경제성이 높다.
Kernel
개입 등을 피함으로써 훨씬 경제적이다. -
멀티 프로세서(CPU)를 활용가능하다.
Thread
는Processor(CPU)
를 활용하는 기본요소이다.
즉, 여러 개의Thread
를 통해 여러 개의 CPU코어를 동시에 사용할 수 있다.
즉,병렬처리
를 통해 더 높은 성능을 얻을 수 있다. -
사용자 응답성이 높아진다.
Single-thread환경에서 게임을 한다고 생각해보자
게임을 하기 위해서 필요한 I/O는 다음과 같다.
- 마우스 클릭을 통한 제어
- 스피커/마이크를 통한 다른 유저와의 소통
- 게임화면 출력
I/O요청이 들어오면, Process
는 run
상태에서 block
상태로 변화하게 되고, ready
를 거쳐 다시 run
으로 돌아가는 과정을 갖는다.
만약 Thread
를 하나만 가지고 있다면,
마우스 클릭하면 화면이 멈추고, 마이크로 얘기하면 마우스 클릭이 안되는
즉, 하나의 작업을 할 때마다 다른 작업을 할 수 없는 상황이 발생한다.
이를 해결할 수 있는 방법은 여러 개의 Thread
를 활용하는 것이다.
3개의 Thread
가 각각 사용자 입력
, 화면 출력
, 스피커/마이크
를 제어
하는 역할을 담당하면 멈춤 없이 게임을 지속할 수 있다.
즉, 하나의 Thread가 지연되더라도, 다른 Thread는 작업을 지속할 수 있게 된다.
스레드 구현
스레드는 크게 2가지로 나뉜다.
- 사용자 수준 스레드
- 라이브러리 레벨로 구현된다.
- 해당 라이브러리가
Thread
의 생성과 스케줄링을 모두 담당한다.
- 커널 수준 스레드
2-A. 사용자 수준 스레드
-
Process
가 생성된다.-
Kernel
영역에 제어를 위한 커널 수준 스레드가 하나 생성된다. -
사용자
영역에서는, 라이브러리를 통해 여러 개의Thread
를 생성하여 작업한다. - 라이브러리 안에는 사용자 수준 스레드를 제어하기 위한 TCB가 생성된다
-
즉, 커널 수준 스레드
는 1개인데, 사용자 수준 스레드
는 여러개인 다대일 맵핑
이 일어나게 된다.
2-B. 사용자 수준 스레드의 장단점
장점
-
Kernel
이Thread
의 존재를 모른다.-
Thread
를 라이브러리 레벨에서 관리하기 때문에,Kernel
의 개입 없이 더 효율적/유연한 관리가 가능하다
-
-
이식성
도 높다.- 해당 라이브러리가 있는 시스템이라면, 생성해 놓은
Multi-thread
프로그램을 사용할 수 있음 -
예시
JVM(Java Virtual Machine) 있으면, 다른 곳에서 사용할 때 따로 컴파일하지 않아도 바로 사용가능
- 해당 라이브러리가 있는 시스템이라면, 생성해 놓은
단점
- I/O로 인해
block
상태가 되면, 같은Process
에 위치한 모든Thread
들이block
된다.-
Kernel
은Process
단위로 자원을 할당하기 때문에 - 하나의
Thread
로 인해Process
가block
되면, 해당 Process내에 있는 모든Thread
들이block
된다.
-
2-C. 커널 수준 스레드
일대일 매핑
: 사용자 영역에서 Thread
가 만들어지면, 커널 영역에서도 동일한 개수의 Thread
가 만들어진다.
사용자 수준 스레드가 사용자 영역에서 Thread
를 관리하는 것과 달리, 커널 수준 스레드는 커널 레벨에서 관리한다.
즉 Overhead가 크다.
단점
-
Kernel
이 직접 관리하는 스레드 -
사용자 수준 스레드에 비해
Overhead
가 크다-
Process
간의context switching
보다는Overhead
적지만, 사용자 수준에서 만들어진 스레드들의 동작보다Overhead
가 커진다.
-
장점
- 하나의
Thread
가 I/O처리를 위해block
상태가 되는 경우에도, 다른Thread
는 작업을 계속할 수 있다. - 즉,
Process
내Thread
들이 병행적으로 작업 가능
2-D. 혼합형 스레드
사용자 수준 스레드와 커널 수준 스레드의 성질을 혼합한 다대다모델
- 병행처리가 가능
- 효율적이고 유연
혼합형 스레드의 형태
-
사용자는 라이브러리를 기반으로, 원하는 만큼
Thread
를 생성해서 사용할 수 있다 - 커널에서는 사용자 스레드보다 작지만, 다수의 커널 수준 스레드를 가지게 된다
- 커널 수준 스레드도 사용자 수준 스레드처럼 동적으로 관리할 수 있다.
-
하나의 사용자 스레드가
block
되더라도, 다른 사용자 스레드는 정상적으로 동작할 수 있게 된다. - 실제
Processor(CPU)
들은 커널 수준 스레드와 맵핑되게 된다.
실제 OS들은 이와 같은 혼합 스레드형 모델을 사용한다.
요약
-
스레드의 개념
-
자원
은 공유하면서, 각각의제어
요소를 가지고 있는 것
-
Kernel
의 간섭/관리를 받지 않으므로, 작업 효율성 높아진다. - 여러 개의 CPU 코어를 사용해 병렬처리가 가능 -
Thread
는Processor
를 사용할 수 있는 기본 단위이기 때문
-
-
스레드 구현
- 사용자 수준 스레드
-
Kernel
의 개입 없어서Overhead
적음 - 하지만, 같은
Process
내의Thread
가block
될 경우 자신도 함께block
됨 - 커널 수준 스레드 -
Kernel
이 각Thread
의 존재를 알고, 개별관리하기 때문에 하나가block
되어도 다른Thread
에 영향 없음 -
Kernel
이 개입하기 때문에, 사용자 수준 스레드보다Overhead
큼 - 혼합형 스레드 - 사용자 수준 스레드와 커널 수준 스레드를 모두 가진 스레드
- 라이브러리를 기반으로 다수의 사용자 기반 스레드 사용 가능
- 다른
Thread
가block
되어도 영향 없어서 병행처리 가능
댓글남기기