Linux 内存管理 pt.2
哈喽大家好我是咸鱼,在《Linux 内存管理 pt.1》中我们学习了什么是物理内存、虚拟内存,了解了内存映射、缺页异常等内容
那么今天我们来接着学习 Linux 内存管理中的多级页表和大页
多级页表&大页
在《Linux 内存管理 pt.1》中我们知道了内核为每个进程都维护了一张页表,这张页表用来记录进程虚拟内存与物理内存的映射关系
页表实际上存储在 MMU 当中。MMU(Memory Management Unit,内存管理单元)是CPU内部的一个硬件模块
MMU 负责将虚拟地址转换为物理地址,从而实现进程间内存地址隔离和虚拟内存的实现

每个进程都有一张页表,一张页表中有很多页表项(页),每个页表项大小为 4KB
也就是说,每一个内存映射关系,都需要一个 4 KB 或者 4 KB 整数倍的内存空间
小伙伴们有没有想过这样一个疑问:为什么 Linux 默认页大小是 4KB ?
这其实是一个历史遗留问题,后续咸鱼有时间的话会单独写一篇来聊聊
现在我们应该把目光放到另一个点上:一个 32 位系统会为每个进程分配 4G 的虚拟地址空间(虚拟内存),这样的话会导致一张页表里面会有特别多页(一百多万)
而且每个页为一个地址,占用 4 个字节,32 位系统中一张页表有 1048576 张页,那就是一张页表占 1048276 * 4 / 1024 = 4M
也就是说一个进程啥都不干,光是页表大小就占了 4M,如果每张页都有映射关系那也就算了,问题是绝大部分程序仅仅就使用了几张页
先不说这样会导致一个页表里面有大量的页,占用大量的空间。如果想要找到存储了对映关系的那一张页,得从头开始查找,这样会导致查询效率很慢
为了解决页表项过多这个问题,Linux 提供了两种机制,也就是多级页表和大页
多级页表
我们知道,每个进程自身都会维护一个虚拟内存,而每个进程虚拟内存比物理内存要大得多,只有在使用的时候才会被分配到物理内存
多级页表就是把被分配了物理内存的虚拟内存内存分成了一块一块,将原来的映射关系改成了区块索引和区块内的偏移量
多级页表将页表分为多级,每级页表仅用于管理对应的物理内存空间,这样就可以大大减少页表中的项数以及页表大小,从而减轻系统负担
多级页表通常由多个页目录和多个页表组成,每个页表存储了该页的物理地址、读写权限等信息;而页目录项则存储了指向该页表的地址
Linux 采用四级页表来管理内存页,如下图所示

多级页表和一级页表的区别
在Linux中,多级页表和一级页表的最大区别在于多级页表只存储有映射关系(即被分配了物理内存)的页,而一级页表存储了所有页表项
用一级页表的话,整个页表都得存放在内存当中,而使用多级页表的话,只有被分配了物理内存的页会存在内存中
举个例子,一级页表就相当于一本厚厚的字典,我们在一级页表中查找存储了映射关系的页就相当于在这本字典中从开始位置查找 而多级页表相当于把这本厚厚的字典拆成了多本字典,如果要查东西,直接去对应的小字典上查找即可,减少了大字典中要从开始处查找的不必要时间,提高了效率
大页
比普通页更大的内存块,常见的大小有 2MB 和 1GB
大页通常用在使用大量内存的进程上,比如 Oracle、DPDK 等
通过上面这些机制,在页表的映射下进程就可以通过虚拟内存来访问物理内存了,那么进程是如何使用被分配了物理内存的虚拟内存呢
我们来看下虚拟内存中的用户空间内存

