百科问答小站 logo
百科问答小站 font logo



当页表中的页表项大部分都有效的时候,多级页表还能节省空间吗? 第1页

  

user avatar   bei-ji-85 网友的相关建议: 
      

是会浪费内存。

这个甚至不需要学习多少体系架构的知识,简单算一下就知道了。

已知一页是4K(2^12),32位下,一个页表项(不开启PAE)是4字节(32位),那么页表项消耗的内存正好是实际消耗内存的1/1024(接近千分之一)的水平。千分之一已经很少了,如果开启了大页(2M页/1G页)那么消耗会更少,所以正常使用是无需担心这个问题的。

当然,有一种特殊的情形,是会造成页表项的浪费的:

以32位为例,一个Page table(页表)可以表达1024个页(实际可能是512个,因为主流OS都开启PAE,本文暂不讨论PAE),如果一个page table只映射了一个页,那么剩下的1023个表项就完全浪费了,所以,可以构造一个内存分布方式:从0地址开始,每4M地址分配一个4K页,那么page table就跟实际物理内存一样多了,加上二级表项就更多了。又因为页表项不连续,所以TLB miss的概率很高,所以题主的这种问题是肯定存在的

但真的会有程序这么做吗?正常情况下不会。

实际运行的程序,使用虚地址(也就是开启分页)的主要目的是让数据和代码都是集中在某个内存区域内的,而不是因为内存碎片原因导致数据零散存放。举个例子:我要加载一个1MB的数据到内存,这1MB的数据肯定是连续存放的,不可能出现前面我说的,把1MB拆成256个4K页,然后分散到256*4M的内存区域里存放,真要这么放,写代码操作数据会非常麻烦,每访问4K,就要跳过4M的地址,估计做开发的人会疯了。

而代码段更不可能出现这种情况,代码段都是编译器生成,操作系统加载的,目前没有哪个编译器会发神经把一个完整的可执行程序,拆成一个一个4K的区域然后分散到4M地址上。

所以,除了人为构造这种页表结构以外,看不出实际应用中,会有人遇到这种问题。况且,硬件还提供大页的支持,嫌页表太多,用2M页/1G页就可以避免了。




  

相关话题

  关于Socket API的设计? 
  为什么 Windows 的 Linux 子系统的文件同步和 Windows 不是实时的? 
  网卡是硬件设备,那为什么安装了linux虚拟机,会自带网卡呢,安装虚拟机不是完完全全的软件操作吗? 
  学习 Linux 有哪些好处? 
  德国又一州将尝试完全使用 Linux 和 LibreOffice,对此你有哪些看法? 
  操作系统虚拟地址转换为物理地址是如何避免冲突的? 
  计算机专业大一能写出 Hello World 程序是什么水平? 
  如何评价微软PowerShell将支持SSH? 
  在Linux中如果把Python卸载了系统还能正常运行吗? 
  如果华为自己做手机操作系统,你对这个操作系统有什么建议? 

前一个讨论
私拉局域网是什么意思?自己安装路由器上网算不算私拉局域网?
下一个讨论
为什么目前x86的CPU的L1 Cache这么小?





© 2025-05-26 - tinynew.org. All Rights Reserved.
© 2025-05-26 - tinynew.org. 保留所有权利