Linux 虚拟内存分页效率低?

Linux 虚拟内存分页效率低?,linux,memory-management,virtual-memory,Linux,Memory Management,Virtual Memory,假设我写了一个100MB的程序,我们知道liunx中的虚拟页面默认为4KB。因此,要运行该程序,将有100*1024/4=25600次缓存未命中,考虑到较大的未命中惩罚,这不是非常低效吗?缓存未命中是基于每个缓存线,而不是每个页面发生的。缓存未命中的数量可能更少(如果未使用程序的某些部分,例如用于处理未发生的错误的代码和数据或在特定运行中未使用的功能),也可能更多(当某些部分通过使用其他部分从缓存中移出,并且以后必须重新加载时)。然而,不可能避免至少装载一次每一条使用过的管线。各种策略降低了成本

假设我写了一个100MB的程序,我们知道liunx中的虚拟页面默认为4KB。因此,要运行该程序,将有100*1024/4=25600次缓存未命中,考虑到较大的未命中惩罚,这不是非常低效吗?

缓存未命中是基于每个缓存线,而不是每个页面发生的。缓存未命中的数量可能更少(如果未使用程序的某些部分,例如用于处理未发生的错误的代码和数据或在特定运行中未使用的功能),也可能更多(当某些部分通过使用其他部分从缓存中移出,并且以后必须重新加载时)。然而,不可能避免至少装载一次每一条使用过的管线。各种策略降低了成本。例如,当程序正在做其他工作时,硬件可能会观察到连续的访问并尝试提前加载将来的行。@EricPostphil那么为什么不在开始时一次性将整个程序映射到物理内存中,以避免缓存未命中惩罚呢?你把映射和存储搞混了。不管映射是如何发生的,数据都需要存储在CPU可以直接使用的地方。因此,如果您的程序确实需要100MB的不同数据,那么就无法回避这样一个事实,即该数据的每个字节都需要在某个点上位于缓存(或内存层次结构的某个级别)。@kaylum感谢您的评论。这是一件让我对加载程序感到困惑的事情,因为它只映射整个程序,而没有将它们加载到内存中,所以实际将页面加载到物理内存中会被延迟,直到一条指令访问该地址。所以,为什么不让loader在一开始就将程序的每个虚拟页面加载到物理内存中,以避免缓存未命中的惩罚呢?如果你一个人住在大房子里,你可以做任何你想做的事情。但是,如果你需要与很多人合租,即使是豪宅也会变得拥挤。当然,有一些方法可以预加载数据并将其固定到内存中。这可以用于在狭义定义的环境中需要高性能的特殊用例中。但它不适用于需要满足更多样化的应用程序工作负载的通用操作系统。