-
Spin Lock vs Mutex vs SemaphoreComputer Science 2023. 9. 18. 16:11
1. 스핀락
2. 뮤텍스
3. 세마포어
4. 스핀락 vs 뮤텍스
5. 이진 세마포어 vs 뮤텍스
스핀락 ( Spin Lock ), 뮤텍스 ( Mutex ), 세마포어 ( Semaphor ) 이 셋의 공통점은 동시성 프로그래밍에서 사용되는 동기화 기술이라는 것이다.
동시성 프로그래밍 ( Concurrency Programming )
여러 스레드 혹은 프로세스로 작업을 처리하는 것으로 쉽게 말해 동시에 여러 작업을 처리하는 것이다.
동기화 ( Synchronization )
여러 스레드 또는 프로세스 간의 작업 순서를 조절하고, 공유 자원에 대한 안전한 접근을 보장한다.
임계 영역 ( Critical Section )
동시성 프로그래밍에서 상호 배제를 적용하는 영역이다. 이 영역은 한 번에 하나의 스레드 또는 프로세스만이 접근할 수 있다.
1. 스핀락 ( Spin Lock )
임계 영역에 접근하려고 할 때 접근 가능할 때까지 반복적으로 접근 시도를 하는 방식이다.
이러한 방식은 대기가 길어질 수록 불필요한 자원의 소모 ( 계속해서 접근 시도 ) 가 많다.2. 뮤텍스 ( Mutex )
임계 영역에 접근할 권한이 생길 때까지 휴식하는 방식이다.
오직 하나의 스레드만이 뮤텍스 권한을 소유하고 해당 스레드만이 뮤텍스를 해재할 수 있다.
이를 가능하게 하는 것이 cpu의 원자적 연산을 이용하기 때문이다.
원자적 연산 ( Atomic Operation )
원자적 연산은 여러 단계의 연산이 중간에 다른 스레드나 프로세스에 의해 간섭받지 않고 완전히 실행되는 연산을 의미한다.
하드웨어 레벨에서 지원되며, 원자성 특징을 가지게 된다.
3. 세마포어 ( Semaphore )
공유 자원에 동시 접근을 제한하는 방식. 뮤텍스는 1개의 스레드만 접근가능하지만 세마포어는 일정한 개수가 접근 가능하다.
또한 세마포어는 Signal/Wait 연산을 할 수 있는데 Signal은 세마포어의 값을 1 증가시키고, Wait는 1 감소시킨다.
Signal이 값을 1 증가 시킬 때 만약 대기 중인 스레드가 있다면 해당 스레드를 깨우고 그 스레드가 실행되도록 한다.
Wait가 값을 1 감소 시킬 때 만약 세마포어의 값이 이미 0이라면 해당 스레드는 대기 상태에 들어간다.
즉 세마포어는 공유 자원에 대한 작업을 하기 전에 Wait 연산을 하고 작업을 다한 후 Signal 연산을 하게 된다.
최대 몇개까지 접근 가능하냐에 따라 명칭이 달라지는데 1개만 접근 가능하다면 이를 이진 세마포어라고 하고 다수개가 접근 가능하다면 이를 카운팅 세마포어라고 한다.
4. 스핀락 ( Spin Lock ) vs 뮤텍스 ( Mutex )
얼핏 보기에는 스핀락이 뮤텍스에 비해 가진 이점이 없다고 생각되는데 그렇지 않다.
대표적으로 컨텍스트 스위칭 보다 임계 영역에서의 작업이 더 빠르게 끝난다면 스핀락이 유리하다.
이는 멀티코어에서만 적용되는데 스핀락 또한 작업완료시 락을 해제해야하는데 이는 컨텍스트 스위칭과 다를바가 없기 때문이다.
5. 이진 세마포어 ( Binary Semaphore ) vs 뮤텍스 ( Mutex )
그렇다면 이진 세마포어랑 뮤텍스는 무슨차이가 있을까.
가장 중요한 것은 뮤텍스는 락을 건자만 락을 해제할 수 있지만 세마포어는 그렇지 않다.
a 쓰레드가 락을 걸었다고 해도 b 쓰레드가 락을 해재할 수 있다. 이를 이용하여 작업 간의 실행 순서를 조정할 수도 있다.
예를 들어 a 작업이 끝나면 b 작업을 진행해야한다고 해보자.
그럼 b 작업에 세마포어의 wait를 걸어놓고 a 작업에 signal을 걸어놓으면 된다. a 작업이 먼저 완료가 된다면 signal로 인해 value가 1올라가서 b 작업은 wait 연산을 바로 처리하고 작업을 진행한다. 반대로 b 작업이 먼저 실행하려고 한다면 wait 연산을 통해 기다리게 되고 a 작업의 signal 연산을 통해서만 이후에 작업을 진행 할 수 있게 된다.
이러한 차이로 인해 뮤텍스는 우선순위 상속 ( priority inheritance ) 속성을 가지는데 세마포어는 이 속성을 가지지 않는다.
우선순위 상속 ( priority inheritance )
우선순위 상속 다른 스레드의 우선순위가 해당 스레드로 적용되는 것인데 예를 들어 a 스레드의 우선순위가 높고 b 스레드의 우선순위가 낮다고 생각해보자. 이럴 때 a 스레드와 b 스레드에 mutex가 걸려있는데 b 스레드가 작업중이다. 우선순위 상속이 없다면 b 스레드의 우선순위가 낮기에 다른 c 스레드나 d 스레드 작업이 우선되고 b 스레드의 작업은 더 늦게 완료가 됨으로 결과적으로 a 스레드의 작업 또한 후순위로 밀리게 된다. 이는 a 스레드의 우선순위가 높은데도 작업이 후순위가 되는 결과를 낳게됨으로 이럴 때 우선순위 상속이 일어나게 된다. a 스레드의 우선순위가 높기에 b 스레드에게도 높은 우선순위가 부여되는 것이다.
세마포어의 경우에는 스레드간의 종속이 일어나지 않게 된다. 왜냐하면 해당 wait을 풀어줄 스레드가 어느 스레드인지 확정할 수 없기 때문이다.
'Computer Science' 카테고리의 다른 글
OSI model ( OSI 7 Layer ) (0) 2023.11.28 Git ( Rebase, Squash ) (0) 2023.11.07 Iptables을 이용한 다른 IP로 포트포워딩 (0) 2023.08.24 HTTPS 통신의 원리 ( SSL/TLS ) (0) 2023.08.04 로드 밸런서 ( Load Balancer ) (0) 2023.08.01