ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spin Lock vs Mutex vs Semaphore
    Computer 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
Designed by Tistory.