1. Mutex Lock (Mutual Exclusive Lock)
    1. Mutual Exclusive propoerty를 제공하는 Lock
    2. Spinlock
      1. 문고리를 계속 돌려보는 방법
      2. 장점 : context-switch가 일어나지 않는다.
      3. 단점 : 계속 돌려봄으로써 리소스를 계속 요구하므로 CPU 낭비가 심하다.
    3. block : aquire 한번만 해보고 점잖게 기다리는 것
  2. Semaphore
    1. Shared data의 개수를 의미한다.
    2. S 변수 : 공유자원의 개수를 나타내는 변수
      1. S값을 1로 주면 lock과 똑같다.
    3. Wait() : Shared data가 없으면 기다린다.
    4. Signal() : 나 다 썼으니 너 써! 라는 신호
    5. Semaphore의 종류
      1. Binary semaphore (= mutex)
        1. S값이 1인 경우
      2. Counting semaphore
        1. S값이 N 경우

 



 Mutual exclusive lock 

aquire()와 release()를 기반으로 mutual exclusive한 접근을 가능하게 하는 locking mechanism을 Mutex Lock 이라고 한다.

Mutex lock 중에서 aquire를 끊임없이 시도하면서(= busy-wait) lock이 되는 것을 spinlock이라고 한다.

이름 적어놓고 기다리는 것처럼 aquire 한번 해보고 점잖게 기다리는 것을 block이라고 한다.

 

Mutex lock은 busy-wait도 가능하고 block도 가능하다.

단지 mutual exclusive property를 제공하는 lock이라는 것이다.


 

Spinlock의 장점

문고리를 계속 돌리는 것(=spinlock)은 구현이 간단하다.

block은 문고리를 돌려보고 wait queue로 가서 기다려야 한다. process 상태가 waiting 상태로 가서 schedule out 된다.

그래서 새로운 스케줄이 필요해서 스케줄러가 관여해야 한다. 

그러나 spinlock은 T1이 리소스를 사용하고 있을지언정 그것을 aquire하려는 프로세스가 schedule out 되지 않는다.

context switch가 일어나지 않는다.

 

Spinlock의 단점

단점은 문고리를 자꾸 돌리면서 system 리소스를 낭비하는 경향이 있다.

T0 가 preempty되면 T1, T2는 계속 리소스를 요구하기 때문에 어마어마한 CPU가 낭비된다.


 Semaphore 

좀 더 높은 수준에서 synchronization을 제공한다.

 

추가설명

더보기

 

 

Semaphore는 깃발이라는 뜻이다. 옛날에는 기찻길에서 깃발 표식으로 파란색이 걸려있으면 지나가도 되고 빨간색이 걸려있으면 섰다가 다른 기차가 지나가게끔 하는 용도로 깃발을 사용했다. 이 깃발을 Semaphore라고 부른다.

 

즉 겹치는 기찻길 부분이 두 기차가 공유하는 critical section인거다. 기찻길에서도 critical section을 지나가도 된다 안된다를 알려주는 단어로 쓰이는 것이다.

 

lock의 경우는 0 또는 1 이었다.

 

그런데 세마포어는 shared data의 개수를 의미한다. 그래서 0 또는 1 또는 2 또는 ... 등이 될 수 있다. 이 그림에서는 공유 자원이 한 개 이므로 (겹치는 기찻길) Semaphore값은 0또는 1일 것이다. 어떤 기차가 지나가고 있으면 내가 사용할 수 없으니 0이고 비어있으면 1의 값을 가지게 된다. 이렇게 0또는 1의 값만을 갖는 세마포어를 binary semaphore라고 한다.

 

위처럼 누가 쓰면 0이 되고 안쓰면 1이 되는, 즉 0과 1만 갖는 binary semaphore는 Lock과 작동 원리가 반대이다. 0과 1을 왔다갔다 하는 것은 똑같지만, 세마포어는 초기화가 1이고 누가 사용하면 0인데, Lock은 누가 사용했을 경우 1이니 말이다.

 

0과 1뿐만 아니라 2,3,4 등의 값들 또한 가질 수 있는, 즉 도메인이 제한이 없는 counting semphore의 예시를 보자.

 

서버에 프린터가 다섯대 물려있다. 사용자가 프린트를 사용하려고 서버에 요청한다. 그러면 공유자원 즉 프린터가 5개 있으니 5로 설정되는 것이다. 그리고 프린터를 사용자가 사용할때마다 하나씩 감소하는 것이다. 그러다가 사용할 프린터가 없어지면 세마포어는 0이 되고 누군가가 프린터를 다 쓰고 반환하면 세마포어가 다시 1 증가한다. 이런식으로 생각하면 된다. 다시 말하지만 여기서 세마포어는 단순히 변수이다. 공유자원의 개수를 나타내는 변수이다.

 

그럼 자원을 어떻게 사용하고 반납하는가? 이를 위해 제공되는 함수가 wait()signal()이다.

별 거 아니고 그냥 사용하면 -1이 되고 반납할 때 +1 해주는 함수이다. 다만 세마포어 자체가 공유자원이 되면 안되니까 쪼개지지 않는 함수로 구성된다. shared data를 보호하려고 지금 세마포어를 사용하는데 세마포어 자체가 shared data가 되면 말이 안되기 때문이다. 두 줄로 구성되지 않고 무조건 끼어들 틈이 없게 atomic하게! 한 번에 수행시켜줘야 한다는 것이다. 따라서 spinlock과 interrupt disanle/enable 하는 방법가지고 세마포어를 구현해준다.

 

세마포어 변수는 atomic operation인 wait()와 signal()로만 접근 가능한 정수 타입의 변수이다. shared data를 사용하려고 봤는데. shared data가 없다면 기다려야 하니까 함수의 이름을 wait라고 지었다. 다 쓰고 나면 세마포어 값을 +1 시켜주면 된다. 

내가 지금 다 쓴 shared data를 누군가 쓰려고 기다릴 수 있다. 그래서 걔한테 나 다썼으니 너 써! 라고 신호를 보내줘야 한다. 그때 사용되는 함수가 signal()이다.


 

한 개 이상에 대해서 synchronization 할 수 있다.


 

초기값 S

S에서 1을 빼보고, 0보다 작으면 기다리고, 0보다 크면 나간다.

 

S값을 1로 주면 lock과 똑같다.


 

block 방식으로도 Semaphore를 구현할 수 있다.


'🚦 Server > Operating System' 카테고리의 다른 글

17. Deadlock  (0) 2020.06.11
16. Synchronization (3)  (0) 2020.05.26
14. Synchronization (1)  (0) 2020.05.18
Process VS Processor  (0) 2020.05.17
13. Process Scheduling (4)  (0) 2020.05.12
복사했습니다!