深入 C 语言和程序运行原理
于航
PayPal 技术专家
21121 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
深入 C 语言和程序运行原理
15
15
1.0x
00:00/00:00
登录|注册

26|进程是如何使用操作系统内存的?

0x0 到 0x400000 无数据存放
修改共享数据时复制物理页
不同进程共享物理内存数据
四级页表
三级页表
二级页表
触发内核处理程序
描述虚拟页状态的字段
维护虚拟页与物理页映射
进程相关的数据结构
[vvar], [vdso], [vsyscall]
局部变量存储区域
.so 共享库相关数据
动态数据增长区域
ELF 二进制文件的 LOAD Segment 结构
虚拟地址到物理地址的翻译
所有程序使用的虚拟地址
管理内存使用
基于物理内存
快于磁盘的读写效率
与 CPU 直接交互
L1, L2 等片上高速缓存
Linux VAS 低地址段空白原因
写时复制(Copy-on-write)
数据共享
缓存表项查询结果
加速 PTE 查询
例子
优化内存空间利用
压缩页表体积
缺页异常
页表项(PTE)
页表
其他内核数据
系统调用加速的内核数据
栈(Stack)
共享库数据
堆(Heap)
LOAD Segments
内存管理单元(MMU)
虚拟地址空间(VAS)
抽象概念
主内存
CPU 高速缓存
思考题
共享对象与私有对象
TLB(翻译后备缓冲器)
多级页表
页表与物理内存管理
Linux 进程 VAS 数据布局
虚拟内存机制
缓存系统
内存使用与操作系统交互

该思维导图由 AI 生成,仅供参考

你好,我是于航。
对于计算机软件的正常运作,内存(Main Memory)所发挥作用的重要性不言而喻。无论是处在“幕后”的操作系统,还是位于“台前”的用户应用程序,它们在运行时都会将所需数据从磁盘等外部存储器转移至内存。实际上,内存和 CPU 芯片上的 L1、L2 等高速缓存,一同构成了计算机中用于支撑程序高效运行的缓存系统。
今天,我们会先从整体的视角看看内存在计算机系统中的作用,然后再一起探究进程是如何在操作系统的控制下与计算机内存交互的。

计算机内部的缓存系统

