CHOU
[Operating System] Pintos project #1 - alarm 본문
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