[운영체제] 동기화 기법(Mutex Lock, semaphore, monitor)

강민혁·2023년 3월 20일
0

기술면접 | 운영체제

목록 보기
19/32

동기화 기법(Mutex Lock, semaphore, monitor)에 대해 설명하세요

Keyword

critical section, 상호 배제, lock, acquire, release, S, wait, signal, 인터페이스, 실행 순서 제어


Script

먼저 Mutex Lock은 동시에 접근해서는 안 되는 자원에 동시에 접근하지 않도록 만드는 도구로, 상호 배제를 위한 동기화 기법입니다. 주로 lock 전역 변수와 critical section을 잠그는 acquire 함수와 잠금을 해제하는 release 함수로 구현됩니다. 이 경우에는 lock이 true여서 critical section이 잠겨있다면 기다렸다가, lock이 해제되면 critical section을 잠그고 작업을 진행한 후에, 작업이 끝나 critical section에서 빠져 나올 때 다시 critical section을 잠그는 방식으로 critical section을 보호할 수 있습니다.

그리고 semaphore는 공유 자원이 여러 개 존재하는 상황에서도 적용이 가능한 동기화 기법입니다. Mutex Lock이 하나의 공유 자원에 접근하는 것에 대한 동기화 기법인 점과 비교할 때, 좀 더 일반화된 방식이라고 할 수 있습니다. semaphore는 critical section에 진입할 수 있는 프로세스의 개수인 전역 변수 S, critical section에 들어가도 되는지 알려주는 wait 함수, critical section의 사용을 기다리는 프로세스에 허가를 내려주는 signal 함수로 구현됩니다.

다음으로 monitor는 개발자 입장에서 더 편리하고 안전하게 적용할 수 있는 동기화 기법입니다. semaphore나 Mutex Lock은 결국 특정 함수를 호출하는 과정을 로직에 포함시켜야 하기 때문에, 관련 코드를 누락하거나 잘못사용하는 경우가 발생할 수 있습니다. 하지만 monitor 방식은 공유 자원과 프로세스 사이에, 공유 자원에 접근하기 위한 인터페이스를 둡니다. 그리고 인터페이스에 접근하기 위한 queue를 두고 프로세스 동기화를 수행합니다.


Additional

상호 배제를 위한 동기화와 실행 순서 제어를 위한 동기화

기본적으로 위 동기화 기법들은 상호 배제를 위한 동기화에 초점을 두고 있지만, 실행 순서 제어를 위한 동기화도 꼭 필요한 과정이다.

상호 배제를 위한 동기화는 '동시에 접근해서는 안되는 자원에 동시에 접근하지 않도록 제어하는 것'이고, 실행 순서 제어를 위한 동기화는 '특정 조건이 만족되어야만 실행할 수 있는 상황에서 올바른 순서대로 실행하게 하는 것'이다.

Mutex Lock의 acquire, release

acquire 함수는 프로세스가 critical section에 진입하기 전에 호출하는 함수로, 만약 임계 구역이 잠겨 있다면(lock이 true), 열릴 때까지 반복적으로 확인하고, 열려 있다면 critical section을 잠그는 함수이다.

참고로, 이러한 대기 방식을 바쁜 대기(busy wait)이라고 한다.

release 함수는 critical section에서의 작업이 끝나고 호출하는 함수로, 잠긴 critical section을 열어주는 함수이다.

semaphore의 wait, signal

wait 함수는 critical section에 들어갈 수 있는 프로세스의 개수가 1개 이상인지 반복적으로 확인하다가, 가능할 경우에 S를 1 감소시키고 critical section에 들어간다.

signal 함수는 critical section에서의 작업을 마치면서, S를 1 증가시키면서, 대기 중인 프로세스가 critical section으로 들어갈 수 있도록 한다.

바쁜 대기(busy wait)의 문제점

Mutex Lock의 acquire 함수와 semaphore의 wait 함수는 사용할 수 있는 공유 자원이 존재할 때까지 무한히 반복하면서 critical section 사용 가능 여부를 확인해야 한다. 하지만, 이 경우 CPU 자원이 다른 작업을 할 수 있는 기회 비용을 포기하고 CPU 자원을 낭비하게 된다.

semaphore의 wait 함수 개선

실제로 semaphore는 바쁜 대기 문제를 개선하기 위해, critical section 사용 가능 여부를 확인하는 wait 함수가 Mutex Lock과 다르게 동작한다.

wait 함수는 만약 사용할 수 있는 공유 자원이 없다면, 프로세스를 대기 상태로 만들어서 해당 PCB를 semaphore를 위한 waiting queue에 넣는다. 그리고 다른 함수의 작업이 끝나 signal 함수가 호출되면, signal 함수는 waiting queue의 프로세스를 준비 상태로 변경하여 ready queue로 옮겨 준다.

monitor의 condition variable과 실행 순서 제어

monitor에서는 semaphore와 마찬가지로 실행 순서 제어를 위한 동기화도 제공한다. 이 때, 조건 변수(condition variable)을 사용해서 프로세스나 스레드의 실행 순서를 제어한다.

이 때, 인터페이스에 접근하기 위한 waiting queue 외에 또 다른 waiting queue들을 두고, 여기에는 조건 변수에 대해 실행이 중단된 프로세스들이 삽입된다. 이 프로세스들은 해당 조건 변수에 대한 wait, signal 함수로 제어된다.


Reference

Book - 혼자 공부하는 컴퓨터 구조+운영체제

profile
with programming

0개의 댓글