티스토리 뷰

- 아래의 글을 먼저 읽어본 후 세마포어 글을 읽어보자
2023.05.09 - [운영체제] - #20 프로세스 동기화 - 공유자원과 임계구역


● 세마포어 예시
- 상호 배제(Mutual Exclusion) 메커니즘의 한 가지인 세마포어에 대해 알아보자
 
ex) 세마포어 예시
- 회사에서 직원들은 맡은 업무에 대한 문서 작업을 마치면 프린터로 결과물을 출력한다.
- 이때 프린터는 네트워크를 통해 여러 PC와 연결돼있는 상태이다. 즉, (프린터 = 공유자원)이다.

출처 - 인프런, 그림으로 쉽게 배우는 운영체제

- 직원A와 직원B가 동시에 프린터 출력을 한다고 할 때 직원A의 컴퓨터와 직원B의 컴퓨터는 프린터를 차지하기 위해서
 경쟁 조건(Rase Condition)이 되버린다.(서로 내가 먼저 출력하겠다고 하는 상태)
- 이러면 직원 A의 결과물과 직원B의 결과물이 섞여버리기 때문에 프린터의 결과물이 무쓸모해진다.

출처 - 인프런, 그림으로 쉽게 배우는 운영체제
https://ko.wikipedia.org/wiki/%EA%B2%BD%EC%9F%81_%EC%83%81%ED%83%9C

- 위와 같은 상황을 방지하기 위해 아래와 같은 방법이 고안되었다.

1. 프린터실을 따로 만들어 그곳에 컴퓨터와 프린터를 설치한다.
2. 프린터실 밖에 프린터실 열쇠를 관리하는 열쇠 관리자를 따로 둔다.
3. 프린터를 사용하고 싶은 직원은 열쇠 관리자에게 키를 받아 프린터실로 들어간 후 혼자 프린터를 사용한다.
4. 누군가 프린터실을 이미 사용중일 때 프린터실을 사용하고 싶은 다른 직원은 대기해야한다.
5. 프린터실을 다 사용한 직원은 열쇠를 다시 열쇠 관리자에게 반납한다.
6. 이후 대기인원은 열쇠를 받아 프린터실을 사용한다.
출처 - 인프런, 그림으로 쉽게 배우는 운영체제

● 세마포어 메커니즘
- 위에서 설명한 과정이 세마포어 메커니즘이다. 단순해 보이지만 동기화에서 가장 중요한 개념이다.
- 위의 예시를 운영체제 용어로 매칭해보자

출처 - 인프런, 그림으로 쉽게 배우는 운영체제
1. 프린터를 사용하려는 직원 = 프로세스
2. 프린터를 쓰기 위해 직원(프로세스)들이 기다리는 공간 = 대기큐
3. 프린터 = 여러 프로세스들이 같이 사용하는 공유자원
4. 열쇠 관리자 = 운영체제
5. 열쇠 관리자의 열쇠 = 세마포어

- 세마포어는 실제로 정수형 변수이다.


- 세마포어가 코드에서 실제로 어떻게 쓰이는지 알아보자(이전 글의 게임 예시를 이어서 설명)
 
1. 세마포어(int s = 1)을 선언
- 공유변수는 health 하나이므로 세마포어의 (초기값 = 1)로 할당했다.

출처 - 인프런, 그림으로 쉽게 배우는 운영체제

 
2. 먼저 물약 먹는 코드가 실행된다.
- 2번 라인에서 세마포어 변수(s)를 가지고 wait 함수를 호출한다.
- wait 함수는 열쇠(세마포어 변수)를 받을 때까지 기다렸다가 열쇠를 획득하면 방에 들어가 문을 잠그는 함수이다.
- 지금은 열쇠(세마포어 변수)가 있으니 받아서 바로 문을 잠근 상태이다.

출처 - 인프런, 그림으로 쉽게 배우는 운영체제

 
3. 이때 공격받는 코드로 CPU가 넘어갔다.
- 공격받는 코드에서도 2번 라인의 wait 함수를 호출했지만 열쇠가 없는 상태이기에 열쇠를 받을 때까지 기다려야한다.
- 즉, 2번 라인 이후의 코드는 실행되지 않은채 계속 멈춰있는 상태가 된다.

출처 - 인프런, 그림으로 쉽게 배우는 운영체제

 
4. 시간이 지나 다시 물약먹는 코드로 CPU가 넘어갔다.
- signal 함수가 호출될 때까지 물약먹는 코드가 실행된다.
- 물약 먹는 코드에서 signal 함수가 호출돼 열쇠(세마포어 변수)가 반납됐고 이때 공격 받는 코드의 wait 함수도 종료된다.
cf) 설사 4번 혹은 5번 라인에서 공격 받는 코드로 다시 CPU가 넘어간다고 해도 어차피 열쇠가 없는 상태이기에 wait 함수 이후는 실행되지 않는다.

출처 - 인프런, 그림으로 쉽게 배우는 운영체제

 
5. 시간이 지나 공격받는 코드로 다시 CPU가 넘어왔다.
- 이제서야 2번 라인 이후의 코드가 실행되면서 health 값을 변경한 후 signal 함수를 호출해 열쇠(세마포어)를 반납한다.

출처 - 인프런, 그림으로 쉽게 배우는 운영체제

- 위와 같이 세마포어를 이용하면 공유자원(health 변수)에 여러 프로세스가 동시에 접근하지 못하기 때문에 동기화 문제가 발생하지 않는다.
- 위의 예시에서는 공유자원(health 변수)이 1개이기에 세마포어를 (int s = 1)로 선언했는데 공유자원이 n개이면 세마포어 변수도 n값으로 설정할 수 있다.(세마포어가 여러개의 열쇠를 가질 수 있다.)
- 세마포어가 단순하면서도 편리한 동기화 방법같지만 여기에도 단점은 있다.
- 아래와 같이 wait 함수와 signal 함수의 순서를 이상하게 호출하면 세마포어를 잘못 사용할 가능성이 있다.
- 이것을 해결하는 방법이 바로 '모니터'이다.

출처 - 인프런, 그림으로 쉽게 배우는 운영체제

 
cf) 참고한 글
https://structuring.tistory.com/m/151

운영체제 - 경쟁조건(Race Condition)의 발생: 동기화의 문제점

강의 소개 현재 수강하고 있는 KOCW 내 이화여자대학교 운영체제(2017, 반효경) 강의의 내용을 정리하였습니다. 개발자 관점에서 운영체제 기초를 학습하는 무료 강의로 자세한 강의 내용은 수강

structuring.tistory.com

https://dar0m.tistory.com/234

[OS] 상호배제 방법 : 뮤텍스, 세마포어, 모니터

상호 배제(mutual exclusion) 멀티 프로그래밍에서 공유 불가능한 자원의 동시 사용을 피하기 위해 사용되는 알고리즘으로, 임계 구역으로 불리는 코드 영역에 의해 구현된다. = 하나의 프로세스가

dar0m.tistory.com

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함