1. 程式人生 > >作業系統課程設計 Pintos 1 ALarm Clock 問題

作業系統課程設計 Pintos 1 ALarm Clock 問題

問題描述:

實現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

得到結果

有關alarmcloc的測試均通過