스핀 락

Spin Lock  이름이 뜻하는대로만약 다른 스레드가 lock 소유하고 있다면  lock 반환될 때까지 계속 확인하며 기다리는 것이다. "조금만 기다리면 바로   있는데 굳이 컨텍스트 스위칭으로 부하를  필요가 있나?" 라는 컨셉으로 개발된 것으로 크리티컬 섹션에 진입이 불가능할때 컨텍스트 스위칭을 하지 않고 잠시 루프를 돌면서 재시도 하는 것을 말합니다. Lock-Unlcok 과정이 아주 짧아서 락하는 경우가 드문 경우(적절하게 크리티컬 섹션을 사용한 경우유용하다Spin Lock  다음과 같은 특성을 갖는다.

  1. Lock 얻을  없다면계속해서 Lock 확인하며 얻을 때까지 기다린다이른바 바쁘게 기다리는 busy wating이다.
  2. 바쁘게 기다린다는 것은 무한 루프를 돌면서 최대한 다른 스레드에게 CPU 양보하지 않는 것이다.
  3. Lock  사용가능해질 경우 컨택스트 스위치를 줄여 CPU 부담을 덜어준다하지만만약 어떤 스레드가 Lock 오랫동안 유지한다면 오히려 CPU 시간을 많이 소모할 가능성이 있다.
  4.  하나의 CPU 하나의 코어만 있는 경우에는 유용하지 않다 이유는 만약 다른 스레드가 Lock 가지고 있고  스레드가 Lock 풀어 주려면 싱글 CPU 시스템에서는 어차피 컨택스트 스위치가 일어나야 하기 때문이다. 주의할  스핀락을 잘못 사용하면 CPU 사용률 100% 만드는 상황이 발생하므로 주의 해야 한다스핀락은 기본적으로 무한 for 루프를 돌면서 lock 기다리므로 하나의 쓰레드가 lock 오랫동안 가지고 있다면다른 blocking 쓰레드는 busy waiting 하므로 CPU 쓸데없이 낭비하게 된다.

장점은 스핀락을  사용하면 context switch 줄여 효율을 높일  있습니다. 무한 루프를 돌기 보다는 일정 시간 lock 얻을  없다면 잠시 sleep하는 back off 알고리즘을 사용하는 것이 훨씬 좋습니다.

크리티컬 섹션

유저 객체. (커널에서 제공 객체X)

커널 객체가 아니므로 가볍고 빠름

그러나 한 프로세스 내의 쓰레드 사이에서만 동기화가 가능. 보통의 경우 가볍고 쉽게 쓸 수 있는 동기화 객체

뮤텍스

커널 객체. 

크리티컬 섹션보다 무거움.

크리티컬 섹션이 한 프로세스 내의 쓰레드 사이에서만 동기화가 가능한 반면, 뮤텍스는 여러 프로세스의 스레드 사이에서 동기화가 가능.

뮤텍스를 가장 흔히 사용하는 예가 프로세스 다중 실행을 막을 때. 이런 기능은 크리티컬 섹션으로는 불가능.

cs(크리티컬 섹션)를 가진 스레드들끼리 실행이 겹치지 않게 단독으로 실행하는 기술

세마포어

커널 객체

위의 크리티컬 섹션, 뮤텍스는 동기화 함에 있어서 동시에 하나의 쓰레드만 실행되게 하지만 이에 반해, 세마포어는 지정된 수만큼의 쓰레드가 동시에 실행되도록 동기화하는 것이 가능.

지정된 수보다 작거나, 같을 때까지 쓰레드의 실행을 허용하고, 지정된 수를 넘어서 쓰레드가 실행되려 하면 실행을 막음.


뮤텍스와 세마포어 차이점

세마포어는 뮤텍스가 될 수 있지만 뮤텍스는 세마포어가 될 수 없음.

세마포어는 소유할 수 없는 반면 뮤텍스는 소유할 수 있고 소유자가 이에 책임을 짐

뮤텍스는 1개만 동기화가 되지만 세마포어는 하나 이상을 동기화 할 수 있음

  • 예) 변기가 하나뿐인 화장실에서는 앞의 사람이 볼일을 마치고 나가야 다음 사람이 들어갈 수 있다. 이렇게 한번에 오직 하나만 처리할 수 있는 대상에 사용하는 것이 뮤텍스, 변기가 세개인 화장실에서는 동시에 세 사람이 볼일을 볼 수 있고 이 세 사람 중 아무나 한명이 나오면 다음 사람이 볼일을 볼 수 있다. 이렇게 동시에 제한된 수의 여러 처리가 가능하면 세마포어이다. 만약 변기 세개짜리 화장실의 각 변기에 대해 뮤텍스를 사용한다면 대기중인 사람은 각 변기 앞에 줄을 서는 것이고 이렇게 되면 옆 칸이 비어도 들어가지 못하게 된다. 이에 비해, 변기 세개에 대해 세마포어를 적용하는 것은 화장실 앞에서 줄을 서서 대기하다가 아무나 한명 나오면 대기중이던 한명이 들어가는 것이다. 만약 변기 세개를 묶어서 뮤텍스를 사용한다면 변기 수에 관계없이 무조건 한명만 사용할 수 있게 된다. 이 예에서 변기는 동기화 대상, 사람은 그 동기화 대상에 접근하는 쓰레드를 나타낸다. 뮤텍스와 세마포어의 목적은 특정 동기화 대상이 이미 특정 쓰레드에 의해 사용중일 경우 다른 쓰레드가 해당 동기화 대상에 접근하는 것을 제한하는 것으로 동일하지만 관리하는 동기화 대상이 몇개인가에 따라 차이가 생기게 되는 것이다.


'공부 > OS' 카테고리의 다른 글

Page Replace Algorithm  (0) 2016.06.26
가상 메모리 (virtual memory)  (1) 2016.06.26
데드락(Deadlock)  (0) 2016.06.25
스핀 락(Spin lock), 크리티컬 섹션(Critical section), 세마포어(Semaphore), 뮤텍스(Mutex)  (1) 2016.06.25
OS  (0) 2016.06.25
  1. ㅁㅁ 2019.05.02 17:30

    음 근데 궁금한게 있는데요 세마포어는 여러 개 쓰레드에 자원할당을 해줄 수 있는데

    똑같이 그러면 공유 데이터에 접근하는 문제가 생기는 거 아닌가요?

+ Random Posts