【问题标题】:How does the cpu decide which data it puts in what memory (ram, cache, registers)?cpu 如何决定将哪些数据放入哪个内存(内存、缓存、寄存器)?
【发布时间】:2015-01-08 12:06:52
【问题描述】:

cpu 在执行程序时,是否会通过内存管道移动所有数据?然后任何数据都将从 ram->cache->registers 移动,因此所有执行的数据都会在某个时候进入 cpu 寄存器。还是它会以某种方式选择它放入那些更快的内存类型的代码,或者作为程序员,您是否可以选择您想要保留的特定代码,例如用于优化的缓存?

【问题讨论】:

  • 这取决于您使用的 CPU、编程语言和许多其他因素。请您提供一个具体示例,以及有关处理器语言和编译器的更多信息吗?
  • @MikeofSST 我没有具体的例子,我正在学习操作系统课程,这些都是我脑海中闪现的问题。我并没有真正考虑过对此的不同实现,如果存在或示例,我正在寻找更通用的答案。
  • 如果我们假设目标处理器有多个寄存器、一个数据缓存和一个内存管理单元,就像您在大多数适合托管相当大的操作系统(例如 Linux)的 CPU 上发现的那样或其中一个 Windows 变体,然后一个好的优化编译器和相关的 OS API 库将为您处理这一切。如果您通过使用汇编或其他低级语言稍微了解一下“幕后”,那么您可以显式影响数据存储位置、缓存等。

标签: memory cpu computer-architecture


【解决方案1】:

这个问题的答案本身就是一门完整的课程! (通常)发生的事情的一个非常简短的总结是:

  1. 您,程序员,指定 RAM 中的内容。好吧,编译器会代表您执行此操作,但您可以通过声明变量的方式来控制它。
  2. 每当您的代码访问一个变量时,CPU 的 MMU 将检查该值是否在缓存中,如果不在,它将从 RAM 中获取包含该变量的“行”到缓存中。某些 CPU 指令集可能允许您阻止它为特定的低频操作执行此操作(导致停顿),但它需要非常低级的代码来执行此操作。当您更新一个值时,MMU 将执行“缓存刷新”操作,将缓存的内存提交到 RAM。同样,您可以通过低级代码影响这种情况发生的方式和时间。它还将取决于 MMU 配置,例如缓存是否为直写等。
  3. 如果您要对需要 ALU(算术逻辑单元)或类似设备使用的值进行任何类型的操作,那么它将从缓存加载到适当的寄存器中。哪个寄存器取决于编译器生成的指令。

一些 CPU 支持动态内存访问 (DMA),它为不需要 CPU 参与的操作提供了快捷方式。这些包括内存到内存的复制以及内存和内存映射的外围控制块(例如 UART 和其他 I/O 块)之间的数据传输。这些将导致数据在 RAM 中移动、读取或写入,而不会真正影响 CPU 内核。

在更高的层次上,一些支持多进程的操作系统会在进程被换出时将分配给当前进程的 RAM 保存到硬盘中,并在进程再次运行时从磁盘重新加载。 (这就是为什么您可能会在 C: 驱动器上找到“页面文件”以及限制其大小的选项。)这允许所有正在运行的进程利用大部分可用 RAM,即使它们实际上不能共享所有 RAM同时地。分页是另一个值得单独学习的主题。 (感谢Leeor 提到这一点。)

【讨论】:

  • 1.您指定要使用的内容,但操作系统可能会决定将其交换到磁盘,因此您不能完全控制它。 2. 缓存通常以行粒度完成,而不是整页(有少数例外)。 3. 还有暂存器的概念——一种类似缓存的存储,接近且具有低延迟,但完全由代码控制。
  • @Leeor 好点。 1)最初的问题没有提到交换文件或进程内存管理,所以我没有考虑这方面,尽管考虑到 O/P 的上下文,我可能应该有。 2)是的,你是对的。我自己的经验被内核模式下的 ISR 期间缓存未命中的邪恶所扭曲,这会导致完全缓存刷新 - 哎呀! 3)我没有在我研究过的(少数)处理器的架构中遇到暂存器。请随时添加新答案,或编辑我的答案并将其标记为社区 wiki 答案。
  • 好吧,正如你所说,这个问题太宽泛了,所以我会解决这些小修正。这实际上是一个很好的答案,+1 :)
猜你喜欢
  • 2016-06-15
  • 2021-09-06
  • 1970-01-01
  • 2013-01-08
  • 2011-12-31
  • 2021-02-09
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
相关资源
最近更新 更多