6단원
>프로세스 동기화
공유 데이터에 대한 동시 접근은 데이터의 비일관성을 낳을 수 있다. 논리 주소 공간을 공유하는 협력적 프로세세의 질서 있는 실행을 보장하여, 이를 통해 데이터의 일관성을 유지하는 다양한 메커니즘을 논의한다.6.1 배경
프로세스가 병행 또는 병렬로 실행될 때 여러 프로세스가 공유하는 데이터 무결성에 어떤 문제를 일으키는지 동시에 여러 개의 프로세스가 동일한 자료를 접근하여 조작하고, 그 실행 결과가 접근이 발생한 특정 순서에 의존하는 상황을 경쟁 상황(racd condition)이라고 한다. 이러한 상황에서 데이터를 보호하기 위해 프로세스들이 동기화 되도록 해야함6.2 임계구역 문제(The Critical_Section Problem)
각 프로세스는 임계구역을 가지고 있다. 한 프로세스가 자신의 임계구역에서 수행하는 동안에는 다른 프로세스들은 그들의 임계구역에 들어갈 수 없다. 임게구역 문제는 프로세들이 협력할 때 사용할 수 있는 프로토콜 설계이다. 프로세스는 자신의 임계구역으로 진입하려면 진입허가를 요청해야한다. 이러한 요청을 구현하는 코드 부분을 진입구역(entry section)이라고 하고 임계구역에 뒤에는 퇴출 구역(exit section)이 따라올 수 있다. 코드의 나머지 부분은 나머지 구역(remainder section)이라 한다. 임계구역 문제에 대한 해결안은 다음의 세가지 요구조건을 충족해야한다. 1. 상호 배체(mutual exclusion) 프로세스 Pi가 자기의 임계구역에서 실행된다면 다른 프로세스들은 그들 자신의 임계구역에서 실행될 수 없다. 2. 진행(proress) 자기의 임계구역에서 실행되는 프로세스가 없고 그리고 그들 자신의 임계구역으로 진입하려고 하는 프로세스들이 있다면, 나머지 구역에서 실행 중이지 않은 프로세스들만 다음에 누가 그 임계구역으로 진입할 수 있는 지를 결정하는데 참여할 수 있으며, 이 선택은 무한정 연기가 될 수없다. 3. 한정된 대기(bounded waiting) 프로세스가 자기의 임계구역에 진입하려는 요청을 한 후부터 그 요청이 허용될 때까지 다른 프로세스들이 그 요청이 허용될 때까지 다른 프로세스들이 그들 자신의 임계구역에 진입하도록 허용되는 횟수에 한계가 있어야 한다. OS 내에서 임계구역을 다루기 위해 선점형 커널과 비선점형 커널의 두가지 일반적인 접근법이 사용된다 선점형 커널 : 프로세스가 커널모드에서 수행되는 동안 선점되는 것을 허용한다. 비선점형 커널 : 커널 모드에서 수행되는 프로세스의 선점을 허용하지 않고 커널 모드 프로세스는 커널을 빠져 나갈 때까지 또는 봉쇄될 때까지의 또는 자발적으로 CPU의 제어를 양보할 때까지 계속 수행6.3 피터슨의 해결안
Peterson's solution 상호 배제, 진행, 한정된 대기의 요구조건을 모두 보장한다6.4 동기화 하드웨어
피터슨해결안으로 두개가 넘는 프로세스에서는 해결이 불가함 락킹에 대한 가정, 즉 임계구역을 보호하기 위해서 락을 사용하는 것에 기반을 둔다. 임계구역 문제는 단일 처리기 환경에서는 공유 변수가 변경되는 동안 인터럽트 발생을 허용하지 않음으로써 간단히 해결 할 수 있다. (비선점형 커널 방법) 다중처리기 환경에서는 적용이 불가능함(인터럽트의 메시지 전달 시간이 너무큼) 한 워드(word)의 내용을 검사하고 변경하거나, 두 워드의 내용을 원자적으로 교환 할 수 있는, 즉 인터럽트 되지 않는 하나의 단위로서, 특별한 하드웨어 명령들을 사용하여 극복 test_and_set() 과 compare_and_swap() 명령어가 있다.
Boolean test_and_set(boolean *target){
boolean rv = *target;
*target = true;
return rv;
}
false로 초기화되는 lock이라는 Boolean변수를 선언하여 상호배제 구현
do{
while (test_and_set(&lock))
; //do nothing
// critical seciton
lock = FALSE;
// remainder section
} while(true);
실행 된 이후 FALSE로 값 초기화, 즉 다시 락을 해제 compare_and_swap() 명령어 정의
int compare_and_swap(int *value, int expected, int new_value) {
int temp = *value;
if (*value == expected)
*value = new_value;
return temp;
}
위 두 알고리즘은 상호 배제 조건은 만족하지만 한정된 대기 조건은 만족시키지 못한다. 한정된 대기 조건을 만족시키는 상호 배제 코드는 waiting[n] 과 lock을 사용한다6.5 Mutex Locks
임계구역 문제를 해결하기 위한 소프트웨어 도구 중 하나가 mutex 락이다. mutual exclusion 의 약어로, 임계구역을 보호하고 경쟁조건을 방지하기 위해 mutex락을 사용한다. 프로세스는 임계구역에 들어가기 전에 반드시 락을 획득해야 하고 임계구역을 빠져 나올 때 락을 반환해야한다. acquire() 함수가 락을 획득하고, release() 함수가 락을 반환한다. mutex락은 available 이라는 불린 변수를 통해 락의 가용 여부 표시
acquire(){
while(!available)
; /* busy wait */
available = false;
}
----------------------
release(){
available = true;
}