gpt4 book ai didi

改变 Minix3 的优先级队列

转载 作者:太空宇宙 更新时间:2023-11-04 04:40:58 33 4
gpt4 key购买 nike

我在虚拟机上安装了 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;
}

我已经输入了一些代码来启动随机化过程,但我不知道从哪里开始。我知道我需要向该文件中添加一些内容,但我不确定哪些变量执行哪些操作以及我需要更改哪些指针。我希望有人能告诉我如何做到这一点或指出我需要更改的部分以帮助我继续前进。现在我很困。

最佳答案

感觉是个微妙的问题;更改算法可能会使高优先级任务无法完成。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;

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

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

关于改变 Minix3 的优先级队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26581657/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com