[운영체제] 뮤텍스, 세마포어

유네스코d·2023년 5월 18일

OS

목록 보기
2/2

🤔뮤텍스&세마포어, 왜 필요할까?

뮤텍스, 세마포어는 공유 자원과 임계 영역에 여러 개의 프로세스와 스레드가 접근하는 것을 막는 동기화 도구이다.

*임계영역(Critical Section)?
여러 프로세스 혹은 스레드가 작업을 수행하면서 공유된 자원을 건드리게 될 수 있는데, 이때 프로그램 코드 상에서 공유 자원에 접근하는 부분을 임계영역이라고 한다.


📌뮤텍스 (Mutex)

임계영역(Critical Section)을 가진 프로세스나 스레드들의 실행시간이 서로 겹치지 않고 각각 단독으로 실행(상호배제)되도록 하는 기술 (동기화 대상이 하나)

뮤텍스는 보통 한칸만 있는 화장실에 비유한다.
화장실 칸에 들어가기 위해서 열쇠가 필요하고, 카운터에 열쇠가 있다면 화장실 칸에 사람이 없으므로 들어갈 수 있다는 뜻이다. 이 열쇠를 가지고 화장실에 들어갈 수 있다.
카운터에 열쇠가 없다면, 화장실에 사람이 있다는 뜻이므로 사람이 나와서 키를 반납할 때까지 기다려야 한다.
(기다리는 사람 중 맨 앞에 있는 사람이 키를 받아 화장실에 간다)

→ 뮤텍스는 Key를 기반으로 동작하며 이 Key에 해당하는 객체를 소유한 프로세스, 스레드만 공유 자원에 접근할 수 있다.

특징

  • 뮤텍스 객체를 두 개 이상의 프로세스/스레드가 동시에 사용할 수 없다.
  • 다중 프로세스들의 공유 리소스에 대한 접근을 조율하기 위해 동기화 또는 락을 사용한다.
  • 이진 세마포어 라고도 한다. (세마포어 초기값이 1이고, 0과 1의 값만 가지는 세마포어)
  • 자원을 소유할 수 있고 책임을 가진다.
  • 뮤텍스는 프로세스의 범위를 가지기 때문에 프로세스가 종료될 때 자동으로 Clean up 된다.
  • 뮤텍스는 소유하고 있는 프로세스만이 뮤텍스를 해제할 수 있다.

📌세마포어 (Semaphore)

공유 자원 또는 임계영역(Critical Section)에 여러 프로세스나 스레드가 접근하는 것을 막아줌 (동기화 대상이 하나 이상)

세마포어는 칸이 여러 개 있는 화장실에 비유할 수 있다.
칸이 3개 존재하고 화장실 입구에 빈칸 개수가 적혀있다고 가정했을 때, 화장실에 가려면 빈칸 개수가 1 이상이어야 들어갈 수 있다.
이 때 빈칸 개수를 하나 감소시키고 화장실로 입장하고, 나올 때 빈칸 개수를 하나 증가시킨다.
빈칸 개수가 0 또는 음수일 경우에는 해당 숫자만큼의 사람이 대기중인 것이므로 빈칸 개수가 양수로 바뀔 때까지 대기해야 한다.

→ 세마포어는 공유 자원에 접근할 수 있는 프로세스의 허용치만큼 프로세스, 스레드가 동시에 접근할 수 있다. 하나의 세마포어 값을 통해 사용하고 있는 프로세스의 수를 공통으로 관리하며 각각의 프로세스는 세마포어의 값을 확인하고 변경할 수 있다.

세마포어의 연산

  • 세마포어 값이 양수 : 그 숫자만큼의 프로세스가 임계영역에 진입 가능
  • 세마포어 값이 0 / 음수 : 그 숫자만큼의 프로세스가 블록 중
  1. 세마포어 초기화 : 세마포어 값을 음이 아닌 값으로 초기화
  2. P 연산
    • 해당 세마포어 S값을 감소(진입 여부에 상관 없이 연산 불려지면 무조건 감소)
      → 감소된 값이 음수 : 호출한 프로세스는 블록
      → 감소된 값이 0 / 양수 : 프로세스는 임계영역에 진입해서 수행
  3. V 연산
    • 세마포어 S값을 증가(자원 사용을 끝내는 프로세스가 연산 호출, 호출 시 무조건 증가)
      → 증가된 값이 0 / 음수(블록된 프로세스 존재) : 블록된 프로세스를 깨워 준비큐로 보냄
      → 증가된 값이 양수 : 블록된 프로세스가 없으므로 종료

특징

  • 자원 소유가 불가능
  • 세마포어는 시스템 범위에 걸쳐 있고 시스템 상의 파일로 존재한다.
  • 세마포어를 소유하지 않은 프로세스도 세마포어를 해제할 수 있다.
  • 한 프로세스가 특정 시그널(신호)을 수신할 때까지 정해진 위치에서 중지하도록 강제함 → 임계영역에 들어갈 수 없으면 대기
    • P연산(수면, 잠자기)과 V연산(깨움)을 이용
    • 사용 가능한 공유 자원의 수를 나타내는 변수 사용

✅뮤텍스 vs 세마포어

  1. 동기화 대상의 개수

    • 뮤텍스는 동기화 대상이 1개일 때 사용
    • 세마포어는 동기화 대상이 1개 이상일 때 사용
  2. 세마포어는 뮤텍스가 될 수 있지만 뮤텍스는 세마포어가 될 수 없다. 뮤텍스는 0,1의 값을 가지는 이진 세마포어라고도 불린다.

  3. 뮤텍스 : 자원 소유 가능 + 책임을 가짐
    세마포어 : 자원 소유 불가능

  4. 뮤텍스 : 소유하고 있는 프로세스만이 뮤텍스 해제 가능
    세마포어 : 세마포어를 소유하지 않는 프로세스도 세마포어 해제 가능

  5. 뮤텍스 : 프로세스의 범위를 가지며 프로세스 종료될 때 자동으로 Clean up됨
    세마포어 : 시스템 범위에 걸쳐 있고 파일 시스템 상의 파일로 존재

뮤텍스와 세마포어는 모두 완벽한 기법은 아니므로 데이터 무결성을 보장할 수 없으며 모든 교착 상태를 해결하지는 못한다.




📝면접 대비

Q. 뮤텍스와 세마포어의 차이점이 무엇인가요?

A.

profile
yune's coding

0개의 댓글