1. 병행 프로세스(Concurrent Process)란
- 병행 프로세스(Concurrent Process)란 두 개 이상의 프로세스가 동시에 수행상태(존재)에 있는 것을 의미한다.
- 병행 프로세스는 독립적 병행 프로세스와 협동적 병행 프로세스로 구분할 수 있다.
- 독립적 병행 프로세스: 여러 프로세스들이 독립적으로 실행
- 협동적 병행 프로세스: 서로 협업하여 동시에 실행
- 여러 프로세스가 제한된 자원을 공유하여 실행되기 때문에 프로세스 간 동기화 문제, 교착 상태 문제를 해결하기 위한 방안이 필요하다.
- 다중 처리 시스템, 분산 처리 시스템 등에 사용
2. 경쟁 상태(Race Condition)
- 컴퓨터는 한정적인 자원안에서 동작을 수행하게된다.
- 때문에 병행 프로세스의 입장에서 동시에 공유 자원에 접근하는 일이 발생한다.
- 이러한 경쟁 상태가 해결되지 않으면 컴퓨터는 교착 상태에 빠지게 되므로, 공유자원에 대하여 한 번에 하나의 프로세스만이 접근 가능하도록 제어할 필요가 있다.
3. 임계 구역 (임계 영역, Critical section)
do {
wait(mutex); //입장 구역
임계 구역
signal(mutex); //퇴장 구역
나머지 구역
}
- 임계 구역 입장 이전에 wait()를 호출, mutex 값을 확인하여 현재 스레드 외 다른 스레드의 자원 접근을 차단한다.
- 임계 구역 내 로직 실행이 모두 종료되면 signal()을 호출, mutex값을 대기값으로 변경
- 병행 프로세스에서는 임계 구역의 동시 접근 배재, 즉 경쟁 상태로의 돌입을 사전에 예방할 필요가 있다.
대표적인 예방 방법으로 뮤텍스와 세마포어가 있다.
- 뮤텍스와 세마포어의 차이는 임계 영역으로의 두개 이상의 스레드 접근을 허용하느냐 하지않느냐의 차이이다.
4. 뮤텍스 (Mutual Exclusion, Mutex)
- Mutual Exclusion의 약자로 상호배제 기법이라고도 한다.
- 뮤텍스 기법은 공유 자원으로의 여러 스레드가 접근하는 것은 막는다.
- 뮤텍스는 pthread에서 제공하는 동기화 매커니즘으로 공유 자원 공간에 대한 접근 시간 제어로 동기화를 달성한다.
- 예시 코드
global int v = 1;
lock()
{
while(1)
{
if (v==1)
break;
}
v = 0;
return 1;
}
unlock()
{
v = 1;
break;
}
5. 세마포어 (Semaphore)
- 세마포어는 사전적 의미는 수기 신호
- 세마포어는 상호 배제알고리즘으로 임계 영역을 만들어서 자원을 보호한다.
- 차단을 원하는 자원에대해서 세마포어를 생성하면 해당자원을 가리키는 세마포어 값이 할당된다. 이 세마포어값을 검사해서 임계영역에 접근할 수 있는지를 결정하게 된다.
SYSTEM V 세마포어
POSIX 세마포어
- POSIX 규격을 따르는 새로운 세마포어 인터페이스로 전통적인 System V 인터페이스에 비해서 좀 더 명확하다. 또한 세마포어 집합이란 개념이 없는데, 덕분에 이해하기가 수월해진 것 같다.
참조 목록