[운영체제] 상호배제 & 세마포어 & 모니터
[운영체제] 상호배제 & 세마포어 & 모니터
동시 프로그래밍에서 공유 불가능한 자원의 동시 사용을 피하기 위해 사용되는 알고리즘
임계 구역(critical section)으로 불리는 코드 영역에 의해 구현된다
- 임계 구역 : 병렬컴퓨팅에서 둘 이상의 스레드가 동시에 접근해서는 안되는 공유 자원(자료 구조 또는 장치)을 접근하는 코드의 일부
각 프로세스는 자신의 임계 구역에 진입하려면 진입허가를 요청해야한다. 이런 요청을 구현하는 코드 부분을 입장구역이라고 한다. 입장 구역에서 기다리다가 진입 허가가 나면 임계 구역에 들어간다. 임계 구역 이후에는 임계 구역을 빠져나왔음을 알리는 코드 부분인 퇴장 구역이 있다. 또한 그 밖의 나머지 코드 부분들을 총칭하여 나머지 구역이라 한다. - 임계영역에서는 인터럽트가 발생하지 않는다.
코드 예시 |
즉, 쉽게 말하면 한 프로세스가 공유자원을 사용하고 있을 경우에 다른 프로세스가 공유자원에 접근하지 못하도록 하는 기법
ex) 빵집 알고리즘(빵집에 들어갈때는 번호표를 받아 순서대로 들어가 빵을 받는 방법)
상호배제(mutual exclusion)의 형태로 가장 중요한것은 동기화!!!!!!
동기화 구현 방법
세마포어(semaphore)
세마포어는 손님이 잠자는경우, 손님을 깨우는 경우만 존재! |
- 신호기, 깃발을 의미하며 각프로세스에 제어 신호를 전달하여 순서대로 작업하도록 하는 기법
- 스레드에서 메시지 간의 동기화를 위해 mutex 사용
- 세마포어는 열쇠(mutex)의 개수
- 음수가 될 수 없다!!
- 세마포어에 대한 연산은 처리 중에 인터럽트 되어서는 안 된다.
- 세마포어 연산은 소프트웨어나 하드웨어로 구현이 가능하다.
- 세마포어 알고리즘은 P 연산(wait 연산)과 V 연산(signal 연산)을 사용한다.
- P연산과 V연산의 구현 방법에 따라 바쁜 대기(busy waiting)를 해결 할 수 있다.
- 바쁜대기 : 대기중인 쓰레드가 여전히 활성상태이지만 아무 작업도 하지 않는 상태
- P조작 : 자는 신호
- V조작 : 깨우는 신호
- 세마포어는 한 번에 한 프로세스만 접근하여 작업을 수행하는 부분을 잠그거나(block), 다시 잠금을 해제하는 기능을 제공하는 정수형 변수(sem)이다.
- 이진형 세마포어 : 0과 1값, 한개의 공유자원을 상호배제
- 계수형 세마포어 : 0과 양의 정수, 여러개의 공유자원을 상호배제
- 이 정수형 변수는 함수를 통하여 값을 변경한다.
모니터(monitor)
- 필요한 공유자원을 프로세스에게 할당하는 데 필요한 데이터와 데이터를 처리하는 procedure로 구성
- 모니터는 정보를 은폐하는 방식을 사용하는데 다른 외부 프로시저가 접근하지 못하도록한다.
- 모니터내의 공유 데이터는 모니터 내부의 procedure에 의해서만 액세스가 가능하므로 모니터 외부의 프로세스는 모니터 내부 데이터를 직접 액세스 할 수 없으며 이를 정보은닉의 개념이라고 한다.
- 모니터에는 한번에 하나의 프로시저만 접근하여 사용 가능
- wait와 signal 사용
- 공유 변수들은 모니터 속에서 선언되며 이 변수들은 모니터 속의 procedure들에서만 사용될 수 있다
- 모니터의 procedure들을 실행할 때 크리티컬 섹션의 조건들을 만족한다
- 크리티컬 섹션 : 한 프로세스가 특정 모니터의 procedure를 실행 중이면 다른 프로세스들은 이 모니터의 procedure들을 실행하지 못하고 대기 상태에 있게 된다
- 한 프로세스가 특정 모니터의 procedure를 실행 중이면 다른 프로세스들은 이 모니터의 procedure들을 실행하지 못하고 대기 상태에 있게 된다.
- 모니터의 경계에서 상호배제가 시행된다.
- 자료 추상화와 정보은폐 기법을 최초로 한다.
- 자원 요구 프로세스는 그 자원 관련 모니터 진입부를 반드시 호출한다
댓글
댓글 쓰기