修改xv6调度算法后队列等级变更触发死循环如何排查
问题排查
- 致命语法嵌套错误:外层的
for(;;)是无限循环,你将进程状态更新逻辑写在这个循环内部,但是循环没有任何跳出机制,真正负责进程切换、执行的代码写在这个无限循环的外部,永远不会被执行,系统直接卡在状态更新的死循环里。同时函数末尾多了一个冗余的右大括号,本身存在语法问题。 - 调度逻辑错误:你当前仅筛选
queuelevel == 3的进程执行,但进程时间片耗尽后会执行queuelevel--降级,所有进程执行过一次后就会被降到3以下,再也不会被调度器选中,自然没有后续输出。 - 锁使用错误:你在
for(;;)循环内获取ptable.lock后,没有在循环内释放锁,会一直持有进程表全局锁,其他上下文无法修改进程状态,直接触发死锁。 - 输出参数类型不匹配:
cprintf中你用%d格式符输出c->proc(结构体指针类型),会引发输出异常甚至内存访问崩溃。 idlecount逻辑错误:p->idlecount++被放在if(p->iterationsleft == 0)分支内,仅当进程时间片耗尽时才会累加,完全不符合该字段统计进程等待调度时长的设计逻辑。
修复方案
首先调整嵌套结构,将进程切换逻辑放到for(;;)循环内部,同时修改调度筛选逻辑,按优先级从高到低选择进程,补充锁释放逻辑,示例修复代码如下:
void scheduler(void) { struct proc *p; struct cpu *c = mycpu(); c->proc = 0; for(;;){ // Enable interrupts on this processor. sti(); acquire(&ptable.lock); // 先更新所有RUNNABLE进程的状态 for (p = ptable.proc; p < &ptable.proc[NPROC]; p++) { if (p->state == RUNNABLE) { p->idlecount++; // idlecount每次调度周期都累加,代表等待次数 if (p->iterationsleft == 0) { p->idlecount = 0; if (p->queuelevel == 0) { p->iterationsleft = 500; } else if (p->queuelevel == 1) { p->iterationsleft = 24; p->queuelevel--; } else if (p->queuelevel == 2) { p->iterationsleft = 16; p->queuelevel--; } else if (p->queuelevel == 3) { p->iterationsleft = 8; p->queuelevel--; } } // 可选补充: idlecount超过阈值时提升队列等级,避免进程饥饿 } } // 按优先级从高到低找可运行进程,这里假设queuelevel数值越高优先级越高 struct proc *selected = 0; int highest_level = -1; for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){ if(p->state != RUNNABLE) continue; if(p->queuelevel > highest_level) { highest_level = p->queuelevel; selected = p; } } if(selected) { // Switch to chosen process. selected->idlecount = 0; selected->iterationsleft--; c->proc = selected; switchuvm(selected); selected->state = RUNNING; swtch(&(c->scheduler), selected->context); switchkvm(); // Process is done running for now. cprintf("Pos in queue: %d , Idle Count: %d , Iterations left: %d0ms.\n , Process [%s:%d] is running. \n", selected->queuelevel, selected->idlecount, selected->iterationsleft, selected->name, selected->pid); c->proc = 0; } release(&ptable.lock); } }
内容的提问来源于stack exchange,提问作者dmesser
相关产品推荐
相关产品推荐

