内存管理阅读笔记1(为什么需要虚拟内存)

213 阅读2分钟

虚拟内存:

虚拟内存让每个进程都认为自己可以使用整个内存空间,这样可以最大限度地发挥其作用,类似于头脑风暴。

为什么要设置虚拟地址?

当有两个进程对同一个物理地址的内容进行操作时,后一个写的就会将前一个写的内容覆盖,这样会导致两个程序崩溃。为了把进程所用地址隔离开来,这样可以使用虚拟地址。

程序访问虚拟地址时,由操作系统转换成不同的物理地址,这样不同进程运行时,写入的是不同的物理地址。进程通过CPU中的MMU的映射关系来进行转换成物理地址,然后再通过物理地址访问内存。 1.png

内存分段: 2.png 不足之处: 会产生内存碎片;内存交换效率低

外部内存碎片:产生多个不连续的小物理内存,导致新的程序无法被装载;

内部内存碎片:程序所有内存都被装载到了物理内存,但是这个程序有部分的内存可能并不是很常使用,也会导致内存浪费。

解决外部内存碎片的问题就是内存交换,先将音乐程序占用的内存写到硬盘上,然后再从硬盘上读回到内存里面,并且直接跟在521MB内存后面。这样就能空出连续的256MB空间,新的200MB程序就可以装载进来。在Linux系统中,常看到的Swap空间,就是从硬盘划分出来的,用于内存与硬盘空间交换。所以,在内存交换的时候,交换的是一个占内存空间很大的程序,这样会导致整个程序都很卡顿。所以引申出分页的方法。

3.png

那么分页是如何解决分段所产生的问题的呢?

采用分页,释放的内存都是以页为单位,不会产生无法给进程使用的小内存。如果内存空间不够,操作系统会将最近未被使用的内存页面暂时写在硬盘上,即为换出。一旦需要,再进行加载,称为换入。所以,一次性写入磁盘的只有少数几个页,节约了时间,内存交换效率相对更高。

4.png 在程序运行时,按需引入到物理内存当中去。

Linux中的虚拟空间划分:

5.png

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

图片源自小林coding公众号,内容为阅读笔记。