쟈미로그

뮤텍스와 세마포어 본문

CS/OS

뮤텍스와 세마포어

쟈미 2022. 11. 22. 16:49

동기화 과정에서 공유 자원에 접근하는 임계 영역에 대한 관리를 어떻게 해주어야 문제들이 발생하지 않을까?

뮤텍스와 세마포어를 사용하면 공유 자원에 대한 여러 스레드/프로세스의 동시 접근을 막을 수 있다. 

 

1. 뮤텍스 (Mutex)

뮤텍스는 공유 자원에 접근 스레드들의 실행 시간이 서로 겹치지 않게 단독으로 실행되게 하는 방법이다.

말 그대로 상호 배제(Mutual Exclusion)의 약자다.

임계 구역에 들어갈 때 lock을 걸고 나갈 때 unlock해서 접근을 조율한다.

 

 

2. 세마포어 (Semaphore)

세마포어는 다수의 프로세스/스레드의 n개의 공유 자원에 대한 접근을 제한하는 방법이다.

 

뮤텍스와의 다르게 여러 스레드가 동시에 한 공유 자원에 접근할 수 있다!

접근 가능한 스레드 개수를 지정해서 count하며 스레드의 동기화를 구현한다.

count 방법

그렇다면 어떻게 스레드 접근 개수를 셀까?

세마포어는 P, V 연산을 통해서 공유 자원에 접근한 스레드들의 개수를 센다.

  • P : 임계 구역에 들어가는 스레드는 P 연산 수행
  • V : 임계 구역에서 나오는 스레드는 V 연산 수행 

 

스레드들의 대기 방법

  1. Sleep-Waiting : 대기 큐에서 sleep 하다가 사용 가능한 자원이 생기면 잠자고 있던 스레드를 깨우는 방식.
  2. SpinLock : lock이 반환될 때까지 계속해서 확인하며 기다리는 방식. (Busy-Waiting) 무한 루프를 돌면서 최대한 다른 스레드에게 CPU를 양보하지 않는 것.
SpinLock 사용하는 경우?
(1) 컨텍스트 스위칭 시간이 Lock을 앞으로 얻을 시간보다 더 길 것 같다면, SpinLock 사용이 나을 수 있다. (컨텍스트 스위칭을 줄일 수 있다)
(2) 멀티코어 프로세스인 경우.

 

 

(이 후에 Java의 동기화 및 locking 기법들 알아보는 게시물도 써보자)

 

 

 

 

참조
https://www.youtube.com/watch?v=oazGbhBCOfU
https://brownbears.tistory.com/45
https://gyoogle.dev/blog/computer-science/operating-system/Semaphore%20&%20Mutex.html

 

Comments