linux调度器_第三代cfs(1)_引入

不计其数的妹子又来了,真是烦恼啊,该怎么办,让我很快就选择一个最好的妹子呢?

为什么要从第三代开始呢?不应该是从简单的先来吗?我是想着有些朋友可能就想学习最新的,就像大家都抢着买最新款的手机一样,据说九月份iphone7要出了。

让CFS这种算法来吧,核心思想就是完全公平,这种思想也算是打破之前的一种观念。以前的时候,大家会把进程分为交互式进程,实时进程,以及一般的进程,交互进程就是想我们这样打字,鼠标点点这样的,我们不能让用户等待,点一下鼠标,半天没动静,人可受不了,就算你再吹嘘你电脑配置怎么怎么好,几G的内存,多少的主频,甚至还是多核的,但对于普通用户来说,这电脑“卡”,不要。为了满足用户体验,所以交互式进程一般都会特殊对待,就像是拿了张特权证书一样,更别说实时进程了,实时进程就像飞飞机一样,你点下右转,它立马就得转,你敢卡下,那估计又有多少坠机了。那既然分了这麽多种,读者,你记下了几种类型的进程?都记住了?算你厉害。一个都没记住?这就对了,你可以去跟张三丰学习学习太极拳。所以对于内核来说,也迫切希望,别让我记那么多东西,我又要拉出这位算法的作者了Ingo Molnar。搞出了一种完全公平的算法,就是把所有进程都排到一个队列里,你们谁把其他所有进程都干过了谁排前面,简言之就是,you can,you up。

在这个算法里,引入了一种虚拟运行时间的概念,还会涉及到红黑树,也就是数据结构 中的树那一块的知识,如果你不懂,可以去查点资料,或者干脆把它就当成一个有序的队列,小的拍前面大的拍后面。然后CPU一下就可以从这个红黑树(O(lgN))里选择一个进程开始执行了。

对于这种程序的大概流程,不知道,你们有点概念了吗?如果有的话,我就要开始上代码了。要是没有,就想着把所有进程扔一个队列里,然后他们自己排个序,每次我选择最小的开始执行,这样理解也可以。

我认为一种正常的逻辑是,我饿了,所以就去找吃的。需要什么,找什么。然而好多书,都是列出一大堆吃的,然后让用户自己去找,也许后来会发现或许作者有先见之名,但这对于初学者来说,是不合适的,过多的引入一些信息,往往会让学习的人没了思路,不知道哪是芝麻,哪是西瓜。所以,接下来行文都会以这种方式,需要什么,找什么。


上代码

第一件事,如何干掉其他进程,或者说是,你凭什么排在前面?对于算法来说就是,你是怎么计算的,让这个进程排前面。以下代码来自linux_2.6.24。来看看怎么计算的,答案是以实体键值排序的。问题来了:什么事实体键。

//kernel\sched_fair.c 138行

static inline s64 entity_key(struct cfs_rq *cfs_rq, struct sched_entity *se) 
{
return se->vruntime - cfs_rq->min_vruntime;
}

哎,真遗憾,源码中竟然没有英文注释,想吹下牛,show下英文都没给机会,别紧张我是英文刚过四级的小渣渣。好吧从名字开始entity_key实体键值的意思,因为调度不仅仅可以调度进程,有时候可以是进程组等其他的,我们在这里就把它当成是进程吧,se->vruntime就是虚拟运行时间,v=virtual虚拟的,se代表sched_entity,后面一个是cfs_rq->min_vruntime,即完全公平调度_就绪队列_最小_虚拟运行时间。简言之,就是虚拟运行时间减去最小虚拟运行时间。

感觉这篇引入就写到这里吧,毕竟一上来就摆大段的代码,会懵B的,让我们把开始的学习的曲线搞的平滑点,前奏做的更好点。

总结

这篇就说了一件事,完全公平调度把所有就绪进程不分什么实时进程,交互进程,等一股脑的扔到一个叫红黑树的结构里(红黑树本来就是有序的,后面说有序队列就是红黑树,是为了理解所有说成有序队列),然后进程依据键值大小,排了一个队,键值越小,就CPU”运行“它的时间越小,所以为了公平,CPU就优先运行键值小的。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值