늘 겸손하게

CS - Operating System - 공유자원과 임계 영역, 세마포어 & 뮤텍스 본문

Computer Science/Operating System

CS - Operating System - 공유자원과 임계 영역, 세마포어 & 뮤텍스

besforyou999 2022. 11. 24. 20:20

공유자원

 

시스템 안에서 프로세스, 스레드가 함께 접근 가능한 자원이나 변수를 의미. 이 공유 자원을 2개 이상의 프로세스가 동시에 읽거나 쓰는 상황을 경쟁 상태(race condition)라고 한다. 동시에 접근을 시도할 때 접근 순서에 따라 결과값이 달라질 수 있는 상황.

 

 

임계 구역 - Critical Section

 

공유 자원의 접근 순서에 따라 실행 결과가 달라지는 프로그램 영역

 

공유 데이터를 여러 프로세스가 동시에 접근할 때 잘못된 결과를 만들 수 있기 때문에, 한 프로세스가 임계구역을 수행할 때는 다른 프로세스가 접근하지 못하도록 해야 한다. 

 

임계 구역을 해결하기 위한 방법은 크게 뮤텍스, 세마포어, 모니터 세 가지가 있으며 모두 상호 배제, 한정 대기, 융통성이라는 조건을 만족합니다. 이 방법의 토대가 되는 매커니즘은 잠금(lock)입니다.

 

 

세마포어

 

일반화된 뮤텍스로 간단한 정수 값과 두 가지 함수 wait( P 함수 ) 및 signal ( V 함수 )로 공유 자원에 대한 접근을 처리합니다.

wait()은 자기 차례를 기다리는 함수이며, signal은 다음 프로세스로 순서를 넘겨주는 함수입니다.

 

바이너리 세마포어

 

바이너리 세마포어는 0과 1의 두 가지 값만 가질 수 있는 세마포어입니다. 구현의 유사성으로 인해 뮤텍스는 바이너리 세마포어라고 할 수 있지만 엄밀히 말하면 뮤텍스는 잠금을 기반으로 상호배제가 일어나는 '잠금 매커니즘'이고, 세마포어는 신호를 기반으로 상호 배제가 일어나는 '신호 매커니즘'입니다. 

 

카운팅 세마포어

 

카운팅 세마포어는 여러 개의 값을 가질 수 있는 세마포어로 여러 자원에 대한 접근을 제어하는 데 사용합니다.

 

 

세마포어 P, V 연산

 

P : 임계 구역 들어가기 전에 수행 (프로세스 진입 여부를 자원의 개수(S)를 통해 결정)

V : 임계 구역에서 나올 때 수행 ( 자원 반납 알림, 대기 중인 프로세스 깨우는 신호 )

 

예시 : 최초 S 값은 1이고, 현재 해당 구역을 수행할 프로세스 A, B가 있다고 가정하자

 

  1. 먼저 도착한 A가 P(S)를 실행하여 S를 0으로 만들고 임계구역에 들어감
  2. 그 뒤에 도착한 B가 P(S)를 실행하지만 S가 0이므로 대기 상태
  3. A가 임계구역 수행을 마치고 V(S)를 실행하면 S는 다시 1이 됨
  4. B는 이제 P(S)에서 while문을 빠져나올 수 있고, 임계구역으로 들어가 수행됨

 

뮤텍스 - Mutex

 

 

임계 구역을 가진 스레드들의 실행시간이 서로 겹치지 않고 각각 단독으로 실행되게 하는 기술

 

상호 배제 (Mutual Exclusion)의 약자

 

해당 접근을 조율하기 위해 lock와 unlock을 사용한다.

 

  • lock : 현재 임계 구역에 들어갈 권한을 얻어옴 ( 만약 다른 프로세스/스레드가 임계 구역 수행 중이면 종료할 때까지 대기 )
  • unlock : 현재 임계 구역을 모두 사용했음을 알림 ( 대기 중인 다른 프로세스/스레드가 임계구역에 진입할 수 있음 )

 

뮤텍스는 상태가 0, 1로 이진 세마포어로 부르기도 함. 구현의 유사성으로 세마포어로 부르긴 하나 뮤텍스는 잠금을 기반으로 상호배제가 일어나는 '잠금 매커니즘'이고 세마포어는 신호를 기반으로 상호배제가 일어나는 '신호 매커니즘'.

 

 

모니터

 

 

모니터는 둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유 자원을 숨기고 해당 접근에 대해 인터페이스만 제공합니다.

 

모니터는 세마포어보다 구현하기 쉬우며 모니터에서 상호 배제는 자동인 반면, 세마포어에서는 상호 배제를 명시적으로 구현해야 하는 차이점이 있습니다.