Process Synchronization(프로세스 동기화)
여러 프로세스가 공유하는 자원의 일관성을 유지하는 것
Critical Section(임계영역)
다른 프로세스와 공유하는 자원에 접근하고 갱신할 수 있는 코드 영역
Critical Section Problem(임계영역 문제)
프로세스들이 Critical Section 을 함께 사용할 수 있는 프로토콜을 설계하는 것
Requirements(해결을 위한 기본조건)
- Mutual Exclusion(상호 배제) :
프로세스가 Critical Section에서 실행중이라면, 다른 프로세스들은 그들이 가진 Critical Section에서 실행될 수 없다. - Progress(진행) :
Critical Section에서 실행중인 프로세스가 없고, 별도의 동작이 없는 프로세스들만 Critical Section 진입 후보로서 참여될 수 있다. - Bounded Waiting(한정된 대기) :
프로세스가 Critical Section에 진입 신청 후 부터 받아들여질 때가지, 다른 프로세스들이 Critical Section에 진입하는 횟수는 제한이 있어야 한다.
임계영역 문제 해결 방안
Semaphore(세마포어)
두개의 원자적(Atomic) 함수로 제어되는 정수 변수로
멀티프로그래밍 환경에서 공유자원에 대한 접근 제어를 하는 방법으로 사용되며,
1개의 공유되는 자원에 제한된 개수의 프로세스(Process), 또는 스레드(Thread)만 접근할 수 있도록 한다.
종류
- Binary Semaphore(이진형 세마포어) : 0 또는 1을 가진다. 즉, 1개의 공유 자원을 상호배제한다.
- Counting Semaphore(계수형 세마포어) : 0과 양의 정수값을 가질 수 있따. 여러개의 공유 자원을 상호배제할 수 있다.
구성
세마포어 변수 S
- 원자적(Atomic)으로 제어되는 정수 변수로,
- 일반적으로 세마포어의 값이 0이면 자원에 접근할 수 없도록 블럭(Block) 하고 0보다 크면 접근함과 동시에 세마포어의 값을 1 감소시킨다.
- 반대로 종료하고 나갈 때에는 세마포어의 값을 1 증가시켜 다른 프로세스가 접근할 수 있도록 한다.
P 연산
- Critical Section을 사용하려는 프로세스들의 진입 여부를 결정하는 조작으로 Wait 동작이라고도 한다.
V 연산
- 대기 중인 프로세스를 깨우는 신호(Wake-up)로 Signal 동작이라고도 한다.
P는 임계 구역에 들어가기 전에 수행되고, V는 임계 구역에서 나올 때 수행된다.
이때 변수 값을 수정하는 연산은 모두 원자성을 만족해야 한다.
즉, 한 프로세스(또는 스레드)에서 세마포어 값을 변경하는 동안 다른 프로세스가 동시에 이 값을 변경해서는 안 된다.
구현 방법
P(S);
// --- 임계 구역 ---
V(S);
procedure P(S) --> 최초 S값은 1임
while S=0 do wait --> S가 0이면 1이 될때까지 기다려야 함
S := S-1 --> S를 0로 만들어 다른 프로세스가 들어 오지 못하도록 함
end P
--- 임계 구역 ---
procedure V(S) --> 현재상태는 S가 0임
S := S+1 --> S를 1로 원위치시켜 해제하는 과정
end V
예시
최초 S 값은 1이고, 현재 해당 구역을 수행할 프로세스 A, B가 있다고 가정하자
- 먼저 도착한 A가 P(S)를 실행하여 S를 0으로 만들고 임계구역에 들어감
- 그 뒤에 도착한 B가 P(S)를 실행하지만 S가 0이므로 대기 상태
- A가 임계구역 수행을 마치고 V(S)를 실행하면 S는 다시 1이 됨
- B는 이제 P(S)에서 while문을 빠져나올 수 있고, 임계구역으로 들어가 수행함
Mutex(뮤텍스)
임계 영역을 가진 스레드들의 실행시간이 서로 겹치지 않고 각각 단독으로 실행되게 하는 기술
해당 접근을 조율하기 위해 lock과 unlock을 사용한다.
- lock : 현재 임계 구역에 들어갈 권한을 얻어옴 ( 만약 다른 프로세스/스레드가 임계 구역 수행 중이면 종료할 때까지 대기 )
- unlock : 현재 임계 구역을 모두 사용했음을 알림. ( 대기 중인 다른 프로세스/스레드가 임계 구역에 진입할 수 있음 )
Mutex는 상태가 0, 1로 Binary Semaphore로 부르기도 한다.
Monitor
모니터는 시스템 호출과 같은 개념이다. 커피머신을 사용자가 직접 만지면 고장 날 가능성이 있는 것처럼, 운영체제가 관리하는 자원을 사용자가 마음대로 사용하게 두면 실수나 악의적인 의도로 시스템 자원을 망가뜨릴 수 있다. 이러한 문제를 예방하기 위해 운영체제는 시스템 자원을 사용자로부터 숨기고 사용자의 요구사항을 처리할 수 있는 인터페이스만 제공하는데, 이를 시스템 호출이라고 한다.
모니터의 작동 원리는 다음과 같다.
- 임계구역으로 지정된 변수나 자원에 접근하고자 하는 프로세스는 직접 P()나 V()를 사용하지 않고 모니터에 작업 요청을 한다.
- 모니터는 요청받은 작업을 모니터 큐에 저장한 후 순서대로 처리하고 그 결과만 해당 프로세스에 알려준다.
세마포어 vs 뮤텍스 vs 모니터
뮤텍스와 모니터의 차이는?
- 뮤텍스는 다른 프로세스나 스레드 간에 동기화를 위해 사용한다.
- 모니터는 하나의 프로세스내에서 다른 스레드 간에 동기화할 때 사용한다.
- 뮤텍스는 운영체제 커널에 의해 제공된다.
- 무겁고 느리다.
- 모니터는 프레임워크나 라이브러리 그 자체에서 제공된다.
- 가볍고 빠르다.
세마포어와 모니터의 차이는?
- 자바에서는 모니터를 모든 객체에게 기본적으로 제공하지만 C에서는 사용할 수 없음.
- 세마포어는 Counter라는 변수값으로 프로그래머가 상호 배제나 정렬의 목적으로 사용시 매번 값을 따로 지정해줘야 하는 등 조금 번거롭다.
- 반면, 모니터는 이러한 일들이 캡슐화되어 있어서 개발자는 Counter 값을 0 또는 1으로 주어야 하는 고민을 할 필요가 없이 synchronized, wait(), notify() 등의 키워드를 이용해 좀 더 편하게 동기화할 수 있다.
세마포어와 뮤텍스의 차이는?
- 세마포어는 뮤텍스가 될 수 있지만, 뮤텍스는 세마포어가 될 수 없다.
- 세마포어는 소유할 수 없으며, 뮤텍스는 소유할 수 있고 소유주가 그 책임을 진다.
- 뮤텍스의 경우 뮤텍스를 소유하고 있는 스레드가 이 뮤텍스를 해제할 수 있다. 하지만 세마포어는 소유하지 않고 있는 다른 스레드가 세마포어를 해제할 수 있다.
- 뮤텍스는 동기화 대상이 1개일 때 사용하고 세마포어는 동기화 대상이 여러 개일때 사용한다.
뮤텍스와 세마포어의 예시 링크 : https://medium.com/@kwoncharles/뮤텍스-mutex-와-세마포어-semaphore-의-차이-de6078d3c453
면접 예상 질문
- 프로세스 동기화란 무엇인가요?
- 동기화 문제에서 임계구역 문제를 해결하기 위한 세가지 조건은 어떤 것들이 있나요?
- 세마포어, 뮤텍스, 모니터는 무엇일까요?
참고 URL
https://gyoogle.dev/blog/computer-science/operating-system/Semaphore & Mutex.html
https://velog.io/@octo__/세마포어Semaphore
https://mfamcs.netlify.app/docs/CA_and_OS/동기화 문제#나올-수-있는-면접-질문
https://chelseashin.tistory.com/40
https://github.com/WooVictory/Ready-For-Tech-Interview/blob/master/Operating System/동기화 문제.md
'컴퓨터 구조 및 운영체제' 카테고리의 다른 글
컨텍스트 스위칭 (1) | 2024.01.21 |
---|---|
프로세스와 스레드 (1) | 2023.12.18 |
CPU의 구조와 원리 (1) | 2023.11.20 |
컴퓨터의 구성 (0) | 2023.11.17 |