본문 바로가기
CS/운영체제

[운영체제] 멀티스레드

by k99812 2025. 4. 18.

멀티스레드

 

멀티스레드

  • 프로세스 내에서 여러 개의 스레드를 생성해 동시에 작업을 수행
    • 멀티코어 활용
      각각의 스레드가 다른 코어에 배정되어 작업을 병렬로 실행

장점

  • 성능 향상
    • 작업을 병렬로 실행 및 멀티코어 활용
  • 자원 절약
    • 멀티 스레드는 코드, 데이터 영역 등 자원을 공유
      그로인해 멀티프로세스 보다 자원이 적게 들고 컨택스트 스위칭 비용도 낮음
  • 응답성 개선
    • 안드로이드의 경우 메인 스레드에서 UI만 처리하고
      다운로드 등 다른 작업을 다른 스레드에서 처리하여 UI의 응답성을 개선

단점

  • 동기화 문제
    • 여러 스레드가 동시에 같은 데이터에 접근하면 Race Condition이 발생할 수 있음
      뮤텍스, 세마포어, 락 등으로 해결해야 됨
    • Race Condition
      두 개 이상의 프로세스 또는 스레드가 공통 자원에 동시에 접근하여 읽기/쓰기 작업을 할 때
      스레드(프로세스)의 접근 순서나 타이밍에 따라 실행 결과가 바뀌는 현상
      레이스 컨디션으로  인해 발생한 버그는 재현이 어렵고 수정하기 힘들다
  • 어려운 디버깅
    • 스레드의 실행 순서는 운영체제의 스케줄링에 결정되므로 프로그래머가 실행 흐름을 예측하거나 분석하기 어렵다
      이로인해 버그발생시 버그재현이 어려워 디버깅 과정이 매우 복잡해질 수 있음
  • 프로세스 종료
    • 멀티스레드 중 하나의 스레드에 치명적인 버그 or 오류가 발생하면 운영체제에서
      모든 스레드를 포함한 프로세스 전체를 종료시킬 수 있음

GPT

 

커널 스레드와 유저 스레드

출처 : https://wonit.tistory.com/90

커널

운영체제의 핵심

  • 사용자 프로그램과 하드웨어의 중앙 관리자 역활
    • 사용자는 하드웨어를 직접 다루지 못함
      대신 커널이 대신 하드웨어에 접근
  • 시스템 콜(System Call)
    사용자 프로그램이 커널에게 요청을 보내는 인터페이스

GPT : 시스템 콜

유저 모드와 커널 모드

  • 커널에서는 하드웨어에 직접 접근을 하기때문에 유저가 자원에 쉽게 접근하지 못하도록 나눔
  • 시스템에 중요한 영향을 끼치는 작업은 커널 모드에서만 실행
  • 유저 모드에서 시스템 콜 or 인터럽트가 발생시 커널 모드로 전환
    • 컨텍스트 스위칭
      현재 스레드가 시스템 콜 or 인터럽트로 인해 블로킹되면 컨텍스트 스위칭이 발생
  • 시스템 콜을 통해 요청한 작업 or 인터럽트 처리가 완료되면 유저모드로 다시 전환
  • 유저 모드에서 커널 모드로 전환시 비용이 필요
    • 사용자 모드와 커널 모드는 메모리에 접근할 수 있는 영역(권한)이 다름
      이로 인해 메모리 접근 권한 변경, 메모리 스택 교체등이 일어남

커널 스레드

  • CPU에서 실제로 실행되는 단위
  • 커널 스레드의 컨택스트 스위칭은 비용이 필요
    • 스위칭의 주체가 커널
    • 유저 모드와 커널 모드의 전환이 일어남
    • 커널이 스택, PCB, TCB 등으로 관리
  • 시스템 콜 호출시 다른 커널 스레드는 계속 실행됨
  • 사용자 코드와 커널 코드 모두 커널 스레드에서 실행됨

유저 스레드

  • 커널 관여 없이 사용자 레벨에서 관리되는 스레드
    • 프로그램 언어에서 생성하는 스레드
  • 유저 스레드가 실행되려면 커널 스레드에 연결되어 있어야 됨
    이로인해 다양한 연결 모델이 존재
    1. 1:1 연결 모델
    2. M:1 연결 모델
    3. M:N 연결 모델
  • 컨택스트 스위칭 비용이 낮음
    • 프로그램 언어의 함수 호출 수준에서 일어남
    • 유저 커널 모드간 전환이 없음

GPT : 커널 스레드 와 유저 스레드의 컨택스트 스위칭

 

스레드 연결 모델

 

M:1 모델

  • M개의 유저 스레드(프로세스)가 1개의 커널 스레드에 매핑
    • 몇개의 유저 스레드가 있더라도 운영체제에선 한개의 스레드(프로세스)로 인식
  • 컨택스트 스위칭
    • 유저 스레드 사이에서 교체가 일어나 비용이 적음
  • 멀티 코어 활용 불가
    • 운영체제 입장에선 하나의 커널 스레드(프로세스)로만 인식
  • 스레드 중단
    • 한개의 유저 스레드에서 시스템 콜을 호출하면 커널 스레드가 블락되어
      모든 유저 스레드가 중단될 수 있음

1:1 모델

  • 1개의 유저 스레드가 1개의 커널 스레드에 매핑
    • 프로그램 언어에서 스레드 생성시 시스템 콜을 통해 커널 스레드도 생성하여 매핑
      이로인해 운영체제에서 각각의 스레드를 파악할 수 있음
  • 멀티 코어 활용
    • 여러 개의 커널 스레드에 매핑이 되어 각각의 커널 스레드가 CPU 코어에서 동작할 수 있음
  • 컨텍스트 스위칭 비용이 높음
    • 커널 수준의 컨택스트 스위칭이 일어나 비용이 높음 
  • 대부분의 OS, 언어에서는 1:1 모델을 사용
  • 스레드 중단이 안됨
    • 한개의 유저 스레드가 시스템 콜을 호출하여 커널 스레드가 블락되어도
      다른 스레드에 영향이 없음
    • 정상적인 종료(시스템 콜, 인터럽트, 시간만료)가 아닌 치명적인 에러가 발생시
      프로세스(모든 스레드)가 종료될 수 있음

 

출처 : https://kspsd.tistory.com/50

 

References

https://www.youtube.com/watch?v=vorIqiLM7jc

https://zu-techlog.tistory.com/122

https://jinjaee.tistory.com/12

https://velog.io/@sodliersung/24-04-10-CPU-User-mode-Kernel-Mode

https://kspsd.tistory.com/50

'CS > 운영체제' 카테고리의 다른 글

[운영체제] 가상 메모리  (0) 2025.04.25
[운영체제] 멀티 프로세스  (1) 2025.04.11
[운영체제] 프로세스와 스레드  (0) 2025.04.09