뮤텍스(Mutex)와 세마포어(Semaphore)

invisible_thorn·2024년 11월 19일
1

이번 시간엔 뮤텍스와 세마포어에 대해 알아보고자 합니다.
이를 알기 전엔 프로세스 동기화를 알아야합니다.

프로세스 동기화

여러 개의 프로세스(or 스레드)가 컴퓨터 내에 공유된 리소스에 접근하는 경우에 데이터 일관성을 유지하기 위한 방식을 말한다.
데이터 일관성이 무엇이냐 하면

시스템 내의 데이터가 동일한 상태를 유지하고 모순이나 충돌이 없는 상태(= 모두 같은 정보를 보게 만드는 것)

티켓팅을 하는데 하나의 좌석에 여러 명이 접근하게 되면 이선좌 메세지가 뜨잖아요?
그거랑 비슷한 느낌입니다.
근데 만약 이선좌가 안뜨고 많은 사람들이 같은 좌석을 선택하면 어떻게 될까요?
생각만 해도 엄청 큰 문제가 발생할 것이란게 느껴집니다.
프로세스 관점에서는 이를 동기화 문제가 발생했다고 합니다.
그리고 이 문제를 해결하기 위한 방법이 앞서 언급한 뮤텍스세마포어입니다.

좀 더 자세히 예를 들어보겠습니다.
지피티가 알맞은 예제를 가져왔네요.

예시: 은행 계좌

시나리오:

계좌에 1000원이 있습니다.
두 개의 스레드, 스레드 A와 스레드 B가 이 계좌에서 돈을 인출하려고 합니다. 두 스레드는 동시에 이 계좌에 접근합니다.
스레드 A: 500원을 인출하려고 합니다.
스레드 B: 700원을 인출하려고 합니다.

경쟁 상태 (Race Condition)
경쟁 상태는 여러 프로세스나 스레드가 동시에 공유 자원에 접근하고, 그 순서나 타이밍에 따라 결과가 달라지는 상황을 말합니다.

동작 순서 (경쟁 상태 발생)
스레드 A가 계좌의 잔액을 읽고, 현재 잔액이 1000원임을 확인합니다.
스레드 B도 계좌의 잔액을 읽고, 잔액이 1000원임을 확인합니다.
스레드 A는 500원을 인출하려고 하고, 스레드 B도 700원을 인출하려고 합니다.
스레드 A가 500원을 인출하여 계좌 잔액을 500원으로 변경합니다.
그런데, 그 사이 스레드 B도 700원을 인출하려고 하면서, 잔액이 500원인 것을 모르고 인출을 시도합니다.
결국, 스레드 B가 700원을 인출하게 되면, 계좌 잔액은 -200원이 되어 과도한 인출이 발생합니다.

문제:

위와 같이, 두 스레드가 동시에 공유 자원인 계좌에 접근하면서 일어나는 경쟁 상태로 인해 잘못된 결과가 발생합니다. 계좌에는 1000원이지만, 두 스레드가 동시에 인출을 시도하면서 결과적으로 과도한 인출이 발생하는 문제가 생깁니다.

임계영역 (Critical Section)
임계영역은 공유 자원에 접근할 때 여러 스레드가 동시에 접근하지 않도록 해야 하는 코드 블록을 의미합니다. 여러 스레드가 동시에 공유 자원에 접근하면 경쟁 상태가 발생할 수 있기 때문에, 이를 해결하려면 임계영역을 보호해야 합니다.

해결책: 임계영역 보호

임계영역을 보호하기 위해, 뮤텍스(Mutex)세마포어(Semaphore) 를 사용할 수 있습니다.
이를 통해 한 번에 하나의 스레드만 공유 자원(계좌 잔액)에 접근할 수 있도록 동기화할 수 있습니다.

예시 해결:

뮤텍스를 사용해서 스레드 A와 스레드 B가 동시에 계좌에 접근하지 못하도록 동기화합니다.
스레드 A가 계좌 잔액을 수정할 때는 뮤텍스 잠금을 걸고, 다른 스레드가 계좌에 접근하지 못하게 합니다.
스레드 A가 작업을 끝내고 뮤텍스 잠금 해제를 하면, 그때서야 스레드 B가 계좌에 접근할 수 있습니다.
이렇게 하면 임계영역을 보호하고, 경쟁 상태를 방지할 수 있습니다.

정리:

경쟁 상태(Race Condition) 는 여러 스레드가 동시에 공유 자원에 접근하여 예상치 못한 결과를 초래하는 상황입니다. 예시에서는 두 스레드가 동시에 은행 계좌에 접근하면서 잘못된 인출 결과가 발생한 상황입니다.

임계 영역(Critical Section) 은 공유 자원에 대한 동시 접근을 막아야 하는 코드 부분을 의미합니다. 여러 스레드가 동시에 자원에 접근하면 문제가 생기므로, 임계영역을 보호해야 합니다. 이를 위해 뮤텍스나 세마포어와 같은 동기화 도구를 사용하여 경쟁 상태를 방지합니다.

따라서 한 줄로 요약해보자면, 경쟁 상태를 해결하기 위해 임계 영역 관리의 필요하다는 것이다.
여기까지 이해가 됐다면 뮤텍스와 세마포어를 알아갈 준비가 되었다.

뮤텍스(Mutex)

세마포어(Semaphore)

0개의 댓글

관련 채용 정보