공유된 자원에 여러 프로세스/쓰레드가 동시에 접근하면 Critical section
문제가 발생하여 원하는 결과가 나오지 않을 수 있기 때문에 한 번에 하나의 프로세스만 접근할 수 있도록 제한을 둬야 한다 (동기화를 해야한다).
임계 구역(Critical Section):
각 프로세스에서 공유 자원에 접근하는 프로그램 코드 영역
wait과 signal이라는 2개의 atomic operations
를 사용한다.
Atomic operation: 원자와 같이 기능적으로 분할할 수 없거나 분할되지 않도록 보증된 조작
자원의 동시 사용을 피하는 기법
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
...
do {
pthread_mutex_lock(&mutex);
...
//critical section
...
pthread_mutex_unlock(&mutex);
}
공유 자원에 대한 접근을 제한하는 기법
공유 자원에 접근할 수 있는 프로세스/쓰레드 수를 나타내는 값( = 자원의 개수)을 두어 상호배제를 달성한다.
Signaling 메커니즘으로 락을 걸지 않은 쓰레드도 signal로 락을 해제할 수 있다 (뮤텍스와 다른 점)
동기화 대상이 1개 이상일 때 사용한다.
Counting Semaphore, Binary Semaphore 두 종류가 있는데 이진 세마포어는 세마포어의 카운트가 1이라서 뮤텍스와 같은 기능을 한다. (뮤텍스 대신 사용할 수 있다)
Wait 호출 -> 세마포어의 카운트 1 감소(사용 가능한 자원이 1 줄어든다), 카운트가 0보다 작거나 같아질 경우 락이 실행
Signal 호출 -> 세마포어의 카운트 1 증가, 락이 걸린 상태일 경우 락에서 나올 수 있다.(자리가 없었다면 기다리던 쓰레드가 자원을 사용할 수 있다)
sem_t semaphore;
sem_init(&semaphore, 0, 3); //3으로 초기화
...
do {
sem_wait(&semaphore);
...
//critical section
...
sem_post(&semaphore);
}
뮤텍스와 세마포어를 사용해서 상호배제를 달성하더라도 교착상태와 같은 문제가 생길 수 있다!
둘 이상의 프로세스들이 자원을 점유한 상태에서 서로 다른 프로세스가 점유하고 있는 자원을 요구하며 무한 대기를 하는 상태를 교착상태라고 한다.
4가지 모두 성립해야 교착상태가 발생한다.
◻ 데드락 예방 (prevention)
◻ 데드락 회피 (avoidance)
- 안전 상태 (Safe state): 교착상태를 발생시키지 않고 자원을 할당하는 순서 (safe sequence)가 존재해서 모든 프로세스가 정상적으로 종료할 수 있는 상태
- 불안전 상태 (Unsafe state): 교착상태가 발생할 수 있는 상태
다음과 같은 가정이 필요함
자원 할당 그래프 (Resource-Allocation Graph) 알고리즘: 자원 인스턴스가 하나만 있는 경우 사용, 자원을 할당 받을 때 그래프에 사이클이 생기면 요청을 거부하는 방식
은행원 알고리즘 (Banker's Algorithm): 자원 인스턴스가 여러개일 경우 사용, 자원 요청을 승인했을 때 안전한 상태가 유지되는 경우만 자원 할당, 불안전 상태가 예상되면 다른 프로세스가 끝날 때 까지 대기
-> 현실성이 부족하고 자원 요청이 있을 때마다 회피 알고리즘을 사용하는 것은 상당한 오버헤드다.
◻ 교착상태 탐지 (detection)
탐지 알고리즘을 사용하여 교착상태가 발생했는지 탐지한다.
대기 그래프 (Wait-for Graph) 알고리즘: 자원할당 그래프를 변형해서 각 프로세스가 다른 프로세스가 보유하고 있는 자원을 기다리는 경우 간선을 추가하고, 사이클이 생기면 교착상태를 탐지한다.
은행원 알고리즘: 현재 상태가 안전 상태인지 확인하고, 불안전 상태면 교착상태라고 판단한다.
탐지 알고리즘은 자원을 요청했으나 즉시 할당받지 못할 때, CPU 이용률이 특정 값 이하로 떨어질 때, 또는 주기적으로 일정 시간마다 호출을 해서 오버헤드를 최소한으로 한다.
기아상태
를 방지해야 한다.특정 프로세스가 원하는 자원을 계속 할당 받지 못하는 상태
동기화, 뮤텍스, 세마포어
[OS] 뮤텍스(Mutex)와 세마포어(Semaphore)란?
[운영체제] 데드락(Deadlock, 교착 상태)이란?