[Operating System ④] 스레드 개념 잡기

4 분 소요

[Operating System ④ 스레드 개념 잡기 ]

HPC Lab 김덕수 교수님의 운영체제 강의를 정리한 내용입니다. :+1:

강의링크


목차

:point_right: [1] 스레드의 개념

  1. 스레드?
  2. 프로세스와 스레드의 차이
  3. 스레드란
  4. 스레드의 장점

:point_right: [2] 스레드 구현

  1. 사용자 수준 스레드
  2. 사용자 수준 스레드의 장단점
  3. 커널 수준 스레드
  4. 혼합형 스레드



:pushpin: 스레드의 개념

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. 스레드의 장점

  1. 자원을 공유할 수 있다. 2개의 Process 가 하나의 자원A를 사용한다면, Kernel이 개입하여 Context switching이 발생하고 Overhead가 커진다.
    반면, 하나의 Process내부의 2개의 Thread자원A를 사용한다면, Kernel개입 없이 프로세스 내부의 자원을 공유할 수 있기 때문에 Context switching이 발생하지 않는다.
    즉, 멀티 스레드환경에서 자원 공유가 가능하기 때문에 멀티 프로세스환경보다 효율성이 증가.

  2. 경제성이 높다. Kernel 개입 등을 피함으로써 훨씬 경제적이다.

  3. 멀티 프로세서(CPU)를 활용가능하다. ThreadProcessor(CPU)를 활용하는 기본요소이다.
    즉, 여러 개의 Thread를 통해 여러 개의 CPU코어를 동시에 사용할 수 있다.
    즉, 병렬처리를 통해 더 높은 성능을 얻을 수 있다.

  4. 사용자 응답성이 높아진다.

Single-thread환경에서 게임을 한다고 생각해보자


게임을 하기 위해서 필요한 I/O는 다음과 같다.

  1. 마우스 클릭을 통한 제어
  2. 스피커/마이크를 통한 다른 유저와의 소통
  3. 게임화면 출력

I/O요청이 들어오면, Processrun상태에서 block상태로 변화하게 되고, ready를 거쳐 다시 run으로 돌아가는 과정을 갖는다.
만약 Thread를 하나만 가지고 있다면,
마우스 클릭하면 화면이 멈추고, 마이크로 얘기하면 마우스 클릭이 안되는
즉, 하나의 작업을 할 때마다 다른 작업을 할 수 없는 상황이 발생한다.

이를 해결할 수 있는 방법은 여러 개의 Thread를 활용하는 것이다.
3개의 Thread가 각각 사용자 입력, 화면 출력, 스피커/마이크제어하는 역할을 담당하면 멈춤 없이 게임을 지속할 수 있다.
즉, 하나의 Thread가 지연되더라도, 다른 Thread는 작업을 지속할 수 있게 된다.


:pushpin: 스레드 구현

스레드는 크게 2가지로 나뉜다.

  • 사용자 수준 스레드
    • 라이브러리 레벨로 구현된다.
    • 해당 라이브러리가 Thread의 생성과 스케줄링을 모두 담당한다.
  • 커널 수준 스레드


2-A. 사용자 수준 스레드


  • Process가 생성된다.
    • Kernel영역에 제어를 위한 커널 수준 스레드가 하나 생성된다.
    • 사용자 영역에서는, 라이브러리를 통해 여러 개의 Thread를 생성하여 작업한다.
    • 라이브러리 안에는 사용자 수준 스레드를 제어하기 위한 TCB가 생성된다

즉, 커널 수준 스레드는 1개인데, 사용자 수준 스레드는 여러개인 다대일 맵핑이 일어나게 된다.

2-B. 사용자 수준 스레드의 장단점

장점

  • KernelThread의 존재를 모른다.
    • Thread를 라이브러리 레벨에서 관리하기 때문에, Kernel의 개입 없이 더 효율적/유연한 관리가 가능하다
  • 이식성도 높다.
    • 해당 라이브러리가 있는 시스템이라면, 생성해 놓은 Multi-thread 프로그램을 사용할 수 있음
    • 예시 JVM(Java Virtual Machine) 있으면, 다른 곳에서 사용할 때 따로 컴파일하지 않아도 바로 사용가능

단점

  • I/O로 인해 block상태가 되면, 같은Process에 위치한 모든 Thread들이 block된다.
    • KernelProcess 단위로 자원을 할당하기 때문에
    • 하나의 Thread로 인해 Processblock되면, 해당 Process내에 있는 모든 Thread들이 block된다.


2-C. 커널 수준 스레드


일대일 매핑: 사용자 영역에서 Thread가 만들어지면, 커널 영역에서도 동일한 개수의 Thread가 만들어진다.
사용자 수준 스레드사용자 영역에서 Thread를 관리하는 것과 달리, 커널 수준 스레드커널 레벨에서 관리한다.
Overhead가 크다.

단점

  • Kernel이 직접 관리하는 스레드
  • 사용자 수준 스레드에 비해 Overhead가 크다
    • Process간의 context switching보다는 Overhead 적지만, 사용자 수준에서 만들어진 스레드들의 동작보다 Overhead가 커진다.

장점

  • 하나의 Thread가 I/O처리를 위해 block상태가 되는 경우에도, 다른 Thread는 작업을 계속할 수 있다.
  • 즉, ProcessThread들이 병행적으로 작업 가능


2-D. 혼합형 스레드


사용자 수준 스레드커널 수준 스레드의 성질을 혼합한 다대다모델

  • 병행처리가 가능
  • 효율적이고 유연


혼합형 스레드의 형태


  • 사용자는 라이브러리를 기반으로, 원하는 만큼 Thread를 생성해서 사용할 수 있다
  • 커널에서는 사용자 스레드보다 작지만, 다수의 커널 수준 스레드를 가지게 된다
  • 커널 수준 스레드사용자 수준 스레드처럼 동적으로 관리할 수 있다.
  • 하나의 사용자 스레드block되더라도, 다른 사용자 스레드는 정상적으로 동작할 수 있게 된다.
  • 실제 Processor(CPU)들은 커널 수준 스레드와 맵핑되게 된다.

실제 OS들은 이와 같은 혼합 스레드형 모델을 사용한다.


:bulb: 요약

  1. 스레드의 개념
    • 자원은 공유하면서, 각각의 제어요소를 가지고 있는 것
    • Kernel의 간섭/관리를 받지 않으므로, 작업 효율성 높아진다. - 여러 개의 CPU 코어를 사용해 병렬처리가 가능
    • ThreadProcessor를 사용할 수 있는 기본 단위이기 때문
  2. 스레드 구현
    • 사용자 수준 스레드
    • Kernel의 개입 없어서 Overhead적음
    • 하지만, 같은 Process 내의 Threadblock될 경우 자신도 함께 block됨 - 커널 수준 스레드
    • Kernel이 각 Thread의 존재를 알고, 개별관리하기 때문에 하나가 block되어도 다른 Thread에 영향 없음
    • Kernel이 개입하기 때문에, 사용자 수준 스레드보다 Overhead 큼 - 혼합형 스레드
    • 사용자 수준 스레드와 커널 수준 스레드를 모두 가진 스레드
    • 라이브러리를 기반으로 다수의 사용자 기반 스레드 사용 가능
    • 다른 Threadblock되어도 영향 없어서 병행처리 가능

태그:

카테고리:

업데이트:

댓글남기기