본문 바로가기
IT/OS

[OS] 프로세스 동기화(세마포어, 모니터, 임계구역)

by 퐁시냥 2022. 1. 20.

프로세스간 통신 방법?

  1. 파일, 파이프
  2. 쓰레드 : 한 프로세스 내에서 쓰레드로 통신(코드, 힙, 데이터 영역 공유, 스택 영역만 따로 갖고 있음.)
  3. 네트워크 : OS가 제공하는 소켓통신, 다른 컴퓨터의 함수를 호출하는 RPC(원격 프로세저 호출)


공유자원

  • 프로세스간 통신할 때 공통으로 사용하는 자원

 

프로세스 동기화(Process Synchronization)란?

  • 동기화 문제 : 여러 프로세스가 공유자원을 동시에 사용하기 때문에 동기화 문제가 발생함.

공유 데이터(shared data)에 두 개 이상의 프로세스가 동시에 접근하면 data inconsistency가 발생할 수 있음

data consistency(데이터의 일관성)을 유지하기 위한 메커니즘을 동기화 함.

 

임계구역(Critical Section)

  • 여러 프로세스가 동시에 사용하면 안되는 영역

 

경쟁조건(Race Condition) 

  • 공유자원을 서로 사용하기 위해 경쟁하는 것

경쟁 조건(Race Condition)

 


상호배제(Mutual Exclusion)

특정 프로세스가 공유 자원을 사용 중일 때 다른 프로세스가 이 자원에 접근하지 못하도록 막는 것

임계구역 문제를 해결하기 위해서 필요

 

상호 배제의 요구사항

  • Mutual Exclusion(상호배제) : 임계영역엔 동시에 하나의 프로세스만 접근한다.
  • Progress(진행) : 여러 요청에도 하나의 프로세스의 접근만 허용한다.
  • Bounded Wait(한정 대기) : 임계구역에 들어간 프로세스는 빠르게 나와야한다.

세마포어(Semaphore)

상호배제 메커니즘 중 하나.

프로세스동기화-세마포어-예시
세마포어 예시(example of semaphore)

ex. 프린터(공유자원)를 동시에 출력하는 것 → 컴퓨터끼리 경쟁조건이 됌. 같이 출력되면 문제가 됨

→ 이후에는 프린터를 쓰려면 열쇠를 가지고 프린터실에 들어가서 사용해야함. 다른 직원이 오면 열쇠를 반납하고 다시 받아서 써야함.

  • 직원 A, B = 프로세스(대기큐에서 다음 차례를 기다림.
  • 열쇠관리자 = 운영체제
  • 열쇠 = 세마포어(정수형 변수)
  • 공유자원 = 프린터

[세마포어 예시 코드]

  • 물약 먹는 코드, 공격 받는 코드
    • wait 함수(세마포어 획득)가 실행되면 signal 함수(세마포어 반납)가 실행될 때까지 기다림.
    • 공유자원에 여러 프로세스가 동시에 접근하지 못하므로 동기화 문제가 발생하지 않음.
// 세마포어 선언, 열쇠가 1개인 세마포어(공유자원이 2개면 2로 설정)
int s= 1
// 물약을 먹는 코드
wait(s); //열쇠를 요청해서 열쇠를 받고 문을 잠금

int currentHealth = GetHealth();
health = currentHealth + 50; // 체력 50 증가

signal(s); // 방에서 나와 문지키는 직원에게 열쇠 반납
// 공격받는 코드
wait(s); //열쇠를 요청해서 열쇠를 받고 문을 잠금

int currentHealth = GetHealth();
health = currentHealth - 10; // 체력 50 증가

signal(s);
  • 만약 아래와 같이 세마포어를 잘 못 사용한다면 문제가 발생함 → 해결 방법 ‘모니터

 

#Case 1 
wait(s);
//임계 구역
wait(s);

#Case 2
signal(s);
//임계 구역
signal(s);

#Case 3
signal(s);
//임계 구역
wait(s);

모니터(Monitor)

세마포어의 단점을 해결한 상호배제 메커니즘

따로 운영체제가 처리하는 것이 아니라 프로그래밍 언어에서 지원함

  • 자바(Java), .NET, C#
  • 자바 : synchronized
    • 해당 키워드가 붙은 프로세스는 동시에 여러 프로세스에서 실행할 수 없음.
    • 상호배제가 완벽하게 이루어 짐. 잘 만 사용하면..
      프로세스동기화-모니터-예시
      모니터(synchronized) 예시

[모니터 예시 코드]

public class Health
{
	private int health = 100;
    
    synchronized void increase(int amount)
    {
    	health += amount;
    }
    synchronized void decrease(int amount)
    {
    	health -= amount;
    }
}

참고

댓글