혼공컴운_CH12-2_동기화 기법

Today Jeeho Learned·2026년 2월 3일

프로세스 동기화 도구: 뮤텍스, 세마포어, 모니터

프로세스는 동기화하지 않으면 겉보기엔 아무런 문제 없이 보이는 코드도 예기치 못하게 작동할 수 있습니다. 동기화를 위한 대표적인 도구인 뮤텍스 락, 세마포어, 모니터에 대해 알아봅니다.


1. 뮤텍스 락 (Mutex Lock)

옷가게에 마음에 드는 옷이 있으면 탈의실에 가는데, 이때 한 명의 인원만 들어갈 수 있습니다.

  • 손님: 프로세스
  • 탈의실: 임계 구역 (자원)

탈의실에서는 자물쇠를 걸면, 탈의실 안에 사람이 있다고 판단하고 밖의 사람은 기다립니다. 이 자물쇠 기능을 코드로 구현한 것이 바로 뮤텍스 락입니다.

  • 정의: 동시에 접근해서는 안 되는 자원에 동시에 접근하지 않도록 만드는 도구, 상호 배제를 위한 동기화 도구입니다.

구현 방식

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

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

동작 원리
1. acquire: 프로세스가 임계 구역에 진입하기 전에 호출합니다. 임계 구역이 잠겨 있다면 열릴 때까지 반복적으로 확인하고, 열려 있다면 잠급니다.
2. release: 임계 구역에서의 작업이 끝나고 호출합니다. 잠긴 임계 구역을 열어줍니다.

⚠️ 바쁜 대기 (Busy Waiting)
acquire 함수는 임계 구역이 잠겨 있는지 반복적으로 lock을 확인합니다. 이러한 대기 방식을 '바쁜 대기'라고 하며, CPU 주기를 낭비할 수 있습니다.


2. 세마포어 (Semaphore)

세마포어는 뮤텍스 락과 비슷하지만, 일반화된 방식의 동기화 도구입니다.

  • 뮤텍스: 탈의실이 하나 있는 경우 (공유 자원 1개)
  • 세마포어: 탈의실이 세 개 있는 경우 (공유 자원 N개)

세마포어는 공유 자원이 여러 개 있는 상황에서도 적용이 가능하며, 멈춤 신호가도 좋다는 신호로서 임계 구역을 관리합니다.

구현 방식

  • S (전역 변수): 사용 가능한 공유 자원의 개수
  • wait 함수: 임계 구역에 들어가도 좋은지, 기다려야 하는지 알려주는 함수
  • signal 함수: 임계 구역 앞에서 기다리는 프로세스에 '가도 좋다'는 신호를 주는 함수

대기 방식의 개선 (Busy Waiting vs Block/Wakeup)

뮤텍스와 동일하게 공유 자원이 없는 경우 무한히 S를 확인하는 바쁜 대기는 CPU 주기를 낭비합니다. 이를 해결하기 위해 세마포어는 큐를 활용합니다.

  1. Wait (Block): 사용할 자원이 없으면 프로세스 상태를 대기 상태로 만들고, PCB를 세마포어 대기 큐에 집어넣습니다.
  2. Signal (Wakeup): 다른 프로세스가 작업을 마치고 signal을 호출하면, 대기 큐에서 프로세스를 제거하고 준비 상태로 변경하여 준비 큐로 옮깁니다.

3. 모니터 (Monitor)

모니터는 공유 자원과 그 자원에 접근하기 위한 인터페이스를 묶어 관리하는 고수준 동기화 도구입니다.

특징

  1. 인터페이스 강제: 프로세스는 반드시 인터페이스를 통해서만 공유 자원에 접근해야 합니다.
  2. 큐(Queue) 관리: 모니터를 통해 공유 자원에 접근하고자 하는 프로세스를 큐에 삽입하고, 순서대로 하나씩 이용하도록 합니다.
  3. 상호 배제: 모니터 안에는 항상 하나의 프로세스만 들어오도록 하여 상호 배제를 제공합니다.
profile
기록해야 (살아)남는다 !

0개의 댓글