본문 바로가기

컴퓨터 공학/운영체제

[Nachos] 3. Alarm 클래스 구현

[Nachos] 3. Alarm 클래스 구현

1. 문제제기

a) 상황 및 목표

아직 미완성의 Alarm 클래스를 완성하는 것이다. 기존의 Alarm클래스는 sleep을 하지 않고 스핀을 통해서 원하는 시간까지 기다린 뒤에 스레드를 시작하는 코드로 구성되어 있다. 따라서 스핀하고 있는 스레드 때문에 하드웨어를 효율적으로 사용하지 못하는 코드이다. 따라서 Alarm wait을 호출한 스레드가 sleep하였다가 원하는 시간 후에 깨어나는 것으로 구현된다면, 다른 리소스가 CPU를 사용할 수 있게 된다. 위에 설명한 방식대로 Alarm을 구현하는 것이 목표이다. 이 때 하드웨어의 Timer의 도움을 받아서 구현한다.

 

 

2. 분석 및 알고리즘

a)       Alarm.timerInterrupt() 코드 분석

 

b)       Alarm.waitUntill() 코드분석

 

 

 !참고: Vector<long_type_Time> time_queue와 Vector<KThread> waitingThread_queue는 클래스의 맴버변수로 선언되어있다. 그리고 이를 클래스 생성자에서 초기화 시킨다.

c)       AlarmTest.java 코드분석

d) 결과

 

T1 fork 하고 나서 내부적으로 300의 시간으로 알람을 맞춰 놓았더니, 정확히 300만큼은 아니지만 time이 호출한 시점에 50에서 깨워지는 시점인 560으로 확인할 수 있었다. 또한 T2 도 마찬가지로 확인할 수 있었다. 그리고 알람을 맞추지 않은 T3 스레드는 60time에 시작하여 60time 에 바로 스레드를 종료하였음을 확인하였다.

 

e) 알고리즘

 waitUntill을 호출한 시점의 시간과 원하는 슬립 시간을 더하여, waitUnitll을 호출한 스레드와 시간을 큐에 넣어서 저장한다. 그리고 나서 현재 스레드를 sleep하고 잠궈놓았던 인터럽트를 해제시킨다.

 TimerInterrupt를 호출하면 타임 큐에 들어있는 타임과 현재 타임을 비교해서 만약 현재 시간보다 큐에있는 시간이 작다면, 잠들어있는 큐에 있는 첫번째 쓰레드를 깨우고 이를 큐가 빌 때까지 반복한다.

 

3. 결론 및 고찰

Alarm을 구현해보면서, OS를 돌아가게 하는 개념상 하드웨어 단의 Timer를 다뤄볼 수 있어서 신기하였다. 그리고 Alarm의 기능에 대해서 확실하게 알게 된 것 같다. 또한 Alarm을 사용하는 다른 여러가지 OS의 프로그램들을 찾아봐야겠다라는 생각이 들었다.

 

nachos (1).zip
0.38MB

Alarm 소스코드