cpu 如何决定将哪些数据放入哪些内存(ram、缓存、寄存器)?
How does the cpu decide which data it puts in what memory (ram, cache, registers)?
当cpu执行程序时,它是否通过内存管道移动所有数据?然后任何数据都会从 ram->cache->registers 移动,所以所有被执行的数据都会在某个时候进入 cpu 寄存器。或者它以某种方式 select 将代码放入那些更快的内存类型中,或者作为程序员,您可以 select 您想要保留的特定代码,例如用于优化的缓存吗?
这个问题的答案本身就是一门完整的课程!对(通常)发生的事情的一个非常简短的总结是:
- 你,程序员,指定 RAM 中的内容。好吧,编译器会代表您执行此操作,但您可以通过声明变量的方式来控制它。
- 每当您的代码访问变量时,CPU 的 MMU 将检查该值是否在缓存中,如果不在,则它将从中获取包含该变量的 'line' RAM 进入缓存。某些 CPU 指令集可能允许您阻止它针对特定的低频操作执行此操作(导致停顿),但它需要非常低级的代码才能执行此操作。当您更新一个值时,MMU 将执行 'cache flush' 操作,将缓存内存提交给 RAM。同样,您可以通过低级代码影响这种情况发生的方式和时间。还要看缓存是否write-through等MMU配置
- 如果您要对需要 ALU(算术逻辑单元)或类似设备使用的值进行任何类型的操作,那么它将从缓存中加载到适当的寄存器中。哪个寄存器将取决于编译器生成的指令。
一些 CPU 支持动态内存访问 (DMA),它为不需要 CPU 的操作提供了快捷方式。这些包括内存到内存的复制以及内存和内存映射外设控制块(例如 UART 和其他 I/O 块)之间的数据传输。这些将导致数据在 RAM 中移动、读取或写入,而实际上根本不会影响 CPU 核心。
在更高层次上,一些支持多进程的操作系统会在进程换出时将分配给当前进程的RAM保存到硬盘中,并在进程运行时重新从磁盘加载回来再次。 (这就是为什么您可能会在 C: 驱动器上找到 'Page Files' 以及限制其大小的选项。)这允许所有 运行 进程利用大部分可用 RAM,即使它们不能实际上并没有同时分享。寻呼是另一个值得单独开设一门课程的主题。 (感谢 Leeor 提到这一点。)
当cpu执行程序时,它是否通过内存管道移动所有数据?然后任何数据都会从 ram->cache->registers 移动,所以所有被执行的数据都会在某个时候进入 cpu 寄存器。或者它以某种方式 select 将代码放入那些更快的内存类型中,或者作为程序员,您可以 select 您想要保留的特定代码,例如用于优化的缓存吗?
这个问题的答案本身就是一门完整的课程!对(通常)发生的事情的一个非常简短的总结是:
- 你,程序员,指定 RAM 中的内容。好吧,编译器会代表您执行此操作,但您可以通过声明变量的方式来控制它。
- 每当您的代码访问变量时,CPU 的 MMU 将检查该值是否在缓存中,如果不在,则它将从中获取包含该变量的 'line' RAM 进入缓存。某些 CPU 指令集可能允许您阻止它针对特定的低频操作执行此操作(导致停顿),但它需要非常低级的代码才能执行此操作。当您更新一个值时,MMU 将执行 'cache flush' 操作,将缓存内存提交给 RAM。同样,您可以通过低级代码影响这种情况发生的方式和时间。还要看缓存是否write-through等MMU配置
- 如果您要对需要 ALU(算术逻辑单元)或类似设备使用的值进行任何类型的操作,那么它将从缓存中加载到适当的寄存器中。哪个寄存器将取决于编译器生成的指令。
一些 CPU 支持动态内存访问 (DMA),它为不需要 CPU 的操作提供了快捷方式。这些包括内存到内存的复制以及内存和内存映射外设控制块(例如 UART 和其他 I/O 块)之间的数据传输。这些将导致数据在 RAM 中移动、读取或写入,而实际上根本不会影响 CPU 核心。
在更高层次上,一些支持多进程的操作系统会在进程换出时将分配给当前进程的RAM保存到硬盘中,并在进程运行时重新从磁盘加载回来再次。 (这就是为什么您可能会在 C: 驱动器上找到 'Page Files' 以及限制其大小的选项。)这允许所有 运行 进程利用大部分可用 RAM,即使它们不能实际上并没有同时分享。寻呼是另一个值得单独开设一门课程的主题。 (感谢 Leeor 提到这一点。)