231011 TIL #213 뮤텍스 / 세마포어

김춘복·2023년 10월 11일
0

TIL : Today I Learned

목록 보기
213/571

Today I Learned

정보처리기사 실기 공부를 하던 중 나온 개념 중 뮤텍스와 세마포어에 대해 좀 더 공부하고 정리해봤다.


  • 공유자원(Shared Resource)
    동시 프로그래밍에서 여러 프로세스(스레드)가 공동으로 사용하는 변수, 메모리, 파일 등의 자원.
    동시에 공유자원을 사용할 시 경쟁조건(Race Condition)이 발생하며 순서가 결과값에 영향을 줄 수 있게된다.

  • 임계 영역(Critical Section)
    위의 상황(경쟁)이 발생하는 프로그램의 코드 영역(블럭)

뮤텍스와 세마포어는 대표적인 동시성 제어 도구로 공유자원을 여러 쓰레드/프로세스가 접근하는 것을 상호배제(Mutual Exclusion)로 막는 역할을 한다.


뮤텍스(Mutex)


이미지 출처 : chelseashin

동시에 여러 스레드가 공유 자원에 접근하는 상황에서 한번에 하나의 스레드만 접근하도록 보장하는 알고리즘

  • 프로세스나 스레드가 공유자원을 lock()을 통해 잠그고, 사용 후에는 unlock()을 통해 잠금 해제하는 객체다.

  • 잠금이 설정되면 다른 프로세스나 스레드는 잠긴 코드 영역에는 접근할 수 없다.

  • 뮤텍스 객체를 두 스레드가 동시에 사용할 수 없다.

  • 잠금 or 잠금해제 2가지 상태만 가진다.

  • 임계영역을 가진 스레드들의 Running Time이 겹치지 않고 상호배제를 통해 각각 단독으로 실행되도록 한다.

  • 다른 스레드가 뮤텍스를 이미 소유하고 있으면 해제될 때 까지 대기상태가 된다.


세마포어(Semaphore)

동시에 접근 가능한 허용된 스레드나 프로세스를 나타내는 정수 변수.

  • 일반화된 뮤텍스

  • 간단한 정수 값과 wait(P 함수), signal(V 함수)로 공유자원에 대한 접근을 처리한다.

  • wait() : 자신의 차례가 올 때까지 기다리는 함수

  • signal() : 다음 프로세스로 순서를 넘겨주는 함수

이진 세마포어

binary semaphore. 0과 1 두가지 값만 가질 수 있는 세마포어.

  • 값이 0이면 다른 스레드가 세마포어를 획득하기 전 까지 대기

  • 값이 1이면 스레드는 세마포어를 획득하고 작업을 수행한 뒤 세마포어를 해제

  • 논리적으로는 뮤텍스가 여기에 속한다고 할 수 있지만, 엄밀히 따지면 뮤텍스는 잠금 기반의 상호배제이고, 세마포어는 신호기반이다.

카운팅 세마포어

counting semaphore. 여러 값을 가질 수 있는 세마포어.

  • 여러 동시접근을 허용할 수 있다. 심지어 값이 음수가 될 수도 있다.

  • 값이 0이하면 스레드는 대기상태에 들어간다.

  • 값이 양수면 세마포어를 획득해 작업을 수행한 뒤 해제한다.

  • 한 번에 여러 스레드가 접근할 수 있기 때문에 상호배제보다는 동시접근 허용의 측면에서 사용된다.


뮤텍스와 세마포어의 차이점

  • 뮤텍스는 소유한 스레드만 해제할 수 있지만, 세마포어는 소유하지 않은 스레드가 해제할 수 있다.

  • 세마포어는 시스템 범위에 걸쳐있고 파일로 존재하지만, 뮤텍스는 프로세스의 범위를 가지고 프로세스가 종료될 때 clean up 된다.

  • 뮤텍스는 동기화 대상이 only 1 일때 사용하고, 세마포어는 1개 이상일때 사용한다.

참고 사이트 : https://chelseashin.tistory.com/40

profile
Backend Dev / Data Engineer

0개의 댓글