CHOU

[Operating System] Pintos project #1 - alarm 본문

Tech/Technical Tips

[Operating System] Pintos project #1 - alarm

chobabo 2009. 5. 14. 19:50

Thread and Scheduling을 개선하는 문제 입니다.

 

1. Alarm Clock 개선

 (1) </threads/init.c> 수정 block_init() call





Line 285: block_init()를 선언하여 thread 를 실행할 때 초기화 해주는 init.c 에 추가하여 block_init() 를 실행하게 하였다.



(2) </devices/timer.c>
추가 block_init()






Line 168: 구조체 list 로 선언되어 있는 alarms 의 주소를 list_init() 에 넣어준다.

Line 171: Boolean 으로 선언되어 있는 alarmswitch 값을 true 로 바꿔준다. (기본값은 false value 선언되어 있다.)

 

 

(3)</devices/timer.c>






*함수 선언

Line 32: static bool less_alarm(const struct list_elem *a, const struct list_elem *b, void *aux UNUSED)

Line 33: static void thread_compare(void) 쓰레드의 만료 시각과 현재 시각을 비교해서 waiting queue에서 빼고 쓰레드를 unblock시키는 함수

*리스트 선언

Line 35: block상태의 쓰레드를 연결하는 linked list alarms

Line 36: alarmswitch 초기값 false로 선언

*구조체 선언

37~42: waiting 만료시각과 쓰레드의 주소값, element를 나타내는 변수를 모아놓은 구조체

 

 

 

(3)</devices/timer.c>






Line 108: bool less_alarm() à Ticks 의 길이에 따라서 작은 tick의 값을 가지는 것을 앞으로 큰 tick의 값을 가지는 것을 뒤로 정렬해 준다.

Line 110~111: struct alarm t1, t2 를 선언해서 두 값을 비교하기 위한 구조체를 선언한다.

Line 113: if statement 에서 t1 종료시간과 t2 종료시간을 비교해서 t1 이 클 경우 false return하고 아닐 경우에는 true return한다.

 

(4) </devices/timer.c>







Line 121: timer_sleep(int64_t ticks) à ticks를 매개변수로 받아 쓰레드를 block 시켜주는 함수

Line 123: start변수에 현재 시각값 저장

Line 124: end 변수에 끝나는 시각값 저장

Line 125: 구조체 변수 선언

Line 129: 구조체 초기 메모리 할당(#include ”threads/malloc.h” 선언)

Line 130: 구조체 내에 쓰레드 주소에 현재 쓰레드를 넣음.

Line 131: 구조체 내의 expiration변수에 end값 집어넣음.

Line 133: 인터럽트를 제어하기 위해 선언

Line 134: 인터럽트를 꺼줌

 


(5) </devices/timer.c>






Line 183: timer_interrupt() à 이 함수는 ticks 이 발생될 때마다 실행되는 인터럽트이다.

Line 185: ticks 을 증가시켜준다.

Line 186: (6) 에 있는 thread_compare() 를 불러온다. (함수에 관한 설명은 (6) 에서 설명)

Line 187: 현재 current_thread Time_Slice를 비교해서 Time_Slice 보다 크거나 같을 때까지 tick의 값을 증가시켜주면서 yield return 한다.


 

(6) </devices/timer.c>









Line 190: thread_compare()
à alarmswitch가 깨어있고 list_size empty가 아닐 때 timer_ticks 와 비교해서 t 의 종료시점과 비교해서 thread unblock 시킨다.

Line 192: alrarmswitch true 이고 list_size() 0이 아닐때에 if statement 를 실행하게 된다.

Line 194: alarm *t 구조체를 선언한다.

Line 195: intr_level old_level enum형을 선언한다.

Line 197: 구조체로 선언한 t 에다가 list_entry() value 를 넣는다.

Line 199: t 의 종결시점이 timer_ticks() 보다 작을 때까지 if statement를 실행한다.

Line 201: 인터럽트를 disable 시켜준다.

Line 202: ready queue 에 있는 List_Front 부분의 thread pop 해준다.

Line 203: thread unblock 시켜준다.

Line 204: 인터럽트를 set 시켜준다.

 

2. 결과 값 출력

(1) pintos -v -- run alarm-multiple






(2) pintos -v -- run alarm-single








 

(3) pintos -v -- run alarm-simultaneous