프로세스가 동기화 되지 않으면 원하는 결과를 얻을 수 없다는 건 지난 글에서 살펴봤다.
2024.01.14 - [IT정보&정보처리기사] - 프로세스 동기화
프로세스 동기화
실행되는 여러 프로세스들은 서로 영향을 끼친다. 프로세스 동기화란 프로세스들 간의 실행 순서를 맞추는 행위이다. 프로세스 동기화에는 실행순서제어와 상호배제가 있다. 실행순서제어의
ent-dreamcatcher.tistory.com
이제부터 프로세스들을 동기화 하는 방법을 알아본다.
대표적인 프로세스 동기화 기법은 뮤텍스락, 세마포, 모니터가 있다.
1. 뮤텍스락(Mutex Lock)
뮤텍스는 상호배제(Mutual Exclusion)의 약자이다. Lock은 잠근다는 뜻이다.
공중화장실 칸마다 있는 문고리를 연상하면 이해가 쉽다. 우군가 볼일을 보고 있으면 "사용중"이라는 빨간색 표시로 바뀌고 일을 다 보고 나오면 파란색 "비었음"이 된다. 파란색 표시를 보면 들어가도 된다는 것을 알 수 있다.
이 문고리표시역할을 구현하면 뮤텍스락이 된다.
- 자물쇠 : 프로세스들이 공유하는 전역변수 Lock
- 임계구역을 잠그는 역할 : acquire함수
- 임계구역의 잠금해제하는 역할 : release 함수
Acquire함수
프로세스가 임계구역에 진입하기 전에 호출하는 함수로 임계구역이 잠금 상태면 반복적으로 임계구역의 상태를 확인한다(임계구역의 lock이 false가 될 때 까지 반복) , 임계구역의 lock이 false가 되면 프로세스가 진입하고 임계구역을 다시 잠근다(lock을 false에서 true로 변경)
Release함수
프로세스가 임계구역에서의 작업이 끝나면 호출하는 함수로 임계구역의 lock을 true에서 false로 변경하는 함수다.
함수 구현
acquire() {
while(lock==true)
;
lock=true;
}
release() {
lock=false;
}
2. 세마포(Semaphore)
세마포는 '깃발'이라는 뜻인데 철로를 공유할 때 한 번에 한대의 기차가 지나갈 수 있도록 양 끝에서 기수가 깃발로 사인을 보내는 것에서 유래되었다. 마찬가지로 공유자원을 사용해야 하는 프로세스가 다수가 있을 때, 자원사용가능여부를 나타내는 깃발 역할을 한다. 네덜란드의 컴퓨터과학자인 에츠허르 데이크스트라가 제안한 동기화 방법이다.
동작방식은 다음과 같다.
S
전역변수인데 임계구역에 접근이 가능한 프로세스의 개수이다. 즉 공유자원을 사용가능한 숫자이다.
wait함수임계구역에 진입할 수 있는 상태인지 확인하고 프로세스가 진입하면 S를 1 감소 시킨다.
signal함수
프로세스가 임계구역에서의 작업 마치고 나왔을 때 S를 1 증가시킨다.
함수구현
wait() { while(S<=0) ; S--;}
signal() { S++}
위의 방법은 초기에 제안된 방법으로 CPU가 계속 S의 값을 확인해야 하는 단점이 있다. 이를 해결하는 방법으로 사용가능한 자원이 없을 경우 프로세스를 대기열(큐)에 넣고 다른 프로세스가 임계구역에서의 작업을 마치고 나오면서 signal함수를 호출하면 signal함수가 대기열의 프로세스를 꺼내(제거) 준비상태로 전환시키는 방법을 이용한다.
코드로는 아래와 같이 구현된다. 주의할 점은 아래의 S의 음수값은 대기하는 프로세스의 숫자라는 것이다.wait() { S--; if(S<0){ add process to queue; sleep(); }}
signal() { S++; if(S<=0){ remove process p from queue; wakeup(p) }}
3. 모니터
모니터는 공유자원과 공유자원에 접근할 수 있는 인터페이스를 묶어서 관리하므로 세마포 보다 사용이 용이하다.
모니터를 통해서 공유자원을 사용하려는 프로세스들은 큐에 삽입되고 한 번에 하나의 프로세스만 모니터 내부로 들어올 수 있게 해서 상호배제 동기화를 제공한다.
특정조건을 바탕으로 프로세스 실행을 제어하기 위해 모니터는 조건변수(Condition variable)라는 걸 사용한다.
조건변수는 큐를 가지는데 모니터를 통해 공유자원에 접근하여 진행중이던 프로세스가 어떤 조건을 만족할 때까지 대기해야(wait) 할 때 저장되는 큐이다. 진행중이던 프로세스가 wait으로 대기상태가 되면 공유자원을 다른 프로세스가 사용할 수 있게 된다. 그러다가 어떤 프로세스에 의해 대기중인 프로세스가 깨워지면(signal) 대기중이던 프로세스는 다시 모니터 내부로 진입하여 실행된다.
'IT정보&정보처리기사' 카테고리의 다른 글
| 애자일 프로세스 모델 - 스크럼 (0) | 2024.01.20 |
|---|---|
| 교착상태 (0) | 2024.01.17 |
| 프로세스 동기화 (2) | 2024.01.14 |
| CPU 스케줄링 (0) | 2024.01.13 |
| 프로세스와 스레드 (0) | 2024.01.12 |