세마포어와 뮤텍스에 대해 작성한다.
여러 쓰레드들은 자원을 공유하고 프로세스간 메시지를 전송하면서 간혹 문제가 발생하기도 한다.
공유된 자원에 여러 프로세스, 쓰레드가 동시에 접근하면서 문제가 발생한다.
공유된 자원 속 하나의 데이터는 한번에 하나의 프로세스만 접근할 수 있도록 제한해두어야 할 필요가 있다. (접근제어)
이를 위해 고안된 것이 세마포어(Semaphore) 이다.
세마포어(Semaphore)
공유된 자원의 데이터를 여러 프로세스가 접근하는 것을 막는 것을 의미한다.
세마포어는 리소스의 상태를 나타내는 간단한 카운터이며 일반적으로 비교적 긴 사용시간을 확보하고자 하는 리소스에 대해 이용하게 된다.
유닉스 시스템의 프로그래밍에서 세마포어는 운영체제의 리소스를 경쟁적으로 사용하는 다중 프로세스의 행동을 조정하거나 동기화 시키는 기술이다.
세마포어의 구성으로 운영체제의 리소스를 효율적으로 경쟁하여 사용하는 계획을 잡는 것은 중요한 이슈이다.
뮤텍스(Mutex, 상호배제)
공유된 자원의 데이터를 여러 쓰레드가 접근하는 것을 막는 것을 말한다.
Critical Section 을 가지는 스레드들의 Running Time이 서로 겹치지 않도록 각각 단독 실행되도록 하는 기술이다.
다중 프로세스들이 공유 리소스에 대한 접근을 조율하기 위해 Locking 과 Unlocking 을 사용한다.
(Critical Section, 다중 프로그래밍 운영체제에서 여러 프로세스가 데이터를 공유하면서 수행될 때 각 프로세스에서 공유데이터를 엑세스하는 프로그램 코드부분을 말한다.)
Mutex 객체는 동시에 두 쓰레드가 사용할 수 없다는 말이다.
공유데이터를 여러 프로세스가 동시에 엑세스하면 시간적인 차이로 잘못된 결과를 만들 수 있다.
이를 막기 위해서 한 프로세스가 위험부분을 수행하고 있을 경우 (공유 데이터) 다른 프로세스들은 절대로 그 데이터를 접근할 수 없도록 처리가 필요하다.
세마포어와 뮤텍스의 차이점
세마포어는 뮤텍스가 될 수 있으나 뮤텍스는 세마포어가 될 수 없다.
세마포어는 파일시스템 상 파일의 형태로 존재하며 뮤텍스는 프로세스의 범위로 존재한다.
프로세스가 사라질 때 뮤텍스는 Clean Up 처리된다.
세마포어는 소유가 불가능하고 뮤텍스는 소유할 수 있다.
뮤텍스의 경우 뮤텍스를 소유하고 있는 스레드가 뮤텍스를 해제할 수 있다.
세마포어의 경우 세마포어를 소유하고 있지 않은 스레드도 이 세마포어를 해제할 수 있다.
'개발' 카테고리의 다른 글
Shield IO (0) | 2020.12.04 |
---|---|
Github git@github.com: Permission denied (publickey). (0) | 2020.11.30 |
Github Actions (0) | 2020.11.20 |
Ubuntu Errors were encountered while processing 해결 (0) | 2020.06.05 |
보일러 플레이트 (Boilerplate) (0) | 2020.06.05 |