운영체제

동기화 기법

mumu3997 2024. 6. 19. 20:57

동기화를 위한 대표적인 도구는 뮤텍스 락, 세마포, 모니터가 있다.

 

뮤텍스 락

탈의실로 비유를 해보자.

탈의실이라는 임계 구역, 사람이라는 프로세스가 있다.

만약 자물쇠가 걸려 있다면 탈의실엔 사람이 있다고 판단할 것이다.

 

이 자물쇠 기능을 코드로 구현한 것이 뮤텍스 락:Mutex lock:MUTual EXclusive lock이다.

상호 배제를 위한 동기화 도구이다.

 

뮤텍스 락의 단순한 형태는 하나의 전역변수와 두 개의 함수로 구현 가능하다.

  • 자물쇠: 전역 변수 lock
  • 임계 구역을 잠그는 역할: acquire 함수
  • 잠금을 해제하는 역할: release 함수

acquire 함수는 프로세스가 임계 구역에 진입하기 전에 호출하는 함수

release 함수는 임계 구역에서의 작업이 끝나고 호출하는 함수

acquire() {
	while (lock == true)  /* 만약 임계 구역이 잠겨 있다면 */
    		;	      /* 임계 구역이 잠겨 있는지를 반복적으로 확인 */
    lock = true;	      /* 만약 임계 구역이 잠겨 있지 않다면 임계 구역 잠금 */
}

release() {
	lock = false;         /* 임계 구역 작없이 끝났으니 잠금 해제 */
}

 

아래와 같이 임계 구역 전후로 호출함으로써 하나의 프로세스만 임계 구역에 진입 가능하다.

acurire();		// 자물쇠 잠겨 있는지 확인, 잠겨 있지 않다면 잠그고 들어가기 
// 임계 구역	// 임계 구역에서의 작업 진행
release();		// 자물쇠 반환

 

이런 프로세스의 대기 방식(쉴 새 없이 반복하며 확인하는)을 바쁜 대기 busy wait라고 한다.

 

세마포

세마포 semaphoresms뮤텍스보다 더 일반화된 방식의 동기화이다.

옷가게에 탈의실이 세 개가 있는, 공유 자원이 여러 개 있는 상황에서도 적용이 가능한 동기화 도구다.(counting semaphore)

 

세마포는 철도 신호기에서 유래한 단어로 멈춤 신호와 가도 좋다는 신호로서 임계 구역을 관리한다.

 

뮤텍스 락과 비슷하게 하나의 변수와 두 개의 함수로 단순하게 구현할 수 있다.

  • 사용 가능한 공유 자원의 개수를 나타내는 전역 변수 S
  • 임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 P 함수
  • 임계 구역 앞에서 기다리는 프로세스에 이제 가도 좋다고 신호를 주는 V 함수

세마포도 임계 구역 전후로 P()와 V()를 호출한다.

P();
// 임계구역
V();
P() {
	while (S <= 0)	// 만일 임계 구역에 진입할 수 있는 프로세스 개수가 0개 이하라면
    ;				// 사용할 수 있는 자원이 있는지 반복적으로 확인하고
    S--				// 임계 구역에 진입할 수 있는 프로세스 개수가 하나 이상이면 S를 1 감소시키고 임계 구역에 진입 한다.
 }
V() {
	S++;	// 임계 구역에서의 작업을 마친 뒤 S를 1 증가시킨다.
}

 

여기서 예를 들어 3개의 프로세스가 두 개의 공유자원을 사용한다 치자. 그러면 하나의 프로세스는 무작정 반복하며 S를 확인해야 한다.

바쁜 대기를 반복하여 CPU 주기를 낭비하게 된다.

 

이를 위해 더 좋은 방법이 있다.

 

  • P 함수는 자원이 없을 경우 해당 프로세스 상태를 대기 상태로 만들고 그 프로세스의 PCB를 세마포를 위한 대기 큐에 집어넣는다.
P() {
	S--;
    if(S < 0) {
    	add this process to Queue; // 해당 프로세스 PCB를 대기 큐에 삽입
        sleep();		  // 대기 상태로 접어든다
    }
}
  • V 함수는 대기 중인 프로세스를 대기 큐에서 제거하고, 프로세스 상태를 준비상태로 변경한 뒤 준비 큐로 옮겨준다.
V() {
	S++;
    if(S <= 0) {
    	remove a process p from Queue;	// 대기 큐에 있는 프로세스 p를 제거한다
        wakeup(p);			// 프로세스 p를 대기 상태에서 준비 상태로 만든다
     }
}

 

 

이제 세마포를 이용해 프로세스의 순서를 제어하는 방법에 대해 알아보자.

 

세마포의 변수 S를 0으로 두고 먼저 실행할 프로세스 뒤에 V함수, 다음에 실행할 프로세스 앞에 P함수를 붙이면 된다.

 

 

모니터

공유 자원과 공유 자원에 접근하기 위한 인터페이스를 묶어 관리한다. 

프로세스는 반드시 인터페이스를 통해서만 공유 자원에 접근하도록 한다.

 

큐에 삽입된 순서대로 공유 자원 사용.

 

공유 자원을 다루는 인터페이스에 접근하기 위한 큐를 만들고, 모니터 안에 항상 하나의 프로세스만 들어오도록 상호 배제를 위한 동기화를 제공함.

 

 

 

조건 변수로 실행 순서 제어를 위한 동기화를 제공함.

wait는 호출한 프로세스의 상태를 대기 상태로 전환하고 일시적으로 조건 변수에 대한 대기 큐에 삽입한다.

 

모니터에 진입하기 위한 큐(상호 배제), 실행이 중단된 프로세스들이 삽입되는 큐(조건 변수에 의한 실행 순서 제어)는 다르다.

 

x.wait을 통해 조건 변수 x에 대한 큐에 삽입되면 모니터는 다시 비게 되므로 다른 프로세스가 들어올 수 있다.

 

signal 은 wait를 호출하여 큐에 삽입된 프로세스의 실행을 재개한다.

 

'운영체제' 카테고리의 다른 글

페이징  (0) 2024.07.09
연속 메모리 할당  (0) 2024.06.23
동기화 - Synchronization  (1) 2024.06.17
CPU 스케줄링 알고리즘  (1) 2024.03.09
CPU 스케줄링  (0) 2024.03.03