作業系統課程設計 Pintos 1 ALarm Clock 問題
阿新 • • 發佈:2018-12-22
問題描述:
實現linux中的thread.sleep()函式,其功能是讓呼叫他的執行緒睡眠一段時間(ticks),然後喚醒。
pintos 本身的sleep函式
void timer_sleep(int 64_t ticks){
Int 64_t start = timer_ticks();
ASSERT(intr_get_level ==INTR_ON);
while(timer_elapsed(start)<ticks)
thread_yield();
}
pintos 本身的sleep函式是忙等待的實現方式,其睡眠應為一種偽睡眠,睡眠的執行緒不斷查詢自己的睡眠時間,如果沒有到給定的睡眠時長,則將自己放到佇列的末端,這一操作持續進行,浪費cpu資源。
改進:我們不讓執行緒去不斷查詢自己的睡眠時長,而是通過中斷機制,在每一次時間終端到來時,判讀該執行緒是否已經休眠夠了睡眠時長,若是則喚醒它,否則讓他的繼續睡眠,在睡眠時間上減一。
為此 我們需要在thread,h的thread結構體中增加block_ticks 這一變數,通過它來初始化睡眠總時長。
同時在thread.c中增加thread_block_ticks_check函式,來喚醒滿足喚醒條件的執行緒。
同時重寫 sleep函式 對執行緒的睡眠時間進行設定,並將該執行緒阻塞,進入睡眠。
1、新增block_ticks變數
struct thread { /* Owned by thread.c. */ tid_t tid; /* Thread identifier. */ enum thread_status status; /* Thread state. */ char name[16]; /* Name (for debugging purposes). */ uint8_t *stack; /* Saved stack pointer. */ int priority; /* Priority. */ long long block_ticks; /*Blocl_ticks */ struct list_elem allelem; /* List element for all threads list. * /* Shared between thread.c and synch.c. */ struct list_elem elem; /* List element. */ }
2、在thread.c中加入thread_block_ticks_check函式
void thread_block_ticks_check(struct thread *t){
if(t->status ==THREAD_BLOCKED){
if(t->block_ticks ==1){
thread_unblock(t);
}
if(t->block_ticks !=0){
t->block_ticks--;
}
}
}
3、重寫sleep函式
timer_sleep (int64_t ticks) { //int64_t start = timer_ticks (); //ASSERT (intr_get_level () == INTR_ON); //while (timer_elapsed (start) < ticks) //thread_yield (); if(ticks<=0) return ; enum intr_level old_level = intr_disable(); //close interupt thread_current()->block_ticks = ticks; thread_block(); intr_set_level(old_level); }
在 /home/os/pintos/src/thread 中
make check
得到結果