0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

分页方式中可以每个进程分配一个页表吗

麦辣鸡腿堡 来源:程序猿阿星 作者:程序猿阿星 2023-10-09 17:06 次阅读

在分页方式下,每个进程分配一个页表会有什么问题?

不卖关子了,每个进程分配一个页表会有空间上的缺陷,因为操作系统上可以运行非常多的进程,那不就意味着页表数量非常多!

1B(Byte 字节)=8bit, 1KB (Kilobyte 千字节)=1024B, 1MB (Megabyte 兆字节简称“兆”)=1024KB, 1GB (Gigabyte 吉字节 又称“千兆”)=1024MB

以32 位的环境为例,虚拟地址空间范围共有 4GB,假设一个页的大小是 4KB(2^12),那么就需要大约 100 万 (2^20)个页,每个「页表项」需要 4 个字节大小来存储,那么整个 4GB 空间范围的映射就要有 4MB 的内存来存储页表。

4MB看起来不大,但是数量上来了就很恐怖了,假设 100 个进程的话,就需要 400MB 的内存来存储页表,这是非常大的内存了,更别说 64位的环境了。

为了解决空间上的问题,在对分页方式的基础上,进行优化,出现了多级页表方式

多级页表

在前面我们知道了,分页方式在32位环境下,以每页4KB来计算,一共有100万页,「页表项」需要 4
个字节大小来存储,一个页表包含100万个「页表项」,那么每个进程的页表需要占用4MB大小,多级页表要如何解决这种问题呢?

在页表的基础上做一次二级分页,把100万「页表项」分为一级页表「1024个页表项」,「一级页表项」下又关联二级页表「1024个页表项」,这样一级页表的1024个页表项就覆盖到了4GB的空间范围映射,并且二级页表按需加载,这样页表占用的空间就大大降低。

做个简单的计算,假设只有 20% 的一级页表项被用到了,那么页表占用的内存空间就只有 4KB(一级页表) + 20% * 4MB(二级页表)=0.804MB,这对比单级页表的 4MB 是不是一个巨大的节约?

图片

接着思考,在二级的基础上是不是又可以继续分级呢,能分二级,必然也能分三级、四级,在64位操作系统是做了四级分页,分为了四个目录,分别是

全局页目录项

上层页目录项

中间页目录项

页表项

图片

TBL

多级页表虽然解决了空间上的问题,但是我们发现这种方式需要走多道转换才能找到映射的物理内存地址,经过的多道转换造成了时间上的开销。

程序是局部性的,即在一段时间内,整个程序的执行仅限于程序的某一部分。相应的,执行所访问的存储空间也局限于某个内存区域。

操作系统就利用这一特性,把最多使用的几个页表项放到TBL缓存, CPU 在寻址时,会先查 TLB,如果没找到,才会继续查常规的页表,TLB的命中率其实很高的,因为程序最常访问的页就那么几个。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内存
    +关注

    关注

    8

    文章

    2767

    浏览量

    72765
  • 操作系统
    +关注

    关注

    37

    文章

    6284

    浏览量

    121882
收藏 人收藏

    评论

    相关推荐

    Linux内存点滴 用户进程内存空间

    文件VM分配与释放“内存总是被进程占用”,这句话换过来可以这么理解:进程总是需要内存。当fork()或者exec()
    发表于 08-14 16:23

    初学者Linux操作系统的基本结构

    的段后与偏移值进行求和.这个地址(在分页机制开启的前提下),会表示页面,通过寻找到的
    发表于 10-01 19:16

    嵌入式Linux内存管理的些知识点总结

    到硬盘,从硬盘上加载被请求的内存, 然后再重新启动您的进程。这样,每个进程都获得了自己可以使用的地址空间,
    发表于 11-20 14:46

    嵌入式Linux内存管理的些知识点总结

    转存到硬盘,从硬盘上加载被请求的内存, 然后再重新启动您的进程。这样,每个进程都获得了自己可以使用的地址空间,
    发表于 03-24 09:31

    页面与地址变换结构

    进行标号,从0#开始。在为进程分配内存空间时,以为单位,每个内存的块存放一页用户作业。只要内
    发表于 08-02 06:14

    Pads Logic 分页符号图编号显示问题

    请教各位大师Pads Logic VX2.6的问题,分页符号如果打开图编号,有时候就叠在起了,如图所示,很难看,这个能设置吗? 谢谢
    发表于 07-08 11:08

    浅谈对计算机系统内存寻址的理解

    转换前地址的话,那么线性地址则对应了硬件式内存的转换前地址。用分页方法来分配和管理实存。即把整个主存分成大小相等的存储块,可装入作业的任何一页。这样
    发表于 08-22 08:00

    Linux内存系统: Linux 内存分配算法

    分配出去(不属于任何进程),但由于太小了无法分配给申请内存空间的新进程的内存空闲区域3) 组织结构· 把所有的空闲分组为 11
    发表于 08-24 07:44

    Linux内存系统---走进Linux 内存

    每个进程都有完全属于自己的,独立的,不***扰的内存空间;用户态的程序就不能随意操作内核地址空间,具有定的安全保护作用;内核态线程共享内核地址空间; 3、内存地址——MMU 地址转换· MMU
    发表于 08-26 08:05

    如何理解ARM进程

    的。并发性:任何进程可以同其他进程起并发执行独立性:进程
    发表于 10-23 16:02

    鸿蒙内核源码分析(内存分配篇):内存的分配方式有哪些

    解决物理内存满足不了多进程对内存的需要。虚拟内存可以远大于物理内存。虚拟空间是进程层面的概念,每个进程都有
    发表于 11-20 10:07

    鸿蒙内核源码分析(内存分配篇):内存的分配方式有哪些

    (); } else {return NULL; }}代码可以看出初始化对物理内存做了几个动作:1.对整个物理内存进行了分页,每页框4K,存放在大
    发表于 11-20 17:34

    Linux虚拟内存和物理内存的深刻分析

    覆盖,当然如果被覆盖的曾经被修改过,需要将此写回磁盘​ 总结:优点:既然每个
    发表于 05-31 08:00

    LINUX内核的内存是如何进行分配

    gfp_mask);gfp: 分配标志,用于控制kmalloc行为。基于kmalloc实现。分配的内存物理上连续,分配页面(4K),并
    发表于 11-04 14:46

    mybatis逻辑分页和物理分页的区别

    MyBatis是一个开源的Java持久层框架,它与其他ORM(对象关系映射)框架相比,具有更加灵活和高性能的特点。MyBatis提供了两种分页方式,即逻辑分页和物理分页。在本文中,我们
    的头像 发表于 12-03 14:54 443次阅读