内存管理也是操作系统最核心的功能之一。内存主要用来存储系统和应用程序的指令、数据、缓存等。

一.内存映射

比方说,我的笔记本电脑内存就是 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 位系统为例,我画了一张图来表示它们的关系。

通过这张图你可以看到,用户空间内存,从低到高分别是五种不同的内存段。

  1. 只读段,包括代码和常量等。

  2. 数据段,包括全局变量等。

  3. 堆,包括动态分配的内存,从低地址开始向上增长。

  4. 文件映射段,包括动态库、共享内存等,从高地址开始向下增长。

  5. 栈,包括局部变量和函数调用的上下文等。栈的大小是固定的,一般是 8 MB。

在这五个内存段中,堆和文件映射段的内存是动态分配的。比如说,使用 C 标准库的 malloc() 或者 mmap() ,就可以分别在堆和文件映射段动态分配内存。

其实64位系统的内存分布也类似,只不过内存空间要大得多。那么,更重要的问题来了,内存究竟是怎么分配的呢?

Linux内存是怎么工作的相关推荐

  1. Linux内存是怎么工作的?

    本文是通过学习倪朋飞老师的<Linux性能优化实战> :Linux内存是怎么工作的? Linux内存是怎么工作的? 内存映射 虚拟内存空间分布 内存分配与回收 如何查看内存使用情况 总结 ...

  2. 15丨基础篇:Linux内存是怎么工作的?

    前几节我们一起学习了 CPU 的性能原理和优化方法,接下来,我们将进入另一个板块--内存. 同 CPU 管理一样,内存管理也是操作系统最核心的功能之一.内存主要用来存储系统和应用程序的指令.数据.缓存 ...

  3. RK3399平台开发系列讲解(内存篇)15.26、Linux内存是怎么工作的?

  4. linux 内存管理优化,Linux性能优化实战 内存篇 阅读笔记

    第十五讲 基础篇:Linux内存是怎么工作的(2020.6.8) 这一讲相关的内容正好之前看csapp的时候总结了一下,可以直接贴出来作为总结了. Linux的内存工作原理,这又是一个特别大的话题.一 ...

  5. 理解Linux内存性能指标

    前言 我们继续看Linux的性能指标,内存也是重要的组成部分之一.本文从常用命令top.free出发,分析内存有哪些性能指标. 本文基于Ubuntu 16.04. Linux内存性能指标有哪些 使用t ...

  6. Linux内存技术分析(下)

    Linux内存技术分析(下) 五. 内存使用场景 out of memory 的时代过去了吗?no,内存再充足也不可任性使用. 1.内存的使用场景 · page管理 · slab(kmalloc.内存 ...

  7. Linux内存技术分析(上)

    Linux内存技术分析(上) 一.Linux存储器 限于存储介质的存取速率和成本,现代计算机的存储结构呈现为金字塔型.越往塔顶,存取效率越高.但成本也越高,所以容量也就越小.得益于程序访问的局部性原理 ...

  8. 嵌入式linux内存使用和性能优化

    这本书有两个关切点:系统内存(用户层)和性能优化. 这本书和Brendan Gregg的<Systems Performance>相比,无论是技术层次还是更高的理论都有较大差距.但是这不影 ...

  9. 万字长文,别再说你不懂Linux内存管理了(合辑),30 张图给你安排的明明白白...

    之前写了两篇详细分析 Linux 内存管理的文章,读者好评如潮.但由于是分开两篇来写,而这两篇内容其实是有很强关联的,有读者反馈没有看到另一篇读起来不够不连贯,为方便阅读这次特意把两篇整合在一起,看这 ...

最新文章

  1. Django REST Framework(DRF)教程:快速入门
  2. PHP面试题:PHP加速模式/扩展? PHP调试模式/工具?
  3. Appointment detail page loading never ends in Zeiss
  4. macos 全局代理 app_「主观向」macOS 好软推荐(使用体验)
  5. update与fixedupdate差别
  6. 基于Redis实现Spring Cloud Gateway的动态管理
  7. 电子元器件选型——MOSFET
  8. 学习日记day29 平面设计 色彩
  9. SAP MM 采购订单中“Delivery Completed“ Indicator
  10. linux系统优点和缺点,Linux系统和Windows系统的各自的优缺点有哪些
  11. html submit提交事件,submit方法与onsubmit事件
  12. 六、外部中断控制LED灯开关
  13. ORACLE EBS中消息队列fnd_msg_pub、fnd_message在PL/SQL中的应用
  14. python学习之路遇到的问题以及解决方法
  15. Android哪个系统占用内存小,哪个安卓模拟器占用的内存小,使用起来又不卡
  16. ppt里面如何插入页脚
  17. Stata基础自学——数据查看
  18. Gvim,Vim编辑器快速学习介绍
  19. F015-“信息不对称”是伪科学 #F750
  20. System Verilog约束块(constrain block)控制和随机变量的随机属性控制

热门文章

  1. Burpsuite中protobuf数据流的解析
  2. Android线程和线程Handler基础一览
  3. NYOJ-57 6174问题
  4. IIS7增加mine类型,以便可以访问apk
  5. Java Timetask 无缘无故停止
  6. Go 编码建议——功能篇
  7. Linux 后台开发常用命令目录(更新 ing)
  8. Linux 命令(79)—— pidof 命令
  9. Specify 的含义 ------ 转载
  10. spring MVC 及 AOP 原理