Linux的进程调度器是通用的调度器,无论是O(n)O(n)O(n),O(1)O(1)O(1),还是CFS,均是基于统一的指标来对待所有进程的。也就是说,进程甚至无法自主退让。

只要确定了一个进程的优先级,无论是是什么调度算法,该进程的地位总是不会变化,如果能做到下面的策略就好了:

  • 系统中进程多了,就加速退让。
  • 系统中进程少了,就加速抢占。
  • 工人来了,就退让。
  • 经理来了,就抢占。

考虑一个进程A在一个特定的系统中运行,它最多只能用40%的CPU,此时,如果有另外的待运行进程,那么这些进程自然分摊另外60%的CPU,如果再来一个进程A呢?显然,两个进程A的CPU时间均会减少。

能不能保证两个进程A仍然分别使用40%的CPU,然后其它进程分摊剩余20%的CPU呢?很难!

你可能说可以配group啊,但是这必须有一个静态的配置过程,很难动态自适应。

换句话说,Linux的调度器是 非弹性的!

下面的代码展示了一个简单的弹性调度:

#!/usr/local/bin/stap -gprobe kernel.function("__enqueue_entity")
{task = _task_of($se)pid = @cast(task, "struct task_struct")->pidif ($1 == pid) {_nr = $cfs_rq->nr_runningt = $se->vruntime;$se->vruntime = t + 3000000*(_nr - 1)}
}

意思是指定进程根据系统中负载的数量来退让:

  • 系统负载越高,指定进程占有CPU时间比例越低。
  • 系统负载越低,指定进程占有CPU时间比例越高。

来来来,看效果:

可以看到:

  • 当只有一个loop的时候,它占用100%的CPU。
  • 当再生一个loop的时候,它几乎和第一个loop平分CPU。
  • 当越来越多的loop运行的时候,第一个loop的CPU份额逐渐降低。
  • 本是同根生,只有第一个loop被弹性了。

嗯,效果还行,但不够平滑。试试二次曲线, or 三次曲线?

$se->vruntime = t + 200*(_nr - 1)*_nr*_nr
// or
// $se->vruntime = t + 20000*(_nr - 1)*_nr

200何来?调一手好参数是必要的。

此外,我这里弹性策略过于单一,其实是可以设计的足够复杂的,比如针对特定进程的特定策略,即便是简单的双斜率直线段,也比我这个OK,是吧,不装逼,不多说。

有人问,如何找到要修改的代码在哪里,只要对Linux内核的执行原理足够熟悉,这并不难,对于手艺人而言,阿基米德,鲁班,庖丁,黄道婆这些人的地位是堪比欧几里得,笛卡尔的。


浙江温州皮鞋湿,下雨进水不会胖!

