-
[운영체제] 뮤텍스 락과 세마포어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—)하게 된다.