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;
}
我已经把一些代码开始随机化过程,但我不知道从哪里去。我知道我需要添加一些东西到这个文件,但我不知道哪些变量做什么和哪些指针我需要改变。我希望有人能告诉我如何做到这一点,或指出我需要改变哪一部分来帮助我移动。现在我很困难。
感谢提示保罗。我对你如何通过添加for循环将随机性引入调度队列感到困惑。要回答您以前的问题: 1.较低优先级的任务可以是任何较低优先级的任务。它不一定是特定的。 2.这个数字不一定要修正。它也可以是随机的。所以有时候它可以让一些更高优先级的任务以及其他时候可以允许的任务。 您提到将q = 0更改为q = low_task,我是否可以将选择随机性的代码合并到该代码中? – John123 2014-10-27 15:56:20
我没有添加随机性。这只是决定是否允许优先级较低的任务的一个例子。您可以使整个过程随机,从最高到最低的任务。这意味着机器会出现挂起的机会(例如,只调度低优先级的任务)。因此,我觉得调度程序可能不是随机的,或者只有在守卫下才是随机的。 – 2014-10-27 17:15:47
谢谢Paul!这对我有很大的帮助。我感谢您的意见,我会相应做出更改。 – John123 2014-10-27 18:00:15