四象限法进程调度
周二收到一篇推送 一次云上网络毫秒级的优化与实践,很有意义的实践和探索,建议阅读,文章不长,没有冗长的源码分析,结论很清晰。
谈谈我的看法。
多少有种感觉,Linux 越来越像个响应系统而不是服务器。
虚拟化容器,计算存储,RPC 微服务,cache 数据库,大包吞吐,小包时延,虽没有接鼠标键盘,但这些对响应时间的要求远大于鼠标键盘,Linux 早就不仅仅承载高并发,大吞吐了。但 Linux kernel 调度器并没有为此做好准备。
再说绑核。
原文中也提到,不绑核就 OK 了。往大了说,绑核是自废武功的行为。绑核用弹性换性能,但有时丢了弹性不说,反而劣化性能,如原文所举实例:
网络协议栈收包软中断以一种奇怪的方式执行,在任意上下文中它是高优的,但它同时也可以在 ksoftirqd 中以普通 task 执行,取决于不确定。
softirq 之所以在非 ksoftirqd 上下文执行时获得更高权重,完全仗着它是被 hardirq 带飞的,softirq 在 irq_exit 时狐假虎威而已,一旦进入 ksoftirqd 上下文就泯然众人。
Linux kernel 调度器自 CFS 以来没有大动作,一直基于优先级摊大饼,配合启发算法作 workaround,这非常适合服务器,但不利用快速响应,如今云主机需要比桌面环境更花式的响应度,摊大饼策略肯定有问题。
摊大饼对所有 task_struct 一视同仁,仅做优先级区分,无法区分紧急性和重要性维度,紧急性需立即响应,而重要性需赋予更多时间片,这就是四象限时间管理。
Windows 采用了类四象限法调度,为一类不同事件赋予了不同的响应优先级。比如鼠标键盘优先磁盘被响应,而绘制请求优先于声音,因此它作为桌面才优秀。详见早期的一篇文章:Linux 桌面为何卡顿。
显然,网络收包无论从紧急性还是重要性看,都要比进程权重更高。可 Linux kernel 在这方面表现很随意。
即使取消 ksoftirqd 的执行判断用硬调用 softirq 来替换也没有解决根本问题,硬调用虽解放了收包 softirq,却又损害了其它 task 的弹性,如果进程真的既紧急又重要(我是说如果),硬调用 softirq 和绑核没本质区别。如果有其它不紧急也不重要的 softirq,取消 ksoftirqd 反而有问题,此时需要区别对待网络子系统,而这又是 workaround。
并不是所有进程都不紧急不重要,也不是所有 softirq 都高优,除这两者外,系统中难免出现别的 task,有些需保障固定时间,有些需固定时间比例,有些需第一时间响应,有些则微不足道。依靠 Linux kernel 现有的 sched_class + interrupt 调度体系根本无法区分对待以上的细粒度。
比如拉屎,无论再忙,有些人拉屎时间总固定在 2 分钟,而另一些人则固定在 30 分钟,而不是忙时 2 秒,闲时 30 分钟。拉屎是一个紧急任务,相对拉屎,工作则是重要任务,但依然要把固定时间让给拉屎,无论工作再满,拉屎时间也不能无限挤压,况且,对于一部分人,拉屎不但紧急,而且重要。
Linux kernel 不知道一个进程是不是仅在一个时间段有密集 IO 行为的 CPU 型,不知道进程被唤醒是因为键盘,还是无关紧要的信号,Linux kernel 只能启发预测,但这并不可靠。
同 TCP 端到端 cc,Linux kernel 追求简单,通用,高效的调度算法,看不上对额外信息有所依赖的算法,笃信所谓纯粹技术含量,这绝对是自视清高庸人自扰,他们假装不知道,高效是尽可能精确的信息堆起来的,信息量有上限,误判后的补偿必然损失效率,换句话说就是启发必有概率误判,而误判则带来时间的浪费。
端到端原则和 Linux kernel 社区的这种态度如出一辙,背后的缘由可能是对成本看不上,对定制看不上。
简单看看 ntddk.h 的部分定制化优先级提升值:
// Priority increment definitions. The comment for each definition gives
// the names of the system services that use the definition when satisfying
// a wait.
//
// Priority increment used when satisfying a wait on an executive event
// (NtPulseEvent and NtSetEvent)
#define EVENT_INCREMENT 1
//
// Priority increment when no I/O has been done. This is used by device
// and file system drivers when completing an IRP (IoCompleteRequest).
#define IO_NO_INCREMENT 0
//
// Priority increment for completing CD-ROM I/O. This is used by CD-ROM device
// and file system drivers when completing an IRP (IoCompleteRequest)
#define IO_CD_ROM_INCREMENT 1
//
// Priority increment for completing disk I/O. This is used by disk device
// and file system drivers when completing an IRP (IoCompleteRequest)
#define IO_DISK_INCREMENT 1
//
// Priority increment for completing keyboard I/O. This is used by keyboard
// device drivers when completing an IRP (IoCompleteRequest)
#define IO_KEYBOARD_INCREMENT 6
//
// Priority increment for completing mailslot I/O. This is used by the mail-
// slot file system driver when completing an IRP (IoCompleteRequest).
#define IO_MAILSLOT_INCREMENT 2
//
// Priority increment for completing mouse I/O. This is used by mouse device
// drivers when completing an IRP (IoCompleteRequest)
#define IO_MOUSE_INCREMENT 6
//
// Priority increment for completing named pipe I/O. This is used by the
// named pipe file system driver when completing an IRP (IoCompleteRequest).
#define IO_NAMED_PIPE_INCREMENT 2
//
// Priority increment for completing network I/O. This is used by network
// device and network file system drivers when completing an IRP
// (IoCompleteRequest).
// 网卡IO之所以优先级提升并不是很多,是因为首先网卡是有队列缓存的,而大多数的报文都是burst而来的,
// 队列缓存可以平滑掉首包延迟,其次,由于光速极限,相比于网络延迟,主机调度延迟真的可以忽略不计。
#define IO_NETWORK_INCREMENT 2
//
// Priority increment for completing parallel I/O. This is used by parallel
// device drivers when completing an IRP (IoCompleteRequest)
#define IO_PARALLEL_INCREMENT 1
//
// Priority increment for completing serial I/O. This is used by serial device
// drivers when completing an IRP (IoCompleteRequest)
#define IO_SERIAL_INCREMENT 2
//
// Priority increment for completing sound I/O. This is used by sound device
// drivers when completing an IRP (IoCompleteRequest)
#define IO_SOUND_INCREMENT 8
//
// Priority increment for completing video I/O. This is used by video device
// drivers when completing an IRP (IoCompleteRequest)
#define IO_VIDEO_INCREMENT 1
//
// Priority increment used when satisfying a wait on an executive semaphore
// (NtReleaseSemaphore)
#define SEMAPHORE_INCREMENT 1
这绝不是 Linux kernel 风格,Linux kernel 总希望在统一的优先级调度框架下解决问题,看不上引入额外信息增强定制。类似的,在处理 TCP cc 时,当我建议利用底层链路信息及 application 信息做决策,也经常被鄙视。不是得不到这些信息,如果得到了,大家会用吗?可能不会,这就是看不上。纯程序员笃信闭环,对外部信息的以来颇为不屑。
我觉得理想的调度器应该类似四象限时间管理法。在传统的重要性优先级外扩展一个紧急优先级就是了:

