CPU是如何执行任务的?

CPU是如何执行任务的?

  • 一、CPU是如何读取数据的?
    • Cache为伪共享
    • 避免伪共享的方法
  • 二、CPU是如何选择线程的?
    • 任务
    • 任务调度类
    • 调度策略
    • 完全公平调度
    • CPU运行队列
    • 调度类优先级
    • 调整任务优先级

一、CPU是如何读取数据的?

Cache为伪共享

因为多个线程同时读写同⼀个 Cache Line 的不同变量时,而导致 CPU Cache 失效的现象称为伪共享。

避免伪共享的方法

将b的地址设置为Cache Line对齐地址
CPU是如何执行任务的?_第1张图片

二、CPU是如何选择线程的?

任务

在linux中,任务的优先级数值越小,优先级越高

  • 实时任务:优先级0-99范围就算实时任务
  • 普通任务:优先级在100-139

任务调度类

CPU是如何执行任务的?_第2张图片

调度策略

Deadline

  • SCHED_DEADLINE:是按照 deadline 进行调度的,距离当前时间点最近的 deadline 的任务会被优先调度

Realtime

  • SCHED_FIFO:对于相同优先级的任务,按先来先服务的原则,但是优先级更高的任务,可以抢占低优先级的任务,也就是优先级高的可以插队
  • SCHED_RR:对于相同优先级的任务,轮流着运行,每个任务都有⼀定的时间片,当用完时间片的任 务会被放到队列尾部,以保证相同优先级任务的公平性,但是高优先级的任务依然可以抢占低优先级的任务

Fair

  • SCHED_NORMAL:普通任务使⽤的调度策略
  • SCHED_BATCH:后台任务的调度策略,不和终端进行交互,因此在不影响其他需要交互的任务,可 以适当降低它的优先级。

完全公平调度

完全公平调度基于CFS调度算法。
让分配给每个任务的 CPU 时间是⼀样,于是它为每个任务安排⼀个虚拟运行时间 vruntime,如果⼀个任务在运行,其运行的越久,该任务的 vruntime 自然就会越大,而没有被运行的任 务,vruntime 是不会变化的。
在 CFS 算法调度的时候,会优先选择 vruntime 少的任务,以保证每个任务的公平性。

CPU运行队列

⼀个系统通常都会运行着很多任务,多任务的数量基本都是远超 CPU 核心数量,因此这时候就需要排队。
每个 CPU 都有自己的运行队列,用于描述在此 CPU 上所运行的所有进程, 其队列包含三个运行队列,Deadline 运行队列 dl_rq、实时任务运行队列 rt_rq 和 CFS 运行队列 csf_rq,其中 csf_rq 是用红黑树来描述的,按 vruntime大小来排序的,最左侧的叶子节点,就是下次会被调度的任务。

调度类优先级

调度类是有优先级的,优先级如下:Deadline > Realtime > Fair
这意味着 Linux 选择下⼀个任务执行的时候,会按照此优先级顺序进行选择,也就是说先从 dl_rq 里选择任务,然后从 rt_rq ⾥选择任务,最后从 csf_rq里选择任务。因此,实时任务总是会比普通任务优先被执行。

调整任务优先级

如果没有特意去指定优先级的话,默认情况下执行的任务都属于普通任务
如果你想让某个普通任务有更多的执行时间,可以调整任务的 nice 值,从⽽让优先级高⼀些的任务执执行更多时间。nice 的值能设置的范围是 -20~19 ,值越低,表明优先级越高,因此 -20 是最高优先级,19 则是最低优先级,默认优先级是 0。权重值与 nice 值的关系的,nice 值越低,权重值就越大,计算出来的 vruntime 就会 越少,由于 CFS 算法调度的时候,就会优先选择 vruntime 少的任务进行执执行,所以 nice 值越低,任务的优先级就越高。
nice 调整的是普通任务的优先级,所以不管怎么缩小nice 值,任务永远都是普通任务,如果某些任务要求 实时性比较高,那么你可以考虑改变任务的优先级以及调度策略,使得它变成实时任务

你可能感兴趣的:(图解系统,CPU是如何读取数据的,Cache伪共享,任务调度类,完全公平调度,CPU运行队列)