2014-10-27 65 views
1

我在虛擬機上安裝了minix3,並希望能夠操縱當前的隊列選擇算法,以便我可以將其從優先級順序更改爲優先級順序,其中包括隨機分配的較低優先級作業。我能夠發現,我需要改變的代碼段是在proc.c中,具體部分是pick_proc.c。更改Minix3的優先級隊列

/*===========================================================================* 
*    pick_proc      * 
*===========================================================================*/ 
PRIVATE struct proc * pick_proc(void) 
{ 
    /* Decide who to run now. A new process is selected and returned. 
    * When a billable process is selected, record it in 'bill_ptr', so that the 
    * clock task can tell who to bill for system time. 
    */ 
    register struct proc *rp; /* process to run */ 
    int q;      /* iterate over queues */ 

    /* Check each of the scheduling queues for ready processes. The number of 
    * queues is defined in proc.h, and priorities are set in the task table. 
    * The lowest queue contains IDLE, which is always ready. 
    */ 
    for (q=0; q < NR_SCHED_QUEUES; q++) {  
     if(!(rp = rdy_head[q])) { 
      TRACE(VF_PICKPROC, printf("queue %d empty\n", q);); 
      continue; 
     } 

     u64_t timecount; 
     u32_t randdom; 
     read_tsc_64(&timecount); 
     rand = timecount.lo; 

     #if DEBUG_RACE 
     rp = random_process(rdy_head[q]); 
     #endif 

     TRACE(VF_PICKPROC, printf("found %s/%d on queue %d\n", 
       rp->p_name, rp->p_endpoint, q);); 
     assert(proc_is_runnable(rp)); 
     if (priv(rp)->s_flags & BILLABLE)   
      bill_ptr = rp;  /* bill for system time */ 
     return rp; 
    } 
    return NULL; 
} 

我已經把一些代碼開始隨機化過程,但我不知道從哪裏去。我知道我需要添加一些東西到這個文件,但我不知道哪些變量做什麼和哪些指針我需要改變。我希望有人能告訴我如何做到這一點,或指出我需要改變哪一部分來幫助我移動。現在我很困難。

回答

0

感覺像一個微妙的問題;改變算法可能會導致高優先級任務未完成。 Q1:什麼是「低優先級任務」?那是NR_SCHED_QUEUES/2嗎? Q2:在您願意選擇較低優先級的任務之前,多少更高優先級的任務最多需要等待? 通過回答,您可以將for循環中的q = 0更改爲q = low_tasks並從那裏選擇一個進程。

for (p=0, q=0; q < NR_SCHED_QUEUES/2; q++) 
    p += rdy_tail[q] - rdy_head[q]; // number of processes in this queue 
if (p<some_value) q= NR_SCHED_QUEUES/2; else q= 0; 

for (; q < NR_SCHED_QUEUES; q++) {  
    if(!(rp = rdy_head[q])) { 
     TRACE(VF_PICKPROC, printf("queue %d empty\n", q);); 
     continue; 
    } 

    TRACE(VF_PICKPROC, printf("found %s/%d on queue %d\n", 
      rp->p_name, rp->p_endpoint, q);); 
    assert(proc_is_runnable(rp)); 
    if (priv(rp)->s_flags & BILLABLE)   
     bill_ptr = rp;  /* bill for system time */ 
    return rp; 
} 
return NULL; 

注意:這只是演示,不保證能正常工作!

注意:您還必須檢查運行的優先級較低的任務。

+0

感謝提示保羅。我對你如何通過添加for循環將隨機性引入調度隊列感到困惑。要回答您以前的問題: 1.較低優先級的任務可以是任何較低優先級的任務。它不一定是特定的。 2.這個數字不一定要修正。它也可以是隨機的。所以有時候它可以讓一些更高優先級的任務以及其他時候可以允許的任務。 您提到將q = 0更改爲q = low_task,我是否可以將選擇隨機性的代碼合併到該代碼中? – John123 2014-10-27 15:56:20

+0

我沒有添加隨機性。這只是決定是否允許優先級較低的任務的一個例子。您可以使整個過程隨機,從最高到最低的任務。這意味着機器會出現掛起的機會(例如,只調度低優先級的任務)。因此,我覺得調度程序可能不是隨機的,或者只有在守衛下才是隨機的。 – 2014-10-27 17:15:47

+0

謝謝Paul!這對我有很大的幫助。我感謝您的意見,我會相應做出更改。 – John123 2014-10-27 18:00:15