멀티스레드
멀티스레드
- 프로세스 내에서 여러 개의 스레드를 생성해 동시에 작업을 수행
- 멀티코어 활용
각각의 스레드가 다른 코어에 배정되어 작업을 병렬로 실행
- 멀티코어 활용
장점
- 성능 향상
- 작업을 병렬로 실행 및 멀티코어 활용
- 자원 절약
- 멀티 스레드는 코드, 데이터 영역 등 자원을 공유
그로인해 멀티프로세스 보다 자원이 적게 들고 컨택스트 스위칭 비용도 낮음
- 멀티 스레드는 코드, 데이터 영역 등 자원을 공유
- 응답성 개선
- 안드로이드의 경우 메인 스레드에서 UI만 처리하고
다운로드 등 다른 작업을 다른 스레드에서 처리하여 UI의 응답성을 개선
- 안드로이드의 경우 메인 스레드에서 UI만 처리하고
단점
- 동기화 문제
- 여러 스레드가 동시에 같은 데이터에 접근하면 Race Condition이 발생할 수 있음
뮤텍스, 세마포어, 락 등으로 해결해야 됨 - Race Condition
두 개 이상의 프로세스 또는 스레드가 공통 자원에 동시에 접근하여 읽기/쓰기 작업을 할 때
스레드(프로세스)의 접근 순서나 타이밍에 따라 실행 결과가 바뀌는 현상
레이스 컨디션으로 인해 발생한 버그는 재현이 어렵고 수정하기 힘들다
- 여러 스레드가 동시에 같은 데이터에 접근하면 Race Condition이 발생할 수 있음
- 어려운 디버깅
- 스레드의 실행 순서는 운영체제의 스케줄링에 결정되므로 프로그래머가 실행 흐름을 예측하거나 분석하기 어렵다
이로인해 버그발생시 버그재현이 어려워 디버깅 과정이 매우 복잡해질 수 있음
- 스레드의 실행 순서는 운영체제의 스케줄링에 결정되므로 프로그래머가 실행 흐름을 예측하거나 분석하기 어렵다
- 프로세스 종료
- 멀티스레드 중 하나의 스레드에 치명적인 버그 or 오류가 발생하면 운영체제에서
모든 스레드를 포함한 프로세스 전체를 종료시킬 수 있음
- 멀티스레드 중 하나의 스레드에 치명적인 버그 or 오류가 발생하면 운영체제에서
커널 스레드와 유저 스레드
커널
운영체제의 핵심
- 사용자 프로그램과 하드웨어의 중앙 관리자 역활
- 사용자는 하드웨어를 직접 다루지 못함
대신 커널이 대신 하드웨어에 접근
- 사용자는 하드웨어를 직접 다루지 못함
- 시스템 콜(System Call)
사용자 프로그램이 커널에게 요청을 보내는 인터페이스
유저 모드와 커널 모드
- 커널에서는 하드웨어에 직접 접근을 하기때문에 유저가 자원에 쉽게 접근하지 못하도록 나눔
- 시스템에 중요한 영향을 끼치는 작업은 커널 모드에서만 실행
- 유저 모드에서 시스템 콜 or 인터럽트가 발생시 커널 모드로 전환
- 컨텍스트 스위칭
현재 스레드가 시스템 콜 or 인터럽트로 인해 블로킹되면 컨텍스트 스위칭이 발생
- 컨텍스트 스위칭
- 시스템 콜을 통해 요청한 작업 or 인터럽트 처리가 완료되면 유저모드로 다시 전환
- 유저 모드에서 커널 모드로 전환시 비용이 필요
- 사용자 모드와 커널 모드는 메모리에 접근할 수 있는 영역(권한)이 다름
이로 인해 메모리 접근 권한 변경, 메모리 스택 교체등이 일어남
- 사용자 모드와 커널 모드는 메모리에 접근할 수 있는 영역(권한)이 다름
커널 스레드
- CPU에서 실제로 실행되는 단위
- 커널 스레드의 컨택스트 스위칭은 비용이 필요
- 스위칭의 주체가 커널
- 유저 모드와 커널 모드의 전환이 일어남
- 커널이 스택, PCB, TCB 등으로 관리
- 시스템 콜 호출시 다른 커널 스레드는 계속 실행됨
- 사용자 코드와 커널 코드 모두 커널 스레드에서 실행됨
유저 스레드
- 커널 관여 없이 사용자 레벨에서 관리되는 스레드
- 프로그램 언어에서 생성하는 스레드
- 유저 스레드가 실행되려면 커널 스레드에 연결되어 있어야 됨
이로인해 다양한 연결 모델이 존재
- 1:1 연결 모델
- M:1 연결 모델
- M:N 연결 모델
- 컨택스트 스위칭 비용이 낮음
- 프로그램 언어의 함수 호출 수준에서 일어남
- 유저 커널 모드간 전환이 없음
스레드 연결 모델
M:1 모델
- M개의 유저 스레드(프로세스)가 1개의 커널 스레드에 매핑
- 몇개의 유저 스레드가 있더라도 운영체제에선 한개의 스레드(프로세스)로 인식
- 컨택스트 스위칭
- 유저 스레드 사이에서 교체가 일어나 비용이 적음
- 멀티 코어 활용 불가
- 운영체제 입장에선 하나의 커널 스레드(프로세스)로만 인식
- 스레드 중단
- 한개의 유저 스레드에서 시스템 콜을 호출하면 커널 스레드가 블락되어
모든 유저 스레드가 중단될 수 있음
- 한개의 유저 스레드에서 시스템 콜을 호출하면 커널 스레드가 블락되어
1:1 모델
- 1개의 유저 스레드가 1개의 커널 스레드에 매핑
- 프로그램 언어에서 스레드 생성시 시스템 콜을 통해 커널 스레드도 생성하여 매핑
이로인해 운영체제에서 각각의 스레드를 파악할 수 있음
- 프로그램 언어에서 스레드 생성시 시스템 콜을 통해 커널 스레드도 생성하여 매핑
- 멀티 코어 활용
- 여러 개의 커널 스레드에 매핑이 되어 각각의 커널 스레드가 CPU 코어에서 동작할 수 있음
- 컨텍스트 스위칭 비용이 높음
- 커널 수준의 컨택스트 스위칭이 일어나 비용이 높음
- 대부분의 OS, 언어에서는 1:1 모델을 사용
- 스레드 중단이 안됨
- 한개의 유저 스레드가 시스템 콜을 호출하여 커널 스레드가 블락되어도
다른 스레드에 영향이 없음 - 정상적인 종료(시스템 콜, 인터럽트, 시간만료)가 아닌 치명적인 에러가 발생시
프로세스(모든 스레드)가 종료될 수 있음
- 한개의 유저 스레드가 시스템 콜을 호출하여 커널 스레드가 블락되어도
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
'CS > 운영체제' 카테고리의 다른 글
[운영체제] 가상 메모리 (0) | 2025.04.25 |
---|---|
[운영체제] 멀티 프로세스 (1) | 2025.04.11 |
[운영체제] 프로세스와 스레드 (0) | 2025.04.09 |