용어 정리
공유 자원
: 프로세스 혹은 스레드가 공유하는 자원
ex) 메모리, 파일, 전역 변수, 입출력장치
임계 구역 (Critical Section)
: 공유 자원에 접근하는 코드 중 동시에 실행했을 때 문제가 발생할 수 있는 코드
레이스 컨디션
: 프로세스 혹은 스레드가 동시에 임계 구역의 코드를 실행하여 문제가 발생하는 상황
1. 동기화
동기화 조건
1. 실행 순서 제어
: 프로세스 및 스레드를 올바른 순서로 실행
2. 상호 배제
: 동시에 접근해서는 안 되는 자원에 하나의 프로세스 및 스레드만 접근
1-1. 뮤텍스 락
임계 구역에 접근하고자 한다면 반드시 lock을 acquire해야 하고,
임계 구역에서의 작업이 끝났다면 lock을 release 해야 한다.
pthread_mutex_t mutex;
void* increment(void* arg)
{
int i;
for(i = 0; i < 10000; i++)
{
pthread_mutex_lock(&mutex);
shared_data++;
pthread_mutex_unlock(&mutex);
}
}
1-2. 세마포
이진 세마포(binary semaphore)
: S가 0과 1의 값을 가지는 세마포. 뮤텍스 락과 유사하게 동작
카운팅 세마포(counting semaphore)
: 공유 자원이 여러 개 존재하는 경우에 사용할 수 있는 세마포
- 변수 S : 사용 가능한 공유 자원의 개수를 나타내는 변수
- wait( ) : 임계 구역 진입 전 호출하는 함수
- signal( ) : 임계 구역 진입 후 호출하는 함수
wait()
{
S--;
if(S < 0)
{
sleep();
}
}
wait 호출 시 변수 S를 1 감소시킨다. 이후 S의 값이 0보다 작은지 확인한다.
S의 값이 0 이상이라면 사용 가능한 공유 자원의 개수가 남아있다는 의미이므로 임계 구역에 진입한다.
S의 값이 0 미만이라면 대기 상태로 전환된다.
signal()
{
S++;
if(S <= 0)
{
wakeup(p);
}
}
signal 호출 시 변수 S를 1 증가시킨다. 이후 S의 값이 0이하인지 확인한다.
S의 값이 0 이하인 경우 대기 상태인 프로세스가 있다는 의미이므로 대기 중인 프로세스 중 하나를 준비 상태로 전환한다.
S의 값이 0을 초과할 경우 사용 가능한 공유 자원의 개수가 1개 이상 남아 있음을 의미한다.
1-3. 조건 변수
조건 변수는 실행 순서 제어를 위한 동기화 도구이다. 특정 조건 하에 프로세스를 실행/중단함으로써 프로세스 및 스레드의 실행 순서를 제어할 수 있다.
pthread_mutex_t mutex;
pthread_cond_t cond;
------------------
while(!ready)
{
pthread_cond_wait(&cond, &mutex);
}
------------------
ready = true;
pthread_cond_signal(&cond);
1-4. 모니터
모니터는 공유 자원과 공유 자원을 다루는 함수로 구성된 동기화 도구이다. 실행순서뿐만 아니라 상호 배제를 위한 동기화가 가능하다.
프로세스 및 스레드는 공유 자원에 접근하기 위해 반드시 정해진 공유 자원 연산(인터페이스)을 통해 모니터 내로 진입해야 하고, 모니터 안에 진입하여 실행되는 프로세스 및 스레드는 항상 하나여야 한다. 만약, 이미 실행 중인 프로세스 및 스레드가 있는 경우 큐에서 대기해야 한다.
자바의 경우 synchronized 키워드가 해당한다.
2. 스레드 안전
멀티스레드 환경에서 어떤 변수나 함수, 객체에 동시 접근이 이루어져도 실행에 문제가 없는 상태를 의미한다.
자바의 경우 ArrayList의 add는 스레드 안전성이 보장되지 않고, Vector의 add는 스레드 안전성이 보장된다고 한다.
3. 교착 상태
일어나지 않을 사건을 기다리며 프로세스의 진행이 멈춰버리는 현상을 뜻한다.
교착 상태의 발생 조건
1. 상호 배제
: 한 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없는 상황인 경우
2. 점유와 대기
: 한 프로세스가 어떤 자원을 할당받은 상태에서 다른 자원을 할당받기를 기다리는 상태인 경우
3. 비선점
: 해당 자원을 이용하는 프로세스의 작업이 끝나야만 비로소 자원을 이용할 수 있는 경우
4. 원형 대기
: 프로세스와 프로세스가 요청한 자원이 원의 형태를 이루는 경우
위의 4가지 조건을 모두 만족하는 경우 교착 상태가 발생할 가능성이 생긴다.
교착 상태의 해결 방법
1. 교착 상태 예방
: 교착 상태 발생 조건 4가지 중 하나를 충족하지 못 하게 하는 방법이다.
2. 교착 상태 회피
: 교착 상태가 발생하지 않을 정도로만 조심하면서 자원을 할당하는 방법이다.
대표적인 알고리즘으로 은행원 알고리즘이 있다.
3. 교착 상태 검출 후 회복
: 자원을 할당하고 주기적으로 교착 상태의 발생 여부를 검사한다. 만약 교착 상태가 발생한 경우 자원 선점을 통해 회복시키거나, 교착 상태에 놓인 프로세스를 강제 종료함으로써 회복시킨다.
'컴퓨터 과학 > 운영체제' 카테고리의 다른 글
[운영체제] 가상 메모리 (0) | 2025.03.11 |
---|---|
[운영체제] CPU 스케줄링 (0) | 2025.03.11 |
[운영체제] 멀티프로세스와 멀티스레드 (0) | 2025.02.03 |
[운영체제] 프로세스의 실행 과정 (0) | 2025.01.24 |
[운영체제] 프로세스의 종류 (0) | 2025.01.24 |