찬란

스레드 (Thread) 관리 본문

운영체제

스레드 (Thread) 관리

chan4 2023. 4. 15. 00:33

해당 블로그의 내용은 학교에서 배운 내용을 개인적으로 정리한 내용이므로, 잘못된 부분이 있을 수도 있습니다. 

프로세스 (Process)와 스레드 (Thread)

자원은 프로세스에 할당되고,

프로세스는 자원을 제어함.

 

프로세스와 스레드의 차이

프로세스(Process)

  • 실행중에 있는 프로그램
  • 운영체제가 수행하는 가장 작업의 단위 
  • 메모리에 올라와 실행되고 있는 프로그램의 인스턴스 (독립적인 개체)
    • *인스턴스(instance): 추상적인 개념을 바탕으로 소프트웨어에 구현된 구체적인 실체
  • 스케줄링의 대상이 되는 작업(task)과 같은 의미
  • 프로세스 내부에는 최소 하나의 스레드(Thread)를 가지고 있음. 실제로 스레드 단위로 스케줄링을 함 
  • 하드 디스크에 있는 프로그램을 실행하면, 실행을 위해서 메모리 할당이 이루어지고, 실행을 위해서 메모리 할당이 이루어지고, 할당된 메모리 공간으로 이진(binary)코드가 올라가게 된다. 이 순간부터 프로세스라 불린다.
  • 프로세스의 문맥 (Context)
    • CPU의 수행 상태를 나타내는 하드웨어 문맥
    • Program Counter
    • 각종 register
    • 프로세스의 메모리 영역
      • Code 영역
        • 실행할 프로그램의 코드나 명령어들이 기계어 형태로 저장된 영역. 
        • CPU는 Code 영역에 저장된 명령어들을 하나씩 처리한다. 
      • Data 영역
        • 코드에서 선언한 전역 변수와 정적 변수가 저장되는 영역이다.
        • 프로그램이 실행되면서 할당되고 종료되면서 소멸한다
      • Stack 영역
        • 함수 안에서 선언된 지역변수, 매개변수, 반환값 등이 저장된다.
        • 함수 호출 시 기록되고, 종료되면 제거한다. 
      • Heap 영역
        • 관리가 가능한 데이터 이외의 다른 형태의 데이터를 관리하기 위한 자유 공간 

 

스레드 (Thread)

프로세스 하나만을 사용해서 프로그램을 실행하기엔 메모리의 낭비가 발생한다. 

스레드는 프로세스와 다르게, 스레드 간 메모리를 공유하며 작동한다. 

 

즉, 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위.

= 하나의 프로세스 내에서 동시에 진행되는 작업 갈래

스레드는 운영체제의 스케줄러에 의해 독립적으로 관리될 수 있는 프로그래밍된 명령어의 가장 작은 시퀀스 

한 프로세스(ex. 크롬) 내의 여러 스레드 흐름

  • 스레드가 독립적으로 가지고 있는 부분
    • program counter = 실행 흐름
    •  register set
    •  stack space 
  • 스레드가 다른 스레드와 공유하는 부분 (=task)
    • code 영역
    • data 영역
    • OS 자원들 

 

스레드는 메모리를 서로 공유할 수 있다.

프로세스가 할당받은 메모리 영역 내에서 Stack 영역은 각 스레드가 따로 할당받고,

나머지 Code/Data/Heap 영역은 할당된 메모리 영역을 공유한다. 

 

따라서, 각각의 스레드는 별도의 스택을 가지고 있지만 힙 메모리는 서로 읽고 쓸 수 있게 된다. 

 

스레드의 장점

  • 사용자 응답성 (Responsiveness)
    •  일부 스레드의 처리가 지연되어도 다른 스레드는 작업을 계속 처리 가능
  • 자원 공유 (Resource sharing)
    • 자원을 공유해서 효율성 증가 
    • 커널의 개입을 피할 수 있음
  • 경제성 (Economy)
    • 프로세스의 생성, context switch에 비해 효율적
  • 멀티 프로세서 활용 (Multi-processor)
    • 병렬처리를 통해 성능 향상 

 

스레드 구현

사용자 수준 스레드 (User Thread)

이미지 출처: 운영체제, 한빛미디이

  • 사용자 영역의 스레드 라이브러리로 구현됨
    • 스레드의 생성, 스케줄링 등
  • 커널은 스레드의 존재를 모름
    • 커널의 관리(개입)를 받지 않음
      • 생성/관리의 부하가 적음, 유연한 관리 가능
      • 이식성(portability) 높음
    • 커널은 프로세스 단위로 자원 할당 
      • 하나의 스레드가 block 상태가 되면, 모든 스레드가 대기 
      • (single-threaded kernel의 경우)

 

커널 수준 스레드 (Kernel Threads)

  • OS(Kernel)가 직접 관리
  • 커널 영역에서 스레드의 생성, 관리 수행
    • Context switching 등 Overhead가 큼
  • 커널이 각 스레드를 개별적으로 관리
    • 프로세스 내 스레드들이 병핼 수행 가능
      • 하나의 스레드가 block상태가 되어도 다른 스레드는 작업 수행 가능

이미지 출처: 운영체제, 한빛미디어

 

Multi - Threading Model

다대일 (n:1) 모델

- 사용자 수준 스레드

일대일 (1:1) 모델

- 커널 수준 스레드

다대다 (n:m) 모델

- 혼합형 스레드 

 

혼합형 (n:m) 스레드

  • n개 사용자 수준 스레드 - m개의 커널 스레드 (n > m)
    • 사용자는 원하는 수만큼 스레드 사용
    • 커널 스레드는 자신에게 할당된 하나의 사용자 스레드가 block 상태가 되어도 다른 스레드 수행 가능 
      = 병행 처리 가능
  • 효율적이면서도 유연함

이미지 출처: 운영체제, 한빛미디어

 

Comments