Linux 缓存一致性及其解决方案

Linux 缓存一致性及其解决方案,linux,multithreading,Linux,Multithreading,我正在读缓存一致性(,)。据说 具有多个高速缓存的处理器出现高速缓存一致性问题 我的问题是:即使我们在一个处理器中有多个缓存。As内核将根据页面进度表只分配一条缓存线。那么为什么缓存一致性问题会出现?它的解决方案是什么?您误解了缓存的功能以及如何控制它 首先,可以在直接程序(通常是操作系统)控制下启用或禁用缓存,或者(如果它具有写缓存功能)刷新缓存。程序还可以指示缓存预加载(读取)内存的某些区域,因为程序比缓存更了解它接下来需要什么数据 除此之外,高速缓存还充当处理器核心和RAM之间的透明高速缓

我正在读缓存一致性(,)。据说

具有多个高速缓存的处理器出现高速缓存一致性问题


我的问题是:即使我们在一个处理器中有多个缓存。As内核将根据页面进度表只分配一条缓存线。那么为什么缓存一致性问题会出现?它的解决方案是什么?

您误解了缓存的功能以及如何控制它

首先,可以在直接程序(通常是操作系统)控制下启用或禁用缓存,或者(如果它具有写缓存功能)刷新缓存。程序还可以指示缓存预加载(读取)内存的某些区域,因为程序比缓存更了解它接下来需要什么数据

除此之外,高速缓存还充当处理器核心和RAM之间的透明高速缓冲区或高速缓冲区系统。如果我们假设一台带有DDRx RAM内存的标准PC,我们就有一个问题,即DDRx RAM无法以接近处理器可以利用的速度向处理器传送数据。同样,DDRx RAM不能以接近处理器写入速度的速度写入,因此缓存也会缓冲写入的数据(具体方式取决于所选的缓存写入策略设计)

通常,处理器(应用程序)访问RAM内存区域的缓存会假定紧跟其后的RAM也会被访问,并将其预加载到缓存线中。当应用程序想要访问该数据时,它已经在缓存中,程序运行得更快。如果程序不需要它,这意味着缓存不必要地加载了它,浪费了时间和内存系统接口容量,这可能会影响以后的缓存工作

如果处理器需要不在缓存中的数据,则会导致缓存未命中。处理器停止在它的轨道上,直到数据已经从RAM中引入,这可能意味着处理器对于任何数量的CPU时钟周期都不做任何事情,我假设正常情况下是在30到100个周期之间

真正快速的应用程序——通常是以高级电脑游戏的形式出现的——如果它们没有以代码组织(小而紧凑的快速)、数据局部性(数据尽可能小且不分散在所有地方)和尽可能预加载等方式最大限度地利用缓存,那么它们就不会快速。在更高的层次上,您需要良好的设计和算法,但它们也或多或少地与缓存相关

由于您是一名嵌入式程序员,因此情况有所不同。大多数嵌入式处理器都有片上SRAM形式的RAM,没有等待状态。这意味着,从SRAM读取和写入SRAM的速度与处理器所需的速度一样快,也就是说,它永远不需要停下来,因为SRAM与之同步

该处理器还具有比SRAM慢得多的片上闪存。为了补偿这一点,芯片在闪存和CPU之间将有一个读缓存,以便在处理器不必等待数据到达的情况下执行闪存的大部分读取(因为它是只读的)

嵌入式设计可能需要比芯片上可用的RAM更多的RAM。在这些情况下,外部SDRAM或DDRx RAM芯片安装在卡上。现在,您又回到了我为PC描述的RAM情况,在这种情况下,无法足够快地访问外部RAM。此外,外部内存通常通过小于32位宽的数据路径访问,这意味着32位或更大的数据实体在到达处理器之前需要两次或更多的物理访问。同时,处理器等待

回到你原来的问题。嵌入式处理器的SRAM可以由处理器或外围设备进行修改(通常使用处理器无法检测到的DMA)。因为SRAM没有缓存(由于其速度),所以其内容总是最新的。另一方面,如果您在外部安装了具有等待状态的RAM,则需要一个同步功能(称为BIU总线接口单元),以确保(处理器和DMA)以受控方式写入。BIU将执行各种各样的技巧来加快速度,但最终,BIU不是缓存,处理器将不得不等待它,从而减慢速度

_____对第一条评论的答复_____

缓存一致性比这要复杂一些

您可能会认为缓存一致性与维护缓存中某些RAM区域的合理最新副本有关。有几种方法可以更新RAM中的位置。一种是现有的任意数量的内核,例如在大规模并行应用程序中,这些内核对公共内存区域进行读取,同时在共享的内存空间中修改其他内核,但希望不会同时更新

很容易忘记,不仅内核更新RAM。当硬盘控制器被命令将数据读入RAM时,它会以极大的自主性来执行。它将磁头排列在正确的磁盘磁道上,等待磁盘到达该位置,然后开始读取。从磁盘到达的数据被发送到RAM中的某个位置。此操作完成后,控制器中断操作系统以通知其完成

控制器物理上位于主板的“南桥”组件(控制所有外围设备)中,并将从驱动器读取的数据发送到“北桥”组件,该组件与CPU、图形控制器和RAM接口。本说明说明了一种适用于许多处理器但并非所有处理器的设计(AMD的Opteron就是其中之一)

因此,内核需要在其自己的缓存可能已获取的地址处通知RAM数据的任何更改,以加速内核的执行。控制器告诉北桥在哪里写入数据