Linux内存是怎么工作的
内存管理也是操作系统最核心的功能之一。内存主要用来存储系统和应用程序的指令、数据、缓存等。
一.内存映射
比方说,我的笔记本电脑内存就是 8GB 的 ,指的是物理内存。物理内存也称为主存,大多数计算机用的主存都是动态随机访问内存(DRAM)。只有内核才可以直接访问物理内存。
(1)Linux 内核给每个进程都提供了一个独立的虚拟地址空间,并且这个地址空间是连续的。这样,进程就可以很方便地访问内存,更确切地说是访问虚拟内存。
(2)虚拟地址空间的内部又被分为内核空间和用户空间两部分,不同字长(也就是单个CPU指令可以处理数据的最大长度)的处理器,地址空间的范围也不同
(3)既然每个进程都有一个这么大的地址空间,那么所有进程的虚拟内存加起来,自然要比实际的物理内存大得多。所以,并不是所有的虚拟内存都会分配物理内存,只有那些实际使用的虚拟内存才分配物理内存,并且分配后的物理内存,是通过内存映射来管理的
内存映射,其实就是将虚拟内存地址映射到物理内存地址。为了完成内存映射,内核为每个进程都维护了一张页表,记录虚拟地址与物理地址的映射关
页表实际上存储在 CPU 的内存管理单元 MMU中,这样,正常情况下,处理器就可以直接通过硬件,找出要访问的内存。
而当进程访问的虚拟地址在页表中查不到时,系统会产生一个缺页异常,进入内核空间分配物理内存、更新进程页表,最后再返回用户空间,恢复进程的运行
页的大小只有4 KB ,导致的另一个问题就是,整个页表会变得非常大。比方说,仅 32 位系统就需要 100 多万个页表项(4GB/4KB),才可以实现整个地址空间的映射。为了解决页表项过多的问题,Linux 提供了两种机制,也就是多级页表和大页(HugePage)。
多级页表就是把内存分成区块来管理,将原来的映射关系改成区块索引和区块内的偏移。由于虚拟内存空间通常只用了很少一部分,那么,多级页表就只保存这些使用中的区块,这样就可以大大地减少页表的项数。
Linux 用的正是四级页表来管理内存页,如下图所示,虚拟地址被分为5个部分,前4个表项用于选择页,而最后一个索引表示页内偏移。
再看大页,顾名思义,就是比普通页更大的内存块,常见的大小有 2MB 和 1GB。大页通常用在使用大量内存的进程上,比如 Oracle、DPDK 等。
通过这些机制,在页表的映射下,进程就可以通过虚拟地址来访问物理内存了。那么具体到一个 Linux 进程中,这些内存又是怎么使用的呢?
二、虚拟内存空间分布
首先,我们需要进一步了解虚拟内存空间的分布情况。最上方的内核空间不用多讲,下方的用户空间内存,其实又被分成了多个不同的段。以 32 位系统为例,我画了一张图来表示它们的关系。
通过这张图你可以看到,用户空间内存,从低到高分别是五种不同的内存段。
只读段,包括代码和常量等。
数据段,包括全局变量等。
堆,包括动态分配的内存,从低地址开始向上增长。
文件映射段,包括动态库、共享内存等,从高地址开始向下增长。
栈,包括局部变量和函数调用的上下文等。栈的大小是固定的,一般是 8 MB。
在这五个内存段中,堆和文件映射段的内存是动态分配的。比如说,使用 C 标准库的 malloc() 或者 mmap() ,就可以分别在堆和文件映射段动态分配内存。
其实64位系统的内存分布也类似,只不过内存空间要大得多。那么,更重要的问题来了,内存究竟是怎么分配的呢?
Linux内存是怎么工作的相关推荐
- Linux内存是怎么工作的?
本文是通过学习倪朋飞老师的<Linux性能优化实战> :Linux内存是怎么工作的? Linux内存是怎么工作的? 内存映射 虚拟内存空间分布 内存分配与回收 如何查看内存使用情况 总结 ...
- 15丨基础篇:Linux内存是怎么工作的?
前几节我们一起学习了 CPU 的性能原理和优化方法,接下来,我们将进入另一个板块--内存. 同 CPU 管理一样,内存管理也是操作系统最核心的功能之一.内存主要用来存储系统和应用程序的指令.数据.缓存 ...
- RK3399平台开发系列讲解(内存篇)15.26、Linux内存是怎么工作的?
- linux 内存管理优化,Linux性能优化实战 内存篇 阅读笔记
第十五讲 基础篇:Linux内存是怎么工作的(2020.6.8) 这一讲相关的内容正好之前看csapp的时候总结了一下,可以直接贴出来作为总结了. Linux的内存工作原理,这又是一个特别大的话题.一 ...
- 理解Linux内存性能指标
前言 我们继续看Linux的性能指标,内存也是重要的组成部分之一.本文从常用命令top.free出发,分析内存有哪些性能指标. 本文基于Ubuntu 16.04. Linux内存性能指标有哪些 使用t ...
- Linux内存技术分析(下)
Linux内存技术分析(下) 五. 内存使用场景 out of memory 的时代过去了吗?no,内存再充足也不可任性使用. 1.内存的使用场景 · page管理 · slab(kmalloc.内存 ...
- Linux内存技术分析(上)
Linux内存技术分析(上) 一.Linux存储器 限于存储介质的存取速率和成本,现代计算机的存储结构呈现为金字塔型.越往塔顶,存取效率越高.但成本也越高,所以容量也就越小.得益于程序访问的局部性原理 ...
- 嵌入式linux内存使用和性能优化
这本书有两个关切点:系统内存(用户层)和性能优化. 这本书和Brendan Gregg的<Systems Performance>相比,无论是技术层次还是更高的理论都有较大差距.但是这不影 ...
- 万字长文,别再说你不懂Linux内存管理了(合辑),30 张图给你安排的明明白白...
之前写了两篇详细分析 Linux 内存管理的文章,读者好评如潮.但由于是分开两篇来写,而这两篇内容其实是有很强关联的,有读者反馈没有看到另一篇读起来不够不连贯,为方便阅读这次特意把两篇整合在一起,看这 ...
最新文章
- Django REST Framework(DRF)教程:快速入门
- PHP面试题:PHP加速模式/扩展? PHP调试模式/工具?
- Appointment detail page loading never ends in Zeiss
- macos 全局代理 app_「主观向」macOS 好软推荐(使用体验)
- update与fixedupdate差别
- 基于Redis实现Spring Cloud Gateway的动态管理
- 电子元器件选型——MOSFET
- 学习日记day29 平面设计 色彩
- SAP MM 采购订单中“Delivery Completed“ Indicator
- linux系统优点和缺点,Linux系统和Windows系统的各自的优缺点有哪些
- html submit提交事件,submit方法与onsubmit事件
- 六、外部中断控制LED灯开关
- ORACLE EBS中消息队列fnd_msg_pub、fnd_message在PL/SQL中的应用
- python学习之路遇到的问题以及解决方法
- Android哪个系统占用内存小,哪个安卓模拟器占用的内存小,使用起来又不卡
- ppt里面如何插入页脚
- Stata基础自学——数据查看
- Gvim,Vim编辑器快速学习介绍
- F015-“信息不对称”是伪科学 #F750
- System Verilog约束块(constrain block)控制和随机变量的随机属性控制