Memory cpu如何决定将哪些数据放入哪个内存(ram、缓存、寄存器)?
当cpu执行一个程序时,它是否通过内存管道移动所有数据?然后,任何一段数据都会从ram->cache->registers中移出,这样所有执行的数据都会在某个时刻进入cpu寄存器。或者,它是否以某种方式选择了放入那些更快内存类型的代码,或者作为程序员,您是否可以选择要保留在缓存中的特定代码,例如,用于优化的代码?这个问题的答案本身就是一个完整的过程!对(通常)发生的事情的一个非常简短的总结是:Memory cpu如何决定将哪些数据放入哪个内存(ram、缓存、寄存器)?,memory,cpu,computer-architecture,Memory,Cpu,Computer Architecture,当cpu执行一个程序时,它是否通过内存管道移动所有数据?然后,任何一段数据都会从ram->cache->registers中移出,这样所有执行的数据都会在某个时刻进入cpu寄存器。或者,它是否以某种方式选择了放入那些更快内存类型的代码,或者作为程序员,您是否可以选择要保留在缓存中的特定代码,例如,用于优化的代码?这个问题的答案本身就是一个完整的过程!对(通常)发生的事情的一个非常简短的总结是: 您,程序员,指定RAM中的内容。嗯,编译器是代表您来做的,但是您可以通过如何声明变量来控制它 每当代码
在更高的级别上,一些支持多个进程的操作系统将在交换进程时将分配给当前进程的RAM保存到硬盘,并在进程再次运行时从磁盘重新加载。(这就是为什么您可以在C:驱动器上找到“页面文件”以及限制其大小的选项。)这允许所有正在运行的进程利用大部分可用RAM,即使它们实际上无法同时共享。分页是另一门值得单独学习的学科。(感谢您的提醒。)这取决于您使用的CPU、编程语言和许多其他因素。请你提供一个具体的例子,以及关于处理器语言和编译器的更多信息好吗?@MikeofSST我没有一个具体的例子,我正在学习一个OS类,这些问题突然出现在我的脑海中。我并没有真正考虑这方面的不同实现,我只是在寻找一个更一般的答案(如果有)或一个例子。如果我们假设目标处理器有多个寄存器、一个数据缓存和一个内存管理单元,就像你在大多数CPU上发现的那样,它适合承载一个相当大的操作系统,例如Linux或Windows的一个变体,那么一个好的优化编译器和相关的OS API库将为您处理这一切。如果您通过使用汇编或其他低级语言“隐藏”了一点,那么您可以显式地影响数据存储位置、缓存等。您指定使用什么,但操作系统可能会决定将其交换到磁盘,因此您无法完全控制它。2.缓存通常是在行粒度中完成的,而不是整个页面(除了少数例外)。3.还有ScratchPad的概念,它是一种类似缓存的存储,接近并具有低延迟,但完全由代码或优点控制。1) 最初的问题没有提到交换文件或进程内存管理,所以我没有考虑这方面,尽管考虑到O/P的上下文,我可能应该考虑。2) 是的,你说得对。我自己的经验已经被内核模式下ISR期间缓存未命中的罪恶所扭曲,这会导致完全缓存刷新-呜呜!3) 在我所研究的(少数)处理器的体系结构中,我没有遇到草稿行。请随意添加一个新答案,或者编辑我的答案,并将其标记为社区维基答案。好吧,正如你所说,这个问题太广泛了,所以我会解决这些小的更正。这实际上是一个很好的答案,+1:)