其他
你不好奇 CPU 是如何执行任务的?
The following article is from 小林coding Author 小林coding
前言
你清楚下面这几个问题吗?
有了内存,为什么还需要 CPU Cache? CPU 是怎么读写数据的? 如何让 CPU 能读取数据更快一些? CPU 伪共享是如何发生的?又该如何避免? CPU 是如何调度任务的?如果你的任务对响应要求很高,你希望它总是能被先调度,这该怎么办? …
CPU 如何读写数据的?
先来认识 CPU 的架构,只有理解了 CPU 的 架构,才能更好地理解 CPU 是如何读写数据的,对于现代 CPU 的架构图如下:
分析伪共享的问题
避免伪共享的方法
如果在多核(MP)系统里,该宏定义是 __cacheline_aligned,也就是 Cache Line 的大小; 而如果在单核系统里,该宏定义是空的;
CPU 如何选择线程的?
了解完 CPU 读取数据的过程后,我们再来看看 CPU 是根据什么来选择当前要执行的线程。
实时任务,对系统的响应时间要求很高,也就是要尽可能快的执行实时任务,优先级在 0~99 范围内的就算实时任务; 普通任务,响应时间没有很高的要求,优先级在 100~139 范围内都是普通任务级别;
调度类
SCHED_DEADLINE:是按照 deadline 进行调度的,距离当前时间点最近的 deadline 的任务会被优先调度; SCHED_FIFO:对于相同优先级的任务,按先来先服务的原则,但是优先级更高的任务,可以抢占低优先级的任务,也就是优先级高的可以「插队」; SCHED_RR:对于相同优先级的任务,轮流着运行,每个任务都有一定的时间片,当用完时间片的任务会被放到队列尾部,以保证相同优先级任务的公平性,但是高优先级的任务依然可以抢占低优先级的任务;
SCHED_NORMAL:普通任务使用的调度策略; SCHED_BATCH:后台任务的调度策略,不和终端进行交互,因此在不影响其他需要交互的任务,可以适当降低它的优先级。
完全公平调度
于是就有了以下这个公式:
CPU 运行队列
调整优先级
总结
理解 CPU 是如何读写数据的前提,是要理解 CPU 的架构,CPU 内部的多个 Cache + 外部的内存和磁盘都就构成了金字塔的存储器结构,在这个金字塔中,越往下,存储器的容量就越大,但访问速度就会小。
推荐阅读:
小程序签到赢积分兑换书籍入口
👇🏻👇🏻👇🏻