以下是个人总结的实验过程及经验分享。
Tips:
• 优先级
–静态优先级(nice):内核不会修改它,不随时间而变化,除非用户通过系统调用setpriority进行修改
–动态优先级(priority):内核根据线程使用CPU的状况、静态优先级nice和系统负荷计算出来,会随时间而变化
最终的调度依据,即调度器只根据动态优先级进行调度
• 在系统启动过程中,g_task_running是NULL!
• task0(tid=0)是系统空闲线程(systemidle thread)
Step1: 添加变量及其初始化
在kernel.h的struct tcb中增加nice(表示线程的静态优先级,ps:一定要加在kstack字段之后、signature字段之前!!!),priority(表示线程的动态优先级,值越大优先级越高),estcpu(表示线程最近使用了多少CPU时间),如下:
int nice; //线程的静态优先级nice,值越小优先级越高
int priority; //表示线程的动态优先级,值越大优先级越高
fixedpt estcpu; //表示线程最近使用了多少CPU时
在task.c的sys_task_create函数中初始化上面三个变量,注意取值范围。nice取值范围[-NZERO,NZERO-1],值越小优先级越高,priority取值范围[PRI_USER_MIN, PRI_USER_MAX],值越大优先级越高。这里都用了宏定义,方便理解和修改。
#define NZERO20
#definePRI_USER_MIN 0
#definePRI_USER_MAX 127
new->nice = 0; //初始化nice=0
new->estcpu=0; //初始化estcpu=0
new->priority=0; //初始化priority=0
在timer.c中增加一个全局变量fixedpt g_load_avg = 0(表示系统的平均负荷,初值为0)
Step2: 增加系统调用
在mechdep.c中增加两个系统调用函数,getpriority(int tid)用于返回线程tid的(nice+NZERO),而setpriority(int tid, int prio)用于把线程tid的nice设为(prio-NZERO)。具体实现如下:
PS: •如果参数tid