博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
朴素UNIX它-Linux CFS注视
阅读量:6684 次
发布时间:2019-06-25

本文共 1310 字,大约阅读时间需要 4 分钟。

该系列产品,被称为纯UNIX,但它也包含各种类别UNIX该系统的细节,自从完成我多年的学习笔记本系列文章,分析了各种UNIX,类UNIX思想和情感的实现。

       这篇文章是比较短。只是分析Linux CFS调度器的一个细节。
       在进程寻找下一个将被执行的进程时,难道仅仅仅仅是在红黑树上取下左下角的进程吗?其实最朴素的实现就是这样,可是考虑到优化的话,就没有这么简单了。要考虑CPU缓存的利用率,即假设一个进程A抢占了进程B。那么在A进程的上下文中。pick next是选择进程B呢还是选择红黑树的左下角进程呢?另外假设进程A刚被唤醒,企图抢占进程B,可是没有成功。那么下一个是选择红黑树的左下角进程呢还是选择进程A呢?是的。这些都是问题。
       我们看一下pick next的实现:

static struct sched_entity *pick_next_entity(struct cfs_rq *cfs_rq){    struct sched_entity *se = __pick_next_entity(cfs_rq);    struct sched_entity *left = se;    if (cfs_rq->next && wakeup_preempt_entity(cfs_rq->next, left) < 1)        se = cfs_rq->next;    /*     * Prefer last buddy, try to return the CPU to a preempted task.     */    if (cfs_rq->last && wakeup_preempt_entity(cfs_rq->last, left) < 1)        se = cfs_rq->last;    clear_buddies(cfs_rq, se);    return se;}
非常显然,要把红黑树最左下角的进程和另外两个进程,即next和last最比較,next是抢占失败的进程,而last则是抢占成功后被抢占的进程,这三个进程究竟哪一个是最优的next进程呢?Linux CFS实现的判决条件是:

1.尽可能满足须要刚被唤醒的进程抢占其他进程的需求;

2.尽可能降低以上这样的抢占带来的缓存刷新的影响。

Linux CFS实现是怎么做到的呢?Linux保存了两个变量。即抢占失败的进程和抢占成功后被抢占的进程,在权衡的时候,优先选择的顺序是:

抢占成功后被抢占的进程>抢占失败的进程>红黑树最左下角的进程

究竟能不能选择前两个进程,则是wakeup_preempt_entity函数来决定的,代码太多无益,看以下的图解就可以:


这个CFS细节Linux 2.6.23初步实现CFS如果没有达到。因此,从最简单的时代,你来了解插件的能力的细节和出局,看Changelog有利的是。不得不说。读史使人明智。

本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5035040.html,如需转载请自行联系原作者

你可能感兴趣的文章
MyBatis学习总结(三)——优化MyBatis配置文件中的配置
查看>>
jsoup使用post方式查询和解析json
查看>>
翻译软件开发(do it yourself)
查看>>
《Java程序员的基本修养》读书笔记之内存回收
查看>>
鸟哥私房菜重温6
查看>>
适用于ASP等环境的JS日期选择控件
查看>>
rpm 与 yum 用法
查看>>
Oracle数据库新版本12c信息汇总
查看>>
【Oracle Database 12c新特性】 In-Database Archiving数据库内归档
查看>>
运维自动化之psutil模块
查看>>
mysql的复制原理以及复制类型
查看>>
iOS开发系统类功能划分
查看>>
知道IP地址的情况下,如何查看主机名
查看>>
SQL执行过程
查看>>
Puppet批量部署tomcat
查看>>
OSPF与Loopback地址
查看>>
mysql的sql执行计划详解
查看>>
Cacti 0.8.8b 配置spine
查看>>
ppt免费模板下载
查看>>
有关字符串中的函数及其部分面试题
查看>>