CSDN|真棒!20 张图揭开内存管理的迷雾


CSDN|真棒!20 张图揭开内存管理的迷雾
本文插图
有不少读者跟我反馈 , 能不能写图解操作系统? 既然那么多读者想看 , 我最近就在疯狂的复习操作系统的知识 。操作系统确实是比较难啃的一门课 , 至少我认为比计算机网络难太多了 , 但它的重要性就不用我多说了 。学操作系统的时候 , 主要痛苦的地方 , 有太多的抽象难以理解的词语或概念 , 非常容易被劝退 。即使怀着满腔热血的心情开始学操作系统 , 不过 3 分钟睡意就突然袭来 。。。该啃的还是得啃的 , 该图解的还是得图解的 , 万众期待的「图解操作系统」的系列来了 。本篇跟大家说说内存管理 , 内存管理还是比较重要的一个环节 , 理解了它 , 至少对整个操作系统的工作会有一个初步的轮廓 , 这也难怪面试的时候常问内存管理 。干就完事 , 本文的提纲:

CSDN|真棒!20 张图揭开内存管理的迷雾
本文插图

虚拟内存如果你是电子相关专业的 , 肯定在大学里捣鼓过单片机 。单片机是没有操作系统的 , 所以每次写完代码 , 都需要借助工具把程序烧录进去 , 这样程序才能跑起来 。另外 , 单片机的 CPU 是直接操作内存的「物理地址」 。
在这种情况下 , 要想在内存中同时运行两个程序是不可能的 。 如果第一个程序在 2000 的位置写入一个新的值 , 将会擦掉第二个程序存放在相同位置上的所有内容 , 所以同时运行两个程序是根本行不通的 , 这两个程序会立刻崩溃 。操作系统是如何解决这个问题呢?这里关键的问题是这两个程序都引用了绝对物理地址 , 而这正是我们最需要避免的 。我们可以把进程所使用的地址「隔离」开来 , 即让操作系统为每个进程分配独立的一套「虚拟地址」 , 人人都有 , 大家自己玩自己的地址就行 , 互不干涉 。 但是有个前提每个进程都不能访问物理地址 , 至于虚拟地址最终怎么落到物理内存里 , 对进程来说是透明的 , 操作系统已经把这些都安排的明明白白了 。CSDN|真棒!20 张图揭开内存管理的迷雾
本文插图
进程的中间层 操作系统会提供一种机制 , 将不同进程的虚拟地址和不同内存的物理地址映射起来 。如果程序要访问虚拟地址的时候 , 由操作系统转换成不同的物理地址 , 这样不同的进程运行的时候 , 写入的是不同的物理地址 , 这样就不会冲突了 。于是 , 这里就引出了两种地址的概念: 操作系统引入了虚拟内存 , 进程持有的虚拟地址会通过 CPU 芯片中的内存管理单元(MMU)的映射关系 , 来转换变成物理地址 , 然后再通过物理地址访问内存 , 如下图所示:CSDN|真棒!20 张图揭开内存管理的迷雾
本文插图
虚拟地址寻址操作系统是如何管理虚拟地址与物理地址之间的关系?主要有两种方式 , 分别是内存分段和内存分页 , 分段是比较早提出的 , 我们先来看看内存分段 。内存分段程序是由若干个逻辑分段组成的 , 如可由代码分段、数据分段、栈段、堆段组成 。 不同的段是有不同的属性的 , 所以就用分段(Segmentation)的形式把这些段分离出来 。分段机制下 , 虚拟地址和物理地址是如何映射的?分段机制下的虚拟地址由两部分组成 , 段选择子和段内偏移量 。CSDN|真棒!20 张图揭开内存管理的迷雾
本文插图
内存分段-寻址的方式