通常,文件会被存放在容量较大的磁盘中。但磁盘作为一种提供数据持久化存储的设备,采用了机械式的数据寻址方式,这就使得它无法匹配 CPU 在完成相关操作时,所需数据在访问速度上的要求。而内存则以快于磁盘几万甚至十几万倍的读写效率,承担起了与 CPU 直接交互的重任。
但随着摩尔定律的不断应验,CPU 与内存两者在数据访问效率的“供需关系”上又出现了问题。因此,现代计算机通过在这两者之间引入更多读写速度更快,容量却更小的高速缓存层,并基于局部性原理,让 CPU 经常使用到的数据可以被更快地再次访问。通过这种方式,由 L1、L2 等片上高速缓存以及内存组成的缓存系统,便成为了计算机中用于承载应用运行时数据的主要部件
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了计算机内存管理的重要性以及进程与操作系统内存交互的细节。首先介绍了内存和CPU高速缓存构成的缓存系统在计算机中的重要性,以及内存与磁盘的读写效率差异。随后详细介绍了虚拟内存机制的工作原理,包括虚拟地址空间的概念和CPU通过内存管理单元进行虚拟地址到物理地址的翻译过程。文章还介绍了Linux进程在虚拟地址空间中的数据布局结构,以及使用页表维护虚拟页状态、多级页表压缩页表体积和使用TLB加速PTE查询的相关技术。最后,讨论了共享对象与私有对象的处理方式。总体来看,本文全面而深入地介绍了计算机内存管理的基本原理和工作机制,适合读者快速了解计算机内存管理的技术特点。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入 C 语言和程序运行原理》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(12)

  • 最新
  • 精选
  • ⁶₆⁶₆⁶₆
    为保证空指针可以触发访问缺失页的异常SIGSEGV,空出位于虚拟地址空间的最低部分,空出的虚拟地址部分不访问,就可以省下一个页大小的空间,原本空出的空间为4KB(0x0~0x1000)即可,考虑到大页机制时最小页为4MB,因此就空出4MB的空间(0x0~0x00400000),所以VAS的真实使用地址从0x400000开始

    作者回复: 回答的很赞!

    2022-02-27
    3
    8
  • ZR2021
    老师,TLB中缓存的是几级页表?如果是一级的话,那对应的二级页表是不是就要到物理内存里查的?这样的话,如果是4级页表,即使第一级被TLB命中,其他3级也得到物理内存里找,好像TLB也没带来多大的性能提升……希望老师指点下,这块我一直有点不清楚

    作者回复: TLB 缓存的直接是物理页号,也就是经过所有页表查询后得到的结果。这个结果再配合虚拟地址中的页偏移信息,就可以的到目标数据的物理地址。

    2022-02-26
    2
    3
  • 猪小擎
    这一讲好难,知识的原文从哪本书里能看到

    作者回复: 这块内容也可以参考 CSAPP 等书籍哈。

    2022-06-23
    2
    1
  • brian
    这部分内容其实是os的设计,不是c特有的,所有语言的进程都是这样使用内存的,这样理解没错吧

    作者回复: 是的

    2023-04-26归属地:中国香港
  • 青鸟飞鱼
    虚拟地址与物理地址根据页表映射起来的,虚拟地址空间是存在哪里的呢,二进制可执行文件吗?是磁盘里吗?根据用到时一点点加载到内存里吗?那申请内存时(brk和mmap),会跳转到内核里,不分配物理内存,分配后的地址要写到可执行的二进制文件里吗?

    作者回复: 是的,VAS 实际上是就是由页表维护的一个“虚拟”的地址空间。页表的数据本身会被存放在磁盘上,随着页面的查询而不断从磁盘载入到内存中。申请内存时通常会让虚拟内存区域映射到“匿名文件”这种类型的对象上,同时更新页表标记某几个页是驻留在内存中的,从而不会产生磁盘与内存之间的实际数据交换过程。

    2022-05-18
  • 神佑小鹿
    假设在一个 32 位地址空间中,页大小为 4KiB,每个 PTE 大小为 4 字节。此时,MMU 在进行物理地址查询时,首先会根据虚拟地址中隐含的虚拟页号信息来查找一级页表内的目标 PTE,而一级页表中的每个 PTE,此时实际上负责映射 VAS 中的一个 4MiB 的片。 这个 4MiB 是怎么算出来的呢?

    作者回复: 这是个好问题,实际上这里我们有一个隐含条件就是页表的大小为 4KiB,PTE 大小为 4 字节,即拥有 1024 个表项。这样每个 PTE 就负责映射 2^32 / 1024,即 4MiB 的大小。我来修改一下文章。

    2022-05-08
  • 神佑小鹿
    则地址字段中存放有该页在物理内存中的起始位置。而在该位复位的情况下,若地址字段为空,则表明该虚拟页还未被分配。否则,地址字段中便保存有 “虚拟页内容在磁盘上的起始位置。” 这个 虚拟页内容 不是程序的数据吧,是指虚拟页自身的一些结构数据??

    作者回复: 这里的“虚拟页内容”指的是虚拟页中存放的数据内容,实际上就是程序使用到的数据。当然,与页表自身相关的数据结构,也是被维护在内存中的,这部分属于操作系统内核数据。

    2022-05-08
  • Simon
    64位系统的地址空间只有 2^48,高十六位都是0,共256T。

    作者回复: 没错,对于大多数体系比如 x86-64 和 ARMv8 来说是这样的,但也有支持完整 64 位虚拟地址的体系,比如 Oracle SPARC 的某些型号。

    2022-02-24
    3
  • 功夫熊猫
    页面置换,请求调页
    2022-06-30
    1
  • LDxy
    位于虚拟地址空间的最低部分,未赋予物理地址。任何对它的引用都是非法的,用于捕捉使用空指针和小整型值指针引用内存的异常情况。
    2022-02-23
    1
收起评论
显示
设置
留言
12
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部