본문 바로가기
(구) 자료/Operating System

[5] 크리티컬섹션, 뮤텍스, 세마포어

by 뜐뜐뜐 2018. 8. 17.

0. 크리티컬섹션(Critical Section)이란?

- 사실 뮤텍스, 세마포어를 하기 전에 크리티컬 섹션의 개념부터 바로잡고 가는 것이 좋다.

- 한 마디로 요약하면, 한 순간에 하나의 쓰레드만 접근이 요구되는 공유 자원에 접근 하는 코드 영역을 의미한다.

- 사실 쓰면서도 뭐 저렇게 어렵게 설명하나 싶다.

- 크리티컬섹션에 대해 공부할 정도쯤 되었다면, 프로세스와 쓰레드 정도는 이미 공부 했을 것이라고 생각한다.

- 그러므로 하나의 프로세스 안에는 1개 이상의 쓰레드들이 존재한다는 것쯤은 다 알고 있을 것이다.

- 또한, 각 쓰레드들은 각자의 Stack과 Register만 독립적으로 갖고 있고, 나머지 자원들은 '공유'함을 알고 있을 것이다.

- 문제는 이거 때문에 발생한다. 예를 들어보자.


ex)
- 한 번에 한 쓰레드만의 접근을 요구하는 공유 자원 A가 있다고 생각해보자.

- 그럼에도 불구하고, Thread 1Thread 2가 동시에 이 자원을 사용하려고 든다면?

- 동기화가 되지 않은 상태라면, 이 A값을 전혀 예측할 수 없게된다. 왜냐면 Thread끼리 뒤죽박죽 섞여서 값이 불안정해지기 때문.

- 그러므로, 크리티컬섹션(Critical Section)에는 무조건 한 Thread만의 접근을 허용해야 한다.

- 모든 Process들과 Thread들이 Critical Section을 함께 사용할 수 있는 행복한 세상을 만들 순 없을까?


- 위의 문제점을 해결해줄 대표적인 방법 두 가지가 뮤텍스와 세마포어다.


- 물론, Critical Section이라는 동기화 기법도 존재한다. 이는 [한 Process내의 Thread들 간의 동기화를 Control]할 수 있다.


- User 객체, Kernel 객체 이런식으로 나누는데 Critical Section의 동기화 기법은 User 객체에 해당된다.


- 커널로 왔다갔다 할 필요가 없기 때문에 가볍고 빠르다는 장점이 있음!


- 그럼 이제 뮤텍스와 세마포어를 들어가보자.

1. 뮤텍스(Mutex)란?

- Mutex는 Mutual exclusion(상호배제)의 약자로, 임계 구역(Ciritical Section) 문제를 해결할 수 있는 개발 도구 중 하나.

-   위에서 Critical Section은 한 Process 내의 Thread들 간의 동기화를 관장한다고 언급했다. 그럼 이놈은 안되느냐? 그것도 아니다. 단지, 그          범위가 프로세스로 확장된다. 뮤텍스는 [여러 프로세스의 Thread 사이에서 동기화가 가능]하다.

- 즉, Critical Section의 동기화 기법으로는 불가능한 [프로세스 다중 실행 방지]에 사용된다고 보면 된다. (Kernel 객체다)

- 나는 어렵게 설명하는거는 질색이므로 무조건 쉽게 설명하겠다.

- 뮤텍스의 대표적인 예로 화장실을 많이 드는데, 그것도 좋지만 나는 일반 옷가게 피팅룸을 예로 들어보겠다.


ex) 홍대 일반 옷가게 피팅룸
- 흰 반팔 입고 나왔는데, 밥 먹다가 흘려가지고 홍대를 걷다가 아무 옷가게나 들렀다.

- 맘에드는 옷 발견! 근데 나한테 맞을까? 싶어서 직원한테 물어보고 피팅룸으로 갔다.

- 근데 이게 뭐람... 여긴 [1]피팅룸이 하나밖에 없다(작은 가게라서). 근데 문이 닫혀있네..?

- 혹시 몰라서 사람이 있나 확인하려고 문을 보니까 [2] 문고리가 [사용 중]으로 돼있다. 이런 기다려야겠군...

- 아니 근데 이 사람은 안에서 옷을 만들어입나 왜 안나와..? 한 10분 기다리니까 나온다. 근데 최홍만이네 조용히 해야겠다.

- 이번엔 내가 들어갔다. 나도 겁나 늦게 나갈거야 쒸익 쒸익! 근데 [3] 밖에서 1분에 한 번씩 문을 뚜들긴다. 흥 내가 나가나봐라!

- 나도 10분을 채우고 나갔다. 근데 아까 들어간 최홍만이 기다리고 있었다. 죄송합니다(꾸벅)



- 위에서 [1], [2], [3]으로 표현한 부분이 뮤텍스의 전부라고 할 수 있다.

[1] 피팅룸이 하나밖에 없다?

- '세마포어는 뮤텍스가 될 수 있다'가 성립이 되는 근거.

