虚拟内存
虚拟内存的基本思想是每个程序拥有自己的地址空间,这个空间被分割成多个块,每一块称为一页或页面。每一页有一个连续的地址范围。这些页被映射到物理内存,但不是所有的页都需要在内存中才能运行程序。当程序引用到一部分在物理内存中的地址空间时,由硬件立刻执行必要的映射。当程序引用到部分不在内存中的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的命令。
从某个角度上讲,虚拟内存是基址寄存器和界限寄存器的综合,可以用相对较小的但愿映射到物理内存。
分页
由陈故乡产生的地址称为虚拟地址,他们构成来以噶虚拟地址空间。在没有虚拟内存的计算机上,系统直接将虚拟地址送到内存总线上,读写操作使用具有相同地址的物理内存字;在使用虚拟内存的情况下,虚拟地址不是直接送到内存总线上,而是被送到内存管理单元(MMU),MMU把虚拟地址映射成物理地址。
虚拟地址空间按照固定大小划分成称为页面的若干单元,而物理内存中对应的但愿称为页框。页面和页框的大小通常是一样的。
RAM和磁盘之间的交换总是以整个页面为单元进行的。
当程序访问来一个未映射的页面,MMU注意到该页面没有被映射,于是CPU陷入到操作系统,这个先将称为缺页中断。操作系统找到一个很少使用的页框且把它吸入到磁盘,随后需要访问的页面读到刚才回收的页框中,修改映射关系,然后重新启动引起陷阱的指令。
虚拟地址会被分为页号和偏移量
可用页号作为页表的索引,以得出对应于该虚拟界面的页框号,如果最高位(存在位)为1,那么也表中查到的页框好复制到输出寄存器高三为,再加上12位偏移量,构成来物理地址。
页表
虚拟也好可用做页表的索引,以找到该虚拟页面对应的页表项。由页表项找到页框号(如果有的话),然后把页框号拼接到偏移量的高位端,以替换掉虚拟页面,形成 送往内存的物理地址。
页表项的结构是与奇迹密切相关的,但不同机器但页表项存储但信息大致相同。
为了记录页面但使用情况,引入“修改”位和“访问”位。写入时由硬件自动设置修改为,若已经修改过,则称之为脏位。
不论读或写,系统都会在页面被访问时自动设置访问位。它的值用来帮助操作系统在发生缺页中断时选择要被淘汰的页面。
最后疑为用于禁止该页面被高速缓存。
若某个页面不在内存时,用于保存该页面的磁盘地址不是页表的一部分。
加速分页过程
大多数优化技术都是从内存中的页表开始的。这种涉及对效率有着巨大的影响。
大多数程序总是对少量页面进行多次访问,而其它页面很少被访问。
而解决方案则是位计算机设置一个小型的硬件设备,将虚拟地址直接映射到物理地址,而不需要再次访问页表,这种设备称为转换检测缓冲区(TLB),有时又称为相联存储器。
虚拟地址进入MMU进行转换时,硬件首先通过将该虚拟页号与TLB中所有表项并行对比,来判断是否存在。若存在且不违反保护规则,则页框好直接从TLB中取出,而不访问页表。
当虚拟页号不在TLB中,MMU则进行正常的页面查询。接着从TLB中淘汰一个表项,然后用新找到的页表项代替它。
当TLB大到一定程度上时,TLB的软件管理就会变得足够有效。
使用软件管理TIL是,如果一个页面访问在内存中而不在TLB中,则产生阮氏小,此时所要做的是更新一下TLB,而不需要磁盘IO。而页面本身不在内存中时,则硬失效。
针对大内存的页表
多级页表
引入多级页表的源于是避免把全部页面一直保存在内存中,他不是那些从不需要的页表就不应该保留。
P112
倒排页表
实际内存中每一个页框都有一个表项,而不是每一个虚拟页面有一个表项。
倒排页表可以节省大量空间,但是在用虚拟地址到物理地址时会非常困难,每一次都需要查找整个道排页表。
解决方法是使用TLB。TLB记录所有常用页面,失效时则需要软件搜索倒排页表。一个可行的方法是建立一张散列表,用虚拟地址来散列。
倒排页表在64位机器上很常见。
页面置换算法
当发生缺页中断时,操作系统必须在内存中选择一个页面将其还出内存,以便为即将掉入的页面腾出空间。如果换出的页面经过修改,那么必须把它协会磁盘以更新该页面在磁盘上的副本。
最优页面置换算法
最优页面置换算法的思路是标记所有页面将会在多少次时钟之后被使用,替换时选择最长的。
该算法不可能被实现,但可以作物哦评价算法的标准。
最近未使用页面置换算法(NRU)
页面被访问时设R位为1,页面被修改是设置M位。
当启动一个进程时,他的所有页面的两个位都由系统设置为0,R位被定期清零,以区别最近没有被访问的页面和被访问的页面
NRU的主要优点是便于理解和实现,虽然性能不是最好,但也够用来。
先进先出页面置换算法
第二次机会页面置换算法
检查最老的页面,若R为0,则替换。若为1,则R置零,并放到链表末端。
若所有页面都被访问过,那么就简化为纯粹的FIFO算法。
不过经常移动链表会导致效率低下
时钟页面置换算法
将所有页面保存在类似与钟面的环形链表中,表针指向最老的页面,然后移动表针。
最近最少使用页面置换算法
在缺页中断发生时,置换未使用时间最长的页面。这个策略称为LRU(最近最少使用)
可以用链表来实现(使用最多的页面放表头),但代价巨大
可以采用硬件来实现
用软件来模拟LRU
该算法将每个页面与一个软件计数器相关联,称为(NFU)最不常用算法
NFU缺点在于永远不忘记任何事
不过对于NFU做一些小小的修改就可以模拟LRU,比如每次将数据向右移动一位,然后R位放在最左边。
修改后的算法称为老化算法。
LRU和老化算法的第二个区别在于老化算法只能针对有限位数,这件限制来对以往界面的记录,不过 通常够用。
工作集页面置换算法
该策略被称为请求调页没因为该页面是在需要时被掉入的,而不是预先装入。
一个进程当前正在使用的页面的集合称为它的工作集。
不少分页系统都会设法跟踪进程的工作集,以确保让进程允许以前,它的工作集就已经在内存当中了,这种方法称为工作集模型,目的在于大大减少缺页中断率。工作集是随着时间变化的。
为实现工作集算法,系统需要一个精确到方法来缺点那些页面处于工作集中。
工作集的置换算法的基本思路就是找出一个不在工作集中的页面并淘汰他。
通常设定一个特定时间,若超过该时间则淘汰。最差的情况就是都在规定时间之内,因此随即选择一个页面淘汰,通常选择感觉的。
工作集时钟页面置换算法
在指针变动时,如果碰到一个过期且干净的页面,则可以直接申请该页面并使用,若过期且脏,则跳过,比较前面可能又干净的,
当系统至少调度过一次写操作,那么必然会有某个页面已经变成干净的,如果没有,那么所有都在工作集中,就随意挑选一个即可。