百科问答小站 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 怎么样? 
  面试了个985的计算机应届生,还比不过个专科生,读985的计算机专业有什么用? 
  学习 Linux 有哪些好处? 
  华为的鸿蒙系统能成功吗? 
  如何解决windows上用fwrite()向文件写入内容时末尾的 问题? 
  为何linux安装程序会很麻烦? 
  Linux 内核的 C 代码风格是怎样的? 
  Android为什么不直接执行Linux的程序?而是自己搞一套? 
  汉字在计算机中的表示方式有哪些? 
  用到了高版本Qt库,但Ubuntu更新不到那么高的Qt版本,自己拷贝高版本Qt库过去又有问题,怎么办? 

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





© 2025-01-18 - tinynew.org. All Rights Reserved.
© 2025-01-18 - tinynew.org. 保留所有权利