스레드와 멀티스레딩
스레드
- 프로세스의 실행 가능한 가장 작은 단위
- 프로세스는 여러 스레드를 가질 수 있음
스레드는 코드, 데이터, 힙은 서로 공유하고 스택과 같은 그 이외의 영역은 각각 생성
멀티스레딩
- 프로세스 내 작업을 여러 개의 스레드, 멀티스레드로 처리하는 기법
- 스레드끼리 서로 자원을 공유하기 때문에 효율성이 높다.
EX) 웹 요청 처리 : 새 프로세스를 생성하는 대신 스레드를 사용하는 웹 서버의 경우 훨씬 적은 리소스를 소비
- 중단되지 않은 빠른 처리가 가능
한 스레드가 중단(blocked)되어도 다른 스레드는 실행(running) 상태일 수 있음
- 동시성에 큰 장점
🤔 동시성?
서로 독립적인 작업들을 작은 단위로 나누고 동시에 실행되는 것처럼 보여주는 것
- 한 스레드에 문제가 생기면 다른 스레드에 영향을 끼쳐 스레드로 이루어져 있는 프로세스에 영향을 줄 수 있다는 단점이 있음
🤔예시 웹 브라우저의 Renderer Process
메인 스레드, 워커 스레드, 컴포지터 스레드, 레스터 스레드 존재
공유 자원과 임계 영역
공유 자원(shared resource)
- 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 자원이나 변수 등
EX) 모니터, 프린터, 메묄, 파일, 데이터 등
- 경쟁 상태(race condition)
: 공유 자원을 두 개 이상의 프로세스가 동시에 읽거나 쓰는 상황
: 동시에 접근을 시도할 때 접근 타이밍 혹은 순서 등이 결과에 영향을 줄 수 있는 상태
임계 영역(critical section)
- 공유 자원에 접근할 때 순서 등의 이유로 결과가 달라지는 영역
- 해결방법
: 1. 뮤텍스, 2. 세마포어, 3.모니터
: 모두 상호 배제, 한정 대기, 융통성 조건 만족
: 메커니즘 == 잠금(lock) EX) 화장실
🤔잠깐
- 상호배제 : 한 프로세스가 임계 영역에 들어갔을 때 다른 프로세스는 들어갈 수 없다
- 한정 대기 : 특정 프로세스가 영원히 임께 영역에 들어가지 못하면 안 된다.
- 융통성 : 한 프로세스가 다른 프로세스의 일을 방해해서는 안 된다.
뮤텍스(mutex)
- 공유 자원을 사용하기 전에 설정하고 사용한 후 해제하는 잠금
- 잠금 설정 시 다른 스레드는 잠긴 코드 영역에 접근할 수 없음
- 하나의 상태(잠금 or 잠금해제)만 가짐
- 동기화 대상이 하나일 때
세마포어(semaphore)
- 일반화된 뮤텍스
- 간단한 정수 값과 두 가지 함수 wait(P함수) 및 signal(V 함수)로 공유 자원 접근 처리
- wait() : 자신의 차례가 올 때까지 기다리는 함수, 프로세스가 공유 자원에 접근시 세마포어는 wiat() 작업 수행
signal() : 다음 프로세스로 순서를 넘겨주는 함수, 프로세스가 공유 자원을 해제시 세마포어는 signal() 작업 수행
- 동기화 대상이 하나 이상일 때
- 바이너리 세마포어
: 0과 1의 두 가지 값만 가질 수 있는 세마포어
: 뮤텍스가 바이너리 세마포어라고 할 수 있음
- 카운팅 세마포어
: 여러 개의 값을 가질 수 있는 세마포어, 여러 자원에 대한 접근을 제어하는 데 사용
뮤텍스 vs 세마포어
뮤텍스는 리소스에 대한 접근을 동기화하는 데 사용되는 잠금 메커니즘,
세마포어는 신호를 기반으로 상호 배제가 일어나는 신호 메커니즘
모니터(monitor)
- 둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 잇도록 공유자원을 숨기고 해당 접근에 대해 인터페이스만 제공
- 모니터 큐를 통해 공유 자원에 대한 작업을 순차적으로 처리
- 모니터는 상호 배제가 자동인 반면 세마포어에서는 상호 배제를 명시적으로 구현해야 함
교착 상태(deadlock)
두 개 이상의 프로세스들이 서로가 가진 자원을 기다리며 중단된 상태
예를 들어 프로세스 1이 프로세스 2의 어떤 자원을 요청할 때 프로세스 2도 프로세스 1이 점유하고 잇는 자원을 요청
원인
- 상호 배제 : 한 프로세스가 자원 독점 시 다른 프로세스 접근 불가
- 점유 대기 : 특정 프로세스가 점유한 자원을 다른 프로세스가 요청하는 상태
- 비선점 : 다른 프로세스 자원 강제로 가져올 수 없음
- 환형 대기 : 프로세스 1은 프로세스 2의 자원 요구, 프로세스2는 프로세스 1의 자원 요구 즉, 서로가 서로의 자원을 요구하는 상황
해결 방법
-
자원 할당 시 애초에 조건이 성립되지 않도록 설계
-
교착 상태 가능성 없을 때 자원 할당, 은행원 알고리즘 사용
은행원 알고리즘
총 자원의 양과 현재 할당된 자원의 양을 기준으로 안정, 불안정 상태로 나누고 안정 상태로 가도록 자원 할당
-
교착 상태 발생 시 사이클 확인, 관련 프로세스 제거
-
교착 상태 발생 시 사용자가 작업 종료 (현재 운영체제의 방법, 교착 상태를 처리하는 비용이 더 크기 때문 )
참고자료
면접을 위한 CS 전공지식노트
operating system concepts 10th
[운영체제] Mutex 뮤텍스와 Semaphore 세마포어의 차이
Mutex vs Semaphore