병행 실행
경쟁 조건
상호 배제
생산자-소비자 관계
임계 구역 문제 해결방법에 대한 요구조건
소프트웨어적인 상호배제 프리미티브 구현 방법
2개 쓰레드 상호배제 구현
다수 쓰레드 상호배제 구현
f0 ← false
f1 ← false
turn ← 0 // or 1
p0: p1:
f0 ← true f1 ← true
while f1 { while f0 {
if turn ≠ 0 { if turn ≠ 1 {
f0 ← false f1 ← false
while turn ≠ 0 { while turn ≠ 1 {
} }
f0 ← true f1 ← true
} }
} }
// 임계 구역 // 임계 구역
... ...
// 나머지 구역 // 나머지 구역
turn ← 1 turn ← 0
f0 ← false f1 ← false
P0: flag[0] = true // 임계 구역 사용을 원함
turn = 1 // 1번 프로세스에게 차례가 감
while( flag[1] && turn == 1 )
{
// flag[1] 이 turn[1] 을 가지고 있으므로
//현재 사용중임
// 임계 구역이 사용 가능한지 계속 확인
}// 임계 구역
...
// 임계 구역의 끝
flag[0] = false
P1: flag[1] = true
turn = 0
while( flag[0] && turn == 0 )
{
// 임계 구역이 사용 가능한지 계속 확인
}// 임계 구역
...
// 임계 구역의 끝
flag[1] = false
하드웨어적인 상호배제 프리미티브 구현 방법
testAndSet(a,b)
swap(a,b)
상호배제를 지원하기 위한 두개의 원자적 함수로 조작되는 정수 변수
Edsger W. Dijkstra가 제안
원자성을 만족하는 2가지 연산만 접근 가능
P 연산 / wait 연산, 임계구역 진입 전에 수행
procedure P(S)
while S=0 do wait
S := S-1
end
V 연산 / signal 연산, 임계 구역을 나올 때 수행
procedure V(S)
S := S+1
end
세마포어를 이용한 생산자/소비자 관계 구현
Semaphore valueProduced = new Sempahore(0);
Semaphore valueConsumed = new Sempahore(1);
int sharedValue; // 생산자와 소비자가 공유하는 변수
// 생산자 쓰레드
void Producer( )
{
int nextValueProduced;
while (!done) {
nextValueProduced = generateTheValue( );
P(valueConsumed);
sharedValue = nextValueProduced; // 임계 구역
V(valueProduced);
}
}
// 소비자 쓰레드
void Consumer( )
{
int nextValueProduced;
while (!done) {
P(valueProduced);
nextValueConsumed = sharedValue; // 임계 구역
V(valueConsumed);
processReceivedValue(nextValueConsumed);
}
}
1보다 큰 값으로 초기화 되는 세마포어
동일한 여러 개의 자원에 대한 접근 제어에 유용
P(S) {
S--;
if S < 0
// 이 프로세스를 재움 큐에 추가 (잠 듦)
}
V(S) {
S++;
if S <= 0
// 재움 큐로부터 프로세스를 제거 (깨어남)
}
조건변수
wait(), notify(), nonifyAll()