上图所示,用户空间内存被分割成了五个不同的内存段:
- 只读段:代码和常量等
- 数据段:全局变量等
- 堆:动态分配的内存
- 文件映射段:动态库、共享内存等
- 栈:局部变量和函数调用的上下文等。栈的大小是固定的,一般是 8 MB
感谢阅读,喜欢作者就动动小手[一键三连],这是我写作最大的动力
Linux 内存管理 pt.2的更多相关文章
- Linux 内存管理 pt.1
哈喽大家好,我是咸鱼 今天我们来学习一下 Linux 操作系统核心之一:内存 跟 CPU 一样,内存也是操作系统最核心的功能之一,内存主要用来存储系统和程序的指令.数据.缓存等 关于内存的学习,我会尽 ...
- linux内存管理---物理地址、线性地址、虚拟地址、逻辑地址之间的转换
linux内存管理---虚拟地址.逻辑地址.线性地址.物理地址的区别(一) 这篇文章中介绍了四个名词的概念,下面针对四个地址的转换进行分析 CPU将一个虚拟内存空间中的地址转换为物理地址,需要进行两步 ...
- 浅谈Linux内存管理机制
经常遇到一些刚接触Linux的新手会问内存占用怎么那么多?在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然.这是Linux内存管理的一个优秀特性,在这 ...
- linux内存管理
一.Linux 进程在内存中的数据结构 一个可执行程序在存储(没有调入内存)时分为代码段,数据段,未初始化数据段三部分: 1) 代码段:存放CPU执行的机器指令.通常代码区是共享的,即其它执行程 ...
- Linux内存管理原理
本文以32位机器为准,串讲一些内存管理的知识点. 1. 虚拟地址.物理地址.逻辑地址.线性地址 虚拟地址又叫线性地址.linux没有采用分段机制,所以逻辑地址和虚拟地址(线性地址)(在用户态,内核态逻 ...
- 了解linux内存管理机制(转)
今天了解了下linux内存管理机制,在这里记录下,原文在这里http://ixdba.blog.51cto.com/2895551/541355 根据自己的理解画了张图: 下面是转载的内容: 一 物理 ...
- Linux内存管理原理【转】
转自:http://www.cnblogs.com/zhaoyl/p/3695517.html 本文以32位机器为准,串讲一些内存管理的知识点. 1. 虚拟地址.物理地址.逻辑地址.线性地址 虚拟地址 ...
- Windows内存管理和linux内存管理
windows内存管理 windows 内存管理方式主要分为:页式管理,段式管理,段页式管理. 页式管理的基本原理是将各进程的虚拟空间划分为若干个长度相等的页:页式管理把内存空间按照页的大小划分成片或 ...
- linux 内存管理——内核的shmall 和shmmax 参数
内核的 shmall 和 shmmax 参数 SHMMAX= 配置了最大的内存segment的大小 ------>这个设置的比SGA_MAX_SIZE大比较好. SHMMIN= 最小的内存seg ...
- linux内存管理子系统
一.Linux内存管理模型 1.虚拟地址与物理地址的映射 2.物理地址的分配二.虚拟地址与物理地址的映射 1.虚拟地址空间分布 32位处理器有32根地址总线,可访问4G的物理空间.其中有0-3G为用户 ...
随机推荐
- SEGGER_RTT_printf()函数添加打印浮点数功能
SEGGER 的实时传输 (RTT) 是一种用于嵌入式应用程序中交互式用户 I/O 的技术.它以非常高的性能结合了 SWO 和半主机的优势.但是在笔者使用时(RTT v758版本),其暂时不支持浮点数 ...
- 记录Nginx配置
1 # Proxy to the Airsonic server location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_hea ...
- adb shell monkey
monkey 在模拟器或真机里在,.它向系统发送伪随机的用户事件流(如按键输入.触摸屏输入.手势输入等),打开app 查看包名 adb shell dumpsys window windows | f ...
- Sleuth 使用
sleuth是spring cloud中日志链(调用链解决方案),自动添加traceId,spanId. sleuth包也可单独引入,和其它藕合度小.sleuth + zipkin 实现APM管理. ...
- SpringBoot笔记--文件配置加载顺序+整合其他框架
内部文件配置加载顺序 外部文件配置加载顺序 jar包配置 整合Junit 若是业务管理类和测试类在同一个包下面,那么这句话, 可以不加括号,只写注解名称 否则,就必须指定到包下面,不然会报错 整合Re ...
- 针对于Sql server突然连接不到服务器的解决方法
问题叙述 点击连接之后,总是会弹出一个错误弹窗: 方法解决 快捷键Win+R,输入services.msc,进入到服务界面: 找到SQL 代理(DEV) 将手动打开改成自动 再连接试一次 连上啦! ( ...
- 在CentOS中安装和使用nginx
概述 本文简单讲述一下,如何快速将一个内网的Web服务通过nginx提供给外网访问,并且启用HTTPS.例如我们部署了一个kubesphere,地址为192.168.202.151:30880,需要通 ...
- CF309E 题解
11:30,过题.12:50,忘记做法. 吃饭时不该看未来日记的,Ynoj 害人不浅(确信). 以上为个人吐槽. 题目大意 不知道题目翻译是个啥...但讨论区有大佬给出了精确的翻译.我改得符合题目背景 ...
- Qt实用技巧:在CentOS上使用linuxdeployqt打包发布qt程序
前言 之前在ubuntu上发布qt程序相对还好,使用脚本,在麒麟上发布的时候,使用脚本就不太兼容,同时为了实现直接点击应用可以启动应用的效果,使用linuxdeployqt发布qt程序. 本篇文 ...
- Windows7卡在正在关机
据我的分析,Windows系统卡在正在关机的原因很大可能性是破解过系统主题.解决方法就是还原成主题未被破解时候的状态.但是这种情况是随机性的,但是可以确定的是,只要是破解过系统主题,都有一定概率关不了 ...