CS/운영체제
[운영체제] 12-2 동기화 기법
서니션
2024. 8. 24. 13:41
이 글을 혼자 공부하는 컴퓨터구조 + 운영체제 (한빛미디어) 책을 읽고 혼자 공부한 내용입니다.
잘못 이해한 부분이 있을 수 있고, 문제가 있는 부분 댓글로 알려주시면 수정하겠습니다.
뮤텍스 락
- 동시에 접근해서는 안되는 자원에 동시에 접근하지 않도록 만드는 도구
- 상호 배제를 위한 동기화 도구
- 하나의 전역 변수와 두 개의 함수로 구현 가능
- lock : 프로세스들이 공유하는 전역 변수, 자물쇠 역할
- acquire : 임계 구역을 잠그는 역할
- release : 임계 구역의 잠금을 해제하는 역할
acquire()
{
while (lock == true) // 만약 임계 구역이 잠겨 있다면
; // 임계 구역이 잠겨 있는지를 반복적으로 확인
lock = true; // 만약 임계 구역이 잠겨 있지 않다면 임계 구역 잠금
}
release()
{ locak = false; } // 임계 구역 작업이 끝났으니 잠금 해제
반복적으로 lock을 확인하는 대기 방식을 바쁜 대기라고 함
세마포, 세마포어 Semaphore
- 뮤텍스 락과 비슷하지만, 조금 더 일반화된 방식의 동기화 도구
- 프로세스는 임계 구역 앞에서 멈춤 신호를 받으면 잠시 기다리고, 가도 좋다는 신호를 받으면 그제서야 임계 구역에 들어감
- 하나의 변수와 두 개의 함수로 단순 구현 가능
- 전역 변수 S : 임계 구역에 지입할 수 있는 프로세스의 개수 (사용 가능한 공유 자원의 개수)
- wait 함수 : 임계 구역에 들어가도 좋은지, 기다려야 할지를 알려줌
- signal 함수 : 임계 구역 앞에서 기다리는 프로세스에 '이제 가도 좋다'고 신호를 줌
// 임계 구역 진입 전후로 wait()와 signal() 호출
wait()
// 임계 구역
signal()
// wait 함수 구현
wait() {
while (S<=0) // 만일 임계 구역에 진입할 수 있는 프로세스 개수가 0 이하라면
; // 사용할 수 있는 자원이 있는지 반복적으로 확인하고,
S--; // 임계 구역에 진입할 수 있는 프로세스 개수가 하나 이상이면 S를 1 감소시키고 임계 구역에 진입
}
// signal 함수 구현
signal()
{ S++; } // 임계 구역에서의 작업을 마친 뒤 S를 1증가
사용할 수 있는 공유 자원이 없는 경우 바쁜 대기를 반복할 수 있음, CPU 주기 낭비임
여기서 세마포어는
wait 함수를 만일 사용할 수 있는 자원이 없을 경우 해당 프로세스 상태를 대기 상태로 만들고,
그 프로세스의 PCB 세마포를 위한 대기 큐에 집어 넣음
그리고 다른 프로세스가 임계 구역에서의 작업이 끝나고 signal 함수를 호출하면 대기 중인 프로세스를 대기 큐에서 제거하고, 프로세스 상태를 준비 상태로 변경한 뒤 준비 큐로 옮겨줌
wait() {
S--;
if (S < 0) {
add this process to Queue; // 해당 프로세스 PCB를 대기 큐에 삽입
sleep(); // 대기 상태로 간다
}
}
signal() {
S++;
if (S <= 0) {
remove a process p from Queue; // 대기 큐에 있는 프로세스 p 제거
wakeup(p); // 프로세스 p를 대기 상태에서 준비 상태로
}
모니터
- 사용자가 사용하기에 훨씬 편리한 도구
- 공유 자원에 접근하기 위한 인터페이스를 묶어서 관리
- 공유 자원에 접근하고자 하는 프로세스를 큐에 삽입, 큐에 삽입된 순서대로 "하나씩" 공유 자원 이용시킴
- 실행 순서 제어를 위한 동기화를 위해 조건 변수 사용 (wait, signal)
- 특정 프로세스가 아직 실행될 조건이 되지 않았을 때는 wait를 통해 시행 중단
- 특정 프로세스가 실행될 조건이 충족되었을 때에는 signal을 통해 실행 재개