1.如果把二进制程序全部加载到内存中,会出现一种情况就是明明内存还有空间,但是不够二进制程序的大小,所以也加载不了,这样很浪费内存,而且会产生外部碎片,所以就改良成2中描述的方案。
2.采用页表的方式对内存进行管理。分页将物理内存和可执行程序划分成很小的区块,这个区块定义为页,每个页的大小为4k,二进制程序中不足4k的页默认为4k。操作系统会为每个进程维护一个页表。页表主要记录进程的页号与内存中的页号的对应关系。这样的话就没有要求二进制程序加载到物理内存中必须是连续的,不会产生外部碎片,但是因为二进制程序中不足4k的页默认为4k,会浪费一点点内存,称为内部碎片。但是因为内存有限,所以加载的二进制程序有限,所以可以有了3中的方案解决内存有限的问题。
3.虚拟内存:
概念:磁盘空间开辟空间作为内存的补充。
有效位:0存储在磁盘上,1已经存储在物理内存上
虚拟地址空间(虚拟内存)被分成了固定大小的页,每一页或者没有映射任何东西,或者被映射到硬盘上的交换文件中,或者映射到物理内存。即未分配、未缓存、已缓存。
程序加载的时候要执行虚拟内存到磁盘空间的映射。
进程可以一部分驻留在内存上,而其他部分存储在虚拟内存上。cpu要执行的虚拟地址从页表中找不到对应的物理页地址时,就会发生页中断(页错误)。此时CPU无法执行,中断处理程序会将虚拟地址所在的虚拟内存的空间,将其加载到内存。CPU再次扫描,程序正常执行。这里会涉及到页面的换入换出,所以讲一下系统抖动。
系统抖动概念:在请求分页存储管理中,从内存刚刚换出某一页面后,根据请求又马上换入该页,这种反复换入换出的现象,叫系统抖动,或系统颠簸。系统抖动是因为页错误太多,频繁出现页中断,浪费CPU大部分时间。为了降低系统抖动,降低页错误次数,就要使用页面置换算法(FIFO),原则是先进先出,但这种算法只是在按顺序访问地址空间时是理想的。因此我们可以使用另一种算法,即最近最久未使用算法(LRU),它是置换最近过去一段时间最久未使用的页面。
虚拟内存的优点:
a.操作系统同时执行的进程数量会大幅提升。
b.操作系统可以执行比内存空间大的多的进程。
虚拟内存的缺点:
a.页中断处理程序执行时,CPU需要等待,会浪费时间。
参考:
https://www.jianshu.com/p/6bcf1f07cb58
https://www.bilibili.com/read/cv14307807