본문 바로가기
CS 지식/Operating System

운영체제 - 4 (Thread management)

by 눈오는1월 2024. 7. 11.
728x90

해당 정리는 youtube HPC Lab. KOREATECH의 OS 강의를 듣고 정리한 내용이다.

강의 자료는 https://hpclab.tistory.com/1?category=887083 해당 링크에 있다.

 

목차

  • 스레드(Thread) 개념
  • 스레드의 구현

스레드(Thread) 개념

스레드의 개념을 공부하려면 프로세스에 대해 복습하는 시간을 가져보자.

프로세스는 지원을 할당받고 자원을 제어해서 목적을 달성한다.

여기서 자원을 제어하는 역할이 스레드(Thread)이다.

즉 스레드는 프로세스 내에서 자원을 제어하는 역할을 가지고, 하나의 프로세스에는 여러 개의 스레드가 존재한다.

위 그림처럼 하나의 프로세스 내에 여러 스레드는 같은 자원을 공유한다. (힙, 데이터, 코드)

즉 메모리 관점에서 각각의 스레드는 독립적인 작업영역을 가지면서 자원을 공유하게 된다.

 

스레드의 개념을 요약하자면

  • Light Weight Process(LWP)라고 불린다.
  • 프로세서 활용의 기본단위이다.
  • 자원을 공유한다.

스레드는 Thread ID, Register set(PC, SP 등), Stack(작업영역)으로 구성되어 있다.

앞서 중복적으로 얘기를 하고 있는 것처럼 “자원을 공유한다” 가 중요하다.

 

추가적으로 하나의 프로세스 내 스레드가 하나일 경우 Single-thread, 하나의 프로세스 내 스레드가 여러 개일 경우 Multi-threads라고 불린다.

스레드 장점

스레드는 4가지 장점이 존재한다.

  1. 사용자 응답성
  2. 자원 공유
  3. 경제성
  4. 멀티 프로세서 활용

위 4가지를 하나씩 알아보자

 

사용자 응답성

스레드를 사용하게 되면 다른 스레드가 지연되어도 다른 스레드는 작업을 계속하기 때문에 사용자 응답성이 좋다.

예를 들어서 FPS 게임을 한다고 생각해 보자. FPS 게임을 할 때는 화면을 보여주고 마우스로 움직이고 총소리가 들리는 기능 3가지가 동작해야 한다. 만약 이를 단일 스레드로 동작을 하게 될 경우 각각의 동작마다 I/O가 필요로 하게 되고 이는 프로세스가 block 상태가 된다. block 상태에서 I/O 자원을 할당받으면 Ready 상태로 되고 다시 Running 상태가 된다. 이러한 과정을 거치는 동안 사용자는 FPS 게임 시 게임이 멈추는 현상을 느끼게 된다.

즉 프로세스 내에 여러 스레드를 사용하게 되면 각각의 기능을 스레드가 역할을 맡아서 하게 되면 위와 같은 현상을 최소화할 수 있다.

 

자원 공유 & 경제성

두 개의 개념이 비슷한 얘기이다.

스레드를 사용하게 되면 자원을 공유해서 효율성이 증가하고 이로 인한 프로세스 생성, context switch에 비해 경제적으로 효율적이다.

P1 프로세스와 P2 프로세스가 A라는 자원을 번갈아가면서 사용한다고 생각해 보자. 자원을 공유해서 사용하지 못하므로 서로 한 번씩 자원을 사용하게 되고 이때 Context Switching이 발생하게 된다. 저번 시간에 말했던 것처럼 Context Swiching은 많은 비용이 들기 때문에 효율적이지 못한다.

만약 프로세스가 아닌 스레드라고 생각한다면, 자원을 동시에 사용하기 때문에 Context Switching이 발생하지 않는다. 이는 즉 커널의 개입을 피할 수 있기에 overhead 발생이 줄어든다라고 볼 수 있다.

 

멀티 프로세서 활용

스레드는 프로세서를 활용하는 기본 요소이기 때문에 스레드가 여러 개면 여러개 CPU 코어 사용이 가능하다. 즉 병렬처리를 통해 성능이 향상된다.

스레드의 구현

스레드는 사용자 수준 스레드, 커널 수준 스레드로 구현할 수 있다.

사용자 수준 스레드(Userr Threads)

 

사용자 수준 스레드는 사용자 영역의 스레드 라이브러리로 구현된 것을 의미한다.

대표적인 예로 POSIX threads, Win32 threads, Java thread API 3개로 되어있다.

 

위 그림처럼 여러 개의 사용자 수준 스레드가 존재하고 이를 스레드 라이브러리를 통해 여러개의 사용자 수준 스레드를 관리한다 그 후 커널 역역에서 커널 수준 스레드하나로 이들을 제어하는 그림이라고 보면 된다.(다대일 매핑)

 

 

사용자 수준 스레드는 커널은 해당 스레드의 존재를 알 수 없다. 즉, 커널의 관리를 받지 않는 점을 장점이라고 볼 수 있다.

 

커널의 개입을 받지 않는다는 overhead가 적고, 그만큼 유연하고 효율적이다. 또한 스레드 라이브러리만 존재하면 다른 os에서도 사용가능하다는 장점이 존재한다.

반면, 커널 수준 스레드가 프로세스 단위로 자원을 할당받기 때문에, 만약 여러 개의 사용자 수준 스레드 중에서 하나가 block 상태로 되면 나머지 모든 스레드도 대기를 해야 하는 단점이 존재한다.

커널 수준 스레드(Kernel Threads)

커널 수준 스레드는 OS(Kernel)이 직접적으로 관리하는 형태로 구현된 것을 의미한다.

사용자 수준 스레드에 커널 수준 스레드가 1대 1 매칭이 되는 것이 특징이다. 즉 커널 영역에서 스레드의 생성, 관리를 한다.

이를 통한 단점으로는 커널 영역에서 직접 관리하기 때문에 Context Switching 등 Overhead가 크게 발생한다.

장점으로는 커널에서 일대일로 관리를 하기 때문에 하나의 스레드가 block 상태가 되어도 다른 스레드는 계속적으로 작업 수행이 가능하다.

혼합형 스레드(Multi-Threading Model)

혼합형 스레드는 사용자 수준 스레드와 커널 수준 스레드가 합쳐져서 구현된 것을 의미한다.

n개의 사용자 수준 스레드와 m개의 커널 스레드로 대다대 형식으로 이루어져 있다.(n > m)

혼합형 스레드는 사용자 수준 스레드와 커널 수준 스레드의 장점만을 가지고 있는데

사용자가 원하는 수만큼 스레드를 사용 가능하고 병행 처리가 가능하다(하나가 block 상태여도 다른 스레드는 수행 가능)

 

728x90