Linux 内存管理 pt.2

哈喽大家好我是咸鱼,在《Linux 内存管理 pt.1》中我们学习了什么是物理内存、虚拟内存,了解了内存映射、缺页异常等内容

那么今天我们来接着学习 Linux 内存管理中的多级页表和大页

多级页表&大页

在《Linux 内存管理 pt.1》中我们知道了内核为每个进程都维护了一张页表,这张页表用来记录进程虚拟内存与物理内存的映射关系

页表实际上存储在 MMU 当中。MMU(Memory Management Unit,内存管理单元)是CPU内部的一个硬件模块

MMU 负责将虚拟地址转换为物理地址,从而实现进程间内存地址隔离和虚拟内存的实现

Linux 内存管理 pt.2

 

每个进程都有一张页表,一张页表中有很多页表项(页),每个页表项大小为 4KB

也就是说,每一个内存映射关系,都需要一个 4 KB 或者 4 KB 整数倍的内存空间

小伙伴们有没有想过这样一个疑问:为什么 Linux 默认页大小是 4KB ?

这其实是一个历史遗留问题,后续咸鱼有时间的话会单独写一篇来聊聊

现在我们应该把目光放到另一个点上:一个 32 位系统会为每个进程分配 4G 的虚拟地址空间(虚拟内存),这样的话会导致一张页表里面会有特别多页(一百多万)

而且每个页为一个地址,占用 4 个字节,32 位系统中一张页表有 1048576 张页,那就是一张页表占 1048276 * 4 / 1024 = 4M

也就是说一个进程啥都不干,光是页表大小就占了 4M,如果每张页都有映射关系那也就算了,问题是绝大部分程序仅仅就使用了几张页

先不说这样会导致一个页表里面有大量的页,占用大量的空间。如果想要找到存储了对映关系的那一张页,得从头开始查找,这样会导致查询效率很慢

为了解决页表项过多这个问题,Linux 提供了两种机制,也就是多级页表和大页

多级页表

我们知道,每个进程自身都会维护一个虚拟内存,而每个进程虚拟内存比物理内存要大得多,只有在使用的时候才会被分配到物理内存

多级页表就是把被分配了物理内存的虚拟内存内存分成了一块一块,将原来的映射关系改成了区块索引和区块内的偏移量

多级页表将页表分为多级,每级页表仅用于管理对应的物理内存空间,这样就可以大大减少页表中的项数以及页表大小,从而减轻系统负担

多级页表通常由多个页目录和多个页表组成,每个页表存储了该页的物理地址、读写权限等信息;而页目录项则存储了指向该页表的地址

Linux 采用四级页表来管理内存页,如下图所示

Linux 内存管理 pt.2

 

多级页表和一级页表的区别

在Linux中,多级页表和一级页表的最大区别在于多级页表只存储有映射关系(即被分配了物理内存)的页,而一级页表存储了所有页表项

用一级页表的话,整个页表都得存放在内存当中,而使用多级页表的话,只有被分配了物理内存的页会存在内存中

举个例子,一级页表就相当于一本厚厚的字典,我们在一级页表中查找存储了映射关系的页就相当于在这本字典中从开始位置查找 而多级页表相当于把这本厚厚的字典拆成了多本字典,如果要查东西,直接去对应的小字典上查找即可,减少了大字典中要从开始处查找的不必要时间,提高了效率

大页

比普通页更大的内存块,常见的大小有 2MB 和 1GB

大页通常用在使用大量内存的进程上,比如 Oracle、DPDK 等

通过上面这些机制,在页表的映射下进程就可以通过虚拟内存来访问物理内存了,那么进程是如何使用被分配了物理内存的虚拟内存呢

我们来看下虚拟内存中的用户空间内存

Linux 内存管理 pt.2

 

上图所示,用户空间内存被分割成了五个不同的内存段:

  • 只读段:代码和常量等
  • 数据段:全局变量等
  • 堆:动态分配的内存
  • 文件映射段:动态库、共享内存等
  • 栈:局部变量和函数调用的上下文等。栈的大小是固定的,一般是 8 MB

感谢阅读,喜欢作者就动动小手[一键三连],这是我写作最大的动力

 
 

