C 更改Minix3的优先级队列

C 更改Minix3的优先级队列,c,minix,C,Minix,我在虚拟机上安装了minix3,希望能够操作当前的队列选择算法,以便将其从优先级顺序更改为包含随机分类的低优先级作业的优先级顺序。我发现我需要更改的代码部分在proc.c中,具体部分是pick_proc.c /*===========================================================================* * pick_proc * *==============

我在虚拟机上安装了minix3,希望能够操作当前的队列选择算法,以便将其从优先级顺序更改为包含随机分类的低优先级作业的优先级顺序。我发现我需要更改的代码部分在proc.c中,具体部分是pick_proc.c

/*===========================================================================*
 *                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;
}

我已经写了一些代码来开始随机过程,但我不知道从这里开始该怎么做。我知道我需要向这个文件添加一些东西,但我不确定哪些变量做什么,哪些指针需要更改。我希望有人能告诉我怎么做,或者指出我需要改变哪一部分来帮助我前进。现在我被卡住了

感觉像是一个微妙的问题;更改算法可能会导致高优先级任务无法完成。 问题1:什么是优先级较低的任务?那是NR_SCHED_队列/2吗? 问题2:在您愿意选择优先级较低的任务之前,最多需要等待多少个优先级较高的任务? 回答此问题后,您可以将for循环中的q=0更改为例如q=low_任务,并从中选择一个流程

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;
注意:这只是演示,不能保证正常工作


注意:您还必须检查是否有较低优先级的任务要运行。

谢谢您的提示。对于如何通过添加for循环将随机性引入调度队列,我有点困惑。回答前面的问题:1。低优先级任务可以是任何低优先级任务。它不必是特定的东西。2.这个数字也不一定是固定的。它也可以是随机的。因此,有时它可以让一些优先级更高的任务进入,而有时它可以让许多任务进入。您提到将q=0更改为q=low_任务,我是否能够将选择随机性的代码合并到该任务中?我没有添加随机性。这只是一个决定是否允许低优先级任务的示例。您可以使整个过程随机进行,从最高任务到最低任务。这意味着机器可能会出现挂起状态,例如,仅调度低优先级任务。因此我觉得调度程序可能不是随机的,或者只是在守卫下随机的。谢谢保罗!这对我帮助很大。我感谢你的意见,我会做出相应的改变。