CS 지식/운영체제

멀티 스레드의 임계 구역과 뮤텍스, 세마포어

Zin0_0 2020. 8. 17. 11:37
반응형

임계 구역과 뮤텍스, 세마포어

  • 임계 영역

    • 한개의 연산을 둘 이상의 쓰레드가 동시에 실행할 경우 발생할 수 있는 코드 블록
    • 쓰레드 안에 있는 코드 블록이 임계 영역이 된다.
    • 따라서, 문제가 발생하지 않게 독점을 보장해줘야 함. (Lock, 동기화)
  • 동기화 기법

    • 뮤텍스(Mutex => Mutual Exclusion)

      • 쓰레드의 동시 접근을 허용하지 않음
      • Mutex를 이용해서 특정 변수로 접근하는 쓰레드를 차단하면, 나머지 쓰레드는 대기줄에서 기다린다.
      • 뮤텍스를 사용한 쓰레드가 뮤텍스를 반환하면, 대기줄에 있는 순서대로 쓰레드가 변수가 접근
      • 뮤텍스 생성, 삭제, 잠금, 잠금해제 함수가 있음
      • 단, 뮤텍스 잠금 후 해제를 하지 않으면, 잠금 함수는 블로킹 상태에 빠져 못나감
        • 이 상태를 데드락 상태라고 부름
      • 뮤텍스 잠금, 해제 함수 호출은 오랜시간이 걸림 ~> 함수 호출 횟수를 최소화
    • 무한루프로 상태를 확인(Busy Waiting) ~> CPU 점유하고 있는 상태, 그래서 나온것이 세마포어

    • 세마포어(Semaphore)

      • 프로세스의 동시접근을 허용하지 않음

      • 리소스의 상태를 나타내는 카운터로 이해하면 된다.

      • 비교적 긴 시간을 확보하는 리소스에 대해 사용하며, Unix에서는 OS의 리소스를 경쟁적으로 사용하는 다중 프로세스에서 행동을 조정하거나 동기화 시키는 기술

      •     P(S) {
                S--;
                if S < 0
                    // 이 프로세스를 재움 큐에 추가 (잠 듦)
            }
        
            V(S) {
                S++;
                if S <= 0
                    // 재움 큐로부터 프로세스를 제거 (깨어남)
            }
        • P함수와 V함수의 동작은 독립적이기 때문에 잘못 사용하는 경우 문제가 발생
      • P 임계구역 - P ~> 현재 프로세스가 임계 구역에서 빠져나갈 수 없게된다. 교착상태(Deadlock) 발생

        • V 임계구역 - P ~> 2개 이상의 프로세스가 동시에 임계구역에 들어갈 수 있으므로 상호 배제(Mutex)를 보장할 수 없게 된다.
      • 바이너리 세마포어

        • 0과 1값만 가지는 세마포어
        • sem_post, sem_wait
      • sem_wait 함수로 블록킹, sem_post로 해제

        • 드라이브 쓰루를 생각하면 편할것 같음
      • 카운팅 세마포어

      • 초기값은 가능한 자원의 수로 정해지며, 세마포어 값의 범위는 정해지지 않음.

        • 커피샾에 테이블이 한정적이고, 자리가 꽉 찬 경우 밖에서 대기한다고 이해하면 된다.
    • 정리

      • Semaphore는 Mutex가 될 수 있지만 반대는 안된다.
        • Mutex는 상태가 0,1 뿐 인 binary Semaphore
      • Semaphore는 소유할 수 없지만, Mutex는 소유 가능하며 이에 대한 책임을 진다.
    • Mutex의 경우 Mutex를 소유하고 있는 쓰레드가 해제해야하지만,
      Semaphore는 소유하지 않은 쓰레드가 Semaphore 해제 가능

  • 2 이상의 값을 가지는 세마포어는 카운팅 세마포어. 뮤텍스로 임계구역에 동시에 접근하는 것을 방지할 수 있고 + 카운팅 세마포어로 임계구역 내부에서 공유변수들을 사용하는 것을 제어할수 있음
반응형