作者:傻傻的不敢看结5_749 | 来源:互联网 | 2023-05-27 18:50
当cpu正在执行程序时,它是否通过内存管道移动所有数据?然后,任何数据都将从ram-> cache->寄存器中移出,这样所有执行的数据都会在某个时刻进入cpu寄存器.或者它是以某种方式选择它放在那些更快的内存类型中的代码,还是作为程序员选择你想要保留的特定代码,例如,用于优化的缓存?
1> Evil Dog Pie..:
这个问题的答案本身就是一个完整的过程!(通常)发生的非常简短的总结是:
你,程序员,指定RAM中的内容.好吧,编译器会代表您执行此操作,但您可以通过声明变量的方式来控制它.
每当您的代码访问变量时,CPU的MMU将检查该值是否在缓存中,如果不是,则它将从RAM中获取包含该变量的"行"到缓存中.某些CPU指令集可能允许您阻止它执行特定的低频操作(导致停顿),但它需要非常低级别的代码才能执行此操作.更新值时,MMU将执行"缓存刷新"操作,将缓存的内存提交到RAM.同样,您可以通过低级代码影响这种情况发生的方式和时间.它还取决于MMU配置,例如缓存是否是直写等.
如果要对ALU(算术逻辑单元)或类似设备使用的值进行任何类型的操作,则将其从缓存加载到适当的寄存器中.哪个寄存器取决于编译器生成的指令.
某些CPU支持动态内存访问(DMA),它为不需要CPU的操作提供快捷方式.这些包括存储器到存储器的复制以及存储器和存储器映射的外围控制模块(例如UART和其他I/O模块)之间的数据传输.这些将导致数据在RAM中移动,读取或写入,而根本不会实际影响CPU内核.
在更高级别,一些支持多个进程的操作系统将在交换进程时将分配给当前进程的RAM保存到硬盘,并在进程再次运行时再次从磁盘加载.(这就是为什么你可以在C:盘上找到'Page Files'以及限制它们大小的选项.)这允许所有正在运行的进程利用大部分可用的RAM,即使它们实际上不能共享它们同时.分页是另一个值得学习的课程.(感谢Leeor提到这一点.)
1.您指定使用的内容,但操作系统可能决定将其交换到磁盘,因此您无法完全控制它.2.缓存通常以行粒度完成,而不是整页(除少数例外).3.还有scratchpads的概念 - 类似缓存的存储,接近并具有低延迟,但完全由代码控制.
@Leeor好点.1)最初的问题没有提到交换文件或进程内存管理,所以我没有想到这方面,虽然我可能应该考虑O/P的上下文.2)是的,你是对的.在内核模式的ISR期间,缓存未命中的错误导致了我自己的经验,这会导致完全缓存刷新 - 这很糟糕!3)我在工作的(少数)处理器的架构中没有遇到过scratchpads.请随意添加新答案,或编辑我的答案并将其标记为社区维基答案.