티스토리 뷰
새로운 게시물이 작성되었습니다 => 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—)하게 된다.