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日

相关文章

  • linux中*乘法在main中作为参数如何输入

    如果你是在Linux中正在做一个计算机,输入的参数中包含* 可能会输入不了。当你查看的时候是a,但是    +  –  /   这几个符号都是好使的。 当输入\* 来代替*就可以了。这里涉及到一个转移符的作用。需要进行转移具体是我也不清楚。    main函数中的各个参数的含义表示: https://blog.csdn.net/baidu_41813368/…

    Linux 2023年4月11日
    00
  • 阿里云云服务器Linux系统更新yum源Shell脚本

    下面是阿里云云服务器Linux系统更新yum源Shell脚本的完整攻略。 步骤一:编写Shell脚本 在Linux系统上,我们可以使用yum命令来安装和更新软件包。yum源是存储软件包的仓库,我们需要定期更新yum源来确保软件更新和安装的正常进行。为了方便,我们可以编写一个简单的Shell脚本来更新yum源: #!/bin/sh # 更新yum源 yum c…

    Linux 2023年5月14日
    00
  • Linux学习之CentOS(一)—-在VMware虚拟机中安装CentOS 7(图文教程)

    下面就为您详细讲解“Linux学习之CentOS(一)—-在VMware虚拟机中安装CentOS 7(图文教程)”的完整攻略。 一、准备工作 在进行CentOS 7安装前,需要准备以下工作: 安装VMware虚拟机软件 下载CentOS 7 ISO镜像文件 创建虚拟机 二、下载CentOS 7 ISO镜像文件 你可以从官网上下载CentOS 7镜像文件:…

    Linux 2023年5月24日
    00
  • centos下安装VMware Server 虚拟机的方法

    下面是CentOS下安装VMware Server虚拟机的方法攻略: 前置条件 CentOS系统环境需要具备sudo命令,而非root用户执行安装操作时需要提供sudo权限; 确认系统内核版本号,安装VMware要求使用2.6.32及以上版本的Linux内核。可以使用以下命令查看内核版本号: uname -r 步骤 1. 安装VMware Server所需环…

    Linux 2023年5月24日
    00
  • VPS CentOS-6 下 LNMP HTTP web服务器的搭建步骤

    下面我将为您详细讲解在VPSCentOS-6下搭建LNMP(HTTP Web服务器)的步骤及示例说明。 1. 安装Nginx 首先需要安装Nginx,用以下命令行安装: yum install nginx 安装完成后,启动Nginx服务: service nginx start 2. 安装MySQL MySQL是用来存储数据的关系型数据库。在CentOS-6…

    Linux 2023年5月14日
    00
  • 如何为CentOS 7配置静态IP地址的两种方法

    为CentOS 7配置静态IP地址是每个Linux管理员必须了解的操作,本文将介绍两种方法,帮助您完成操作。 方法1:使用图形界面进行配置 步骤1:打开“网络”设置 在CentOS 7的桌面环境下,单击右上角的菜单栏,选择“网络设置”菜单项。此时会弹出网络设置窗口。 步骤2:选择连接 选择需要配置静态IP地址的连接,这里以“有线连接1”为例。单击该连接右边的…

    Linux 2023年5月30日
    00
  • 详解Linux(Centos)之安装Nginx及注意事项

    详解Linux(Centos)之安装Nginx及注意事项 在Centos系统中,安装Nginx的过程与其他Linux系统类似,但也存在一些注意事项,下面将详细介绍这个过程。 步骤一:添加Nginx源 在Centos系统中,我们需要先添加Nginx的yum源: sudo vi /etc/yum.repos.d/nginx.repo 在打开的文件中输入以下内容:…

    Linux 2023年5月14日
    00
  • Linux上安装搭建Nginx服务器的详细步骤

    下面是Linux上安装搭建Nginx服务器的详细步骤攻略。 准备工作 系统环境要求:Linux服务器操作系统 安装编译工具:编译Nginx需要安装gcc和pcre,执行以下命令: sudo yum -y install gcc pcre-devel 安装依赖库:编译Nginx需要依赖其他库,执行以下命令: sudo yum -y install zlib-d…

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