세마포어와 뮤텍스
여러 프로세스나 쓰레드가 공유 자원에 접근하는 것을 제어하기 위한 방법
병행 처리를 위한 프로세스 동기화 기법이다.
뮤텍스
뮤텍스는 화장실이 하나뿐인 식당과 비슷하다. 화장실을 가기 위해서는 카운터에서 열쇠를 받아야 한다.
당신이 화장실을 가려고 하는데 카운터에 키가 있으면 화장실에 사람이 없다는 뜻이고, 당신은 열쇠를 이용해 화장실에 들어갈 수 있다.
당신이 화장실에서 행복한 시간을 보내고 있는데 다른 테이블에 있는 어떤 남자가 화장실에 가고 싶어졌다. 이 남자는 아무리 용무가 급하더라도 열쇠가 없기 때문에 화장실에 들어갈 수 없다. 결국 남자는 당신이 용무를 마친 후 나올 때까지 카운터에서 기다려야 한다.
곧이어 옆 테이블에 있는 남자도 화장실에 가고 싶어져서 이 남자 또한 화장실에 들어가기 위해서는 카운터에서 대기해야 한다.
이제 당신이 화장실에서 나와 카운터에 키를 돌려놓았다. 이제 기다리던 사람들 중 맨 앞에 있던 사람은 키를 받을 수 있고 이를 이용해 화장실에 갈 수 있다.
이것이 뮤텍스가 동작하는 방식이다. 화장실을 이용하는 사람은 프로세스 혹은 쓰레드이며 화장실은 공유자원, 화장실 키는 공유자원에 접근하기 위해 필요한 어떤 오브젝트이다.
즉 뮤텍스는 Key에 해당하는 어떤 오브젝트가 있고, 이 오브젝트를 소유한 쓰레드 또는 프로세스 만이 공유자원에 접근할 수 있다.
세마포어
세마포어는 손님이 화장실을 좀 더 쉽게 이용할 수 있는 레스토랑이다. 세마포어를 이용하는 레스토랑의 화장실에는 여러 개의 칸이 있다. 그리고 화장실 입구에는 현재 화장실의 빈칸 개수를 보여주는 전광판이 있다.
만약 당신이 화장실에 가고 싶다면 입구에서 전관판을 확인하고 빈칸이 1개 이상 있다면 빈칸의 개수를 하나 뺀 다음에 화장실로 입장해야 한다. 그리고 나올 때 빈칸의 개수를 하나 더해준다.
모든 칸에 사람이 들어갔을 경우 빈 칸의 개수는 0이 되며 이때 화장실에 들어가고자 하는 사람이 있다면 빈 칸의 개수가 1로 바뀔 때까지 기다려야 한다.
사람들은 나오면서 빈 칸의 개수를 1씩 더한다. 그리고 기다리던 사람은 이 숫자에서 다시 1을 뺀 다음 화장실로 돌진한다.
이처럼 세마포어는 공통으로 관리하는 하나의 값을 이용해 상호 배제를 달성한다.
세마포어도 뮤텍스와 같이 화장실이 공유자원이며 사람들은 쓰레드 또는 프로세스이다. 그리고 화장실 빈칸의 개수는 현재 공유자원에 접근할 수 있는 쓰레드 또는 프로세스의 개수이다.
뮤텍스와 세마포어의 특징
뮤텍스
한 쓰레드, 프로세스에 의해 소유될 수 있는 Key🔑
를 기반으로 한 상호 배제 기법
- 오직 1개의 프로세스 또는 스레드만 접근 가능하다.
- 임계 영역에 들어갈 때
lock
을 걸어 다른 프로세스 또는 스레드가 접근하지 못하도록 하고, 임계 영역에서 나올 때unlock
으로 다른 프로세스 또는 쓰레드가 접근할 수 있도록 한다.
세마포어현재 공유자원에 접근할 수 있는 스레드 또는 프로세스의 수를 나타내는 값
을 두어 상호 배제를 달성하는 기법
- 세마포어 변수만큼 프로세스 또는 스레드가 접근할 수 있다.
- 현재 수행 중인 프로세스가 아닌 다른 프로세스가 세마포어를 해제할 수 있다.
참고 사이트
'개발공부 > 운영체제' 카테고리의 다른 글
[OS] System Call (0) | 2021.11.15 |
---|---|
[OS] 데드락(Dead Lock)이란 (0) | 2021.11.14 |
[OS] 좀비 프로세스 & 고아 프로세스 (0) | 2021.11.12 |
[OS] 메모리 단편화 (0) | 2021.11.11 |
[OS] 가상 메모리와 페이지 교체 (0) | 2021.11.10 |