본문 바로가기
CS/Operating System

[ OS 기초 ] 03. 스레드 관리

by IM조이 2021. 6. 23.

1. 스레드의 개념
2. 스레드의 구현

 

00 도입

스레드에 들어가기 전 기본 개념을 한 번 더 짚어보면
- 작업 : 목적 달성을 위해 필요한 프로그램과 데이터의 묶음
- 프로세스 : 자원을 할당받아 작업을 수행해 목적을 달성하는 것, 할당받은 자원을 제어한다
- 스레드 : 프로세스의 '제어' 부분

 

01 스레드의 개념

스레드 = 실 (표현 할 때 ~ 로 표현)
프로세스는 자원을 할당받아 이 자원을 제어하며 작업을 수행해나간다. 여러 자원을 할당받았을 때, 이 자원들을 제어 하는 것이 바로 스레드다.

01-1 스레드
프로세스 : 자원제어하여 목적 달성을 위해 작업을 수행하는 것
스레드는 여기서 제어에 해당하는데, 자원은 공유하고 있기 때문에 가벼운 프로세스(Light Weight Process)라 불린다. 스레드는 프로세서(cpu) 활용의 기본 단위로, 스레드가 여러개라면 프로세서도 여러개를 사용한다.(다른 표현으로 말하면, 프로세서를 동시에 사용한다.)

자원(리소스) 영역
- 우리가 작성한 코드(PC가 가리키고 있는 대상)
- 데이터(인풋 정보 등)
- 힙(프로세스가 사용하는 전역 메모리 공간)

제어 영역 ( = 스레드 )
- PC, 프로세스 상태 정보, SP
- 지역 데이터(제어를 위해 내부에서 사용하는 데이터 - 마치 for문 내부에서만 유효한 데이터처럼)
- 지역데이터를 저장하는 스택영역

핵심은 프로세스의 자원들은 공유하면서, 이를 제어하는 여러개의 스레드가 존재할 수 있다는 점이다. 즉, 한 프로세스 안에도 독립적으로 제어를 할 수 있는 여러개의 스레드가 있을 수 있다. (자원공유 + 독립적 제어)

How?
- 메모리에는 프로세스에 할당된 공간이 있다
- 그 메모리 안에는 앞서 언급한 자원 영역인 코드, 데이터, 힙 메모리가 있고 제어를 위한 메모리도 있는데, 이 제어를 위한 메모리 안에 개별 스레드가 자신만의 작업 영역인 스택을 갖는다.
- 따라서 스레드들은 프로세스에 할당된 동일한 메모리 공간을 공유하면서도, 코드 내에서 각자 어떤 부분을 실행하고 있는지 개별 PC를 가지고 있고( 그 정보는 해당 스레드의 스택에 ), 흐름을 제어한다.

 

01-2 스레드의 구성 요소

  • Thread ID
  • Register Set (PC)
  • Stack (자신만의 작업 영역)

 

01-3 단일 스레드 프로세스(Single Thread Process) VS 멀티 스레드 프로세스(Multi Threads Process)

단일 : 하나의 프로세스(자원 + 제어) <= 하나의 스레드로 제어
멀티 : 하나의 프로세스(자원 + 제어) <= 여러개의 스레드로 제어

멀티 스레드의 경우, 개별 스레드가 각자의 PC, 지역데이터, Stack 영역을 갖고 있고, 모든 스레드가 프로세스의 자원을 공유하는 구조

 

