Linux 内存管理 pt.2

简介: Linux 内存管理 pt.2

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

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

多级页表&大页

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

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

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

image-20220915133935587.png

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

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

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

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

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

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

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

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

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

多级页表

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

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

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

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

Linux 采用四级页表来管理内存页,如下图所示
image-20220915134450038.png

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

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

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

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

大页

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

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

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

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

image-20230427112015713.png

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

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

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

相关文章
|
2月前
|
缓存 Linux
linux 手动释放内存
在 Linux 系统中,内存管理通常自动处理,但业务繁忙时缓存占用过多可能导致内存不足,影响性能。此时可在业务闲时手动释放内存。
136 17
|
4月前
|
监控 Linux
如何检查 Linux 内存使用量是否耗尽?这 5 个命令堪称绝了!
本文介绍了在Linux系统中检查内存使用情况的5个常用命令:`free`、`top`、`vmstat`、`pidstat` 和 `/proc/meminfo` 文件,帮助用户准确监控内存状态,确保系统稳定运行。
1314 6
|
1月前
|
消息中间件 Linux
Linux中的System V通信标准--共享内存、消息队列以及信号量
希望本文能帮助您更好地理解和应用System V IPC机制,构建高效的Linux应用程序。
125 48
|
17天前
|
缓存 NoSQL Linux
Linux系统内存使用优化技巧
交换空间(Swap)的优化 禁用 Swap sudo swapoff -a 作用:这个命令会禁用系统中所有的 Swap 空间。swapoff 命令用于关闭 Swap 空间,-a 参数表示关闭 /etc/fstab 文件中配置的所有 Swap 空间。 使用场景:在高性能应用场景下,比如数据库服务器或高性能计算服务器,禁用 Swap 可以减少磁盘 I/O,提高系统性能。
34 3
|
17天前
|
缓存 Linux
Linux查看内存命令
1. free free命令是最常用的查看内存使用情况的命令。它显示系统的总内存、已使用内存、空闲内存和交换内存的总量。 free -h • -h 选项:以易读的格式(如GB、MB)显示内存大小。 输出示例: total used free shared buff/cache available Mem: 15Gi 4.7Gi 4.1Gi 288Mi 6.6Gi 9.9Gi Swap: 2.0Gi 0B 2.0Gi • to
30 2
|
6月前
|
安全 Linux Shell
Linux上执行内存中的脚本和程序
【9月更文挑战第3天】在 Linux 系统中,可以通过多种方式执行内存中的脚本和程序:一是使用 `eval` 命令直接执行内存中的脚本内容;二是利用管道将脚本内容传递给 `bash` 解释器执行;三是将编译好的程序复制到 `/dev/shm` 并执行。这些方法虽便捷,但也需谨慎操作以避免安全风险。
285 6
|
2月前
|
消息中间件 Linux
Linux:进程间通信(共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)
通过上述讲解和代码示例,您可以理解和实现Linux系统中的进程间通信机制,包括共享内存、消息队列和信号量。这些机制在实际开发中非常重要,能够提高系统的并发处理能力和数据通信效率。希望本文能为您的学习和开发提供实用的指导和帮助。
185 20
|
4月前
|
Linux
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
582 58
|
4月前
|
缓存 Java Linux
如何解决 Linux 系统中内存使用量耗尽的问题?
如何解决 Linux 系统中内存使用量耗尽的问题?
349 48
|
3月前
|
算法 Linux
深入探索Linux内核的内存管理机制
本文旨在为读者提供对Linux操作系统内核中内存管理机制的深入理解。通过探讨Linux内核如何高效地分配、回收和优化内存资源,我们揭示了这一复杂系统背后的原理及其对系统性能的影响。不同于常规的摘要,本文将直接进入主题,不包含背景信息或研究目的等标准部分,而是专注于技术细节和实际操作。