* 동시에 두 개 이상의 프로세스들을 병행처리하면 여러 가지 문제가 발생 할 수 있다
* 상호배제 기법, 임계영역, 동기화 기법 등으로 해결 가능하다
1. 비동기 병행 프로세스
1.1 상호배제
비동기 병행 프로세스들은 실행 시 메모리를 공유하여 사용하다 보니 어떤 프로세스가 메모리에 쓰고 있는 동안 다른 프로세스가 메모리를 읽는 현상이 발생되기도 한다. (경쟁조건) 가끔 순서에 따라 출력되는 결과가 달라질 수 있다 이러한 현상을 제어하기 위해 상호배제가 필요하다
한 프로세스가 공유 기억장치 또는 공유 기억 파일을 사용 중 일때 다른 프로세스들이 사용하지 못하도록 배제시키는 제어기법
임계영역의 개념을 이용하여 두 프로세스가 하나의 공유자원을 상호배타적으로 사용할 수 있게 하면서 동시에 수행할 수 없도록 하는 것
1.2 임계영역
한 순간에 하나의 프로세스만 사용할 수 있는 영역
공유자원의 독점 보장
임계영역의 문제해결을 위한 조건
상호배제 조건
두 개 이상의 프로세스들이 동시에 임계영역에 있어서는 안 된다
임의의 프로세스 P가 임계 영역에서 수행 중일때 다른 프로세스는 임계영역에서 수행될 수 없다
각 프로세스는 임계영역에 들어가기위해 미리 요청한다
진행 조건
임계영역 바깥에 있는 프로세스가 다른 프로세스의 임계영역 진입을 막아서는 안 된다
임계영역에서 수행하는 프로세스가 없고 여러 개의 프로세스가 임계영역으로 들어가려 하면 프로세스 선정 알고리즘을 이용해 다음 대상 선정
한계 대기 조건
임의 프로세스가 임계영역으로 들어가는 것이 무한정 연기 되어서는 안 된다
2. 동기화된 프로세스
2.1 Test-and-set
논리변수를 읽어 다른 저장소에 보관하고 그 변수에 새로운 값을 부여하는 일련의 명령을 인터럽트를 허용하지 않고 처리해 주는 단일 하드웨어 명령문
function TestAndSet(boolean lock) { // 초기값 = false
boolean initial = lock
lock = true
return initial
}
// 임계영역에 존재 = true
// 임계영역에 존재하지 않음 = false
2.2 semaphore(세마포어)
여러 개의 프로세스가 동시에 자원을 요청하면 시스템이 순서를 정해 각 프로세스에 제어신호를 전달하여 순서대로 작업 수행
P연산(- 연산)과 V연산(+ 연산)으로 동기화를 유지
Wait (P연산)
P(S) = S - 1
자원점유를 알리는 것으로 자원의 갯수를 감소시킨다
Wake Up (V연산)
V(S) = S + 1
자원을 반납한 것을 알리는 것으로 자원의 갯수를 증가시킨다
2.3 시간종속 오류
프로세스들이 임의로 변수를 공유할 때 발생
어떤 특정 순서로 실행될 때에만 발생하는 데, 항상 발생하지 않기 때문에 탐지하기가 어렵다
세마포어 사용으로도 발생 가능하다
2.4 모니터
순차적으로만 사용할 수 있는 공유자원 또는 공유자원 그룹을 할당하기 위한 병행성 구조
공유자원과 데이터를 처리하는 프로시저로 구성되며 모니터 내의 공유자원을 사용하기 위해서는 모니터의 진입부를 호출해야 한다
여러 개의 프로세스들이 동시에 모니터에 들어가려 할 경우 모니터 자체는 한순간에 하나의 프로세스만 진입하여 자원을 사용할 수 있도록 한다
모니터 내부의 변수는 모니터 내부에서만 접근 가능하다
3. 프로세스 간의 통신
* 프로세스간 자원을 송수신
3.1 직접통신
메시지를 주고받기를 원하는 각각의 프로세스가 통신의 송신자나 수신자의 이름을 외부적으로 표현하여 직접 send, receive 명령을 통해 메시지 송수신