안녕하세욤
오늘 공부할 내용은
세마포어와 뮤텍스라는 개넘입니다!!
공유 자원의 보호
이름이 참 거창합니다.
두가지는 모두 공유자원 보호를 위한 일종의 방법론들인데요
여러개의 프로세스가 실행되는 동안, 공유되는 자원들이 존재합니다. 이 공유되는 자원은 실행중인 프로세스들이 모두 접근 가능합니다. 다만, 여기서 모든 프로세스들이 동시에 같은 공유자원을 접근하고 수정하게 된다면?
이른바 경쟁 상태(Race condition)에 빠지게 될 수 있습니다.
+ 경쟁 상태(Race condition)와 임계구역
경쟁상태
경쟁상태는 두 개 이상의 스레드나 프로세스가 공유 자원에 동시 접근하면서 실행 결과가 접근 순서에 따라 달라지는 상태를 말합니다.
임계 구역
아무리 동시에 접근하더라도 경쟁상태에 빠지지 않는 데이터 (ex)가 있고, 경쟁상태에 빠질 위함이 있는 데이터들이 있는데, 여기서 경쟁 상태에 빠질 수 있는 데이터들이 전재하는 공간을 임계구역이라고 합니다.
우리는 이러한 임계구역 속 자원들의 경쟁상태를 제한할 수 있도록 데이터가 한 번에 하나의 프로세스만 접근할 수 있는 방안을 제시해야만 하는데, 거기서 우리는 두가지의 방법을 사용합니다.
세마포어
첫번째가 바로 세마포어 입니다
세마포어는 멀티 프로세스의 환경에서 공유자원의 접근을 제한하는 방법으로, 쉽게 말해 프로세스 하나가 임계 구역 내의 공유자원에 접근하는 순간, 프로세스가 그 자원을 다시 반납하기 전까지 다른 프로세스가 들어올 수 없도록 제한합니다.
세마포어는 P,V연산을 통해 작성됩니다
세마포어 P, V 연산
P : 임계 구역 들어가기 전에 수행 (프로세스 진입 여부를 자원의 개수(S)를 통해 결정)
V : 임계 구역에서 나올 때 수행 (자원 반납 알림, 대기 중인 프로세스를 깨우는 신호 )
-> 사용가능한 자원의 개수 S, S하나를 사용하고자 할 깨마다 P를 통해 사용가능한 자원의 개수를 하나씩 줄이고, 나갈 때에는 V를 통해 다시 자원을 반납했음을 알리며 S의 개수를 늘립니다. S가 0개인 경우 다른 자원들은 다른 프로세스가 해당 자원을 반납할 때까지 대기합니다.
뮤텍스
두번째 방법은 뮤텍스입니다.
뮤텍스는 임계 구역의 데이터들에 접근하는 스레드들의 실행시간이 겹치지 않고 독립적으로 실행될 수 있도록 설계하는 방법으로, 상호 배체(Mutual Exclusion)에서 약자를 따온 이름입니다. 세마포어와 얼추 비슷한 개념으로 보이지만,
절대적으로 오직 하나의 스레드만이 자원에 접근할 수 있다는 점에서 차이가 있습니다.
그리고 이 접근을 조율하기 위해 lock과 unlock을 사용하게 됩니다.
lock : 현재 임계 구역에 들어갈 권한을 얻어옴 ( 만약 다른 프로세스/스레드가 임계 구역 수행 중이면 종료할 때까지 대기 )
unlock : 현재 임계 구역을 모두 사용했음을 알림. ( 대기 중인 다른 프로세스/스레드가 임계 구역에 진입할 수 있음 )
뮤텍스는 언뜻보면 세마포어보다 더 단순하지만 이를 구현하는 알고리즘이 세개나 마련되어있습니다 (왜?)
자세한 내막은 크게 알 필요없이 어떤 식으로 돌아가는지만 간단하게 설명 드리도록 하겠습니다.
1. 데커(Dekker) 알고리즘
: flag/turn 변수 두개를 사용하여 뮤텍스를 구성합니다. 각각의 변수는 flag=현재 상태 , turn = 몇번째로 들어갈지에 대한 순서를 나타냅니다.
2. 피터슨 (Peterson) 알고리즘
: 데커와 거의 유사한 작동방식을 가지고 있습니다.
다만, 여기서 다른 프로세스에게 진입 기회를 양보할 수 있다는 차이점이 조금 있습니다.
3. 제과점 (Bakery) 알고리즘
: 각각의 스레드 또는 프로세스가 각각 임계구역에 들어갈 수 있는 번호표를 지니고, 이 번호표의 순서에 따라 차례로 임계구역에 진입하도록 합니다.
알고리즘이 각각 비슷하지만 미묘하게 다르니 차이점만 간단하게 훑어보고 지나가면 좋을 것 같습니다.
중요한 점을 요약하자면
공유 자원을 사용하는 과정에서 다중스레드/ 다중프로세스의 경우, 공유 자원 중에서도 동시에 사용하게 되면 잘못된 작동이 이루어질 수 있는 임계구역에 두개 이상의 작업이 도달하면 경쟁상태에 이를 수 있다.
이를 해결하기 위해 세마포어/뮤텍스 알고리즘을 활용한다.
세마포어의 경우에는 사용가능한 임계 구역의 개수를 여러개 마련하고, 개수에 맞춰 프로세스들이 작업할 수 있도록 한다.
뮤텍스의 경우에는 사용가능한 임계 구역의 개수를 하나로 고정해두고, 한 번에 하나의 프로세스만 접근할 수 있도록 제한한다.
참고자료
https://gyoogle.dev/blog/computer-science/operating-system/Semaphore%20&%20Mutex.html
세마포어(Semaphore) & 뮤텍스(Mutex) | 👨🏻💻 Tech Interview
세마포어(Semaphore) & 뮤텍스(Mutex) 공유된 자원에 여러 프로세스가 동시에 접근하면서 문제가 발생할 수 있다. 이때 공유된 자원의 데이터는 한 번에 하나의 프로세스만 접근할 수 있도록 제한을
gyoogle.dev
https://worthpreading.tistory.com/m/90
뮤텍스(Mutex)와 세마포어(Semaphore)의 차이
이 글은 Medium에 개시된 글입니다. Medium에서 보시면 좀 더 유쾌한 환경에서 글을 보실 수 있습니다. 뮤텍스(Mutex)와 세마포어(Semaphore)의 차이 Toilet problem 동시성 프로그래밍의 가장 큰 숙제는 ‘공
worthpreading.tistory.com
'개발 > CS' 카테고리의 다른 글
IPC(Inter Process Communication) - 프로세스 간 통신 (3) | 2024.12.02 |
---|---|
데드락(DeadRock, 교착상태) (5) | 2024.11.24 |
[컴퓨터개론] - 페이징과 세그먼테이션 (0) | 2024.10.29 |
[컴퓨터개론] - CPU 스케줄러 (0) | 2024.10.21 |
[컴퓨터개론] - PCB와 문맥교환(context switching) (2) | 2024.10.16 |