본문 바로가기

컴퓨터 공학/운영체제

[Nachos] 2. Condition 클래스 구현

[Nachos] 2. Condition 클래스 구현

1. 문제제기

 

a) 목표

Semaphore로 구현 되어있는 Condition클래스를, 하드웨어 인터럽트를 사용하여 Condition2에 새롭게 구현한다.

b) 상황

동기화를 위해 semaphore를 사용할 경우, user 프로그래머가 실수로 PV의 순서를 반대로 생각하고 프로그램을 작성했을 경우, 심각한 Deadlock에 빠질 수 있다. 따라서 lockconditional variable을 분리시킨 monitor를 사용하면 이러한 실수나 예외적인 프로그램환경에서 프로그램이 돌아갈 수 있다.

 

2. 분석 및 알고리즘

 

a) Condition2.sleep() 코드 분석

 

b) Condition2.wake() 코드 분석

 

 

c) Condition2.wakeAll()코드분석

 

d) 알고리즘

Sleep을 호출할 때 Wating-Queue를 만들어서 condition-variable의 순서를 정해주는 과정은 앞선 과제에서 join을 구현할때랑 비슷하다. 그러나 condition-variable Lock release한 뒤에 sleep을 한다는 점이 조금 다르다. 왜냐하면 Lock을 쥔 채로 sleep을 하면 다른 스레드가 Lock을 얻지 못하기 때문이다. 또한 wake()함수에서는 웨이팅 큐에 제일 첫번째 스레드를 준비상태로 바꾼다. 이 과정은 interrupt 를 막아주어야 하는데, 왜냐하면 여러 스레드를 꺼내는 도중에 context-switch가 일어날 경우 wating-queue에 스레드가 추가됬는지의 여부가 불확실 하기 때문에 제대로 된 동기화를 구현하기 어렵기 때문이다.

3.결과 화면

Condition2Test.java

Condition2Test.java

 

 

 

출력

 

 

4.             결론 및 고찰

 

Condition2를 직접 구현해보면서, 같이 따라다니는 Lock에 기능에 대해서 다시한번 깊게 공부할 수 있게 되었다. 또한 LockCondition-variable로도 SemaphoreP(wait) V(signal)의 기능을 그대로 구현하고 더 안전한 프로그래밍을 제공할 수 있다는 것을 코드를 통해 체감할 수 있었다. 처음 접해보는 Monitor 구조에 익숙하지 않아서 Test-Code를 작성함에 많이 애를 먹었지만, 지금은 P,VLock Condition으로 변환할 수 있는 것을 보면, 이번 과제를 통해 Condition variable의 구조 그리고 사용 목적과 이유를 알고 과제를 한 것 같아서 후련한 기분이 든다. 앞으로 과제를 해 나갈 때, 이 기능의 목적과, 이유를 반드시 알고 과제를 해결해 나가야겠다는 생각이 들었다.

 

 

nachos.zip
0.37MB

소스코드