百科问答小站 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? 
  Linux 为什么没发展成 macOS 或者 Windows 那样的大众图形化操作系统? 
  如何看待联想建议使用单独国产 Linux 系统整机方案? 
  倪光南的真实水平和事迹如何? 
  有没有RAM版的U盘? 
  为什么碰到几个做嵌入式开发的人都说做MCU开发没什么意思,要做基于Linux系统的嵌入式开发? 
  如何看待任正非透露鸿蒙是一个「短时延」系统? 
  把操作系统编译结果的机器码更改一位,比如将第一位0改成1或者反之,操作系统还能运行吗? 
  IOI国际金牌是什么水平,在此之上更高的水平是什么样的? 
  为什么开源软件往往都支持Linux/Mac/Windows,而闭源软件往往只支持Win和Mac? 

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





© 2024-05-02 - tinynew.org. All Rights Reserved.
© 2024-05-02 - tinynew.org. 保留所有权利