11.임계구역 문제, 동기화 도구

임계구역 문제(critical-section problem)

여러개의 쓰레드로 이뤄진 시스템에서 각각의 쓰레드는 코드영역을 갖고있는데 이를 크리티컬 섹션이라한다. 또한 쓰레드로 부터 공통으로 사용되고 변경될 수 있는 부분을 의미한다.

어떤 복수개의 쓰레드들이 공통적으로 사용하는 부분.

임계영역 해결

이를 해결하기 위해 다음 세가지가 만족되어야 한다.

Mutual exclusion (상호배타): 오직 한 쓰레드만 진입
Progress (진행): 진입 결정은 유한 시간 내. 즉 누가 먼저 들어가야되는지 유한시간내에 결정해야 한다.
Bounded waiting (유한대기): 어느 쓰레드라도 유한 시간 내 크리티컬 섹션안에 들어갈 수 있어야한다. 기다리는 시간이 한계가 정해져 있다.

동기화의 목적

우리가 원하는대로 프로세스 혹은 쓰레드의 실행 순서를 결정 지을 수 있는것.

O/S 가 가진 여러 매니지먼트(프로세스 매니지먼트,메모리 매니지먼트,파일 시스템 매니지먼트, I/O 매니지먼트) 중 가장 중요한것은 프로세스 매니지먼트. 프로세스 매니지먼트는 두 가지로 나뉘는데 하나는 CPU Scheduling, Synchronization

Synchronization를 위한도구

세마포어 모니터가 있다.

Semaphores : 기차역에서 출발신호를 의미하는 깃발이다. 네덜란드사람 딕스트라가 만듦.
내부구조는 정수 하나와 동작 두개로 구성된다. 하나는 P 동작 하나는 V 동작
P: Proberen (test) 즉 acquire() 검사
V: Verhogen (increment) 즉 release() 증가.

스택에는 푸쉬, 팝이라는 동작이 있다. 마찬가지로 세마포어도 내부에 정수가 있고 P,V가 존재한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void acquire() {
value--;
if (value < 0) {
add this process/thread to list; // 누가 호출하면 큐안에 넣는다.
block;
}
}

void release() {
value++;
if (value <= 0) {
remove a process P from list; //누군가 갇혀있으면 깨워준다.
wakeup P;
}
}

저번에 배웠듯이 레디큐에서 CPU의 서비스를 받기 위해 기다리던 프로세스들이 CPU 서비스를 받다 IO를 만나면 IO서비스를 받으려 하는데 누가 IO서비스를 받고있다면 IO Queue(Device Queue)에서 대기하다 IO서비스를 받고 끝나면 다시 레디큐로 돌아온다.

타임쉐어링 시스템의 경우엔 IO를 만나지 않더라도 시간이 지나면 다시 레디큐로 돌아간다.

이는 프로세스의 큐잉 모델 즉 줄서서 기다리는 모델이다.

세마포어는 정수값도 있고 세마포어 큐도 있다. 어떤 프로세스가 레디큐에 있다 CPU를 쓰다가 acquire를 호출했는데 if문이 맞으면 갇혀버린다.(like 감옥) 이후에 누가 release를 해주면 감옥에서 탈출하여 다른 레디큐로 갈 수 있다.

위에서 value는 권한의 갯수로 생각하면 된다.

세마포어는 Mutual exclusion 상호베타를 위해 동작한다.

세마포어의 초깃값이 1이라 하자. 이때 레디큐에 A, B가 있다고 하자.
먼저 A가 acquire(); 을 호출하면 0이 되고 크리티컬 섹션 안으로 들어간다.(블록 걸리지 않음)
이때 컨텍스트 스위칭이 되고 B가 acquire를 호출하면 이때는 value가 -1이므로 세마포어 큐에 갇히게 된다. (크리티컬 섹션 안으로 못들어간다). 그 후 A가 작업을 마치고 release를 호출하게 되면 value를 늘리고 세마포어 큐에 갇혀있는 B를 깨워 다시 레디큐로 들어가게 한다.

이를 상호베타라 한다.

Monitors :

메모리 매니지먼트라
파일 시스템 매니지먼트
I/O 매니지먼트

Share