본문 바로가기
운영체제

세마포어 / 뮤텍스

by Minok_nok 2020. 6. 18.

개요

여러 스레드들은 자원을 공유하고, 프로세스간 메시지를 전달합니다.

 

공유된 자원에 여러 프로세스, 스레드가 동시에 접근하면서 여러문제가 발생했습니다.

이런 문제들을 해결하기 위해 동기화를 해주는 기법인 세마포어와 그에 소속된 뮤텍스를 알아봅시다.

DeadLock

세마포어는 대표적인 DeadLock회피책의 일종입니다.

개요

공유된 리소스를 여러 스레드가 접근할때 대표적으로 나타나는 문제중 하나입니다.

 

간단한 DeadLock의 사례입니다.

프로세스 A/B가 리소스 A/B를 모두 얻어야 진행될때, 프로세스가 각각 하나를 사용중인 상태가 된다면 무한정 기다리게 됩니다.

 

세마포어는 이런 DeadLock이 발생할 수 있는 Critical Section을 관리하는 회피책입니다.

세마포어

개요

세마포어는 리소스의 상태를 나타내는 간단한 카운터입니다.

Dead Lock을 피하기 위한 기술 중 하나입니다.

 

일반적으로 비교적 긴 시간을 확보하는 리소스에 대해 이용하게 되며, 유닉스 시스템의 프로그래밍에서 세마포어는 운영체제의 리소스를 경쟁적으로 사용하는 다중 프로세스에서 행동을 조정하거나 또는 동기화 시키는 기술입니다.

동작

세마포어는 정수값을 가지는 변수입니다.

세마포어의 값은 리소스에 접근할 수 있는 최대 허용치를 나타냅니다.

 

세마포어의 값은 바꾸는 연산의 목록입니다.

 

semWait

세마포어 값을 감소시킵니다.

만약 값이 음수가 되면 semWait을 호출한 프로세스는 블록이 됩니다.

음수가 아니라면 프로세스는 계속 수행됩니다.

semSignal

세마포어 값을 증가시킵니다.

만약 값이 양수가 아니면(0 or 0>value), semWait연산에 의해 블록된 프로세스들을 깨웁니다.



 

세마포어의 연산으로 인해 대기중인 프로세스는 선입선출의 구조를 가진 큐에 저장이 됩니다.

semSignal로 인해 세마포어 값을 증가시키면 큐가 비워지면서 먼저 대기열에 등록한 프로세스가 진행됩니다.

 

https://www.crocus.co.kr/524

세마포어의 코드 예시를 적어주신 분의 블로그입니다.

종류

세마포어는 유지할 수 있는 값의 범위에 따라 이진 세마포어와 범용 세마포어(카운팅 세마포어)로 구분됩니다.

 

이진 세마포어: 세마포어의 초기값이 0또는 1만 가질 수 있는 세마포어입니다.

범용 세마포어: 세마포어의 초기 값이 1 이상으로 여러 프로세스가 접근할 수 있습니다.

뮤텍스

개요

뮤텍스는 이진 세마포어와 같이 초기값을 1과 0으로 가집니다.

즉 한 임계영역에 한 프로세스만 접근하도록 하는것이 목적입니다.

 

임계영역에 진입할 때 Lock을 걸어 다른 프로세스가 접근하지 못하게하고, 임계영역에서 나올 때에는 Unlock을 합니다.

 

https://www.crocus.co.kr/526?category=204622

뮤텍스에 대한 활용법을 적어주신 분의 블로그입니다.

 

세마포어와 뮤텍스의 차이

세마포어는 소유할 수 없으며, 뮤텍스는 소유가 가능합니다.

뮤텍스는 소유주가 그에 대한 책임을 집니다.

 

세마포어는 소속되지 않는 스레드가 세마포어를 해제할 수 있습니다.

뮤텍스의 경우 뮤텍스를 소유하고 있는 스레드가 이 뮤텍스를 해제할 수 있습니다.

 

세마포어는 시스템 범위에 걸쳐있고, 파일형태로 존재합니다.

뮤텍스는 프로세스 범위를 가지고, 프로그램이 종료될 때 자동으로 지워집니다.



-개인적 생각-

세마포어에 소속되지 않은 스레드가 세마포어를 해제할 수 있는 이유를 생각해보았습니다.

 

아무래도 락을 해제하는 부분에서 문제가 생겨 데드락이 발생할수 있고, 이를 예외처리 하여 외부에서 데드락을 풀어주는 상황을 만들 수 있도록 한것 같습니다.

 

'운영체제' 카테고리의 다른 글

스레드  (0) 2020.06.18
캐시 메모리: 리스트와 벡터의 속도차이  (0) 2020.06.17

댓글