Memory cpu如何决定将哪些数据放入哪个内存(ram、缓存、寄存器)?

Memory cpu如何决定将哪些数据放入哪个内存(ram、缓存、寄存器)?,memory,cpu,computer-architecture,Memory,Cpu,Computer Architecture,当cpu执行一个程序时,它是否通过内存管道移动所有数据?然后,任何一段数据都会从ram->cache->registers中移出,这样所有执行的数据都会在某个时刻进入cpu寄存器。或者,它是否以某种方式选择了放入那些更快内存类型的代码,或者作为程序员,您是否可以选择要保留在缓存中的特定代码,例如,用于优化的代码?这个问题的答案本身就是一个完整的过程!对(通常)发生的事情的一个非常简短的总结是: 您,程序员,指定RAM中的内容。嗯,编译器是代表您来做的,但是您可以通过如何声明变量来控制它 每当代码

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

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

  • 您,程序员,指定RAM中的内容。嗯,编译器是代表您来做的,但是您可以通过如何声明变量来控制它
  • 每当代码访问变量时,CPU的MMU都会检查该值是否在缓存中,如果不在缓存中,则会将包含该变量的“行”从RAM提取到缓存中。某些CPU指令集可能允许您防止它对特定的低频操作执行此操作(导致暂停),但它需要非常低级别的代码才能执行此操作。更新值时,MMU将执行“缓存刷新”操作,将缓存内存提交到RAM。同样,您可以通过低级代码影响这种情况发生的方式和时间。它还将取决于MMU配置,例如缓存是否是直写的,等等
  • 如果要对该值执行任何类型的操作,需要ALU(算术逻辑单元)或类似设备使用该值,则该值将从缓存加载到适当的寄存器中。哪个寄存器取决于编译器生成的指令
  • 一些CPU支持动态内存访问(DMA),这为不需要CPU参与的操作提供了快捷方式。这些包括内存到内存的拷贝以及内存和内存映射外围控制块(如UART和其他I/O块)之间的数据传输。这将导致数据在RAM中移动、读取或写入,而不会实际影响CPU核心


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

    这取决于您使用的CPU、编程语言和许多其他因素。请你提供一个具体的例子,以及关于处理器语言和编译器的更多信息好吗?@MikeofSST我没有一个具体的例子,我正在学习一个OS类,这些问题突然出现在我的脑海中。我并没有真正考虑这方面的不同实现,我只是在寻找一个更一般的答案(如果有)或一个例子。如果我们假设目标处理器有多个寄存器、一个数据缓存和一个内存管理单元,就像你在大多数CPU上发现的那样,它适合承载一个相当大的操作系统,例如Linux或Windows的一个变体,那么一个好的优化编译器和相关的OS API库将为您处理这一切。如果您通过使用汇编或其他低级语言“隐藏”了一点,那么您可以显式地影响数据存储位置、缓存等。您指定使用什么,但操作系统可能会决定将其交换到磁盘,因此您无法完全控制它。2.缓存通常是在行粒度中完成的,而不是整个页面(除了少数例外)。3.还有ScratchPad的概念,它是一种类似缓存的存储,接近并具有低延迟,但完全由代码或优点控制。1) 最初的问题没有提到交换文件或进程内存管理,所以我没有考虑这方面,尽管考虑到O/P的上下文,我可能应该考虑。2) 是的,你说得对。我自己的经验已经被内核模式下ISR期间缓存未命中的罪恶所扭曲,这会导致完全缓存刷新-呜呜!3) 在我所研究的(少数)处理器的体系结构中,我没有遇到草稿行。请随意添加一个新答案,或者编辑我的答案,并将其标记为社区维基答案。好吧,正如你所说,这个问题太广泛了,所以我会解决这些小的更正。这实际上是一个很好的答案,+1:)