10行代码玩转弹性调度的小把戏相关推荐

  1. 10 行代码玩转弹性调度的小把戏

    作者 | dog250 责编 | 唐小引 头图 | CSDN 下载自东方 IC 出品 | CSDN Linux 的进程调度器是通用的调度器,无论是 O(n)O(n),O(1)O(1),还是 CFS,均 ...

  2. 10 行代码玩转 NumPy!

    作者 | 天元浪子 来源 | Python作业辅导员 NumPy也可以画图吗?当然!NumPy不仅可以画,还可以画得更好.画得更快!比如下面这幅画,只需要10行代码就可以画出来.若能整明白这10行代码 ...

  3. 10行代码玩转python切片

    # coding:utf8 # [start:end:step] if __name__ == '__main__':list = [0,1,2,3,4,5,6,7,8,9]print(list[:: ...

  4. 小程序短信验证码登录,1分钟实现小程序发短信功能,借助云开发10行代码实现短信验证码登录小程序

    老规矩先看效果图 普通短信 验证码短信 今天被云开发官方告知,云开发支持发短信功能了,然后就迫不及待的来尝下鲜. 进入官方文档一看,云开发给咱们开发者的福利还真不小. 不仅仅可以很方便的使用短信功能, ...

  5. Python3,10行代码,我把情书写在她的照片里,她被我的才华征服了。

    10行代码把情书写在她的照片里 1.引言 2.Pillow 2.1 Pillow 安装 2.2 Pillow 介绍 2.2.1 新建及保存图片 2.2.2 重新绘制图片 2.2.3 图片合并 2.3 ...

  6. 10行代码制作群聊提醒小助手,再也不怕漏掉消息了

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 胸中有誓深于海,肯使神州竟陆沉? ...

  7. 如何用10行代码设置微信回复功能?

    大家还记得教会父母玩微信是什么时候吗?父母学会后,我们的生活就发生了「质」的变化,父母也许会 吐槽你的微信头像 不好,要你换一个头像.微信对于年轻的我来说就是一个支付工具罢了,要说好玩,花样的我觉得还 ...

  8. 铅笔素描算法_如何用10行代码将任何图像变成铅笔素描

    铅笔素描算法 by Rishav Agarwal 通过里沙夫·阿加瓦尔 如何用10行代码将任何图像变成铅笔素描 (How to turn any image into a pencil sketch ...

  9. 10行代码实现目标检测,请收下这份教程

     翻译 | 林椿眄 编辑 | 阿司匹林 出品 | AI科技大本营(公众号ID:rgznai100) 作为人工智能的一个重要领域,计算机视觉是一门可以识别并理解图像和场景的计算机及软件系统科学.该领 ...

  10. 什么,PyTorch还能开发新药?哈佛推出这款工具包,10行代码训练“药神”模型...

    萧箫 编辑整理 量子位 报道 | 公众号 QbitAI 最近,来自哈佛大学等机构的研究人员,开发出了一个AI"药神"工具包,为加速新冠疫情下的新药研发助力. 这款名为DeepPur ...

最新文章

  1. 使用pv命令限制SQL文本导入速度
  2. SAP UI5 初学者教程之十二 - 使用 CSS 类对 UI 进行进一步美化试读版
  3. CodeForces 731C Socks
  4. rm删除文件显示:Operation not permitted
  5. 如何使用 Serverless Devs 部署静态网站到函数计算(上)
  6. python变量使用前必须先声明、并且一旦声明_初学者学习Python的30天‍-第18天-文件处理...
  7. sublime text3 Package Control 插件安装及推荐(MAC)
  8. OpenStack KVM环境搭建
  9. 舱机器人尾巴毛茸茸_这个毛茸茸的机器人不仅可撸,还会摇尾巴
  10. basic auth java_java发送带Basic Auth使用 httpclient自带的认证方式
  11. 关于苹果手机部分版本机型上传时卡住相册问题记录
  12. EChat(简易聊天项目)三、聊天界面UI实现
  13. Kubernetes实战指南:零宕机无缝迁移Spring Cloud至k8s
  14. Revit二次开发2、RevitAPI、RevitAPIUI及Revit开发三大利器
  15. JAVA-File类与IO流
  16. 会声会影X10中文版序列号32位/64位下载教程
  17. 加载、滑动翻阅大量图片解决方案详解
  18. matlab mda,Matlab的学习最大似然估计,PCA和MDA的一段代码
  19. Python环境配置与数据处理
  20. 物理像素、CSS像素、dip、dpr、ppi、dpi

热门文章

  1. flea-frame-cache使用之Redis接入【旧】
  2. [置顶] 增强型的FLEA_Db_TableDataGateway,提供按字段名称操作的功能
  3. 网络安全——WEP实现无线局域网安全
  4. 如何让机器产生意识之意识具象化
  5. 山东大学项目实训(三十二)—— 科室管理
  6. [导入]冰刃Icesword 1.22测试版发布
  7. 关于 国产麒麟系统使用killall命令杀死模糊匹配进程失败“未找到该进程” 的解决方法
  8. Meebo 和 GMail + Talk 等 WebIM 的实现方式
  9. **51 stm8 arduino esp8266 esp32 stm32 树莓派 等单片机使用对比**
  10. mac iTunes 下载慢,如何加速