2014-10-27 64 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