쓰레드의 이해
동기화(Synchronization) 이슈
- 동기화 : 작업들 사이에 실행 시기를 맞추는 것
- 여러 스레드가 동일한 자원(데이터) 접근시 동기화 이슈 발생
ex. 프로세스 안에 스레드 여러개, 스레드들은 모픈 프로세스에 있는 데이터 공유
스레드 A가 데이터값을 바꾸고 다른 스레드들이 읽을 수 있다.
스레드들은 실행 순서는 정해져 있지 않고 스케줄러가 그에 맞춰 정해지게 된다.
순서가 정해져 있지 않다보니 비정상 동작을 하게 된다.
→ 동기화 이슈라고 한다. (Synchronization)
동기화 이슈는 관리(스레드 관리)가 필요하다. 디버깅하기 쉽지 않다.
동기화(Synchronization) 이슈 해결 방안
- 동기화 간에 실행 시기를 맞춰야 한다.
- Mutual exclusion (상호 배제)
- 쓰레드는 프로세스 모든 데이터를 접근 할 수 있으므로,
1. 여러 스레드가 변경하는 공유 변수에 대해 Exclusive Access 필요
2. 어느 한 스레드가 공유 변수를 갱신하는 동안 다른 스레드가 동시 접근하지 못하도록 막아라.
Mutual exclusion (상호 배제)
- 임계 자원(critical resource) : 동시에 수정하는 안되는 자원
- 임계 영역(critical section) : 동시 실행을 하면 안되는 코드 영역
동기화(Synchronization)와 세마포어
- Semaphore 를 동기화 이슈를 해결하는데 활용할 수 있음
1) Mutex 와 세마포어(Semaphore)
- Critical Section(임계 구역)에 대한 접근을 막기 위해 LOCKING 메커니즘이 필요
1. Mutex(binary semaphore) : 임계구역에 하나의 스레드만 들어갈 수 있음
2. Semaphore : 임계구역에 여러 스레드가 들어갈 수 있음
counter를 두어서 동시에 리소스에 접근 할 수 있는 허용 가능한 스레드 수를 제어
2) 세마포어(Semaphore)
- 세마포어는 리눅스에서 코드로 구연되어 있는 하나의 함수
- P : 검사 (임계영역에 들어갈 때)
- V : 증가 (임계영역에서 나올 때)
- S : 세마포어 값 (초기 값만큼 여러 프로세스가 동시에 임계영역에 접근 가능)
3) 세마포어(Semaphore) - 바쁜 대기
wait() 은 S가 0이라면, 임계 영역에 들어가기 위해 반복문(loop) 수행
바쁜 대기 , busy waiting → 반복문 수행 → CPU 실행 (성능 떨어짐)
4) 세마포어(Semaphore) - 대기큐
운영체제 기술로 보완 - 대기큐
세마포어(Semaphore)
교착상태(Deadlock)와 기아상태(Starvation)
1) 교착상태(Deadlock) 란?
- 무한 대기 상태 (아무 스레드 동작 x) : 두개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있어 다음 단계로 진행하지 못하는 상태
- 배치 처리시스템에서는 일어나지 않는 문제
- 프로세스, 스레드 둘다 이와 같은 상태 일어날 수 있음
참고: 교착상태 발생 조건
- 다음 네가지 조건이 모두 성립될 때, 교착상태 발생 가능성이 있음
1. 상호배제(Mutual exclusion): 프로세스들이 필요로 하는 자원에 대해 배타적인 통제권을 요구한다.
2. 점유대기(Hold and wait): 프로세스가 할당된 자원을 가진 상태에서 다른 자원을 기다린다.
3. 비선점(No preemption): 프로세스가 어떤 자원의 사용을 끝낼 때까지 그 자원을 뺏을 수 없다.
4. 순환대기(Circular wait): 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있다.
2) 기아상태(Starvation) 란?
- 특정 프로세스의 우선순위가 낮아서 원하는 자원을 계속 할당 받지 못하는 상태
- 교착상태와 기아 상태
1. 교착상태는 여러 프로세스가 동일 자원 점유를 요청할 때 발생
2. 기아상태는 여러 프로세스가 부족한 자원을 점유하기 위해 경쟁할 때, 특정 프로세스는 영원히 자원 할당이 안되는
경우를 주로 의미
- 기아상태 해결 방안
우선순위 변경
- 프로세스 우선순위를 수시로 변경해 각 프로세스가 높은 우선순위 가질 기회부여
- 오랜 기다린 프로세스의 우선순위 높여주기
- 우선순위가 아닌, 요청 순처대로 처리하는 FIFO 기반 요청큐 사용
제로베이스 컴퓨터 공학 전공자 따라잡기 강의 시청 후 정리한 내용입니다.