ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [운영체제] 뮤텍스 락과 세마포어
    legacy/Operating System 2024. 5. 10. 10:28

    새로운 게시물이 작성되었습니다 => https://server-technology.tistory.com/479

    현재 글과 새로운 게시물 둘 다 읽어보시면 도움이 될 것이라 생각합니다.

     

    뮤텍스락: 공유 자원 1개에 대하여 오직 하나의 스레드만이 접근할 수 있도록 하는 상호 배제(Mutual Exclusion) 기법이다.
    세마포어: 공유 자원 n개에 대하여 여러 스레드가 동시에 접근할 수 있도록 n개의 자원을 제어한다.

     

    뮤렉스락(Mutex Lock)

    1개의 공유 자원에 1개의 스레드 또는 프로세스만 접근할 수 있도록 제어한다. 이를 상호 배제(Mutual Exclusion)라고 한다.

    뮤텍스 락

     

    공유 자원을 사용하고 있는 스레드(또는 프로세스)는 Key를 가지고 있다. Key를 가지고 있는 스레드는 공유 자원을 사용하고 있음을 의미한다. 반대로 Key가 없는 스레드는 공유 자원에 접근할 수 없다.

    → Key를 사용하여 여러 스레드가 1개의 공유 자원에 동시에 접근할 수 없도록 막는다.

     

    공유 자원: Toilet

    공유 자원에 접근하기 위한 물체: Key

    스레드: 사람

    공유 자원을 사용하는 스레드: A

    Key를 가지고 있는 스레드: A

    Key가 없어 임계 영역에 접근할 수 없는(대기) 스레드: B

     

    스레드 A가 공유 자원을 사용을 마치고 Key를 반납하면, 대기 중이던 스레드 B가 해당 Key를 가져간다.

    Key를 갖고 있는 스레드 B는 공유 자원에 접근할 수 있게 된다.

    공유 자원을 사용하는 스레드: B

    Key를 가지고 있는 스레드: B

    Key가 없어 임계 영역에 접근할 수 없는(대기) 스레드: C

     

    wait: 임계 영역에 접근하기 위한 lock을 얻기 위해 대기 중인 상태

    signal: 임계 영역을 해제하면 lock을 반환

    do {
        wait(lock); // 공유 자원을 사용하기 위해 대기
        // Critical Section
        signal(lock); // 공유 자원 사용을 완료하면 임계 영역 해제
    } while(true);

     

    세마포어 (Semaphore)

    n개의 공유 자원에 여러 스레드가 접근할 수 있도록 제어하는 방식이다.

    세마포어

     

    주의할 점은 1개의 자원에 대해서 여러 스레드가 동시에 접근하는 방식이 아닌, n개의 자원에 여러 스레드가 동시에 접근할 수 있도록 하는 것이다.

     

    세마포어는 카운터라는 변수를 사용하여 여러 스레드가 공유 자원을 사용할 수 있도록 제어한다.

    공유 자원을 사용하던 스레드가 사용을 완료하면 카운터 값이 1이 증가한다.

    동시에 해당 공유 자원을 사용하기 위해 대기하던 스레드가 있다면 카운터 값을 감소시키고 사용한다.

     

    공유 자원: Toilet

    공유 자원을 제어하는 변수: Counter

    스레드: 사람

    공유 자원을 사용하는 스레드: A

    공유 자원에 접근할 수 있는 스레드 개수: 2

    대기 중인 스레드: 없음

     

    이전에 Counter가 2였기 때문에 2개의 스레드가 공유 자원에 접근할 수 있었다.

    따라서 스레드 B와 C가 남은 공유 자원에 접근하여 사용 중이다.

    이후에 스레드 D가 공유 자원을 사용하고자 하였으나, Counter 값이 0이기 때문에 대기 중인 상태가 된다.

    공유 자원을 사용하는 스레드: A, B, C

    공유 자원에 접근할 수 있는 스레드 개수: 0

    대기 중인 스레드: D

     

    P: 공유 자원을 사용하기 전(임계 영역 접근 전)에 수행

    V: 공유 자원을 사용 후(임계 영역에서 나온 후)에 수행

    S: 세마포어 변수(사용 가능한 공유 자원 개수)

    P(S) {
        while S <= 0; // 접근할 수 있는 자원이 없다면 대기
        S--; // 자원 획득
    }
    
    V(S) {
        S++; // 자원 해제
    }

    위 이미지에서 스레드 D는 P연산에서 while문에 의해 대기 중인 상태이다.

    공유 자원을 사용 중인 스레드 A, B, C 중에 사용을 완료한 스레드가 생기면 V 연산을 수행하여 S 값을 증가시킨다.

    이때, 스레드 D는 S ≥1이 됨에 따라 대기를 종료하고 공유 자원에 접근(S—)하게 된다.

Designed by Tistory.