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을 통해 실행 재개