운영체제(6) - Process Syncronization(1)
‘운영체제’를 공부하여 정리한 내용입니다.
1. 배경
race condition
-
본래 우리는 병렬로 process를 움직이거나, thread를 동작시킬 때, 동기화를 해야 하는 이슈에 대해서 생각해보지 않았다.
- 하지만 이렇게 Asyncronize하게 동작을 시키면 race condition이 밠생한다. race condition에 대해서는 아래의 링크에서 논의한 바있다.
- 운영체제(5) -CPU Scheduling(1) - 1. Basic Concepts - Preemptive Scheduling $ Non-Preemptive Scheduling - Preemptive Scheduling
- 비록 병렬처리에 대한 문제는 아니었으나, 이 Asyncronize multiprocessing에서는 정확히 같은 형태의 문제가 발생한다.
- 병렬처리(다수의 Process나 Thread가 어떤 작업을 나눠하는 경우, 그리고 공유하는 데이터가 있는 경우)는 위의 링크에서 본 것처럼 같은 메모리 혹은 논리적 공간에 두 개의 서로 다른 Process혹은 thread가 접근할 가능성이 있기 때문이다
-
우리는 위에서도 살펴본 것처럼 동시에 접근했을 때, 그 결과값을 보장할 수 없게되는 영역이 존재한다는 것을 알 수 있다.
- 이를 우리는 Critical Section이라고 한다.
2. Critical Section Problem
신경써야 하는 것
- 안전한 병렬 작업을 위해서 요구조건으로 정리하면 다음과 같다.
- Mutual exclusion: 한 프로세스가 자신의 Critical Section에서 실행하는 동안에는 다른 프로세스는 이 공유하는 Critical Section에 접근해서는 안된다.
- Progress: 각 프로세스는 Critical Section에 들어갈 수 있는 가능성이 있는가? 아예 들어가지도 못하면 안되니 말이다.
- Bounded waiting: 프로세스가 Critical Section에 들어가는 것을 한번 요청하면, 유한 시간 내에 Accept되어야 한다.
- 어떤 프로세스는 계속 요청이 허락되는데, 어떤 프로세스는 계속 기다리게 되거나 하는 상황이 발생하면 안된다.
- Mutual exclusion: 한 프로세스가 자신의 Critical Section에서 실행하는 동안에는 다른 프로세스는 이 공유하는 Critical Section에 접근해서는 안된다.
3. Peterson’s Solution
Peterson’s Solution
int turn; // 전역 변수
boolean flag[2]; // 전역 변수
do {
flag[i] = TRUE; // 각각 반대편의 flag를 True로 만들어준다.
turn = j; // 처음에는 여기에서 갈린다. 누가 나중에 turn을 세팅 하는가에 따라 0 혹은 1이 들어간다.
while (flag[j] && turn == j) ; // flag[j]와 turn == j 둘 중 하나라도 FALSE가 되면 Critical section에 들어간다.
// Critical Section
flag[i] = FALSE; // 이 작업을 통해 critical Section에 있던 프로세스는 작업을 마치면서 상대방 프로세스에게 차례를 바로 넘긴다. 상대방 프로세스가 위의 while에서 기다리고 있었다면, 이 작업 때문에 while문을 빠져나올 수 있게 된다.
// Remain Section
}
- (위에서 신경써야 한다고 했던 요소가 어떻게 보장되는지 설명 추가)
4. Synchronization Hardware
Locking
- (추후 업데이트)
Leave a Comment