是不是觉得 nice 值的范围很诡异?事实上 , nice 值并不是表示优先级 , 而是表示优先级的修正数值 , 它与优先级(priority)的关系是这样的:priority(new) = priority(old) + nice 。内核中 , priority 的范围是 0~139 , 值越低 , 优先级越高 , 其中前面的 0~99 范围是提供给实时任务使用的 , 而 nice 值是映射到 100~139 , 这个范围是提供给普通任务用的 , 因此 nice 值调整的是普通任务的优先级 。

文章插图
在前面我们提到了 , 权重值与 nice 值的关系的 , nice 值越低 , 权重值就越大 , 计算出来的 vruntime 就会越少 , 由于 CFS 算法调度的时候 , 就会优先选择 vruntime 少的任务进行执行 , 所以 nice 值越低 , 任务的优先级就越高 。
我们可以在启动任务的时候 , 可以指定 nice 的值 , 比如将 MySQLd 以 -3 优先级:

文章插图
如果想修改已经运行中的任务的优先级 , 则可以使用 renice 来调整 nice 值:

文章插图
nice 调整的是普通任务的优先级 , 所以不管怎么缩小 nice 值 , 任务永远都是普通任务 , 如果某些任务要求实时性比较高 , 那么你可以考虑改变任务的优先级以及调度策略 , 使得它变成实时任务 , 比如:

文章插图

文章插图
总结理解 CPU 是如何读写数据的前提 , 是要理解 CPU 的架构 , CPU 内部的多个 Cache + 外部的内存和磁盘都就构成了金字塔的存储器结构 , 在这个金字塔中 , 越往下 , 存储器的容量就越大 , 但访问速度就会小 。
CPU 读写数据的时候 , 并不是按一个一个字节为单位来进行读写 , 而是以 CPU Line 大小为单位 , CPU Line 大小一般是 64 个字节 , 也就意味着 CPU 读写数据的时候 , 每一次都是以 64 字节大小为一块进行操作 。
因此 , 如果我们操作的数据是数组 , 那么访问数组元素的时候 , 按内存分布的地址顺序进行访问 , 这样能充分利用到 Cache , 程序的性能得到提升 。但如果操作的数据不是数组 , 而是普通的变量 , 并在多核 CPU 的情况下 , 我们还需要避免 Cache Line 伪共享的问题 。
所谓的 Cache Line 伪共享问题就是 , 多个线程同时读写同一个 Cache Line 的不同变量时 , 而导致 CPU Cache 失效的现象 。那么对于多个线程共享的热点数据 , 即经常会修改的数据 , 应该避免这些数据刚好在同一个 Cache Line 中 , 避免的方式一般有 Cache Line 大小字节对齐 , 以及字节填充等方法 。
系统中需要运行的多线程数一般都会大于 CPU 核心 , 这样就会导致线程排队等待 CPU , 这可能会产生一定的延时 , 如果我们的任务对延时容忍度很低 , 则可以通过一些人为手段干预 Linux 的默认调度策略和优先级 。
【你不好奇 CPU 是如何执行任务的?】
推荐阅读
- 一口气看完45个寄存器,CPU核心技术大揭秘
- CPU越来越热吗 一文带你看懂怎么选
- 2020年 你到底需要什么样的CPU来满足你的日常使用呢?
- 关于路由器的2.4G以及5G,你不知道的那些事
- CPU处理器|打造下一个ASML?荷兰投资77亿元研发硅光子芯片技术
- CPU针脚密密麻麻,几千根针脚坏了一两个竟然还能点亮?
- 因为没选对CPU,小万元的3080废了!论电脑CPU如何选购
- i3,i5,i7的cpu到底有什么区别?
- JVM常见线上问题 → CPU 100%、内存泄露 问题排查
- 都是芯片 为什么电脑CPU不能用在手机里
