美文网首页
操作系统中的任务调度 & CPU 内存缓存一致性问题

操作系统中的任务调度 & CPU 内存缓存一致性问题

作者: 光剑书架上的书 | 来源:发表于2021-06-13 15:04 被阅读0次

处理器调度(multiprocessor scheduling)

作系统应该如何在多 CPU上调度工作?会遇到什么新问题?

CPU 根据程序寄存器(PC)加载指令,详码,执行,写回,并对程序计数器更新,周而复始。

但是CPU怎么及时响应硬件来的请求呢?
解决方案:中断机制。CPU有一个引脚就是触发中断的。

1、为了接入不同通常会有中断控制器,不同硬件连接到中断控制器上,每个硬件的中断有一个中断编号IRQ。

2、当一个硬件中断发生时,CPU会根据中断编号查到对应的中断服务处理程序,将当前执行上下文压栈,并将程序计数器设为中断处理程序的地址。这样中断处理程序就抢到了CPU。

3、中断处理完成后,再弹栈,跳回到原来的程序继续执行。

计算机中有一种硬件设备叫时钟,用来让程序按照一定的时间间隔执行特定的逻辑。时钟会产生时钟中断。而多任务操作系统把自己的中断服务处理程序注册到了时钟中断上,这样每隔一定间隔。就可以把 CPU从当前的任务手中抢过来,进行上下文切换后,交给另一个任务。这样就支持多任务"同时"执行了。

缓存一致性(cache coherence)问题

在单CPU系统中,存在多级的硬件缓存(hardware cache),一般来说会让处理器更快地执行程序。缓存是很小但很快的存储设备,通常拥有内存中最热的数据的备份。相比之下,内存很大且拥有所有的数据,但访问速度较慢。通过将频繁访问的数据放在缓存中,系统似乎拥有又大又快的内存。

举个例子,假设一个程序需要从内存中加载指令并读取一个值,系统只有一个CPU,拥有较小的缓存(如64KB)和较大的内存。

程序第一次读取数据时,数据在内存中,因此需要花费较长的时间(可能数十或数百纳秒)。处理器判断该数据很可能会被再次使用,因此将其放入CPU缓存中。如果之后程序再次需要使用同样的数据,CPU会先查找缓存。因为在缓存中找到了数据,所以取数据快得多(比如几纳秒),程序也就运行更快。

缓存是基于局部性(locality)的概念,局部性有两种,即时间局部性和空间局部性。时间局部性是指当一个数据被访问后,它很有可能会在不久的将来被再次访问,比如循环代码中的数据或指令本身。而空间局部性指的是,当程序访问地址为x的数据时,很有可能会紧接着访问x周围的数据,比如遍历数组或指令的顺序执行。由于这两种局部性存在于大多数的程序中,硬件系统可以很好地预测哪些数据可以放入缓存,从而运行得很好。

有趣的部分来了:如果系统有多个处理器,并共享同一个内存,如图所示,会怎样呢?


带缓存的单CPU


两个有缓存的CPU共享内存

事实证明,多CPU的情况下缓存要复杂得多。
例如,假设一个运行在CPU 1上的程序从内存地址A读取数据。
1、由于不在CPU 1的缓存中,所以系统直接访问内存,得到值D。程序然后修改了地址A处的值,只是将它的缓存更新为新值D'
2、将数据写回内存比较慢,因此系统(通常)会稍后再做。
3、假设这时操作系统中断了该程序的运行,并将其交给CPU 2,重新读取地址A的数据,由于CPU 2的缓存中并没有该数据,所以会直接从内存中读取,得到了旧值D,而不是正确的值D'

这一普遍的问题称为缓存一致性(cache coherence)问题。

相关文章

  • JMM 内存模型简析

    高速缓存 cpu(CPU寄存器)<---> CPU高速缓存 <---> 主内存RAM 缓存一致性问题:多个处理器的...

  • 操作系统中的任务调度 & CPU 内存缓存一致性问题

    处理器调度(multiprocessor scheduling) 作系统应该如何在多 CPU上调度工作?会遇到什么...

  • 深入理解Java内存模型

    CPU与缓存一致性问题 我们都应该知道线程是 CPU 调度的最小单位,线程中的字节码指令最终都是在 CPU 中执行...

  • 多线程安全问题:可见性、原子性、有序性

    引言 CPU缓存与内存产生的一致性问题 CPU时间片切换产生的原子性问题 CPU指令编译优化产生的有序性问题 并发...

  • Linux - 进程调度

    介绍 进程调度算法也称 CPU 调度算法,毕竟进程是由 CPU 调度的。 当 CPU 空闲时,操作系统就选择内存中...

  • (1)进程调度算法

    也称 CPU 调度算法:CPU空闲时,操作系统给内存中「就绪」进程分配 CPU 1、什么时候会发生CPU调度?进程...

  • java多线程-3-volatile

    缓存一致性问题 起因:高速缓存 方案总线LOCK#锁,释放锁前该块内存无法被别的cpu或线程访问缓存一致性协议(I...

  • 01 并发编程的问题根源

    问题根源: 1. 可见性问题:多核 CPU 缓存导致 由于硬件之间访问速度的差异,CPU 会从内存中读取数据并缓存...

  • 内存模型

    内存模型 解决什么问题 问了解决三个问题:缓存一致性、处理器优化和指令重排 缓存一致性问题 单线程。cpu核心的缓...

  • 第一章-并发基础

    cpu多级缓存- 缓存一致性 cpu多级缓存- 乱序执行优化 JAVA内存模型【java Memory Model...

网友评论

      本文标题:操作系统中的任务调度 & CPU 内存缓存一致性问题

      本文链接:https://www.haomeiwen.com/subject/dbqieltx.html