前言:本章中你会了解计算机中一种非常巧妙且非常聪明的设计方法(软工中不算很通用吧)。也就是存储器的层次结构,当时我在了解到本章的内容后,非常兴奋的对着电脑连声了三句“秒啊”,这就是计算机的魅力吧,希望你也能有相同的奇妙体验和快感(捂脸)。
1.虚拟存储器的概念以及问题的引出:
在页式存储管理机制那章中,还记得我说过逻辑地址的个数要>=物理地址的个数吗?
很有意思的是我们在每个机制中总能发现一种映射关系,即逻辑地址到物理地址的映射关系。
这里我们映入一个新的问题和概念:
问题是当程序和数据已经超过我所拥有的内存大小时,我该怎么办。
这里我引入一个新的概念即虚拟地址,它是操作系统提供的一个假想存储器的映射,它不是实际的内存,而是操作系统对物理内存的逻辑扩充,简而言之你可以把他看做一块逻辑地址,但又不完全是逻辑地址,在这里你不需要完全理解它,把它当做逻辑地址就好。而在结尾的总结中我会给你统一说一说它和逻辑地址以及物理地址三者之间的关系。
那么我们引入虚拟地址的目的就凸显出来了,即解决内存不足使用的问题。虚拟地址可以映射的地址空间就不只内存中的物理地址空间了,它还可以映射到硬盘磁盘这类存储介质中。也就是说我们可以将程序当前使用的数据代码保存在内存中,而将不怎么用的代码或数据保存在硬盘上,而在需要用的时候将其调入内存置换。这样我们就完美解决了内存不足问题。
2.MMU(内存管理单元):
它是我上述讲的所有内存管理机制的管理单元。它是一种负责处理中央处理器(CPU)的内存访问请求的计算机硬件。mmu的功能非常强大,其中它的功能如下:
管理硬件页表基址寄存器
分解逻辑地址
管理快表TLB
访问页表,或发出缺页中断(即高一级的存储器没有存储要访问的页),或越界处理,并将控制权交给内核存储管理处理
设置和检查页表中的各个特征位
3.如何协调内存和硬盘中的数据?
首先我要明确的是我们提到的虚拟存储器,它的管理范围手段还是在页式存储管理和段式存储管理之中二选一或者混用的。无论是分页式管理还是分段式管理,在高速缓冲区和内存,还是在内存和硬盘上我们都需要关注的问题是(这里用内存和硬盘的情况举例子)
①.系统如何获知进程当前所需的页面不在内存(缓冲器)中
②.当发现缺页时,如何把所缺页面调入内存(缓冲器)中
③.当内存(缓冲器)中没有空闲页面时,有一张新页需要接受,我们应该淘汰哪张页面。
针对一号问题我们引入新的页表属性,即扩充页表为:
注意这是页表,你会发现多出了驻留位,外存地址,以及访问位和修改位。
驻留位好理解,表示其要访问的页面是否现在是否在内存中。1表示在,0表示不在。
访问位,表示最近有多长时间未被访问了。或者记录了上一次访问的时间,这将给置换算法选择换出页面时做出参考。
修改位,表示该页调入内存后,是否被修改过。一旦被修改过,将其调入外存时,必须重新写入。以保证外存中的版本是最新的。
这样因为各种属性的扩充我们轻松的解决了问题一。即判断驻留位就可知道页面在不在内存中。
针对问题二,我们的回答就简单多了。调入缺页的页面,我们有两种选择,请页式调入(每次调入一页,多次启动硬盘)和预调式调入(每次调入多页,一次启动硬盘,但可能调入的页面会有用不到的情况)。相对的,会有相似的清除策略请页式清除和预约式清除。
好了,终于最后一个问题了。解决它我们提出了一个新的算法即页面置换算法。一个理想的理论算法(OPT)是:假定进程P共有N页,而系统分配给它的内存块只有M块。如果进程p在运行中成功的访问次数为S。不成功的访问次数为F。那么缺页中断率为:
你以为这就完了吗?不不不。既然提到了算法当然有不同策略的比较。
理想置换算法-最佳页面算法(OPT):每次淘汰的页面都是不再访问或距现在时间最远访问的页面。现实中无法实现,但是拿来衡量算法的优劣性。
随机页面置换算法:随机选一个页面淘汰。
先进先出页面置换算法:选择驻留时间最长的页面淘汰。
最近最少使用页面置换算法:淘汰的页面是在最近一段时间里较久未被访问的那一页面。队列实现,队列头淘汰,队列为放入页面。
时钟页面置换算法:循环链表构建而成。是上一步算法的具体实现。具体为访问过将其引用位置1,淘汰时找一个引用位为0的置换掉。并将需要的引用位置为1的页面引用位置零。
最少使用置换算法:把到当前为止被访问次数最少的页面置换。被访问时引用次数加1,需要置换时淘汰最小的页面。
4.存储设备的层次结构:
学过模电数电的同学应该知道,我们计算机上的存储介质都是有速度差异的。一般来说越快的介质越贵,在计算器中的容量就越小(因为贵,省成本就要小)。不然如果很贵的存储器给你的容量很大,那么计算机可能就是十多万一台,如此高的成本,那么可能互联网时代与我们就无缘了,而且现在学习计算机的你我可能也与计算机这个行业就此无缘了。
实际上如果你看到了下图,你会思考为何这么设计。而在处理器和较大较慢的存储设备之间插入一个更小更快的存储设备已经成了主流的一个观念。
如果你能理解本节前面我说的思想,你就能理解为什么计算机的存储层次结构是如此设计的了。很明显,计算机的局部原理告诉我们我们最近使用过的数据还将大概率被再次使用。而就像我们上面高速缓冲区对内存,或者是内存对硬盘这类的两者之间的关系,你可以将更需要更常使用的数据以及代码存储在更快的设备之上,从而达到让系统io的总时间变得更少,从而高效的使用cpu去执行你所需要的计算。这样妥协了成本的情况下,却几乎没怎么让速度变慢,这种独特而又聪明的机制怎么会对我没有魅力呢。正如我开头所说的,当我写到这里的时候,我还是会忍不住的讲一句:“秒啊”。
总结:
今天我讲了虚拟内存,也就是虚拟地址往硬盘上的映射解决了我们内存不够的问题。通过内存和硬盘的映射关系,我们想到了高速缓冲区和内存的映射关系,从而考虑到整体存储设备设计的层次结构问题。它非常巧妙的平衡了速度和成本的关系。希望你能多多理解并更加深入的学习。
虚拟地址,逻辑地址,物理地址的关系:
逻辑地址是给操作系统之上的软件看的。他们不需要知道硬件是怎么设计的,只需要一台理想的虚拟机就可以了。这样是为了同样的软件应用于不同的硬件上。
线性地址是给CPU看的。CPU不需要知道有多少外设,什么种类的外设,反正它都是用地址来访问。打印机也好,硬盘也好,游戏手柄也好,内存也好,任何乱七八糟的外设也好,它都是分配个地址来访问。这叫做统一编址,也属于线性编址。让所有的外设,都可以像访问内存一样,线性访问。目的是为了让CPU可以接各种外设,不需要知道外设是怎么实现的。比如说硬盘,根本就不是线性地址,其有多个扇面,扇面又被划分成很多小块,磁头的移动绝对不是线性的。你不需要知道硬盘是怎么样的物理结构,你只需要把它想象成一排格子,每一格是一个sector。你甚至不需要知道硬盘只能以sector读写,你也可以只读写一字节,硬盘控制器会帮你搞定你想要的。简言之,线性地址能让CPU把任何设备当成内存。
物理地址是给实际的硬件看的。光驱控制器给读写头的控制信号,硬盘控制器给磁头发出的读写地址,内存总线上的地址是物理地址。硬件只对这个地址做响应。
逻辑地址要经过操作系统转换成线性地址给CPU,CPU发出线性地址给译码器,译码器根据线性地址找到合适的外设,外设自身的控制器再将线性地址进行译码得到物理地址送给实际的设备。
当然,真正的IC里面,地址比这个模型复杂多了。
作者:龚黎明链接:https://www.zhihu.com/question/41431386/answer/91115537 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。