linux进程调度

参考:

 

进程可被执行的优先级的修正数值为PRI(new)=PRI(old)+nice,

 

1.什么是CFS
CFS(Completely Fair Scheduler)是Linux 2.6.23中引入的,针对普通进程(linux中除了普通进程之外还有实时进程,实时进程有专门的实时调度器,其实现在kernel/sched_rt.c)的一个调度器。它的实现在kernel/sched_fair.c。

CFS的设计原则是,尽力保证CPU资源在所有可运行进程之间平均划分——假如系统中一共有n个可运行进程,那么在任何时刻,每个可执行进程刚好使用了1/n的CPU资源。注意,红色字体意味着这只能是一个理想化的模型,在某一时刻(甚至可以说在每一时刻)肯定会有人超过1/n,有人不足1/n,但是CFS会以此模型为目标尽力去做到。
 
2. vruntime
CFS通过为每个可运行进程维护一个虚拟运行时间vruntime来实现它的目标。vruntime记录了一个可执行进程到当前时刻为止执行的总时间(需要以进程总数n进行归一化,并且根据进程的优先级进行加权)。CFS每次挑选新进程投入运行的时候,采用的策略超级简单:挑选vruntime最小的可运行进程p投入运行,当运行了一段时间dt之后,进程p的vruntime相应增加Dt(vruntime+=Dt),然后CFS重新选择拥有最小vruntime的进程p'投入运行。

需要注意的是,上文中vruntime的增加值Dt并不一定等于dt,Dt的计算需要根据进程的优先级也就是nice值进行加权,并对可执行进程总数n进行归一化。例如对同样的dt,高优先级进程的Dt比低优先级进程的Dt小。也就是说高优先级进程的vruntime增加较慢,所以就有更多的机会获得CPU。

在理想的情况下,CFS应该把时间粒度划分的无限小。当一个可运行进程投入运行时,只运行无限小的时间就交出CPU。这样就可以满足任意时刻每个可运行进程的vruntime都相等的理想目标。实际中当然不可能做到无限小,每个进程的运行时间的最小粒度默认是1ms,再小的话,上下文切换的开销就相当巨大了。
 
3. 可运行进程的维护
CFS如何快速挑选最小vruntime的可运行进程呢?答案是红黑树。红黑树是一种准平衡二叉排序树,也是一种自平衡二叉树,它的search/insert/delete操作的时间复杂度都是O(log(n)),并具有良好地动态特性(相比AVL树)。CFS将所有可运行进程组织成一个红黑树(rbtree),红黑树的key就是进程的vruntime。通过这个rbtree,CFS可以在O(log(n))时间内找到最小vruntime的进程——也就是最左边的树节点(leftmost)。并且,CFS会将leftmost节点cache起来,以便加速下一次查找。
 
在每一次调度中,CFS从rbtree中挑中leftmost进程投入运行,运行完之后增加这个进程的vruntime值,并将其重新insert到rbtree里(如果这个进程没有被阻塞,即仍然是可运行的)。随着系统不断运行,可运行进程会不断地从rbtree的最左边delete,再被insert到右边,是一个很有趣的过程。

 

更改nice

nice:

更改优先级

nice -n 10 bash
如果是超级用户,则-n后面的值可以为负数:-20<=x<=19

renice:

如果您正好启动了一个进程,但意识到它应该以不同的优先级运行,那么有一种方法可以在启动之后对其进行更改,即使用 renice命令。您可以为进程指定一个绝对优先级(不是调整值)

renice +x PID
x指的是一个数字,PID为需要指定的进程的PID值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值