原文链接:https://www.cnblogs.com/edisonfish/p/17373116.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Linux 内存管理 pt.2 - Python技术站

(0)
上一篇 2023年5月4日
下一篇 2023年5月5日

相关文章

  • 为什么访问同一个网址却返回不同的内容

    哈喽大家好,我是咸鱼。今天给大家分享一个关于 HTTP 有趣的现象 链接:https://csvbase.com/meripaterson/stock-exchanges 我们用浏览器访问这个链接,可以看到下面的网页但如果我们使用 curl 命令去访问这个链接呢?可以看到返回的是一个 csv 文件 我们用 wget 命令下载下来看看可以看到 text/csv…

    Linux 2023年5月11日
    00
  • UDP内核发包流程

    背景 工作中遇到客户反馈,上层应用UDP固定间隔100ms发包,但本地tcpdump抓包存在波动,有的数据包之间间隔107ms甚至更多,以此重新梳理了下udp的发送流程。 udp发包流程 udp_sendmsg UDP corking 是一项优化技术,允许内核将多次数据累积成单个数据报发送。在用户程序中有两种方法可以启用此选项: 使用 setsockopt …

    Linux 2023年5月8日
    00
  • Apache简介及安全配置方案

    以下是“Apache简介及安全配置方案”的完整使用攻略,包含两个示例说明。 Apache简介 Apache是一款开源的Web服务器软件,它是目前最流行的Web服务器之一。Apache支持多种操作系统,包括Linux、Unix、Windows等。Apache提供了丰富的功能模块,可以用于搭建各种类型的Web应用程序。 安全配置方案 为了保护Apache服务器的…

    Linux 2023年5月13日
    00
  • VMware虚拟化kvm安装部署教程小结

    VMware虚拟化kvm安装部署教程小结 本文介绍了在VMware虚拟化环境下部署kvm的详细步骤,包括以下内容: 环境准备 在部署kvm前,需要进行环境准备: 安装Ubuntu Server操作系统; 安装VMware Workstation/Fusion等虚拟机软件; 确认虚拟机配置可以支持kvm。 安装kvm 以下是在Ubuntu Server 18.…

    Linux 2023年5月24日
    00
  • 干货!超实用的 Linux 初始化脚本

    咸鱼今天给大家分享一个无论是学习还是工作中都很实用的 Linux 系统初始化脚本,其实就是各种命令的集合   完整代码在文章最后哦   定义相关变量       配置 yum 镜像源     获取阿里云 yum 镜像源     判断函数是否执行成功     写入一行配置     修改配置     配置系统时区     配置 dns 服务器     修改最大文…

    Linux 2023年4月10日
    00
  • Linux系统更改日期和时间如何通过命令行修改?

    Linux系统更改日期和时间通过命令行可以使用date命令,具体步骤如下: 查看当前系统时间 date 输出示例: Mon Nov 8 15:30:42 CST 2021 修改系统时间 可以使用如下命令进行时间修改: sudo date -s "2021-11-08 15:35:00" 示例说明: 将系统时间修改为2021年11月8日下午…

    Linux 2023年5月24日
    00
  • linux rsync的安装与配置

    Linux Rsync的安装与配置 什么是Rsync Rsync是一款类Unix系统下的文件传输工具,可以在本地文件之间或者本地文件和远程文件之间进行同步、备份操作,且能够快速地更新目标文件,具有增量备份、备份完整性校验等特点。 Rsync的安装 安装Rsync 在Linux环境下Rsync一般是预安装的,如果没有安装的话可以使用以下命令进行安装。 sudo…

    Linux 2023年5月14日
    00
  • linux传输文件命令 rz 和 sz详解

    Linux传输文件命令rz和sz详解 在Linux系统中,rz和sz命令是用来传输文件的工具,常用于在Linux和Windows系统之间传输二进制文件,如照片、压缩包等。本文将详细讲解rz和sz的使用方法。 安装lrzsz工具 rz和sz命令属于lrzsz工具的一部分,所以需要安装lrzsz工具才能使用rz和sz命令。在Debian/Ubuntu系统中使用以…

    Linux 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部