《操作系统原理》实验三:线程的调度

 

以下是个人总结的实验过程及经验分享。

 

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

  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值