01-4 스레드 사용의 장점

  • 자원 공유 가능
    : 서로 다른 프로세스(A,B)가 동일한 자원(R)이 필요하다면 어느 한 프로세스(A)가 자원을 사용하는 동안에 다른 프로세스(B)는 R을 사용할 수 없고, A의 작업이 끝나야 B가 R을 사용할 수 있다. 이때 context switching이 발생한다(context switching 은 비용이기때문에 피하는 게 좋다). 그렇지만 만약 하나의 프로세스(P)안에 여러 스레드(A,B)가 있으면 X를 공유할 수 있기 때문에 전자보다 훨씬 효율적이다.
  • 높은 경제성
    : 프로세스 생성에 들어가는 비용, 문맥 교환(context switching)에 들어가는 비용을 획기적으로 줄일 수 있다
  • 멀티 프로세서 활용
    : 여러 스레드를 사용한다는 것은 여러개의 cpu 코어를 동시에 사용한다는 것 의미하기 때문에 병렬처리를 통한 성능 향상을 기대할 수 있다
  • 높은 사용자 응답성
    : 여러 프로세스를 사용해 작업을 수행할때는 I/O가 있을때마다 blocked되어 모든 프로세스가 중단 상태에 갔다가 다시 돌아가기때문에 사용자 입장에서는 멈춤이 자꾸 발생해 불편할 수 있다. 하지만 스레드를 사용하면 자원은 공유하면서 동시에 작업들을 처리할 수 있어 사용자 입장에서 응답성이 높다 느낄 수 있다.

 

02 스레드의 구현

스레드는 크게 사용자 수준의 스레드와 커널 수준의 스레드로 나누어 볼 수 있다.

02-1 사용자 수준의 스레드

  • ex) POSIX threads, Win32 Threads, Java Thread API 등
  • 각 사용자 수준 스레드 정보는 TCB라는 스레드제어블록에 담겨있다
  • 프로세스 하나가 생성되면 이에 커널은 이 프로세스에 대해 이를 제어하기 위한 커널 수준의 스레드를 하나 만든다
  • 스레드를 라이브러리 레벨로 구현한 것으로, 이 라이브러리가 스레드들의 생성과 스케줄링을 담당한다. 따라서 커널은 사용자 수준의 스레드들의 존재에 대해서는 모르기때문에 개입도 하지 않는다.

커널이 개입하지 않기 때문에, 더 유연하게 관리할 수 있고 오버헤드도 적다는 점이 특징이며 이식성(portability)가 높아서 라이브러리만 있다면, 쉽게 쓸 수 있다. 하지만, 커널이 개입하지 않기 때문에 I/O가 필요할 때는 blocked state가 되고, 이때 다른 스레드들 전부 다 block이 되어 대기상태로 빠진다.(why? 커널은 프로세스 단위로 자원을 할당하기 때문에 어떤 특정 스레드에서 자원을 요청하게 되면 해당 프로세스에서의 자원 요청을 의미하므로, 프로세스를 중단시키게 되서)

 

02-2 커널 수준의 스레드

사용자 수준의 스레드와는 달리 스레드를 커널이 직접 관리하는 방식에 해당한다. 커널 영역에서 사용자 영역만큼의 스레드를 만들어서 1:1 매핑을 시키고 스레드 관리도 커널 레벨로 들어오게 된다. 하지만, 커널 안에 여러 제어 요소들이 생기는 만큼 오버헤드가 커지고, 스레드임에도 불구하고 문맥교환이 자주 발생한다.(물론 스레드를 사용하지 않을 때보다는 덜 발생한다) 다만, 특정 스레드가 I/O를 필요로 해 blocked State가 되어도 나머지 스레드는 계속 작업을 수행할 수 있어 병행 수행이 가능하다는 장점도 있다.

 

이처럼 두 방식 모두 장단점이 있기 때문에, 우리는 이 두 방식을 잘 조합해 사용한다. (다대다 모델)

 

02-3 혼합형 n:m 스레드

혼합형은 n개의 사용자수준 스레드와 m개의 커널 수준 스레드 (n>=m) 로 구성된다. 사용자는 원하는 수 만큼 스레드 사용이 가능하고 커널은 해당 커널에 할당된 사용자 스레드가 blocked 상태가 되어도 다른 스레드는 계속 작업을 수행하도록 병행처리가 가능하게 만들 수 있다. 이런 점에서 혼합형 스레드는 효율적이면서 유연하고 실제 OS에서 주로 활용하는 방식이다.

 

**  KOREATECH 무료 OS강의(클릭) 학습 후 나름대로 이해한 뒤 정리한 내용입니다. **

 

[Course] Operating System (CPA310) - 운영체제 강의

o Operating System (운영체제), CPA310, KOREATECH o Instructor: Duksu Kim (김덕수) o Course homepage: https://sites.google.com/view/hpclab/courses/operating-system 운...

www.youtube.com

 

댓글