转换到二维坐标系,y 轴表示重要性,x 轴表示时间片,每个三角形表示一个任务的执行,下图是图示及一个例子:

所有 task 展示为各种形状的三角形,这些三角形以图示实例方式不断抢占执行,更矮的三角形被更高的三角形切割,最终什么也不耽误,既能体现紧急程度,又能体现重要性。即使绑核,紧急且重要的 task 仍可获得足够的 CPU 时间,整体看,三角形越宽,获得 CPU 总时间越多,三角形越高,越优先执行。
大概就是 Windows 的样子,优先级在不同事件后根据其紧急性获得不同提升,然后再根据其重要性以负相关的不同速度下降。
注意到 Linux kernel 曾为实时性引入中断线程化,但在现有调度机制下,很难为中断线程适配一个合适的执行权重,但采用上述四象限方法就很容易解决这问题。
Windows,Linux 哪个更好,我没有答案,但有一点很明确,Linux kernel 并非什么都对,但如今它拥有庞大但逐渐封闭的圈子,以至于 Linux kernel 涉及的一切 “越来越合理”,以至于争论不得。本文只谈观点,无意涉足名利场,有时间还是更多聊聊 TCP/IP。
浙江温州皮鞋湿,下雨进水不会胖。
相关文章:
四象限法进程调度
周二收到一篇推送 一次云上网络毫秒级的优化与实践,很有意义的实践和探索,建议阅读,文章不长,没有冗长的源码分析,结论很清晰。 谈谈我的看法。 多少有种感觉,Linux 越来越像个响应系统而不是服务器。 虚…...
蓝桥杯拿到一等奖,并分享经验
昨天和群里的小伙伴在群里聊,有的小伙伴竟然说蓝桥杯一等奖没有含量,我也是醉了! 就像去年看了一个号主写的:研究生遍地都是! 放眼全国14亿人口,别说研究生了,本科生占比有多少? “蓝桥杯是我人生中得到…...
vue3。 Cannot use JSX unless the ‘–jsx’ flag is provided. ts(17004)
react用tsx或者jsx很常见,也有配套的配置 那如果是vue呢? 默认是没问题的,可是我用了jsdoc,并开启了checkjs,然后vscode就爆红了 谷歌,百度,一个晚上 查到的答案: 推荐我新增tsco…...
HVV面试题目总结
蓝队 如何识别安全设备中的无效告警? 常见的端口有哪些? 这些端口对应的服务是什么? 针对这些服务,红队攻击方式有哪些? 常用的威胁情报平台有哪些? 有没有做过关于情报输出的工作? 木马驻留系统的方式有哪些? 当收到钓鱼邮件的时候,说说处置思路…...
Access denied for user ‘root‘@‘localhost‘ (using password:YES) 解决方案
文章目录 问题描述解决方案: 问题描述 Access denied for user ‘root’‘localhost’:拒绝用户’root’localhost’的访问。 出现这个报错语句的一般原因是输入了错误的密码,也有可能是是root帐户默认不开放远程访问权限。 相关的解决方法是重新设置…...
为什么C++这么复杂还不被淘汰?
C是一门广泛使用的编程语言,主要用于系统和应用程序的开发。尽管C具有一些复杂的语法和概念,但它仍然是编程界的重量级选手,在编程语言排行榜中一直位居前列。为什么C这么复杂还不被淘汰呢? C有以下优势 1、C具有高性能 C是一门编…...
内存泄漏的原因,内存泄漏如何避免?内存泄漏如何定位?
1. 内存溢出 内存溢出 OOM (out of memory),是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个int,但给它存了long才能存下的数,那就是内存溢出。 2. 内存泄…...
关于全志T113开发板接7寸LCD屏幕显示异常问题的解决方案
在入手全志T113之后,第一时间移植好了之前6ull平台的rootfs。但是在测试QT的过程中发现屏幕最右侧有一部分显示不正常,经过初步推测应该是RGB行场同步时序有问题。本以为在设备树里面稍作修改之后就能OK,但是居然前前后后一共花了至少三个星期…...
SpringMVC第四阶段:Controller中如何接收请求参数
Controller中如何接收请求参数 1、原生API参数类型 1.1、HttpServletRequest类 只需要在Controller的目标方法中, 直接写上HttpServletRequest对象即可获取 原生API的 request对象实例。 RequestMapping(value "/p1") public String param1(HttpServletRequest …...
第三十回: LisvtView响应事件
我们在上一章回中介绍了如何给ListView添加分隔线,本章回中将介绍ListView响应事件相关的知识.闲话休提,让我们一起Talk Flutter吧。 概念介绍 我们在这里说的ListView响应事件主要分两种类型: 一种是滑动ListView时ListView做出响应,我们…...
重磅!用友荣登全球5强
近日,全球权威信息技术研究和顾问公司Gartner发布《Market Share: All Software Markets, Worldwide,2022》报告,用友在EAM(资产管理)市场再创新高,市场占有率位居全球第五位,亚太第一位&#x…...
计算机组成原理实验报告二-认识汇编语言
实验资料: https://wwpv.lanzoue.com/b05drqjef 密码:d19t 使用txt文档编写下面C源码,文档命名为【学号_hello.c】并使用Mingw工具(是 Minimalist GNU for Windows的缩写)的bin文件夹下gcc.exe带选项编译()…...
都说计算机今年炸了,究竟炸到什么程度呢?
近期,最大的计算机领域新闻莫过于Intel CPU严重漏洞曝光。该漏洞被称为“Meltdown”和“Spectre”,几乎涵盖了所有使用Intel芯片的计算机,包括PC、笔记本电脑、服务器和移动设备。 Meltdown漏洞的主要风险是黑客可以利用此漏洞访问操作系统的…...
0Ω的电阻作用
0欧姆电阻即电阻标值为0欧姆的电阻,多用于PCB设计等方面,是一种理想电阻。那0欧姆电阻是表示没有电阻吗?当然不是,0欧姆电阻的阻值不是0欧姆,只是接近0欧姆。 1、调试方便或者兼容设计:可以选择器件、功能…...
02 PostGIS常用空间分析函数
常用的PostGIS空间分析函数清单: 序号函数名描述示例1ST_AsText(geometry)将几何对象转换为文本形式的WKT字符串ST_AsText(ST_GeomFromText(‘POINT(1 2)’)) 返回 ‘POINT(1 2)’2ST_GeometryType(geometry)返回几何对象的类型,如POINT、LINESTRING、P…...
[Golang] 管理日志信息就用Zap包
😚一个不甘平凡的普通人,致力于为Golang社区和算法学习做出贡献,期待您的关注和认可,陪您一起学习打卡!!!😘😘😘 🤗专栏:算法学习 &am…...
【pytest】执行环境切换的两种解决方案
一、痛点分析 在实际企业的项目中,自动化测试的代码往往需要在不同的环境中进行切换,比如多套测试环境、预上线环境、UAT环境、线上环境等等,并且在DevOps理念中,往往自动化都会与Jenkins进行CI/CD,不论是定时执行策略…...
2023国赛tomcat题
环境: 10.10.120.128 安装 tomcaA 10.10.120.129 安装tomcatB 10.10.120.130 安装 nginx 配置dns: 正向解析 反向解析 Tomcat ssl配置 [root@localhost ~]# tar -zxvf jdk-11.0.8_linux-x64_bin.tar.gz [root@localhost ~]# mv jdk-11.0.8 /usr/local/ Vim /etc/profile …...
计算机视觉——day 92 基于跨领域协作学习的单图像去雨
基于跨领域协作学习的单图像去雨 1. Introduction3. Proposed method3.1 网络架构 4. Experiments and results4.1 数据集和指标4.3 合成图像的结果4.8 建模复杂度和运行时间 5. Conclusion 1. Introduction 深度卷积神经网络(DCNN)在图像解析任务中取得了优异的性能。然而&am…...
Java 正则表达式
Java 正则表达式 正则表达式定义了字符串的模式。 正则表达式可以用来搜索、编辑或处理文本。 正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。 示例 boolean b String.matches(String regex) ;regex 有2种形式: 字符串 直接就是一…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
