컴퓨터(Computer Science)/운영체제(Operation System)

동기화, 모니터 : Synchronization, Monitor [운영체제]

게임이 더 좋아 2020. 5. 28. 22:50
반응형
728x170

 

세마포를 기반으로 이해하면 된다.

[컴퓨터(Computer Science)/운영체제(Operation System)] - 동기화, 세마포 : Synchronization, Semaphores [운영체제]

 

 


 

 

• A high-level abstraction that provides a convenient and effective mechanism for process synchronization
• Abstract data type, internal variables only accessible by code within the procedure
• Only one process may be active within the monitor at a time
• But not powerful enough to model some synchronization schemes

 

세마포가 프로세스 간의 동기화를 위해서 편리하고 효과적으로 쓰일 수 있지만

세마포는 잘못 사용하면 발견하기 어려운 타이밍 오류를 불러올 수 있다. 

 

왜 발견하기 어렵냐면

특정 실행 순서로 진행되었을 때만 발생하고 이러한 순서가 항상 일어나는 것은 아니라 그렇다.

 

mutex를 써도, 세마포를 써도 타이밍 오류는 여전히 발생가능성이 있다. 그래서 우리가 모니터를 배우는 것이다.

 

 


 

모니터는  변수들의 선언을 포함하고 있는데 이 변수들의 값은 그 형에 해당하는 한 인스턴스의 상태를 정의한다.

그리고 모니터는 이 변수들을 조작할 수 있는 프로시저 또는 함수들의 본체도 같이 포함하고 있다.

 

 

공유데이터를 접근하기 위해서는 위와 같이 모니터 내부에 공유 데이터를 선언하고 내부의 프로시저를 통해서만 내부의 공유 데이터에 접근할수 있게 한다.

**모니터 구조물은 모니터 안에 항상 하나의 프로세스만이 활성화되도록 보장해 준다.

-> 프로그래머들은 동기화 제약 조건을 명시적으로 코딩해야할 필요가 없다. 

 

또한 내부의 프로시저가 동시에 접근이 되지 않도록 만들어서 lock을 걸 필요가 없다.

**세마포와의 가장 큰 차이점 lock 유무

 

 

세마포에서 Resource Count를 하여 자원이 있을 때만 프로세스가 접근이 가능하게 했는데

모니터에서도 여전히 비슷하게 적용한다.

Condition variable이 그것을 대체한다.

 

 

condition 형에 호출될 수 있는 연산은 저 2개뿐이다.

 

해당 자원이 당장 없다면 wait() 으로 대기를 하게 되고

해당 자원을 반납할 때는 signal()을 써서 반납함과 동시에 대기하고 있는 프로세스를 끌고온다.

 

다시 말해서 signal()을 보내서 일시 정지 된 프로세스가 재개되면 그 signal()을 보낸 프로세스는 대기해야한다.

그러는 과정이 2가지가 있다.

 

 

1. Signal and wait

P는 Q가 모니터를 떠날 때까지 기다리거나 또는 다른 조건을 기다린다.

 

2. SIgnal and continue

Q는 P가 모니터를 떠날 때까지 기다리거나 또는 다른 조건을 기다린다.

 

 

 

 

 

예를 들어 공유데이터가 있으면

밖에서 공유데이터에 접근하는 것이 아닌

모니터 안에다 공유데이터와 해당 데이터에 접근하는 procedure를 정의해서

해당 procedure를 통해서만 접근할 수 있게하는 것이다.

 

추상 자료형과 같은 원리라고 보면 된다.

 


 

모니터를 세마포로 구현할 수도 있다.

 

각 모니터마다 mutex 라는 이진 세마포가 정의되고 그 초기 값은 1이다.

프로세스는 모니터로 들어가기 전에 wait(mutex)를 실행하고 모니터를 나온 후에 signal(mutex)을 실행해야한다.

 

++signal - and - wait 기법을 사용한다.

 

 Signaling 프로세스는 실행 재개되는 프로세스가 모니터를 떠나든지 아니면 wait() 할 때까지 기다려야 하므로

next 이진 세마포가 필요하고 0으로 초기화되는 것이다.

 

++Signaling 프로세스는 자신을 중단시키기 위해 next를 사용할 수 있다.

 

 

정수형 변수 next_count 는 next에서 일시 중지 되는 프로세스의 개수를 세기 위해 제공된다.

 

** 위에 예시에서 F는 외부 프로시저다.

 

**위의 예시에서는 모니터 안에서의 상호 배제를 보장한다.

 

 

 

조건 변수를 세마포로 구현하는 방법이다.

 

각 조건 x마다 x_sem이라는 이진 세마포와 x_count라는 정수형 변수를 도입하고

 

wait()   signal()을 구현한다.

 

 

728x90
반응형
그리드형