百科问答小站 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页就可以避免了。




  

相关话题

  当初Linux的作者想写一个操作系统,结果全世界外国人帮他写完;如今我也想写一个,为啥国内没人帮我? 
  如何看待CentOS 8将于2021年结束支持? 
  linux更新后无法启动时你的心情怎样、第一步怎么做? 
  有大神研究过华为 P40 上的鸿蒙 OS 2.0 吗?事实它到底是个全新的自主操作系统还是个套壳安卓? 
  Fuchsia OS可以从Cast OS保留数据升级,是否说明Fuchsia只是Linux套壳? 
  C语言编写时,将参数传递跨越多个函数的方式是否是妥当的? 
  IOI国际金牌是什么水平,在此之上更高的水平是什么样的? 
  SpaceX 龙飞船中的新触控交互操作系统,意味着什么? 
  如何看待华为称其对 Linux 贡献全球第一,Linux 内核审核员呼吁华为公司不要刷 KPI ? 
  Linux命令行输入whereis mysqlm,没有返回结果,请问怎么回事? 

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





© 2025-04-09 - tinynew.org. All Rights Reserved.
© 2025-04-09 - tinynew.org. 保留所有权利