- 왜냐면, 뮤텍스1개만 동기화가 가능하지만, 세마포어는 뒤에서 언급하겠지만, 1개 이상의 동기화가 가능하다.

- [뮤텍스 ⊂ 세마포어] 수학 공부 해본 사람은 다 아는 포함 관계일 것이다.

- 세마포어의 일부분이 뮤텍스이기 때문에 [세마포어는 뮤텍스가 될 수 있다]는 성립하지만, 그 반대는 말이 안됨.

- 이처럼 뮤텍스는 한 개만 동기화가 가능하기 때문에 '소유 한다'라고도 말하고, '소유자(사용중인 Thread)가 이에 책임을 진다'고 함.

[2] 문고리가 [사용 중]으로 돼있다?

- 이미 다른 [Thread A]가 Critical Section을 '소유' 하고 있다면, [Thread A]는 Lock()을 획득했다 로 표현할 수 있다.

- 즉, 홍만이형은 Lock()을 획득한 상태가 된다는 것이다.(나올 땐 'lock()을 반환한다'고 표현, 'release()를 호출한다' 고 한다)

- 이 때, 다른 [Thread B]가 이 Critical Section에 접근(acquire())을 시도하지만 Lock()을 획득하지 못하면, [Thread B]는 Block상태가 된다.

- 즉, 나는 Block상태가 되어 홍만이 형이 나오길 기다리는 상태가 된다.

[3] 밖에서 1분에 한 번씩 문을 두들긴다?


- [문을 1분에 한 번씩 뚜들긴다] = [일정 시간을 주기로 계속 acquire()를 반복 호출한다.(lock 얻을 수 있는지 알기 위해)]


- 이를 'Busy Waiting(바쁜 대기)을 한다'고 표현하는데, 이를 위해선 프로세스가 반복 회전해야 하므로 [spinlock]이라고 부르기도 함.


- 이는 'CPU cycle을 계속해서 낭비'한다는 단점을 갖고 있다.


2. 세마포어(Semaphore)

- 위에서 동기화 기법으로 크리티컬 섹션, 뮤텍스를 보고 와서 이제 대충 감은 잡혔을거라 믿는다. (내가 이해된걸 보면 분명하다.)

- 위에서 이미 살짝 언급을 했다. 세마포어는 뮤텍스를 좀더 확장한 버전이라고!

- 뮤텍스는 하나의 Thread만 실행되게 하지만, 세마포어는 [지정된 수 만큼의 Thread가 동시에 실행되도록 동기화 하는 것이 가능]하다.

- 운영체제에서 자원을 경쟁적으로 사용하는 다중 프로세스에서의 동기화 기법이다.

- 세마포어는 [Binary Semaphore][Counting Semaphore]로 두 가지가 있는데, 전자뮤텍스와 같다고 보면 되고, 앞으로 설명할거는 후자다.

- 물론 마찬가지로 설명 복잡한거 질색이니까 또 예를 들겠다.



EX)

- 저번에 아무 가게나 갔다가 만났던 홍만이 형을 또 만날까봐 무서웠던 나는 이번엔 유X클로에 가기로 했다!


- 오우 역시 큰 매장은 달라도 확실히 다르구만! [1] 피팅룸이 10개나 되네 캬...


- 옷 고르고 와도 충분하겠군! 반팔이랑 반바지랑.... 팬티랑 양말이랑... 약 30분 정도 돌았다.


- 다시 와보니까 이게 뭐지? [2] 피팅룸이 꽉 찼다....


- 그래도 뭐 10개나 있는데 금방 들어가서 입어볼 수 있겠지?


- 10분을 기다렸는데... 또 드럽게 안나온다. 그러다가 1번 피팅룸에서 누군가가 나왔다. 홍만이 형!


- 이정도면 운명인가 싶지만, 나는 형이 무서우니까 호다닥 피팅룸 1번으로 들어가서 갈아입었다.


- 나오니까 또 많은 사람들이 기다리고 있었다. 바로 뒤에 있던 사람이 1번 방으로 들어갔다.



- [1], [2]는 세마포어의 전부라고 볼 수 있다.


[1] 피팅룸이 10개!


- 뮤텍스는 임계구역에 한 개의 프로세스 or 쓰레드를 진입시킬 수 있다면, 세마포어는 2개 이상을 진입 시킬 수 있다.


[2] 피팅룸이 다 꽉찼다...


- 받아 들일 수 있는 프로세스의 수를 세마포어(S)라고 부른다.

* if(S <= 0) : 뮤텍스에서와 마찬가지로 Busy Waiting을 반복한다. 언제까지? S가 1 이상이 될 때까지.

  else : 진입. Wait()이라는 코드 블럭 내부에 모든 로직이 존재한다.


- 크리티컬 섹션에서의 작업을 마치고 lock을 반납할 때, 세마포어(S)는 증가한다.


* 그럼, 세마포어는 왜 필요한걸까?

: [Dead Lock]을 피하기 위함. 데드락은 다음에 다룰 예정!


끝!

'(구) 자료 > Operating System' 카테고리의 다른 글

[OS] Chapter 1. OS 개념 정립  (0) 2017.11.29