虚拟存储器
页式存储产生原因
-
分区式存储管理最大的缺点是碎片问题严重,内存利用率低。究其原因,主要在于连续分配的限制,即它要求每个作用在内存中必须占一个连续的分区。
-
如果允许将一个进程分散地装入到许多不相邻的分区中,便可充分地利用内存,而无需再进行“紧凑”。
-
基于这一思想,产生了“非连续分配方式”,或者称为“离散分配方式”。
-
连续分配:为用户进程分配的必须是一个连续的内存空间。
-
非连续分配:为用户进程分配的可以是一些分散的内存空间。
页式虚拟存储器
- 以页为单位的虚拟存储器,称为页式虚拟存储器。
- 它的虚拟空间跟主存空间都将被划分为相同大小的页。
- 主存中的页,称为实页,虚存中的页,称为虚页。
- 虚拟地址被分为两个字段,虚页号和页内偏移。
- 为了对每个虚拟页的存放位置,存取位置,使用情况,修改情况等等进行等进行说明,操作系统在主存中给每个进程都生成一个页表。
- 因此,每个虚拟页表都对应有一个页表项。页表是一张存放在主存中的,虚拟页与实页对照的映射表。
- 其中存放位置字段用来建立虚拟页与实页之间的映射,进而进行地址转换。有效位用来表示对应页面是否存在。
工作原理
- 只要求将当前需要的一部分页面装入内存,便可以启动作业运行,倘若在执行的过程中,出现要访问的页面不在内存中,那么就通过页面调入功能将其调入,同时还可以将暂时不用的页面换出到辅存,以腾出空间。因为页是根据请求调入的,故称为请求页式存储管理。
-
状态位P:用于记录该页是否已经调入内存
-
访问字段:记录该页多久没有被访问了
-
修改位:标识该页调入内存后是否被修改过
-
外存地址:指出该页在内存外的地址,供调入该页的时候使用。
分页
分页方式
-
把物理内存划分成固定且很小的块,称为页框,每个进程也划分为固定长的块,称为页
-
进程的程序块装到可用的存储块中,且无须用连续的页框来存放
-
编写程序不再使用物理地址,所有程序使用统一的虚拟地址
-
操作系统提供一个页表,提供虚拟地址到物理地址的转换
-
每个用户进程都使用虚拟地址,然后都通过页表找到对应的物理地址,然后从内存中读取数据。
缺页中断
- 在请求分页系统中,当所要访问的页面不在内存中时,便产生一个缺页中断,请求操作系统将所缺的页调入内存。此时应将缺页的进程阻塞(调页完成唤醒),若内存中有空闲块,则分配一个块,将要调入的页装入该块,并修改页表中的相应页表项,若此时内存中没有空闲块,则要淘汰某页(若被淘汰页在内存期间被修改过,则要将其写回外存)。
注意
- 在指令执行期间而非一条指令执行完后产生和处理中断信号,属于内部中断。
- 一条指令在执行期间,可能产生多次缺页中断。
快表(TLB)
- 页表指出逻辑地址中的页号与所占主存物理块号的对应关系。页式存储管理在用动态重定位方式装入作业时,要利用页表做地址转换工作。
- 快表就是存放在高速缓冲存储器的部分页表。作为页表的Cache,它的作用与页表相似,但是提高了访问速率。
- 由于采用页表做地址转换,读写内存数据时CPU要访问两次主存。有了快表,有时只要访问一次高速缓冲存储器,一次主存,这样可加速查找并提高指令执行速度。
- 如果没有TLB,则每次取数据都需要两次访问内存,即查页表获得物理地址和取数据。
页面置换算法
LRU
- 最近最少使用(LRU):将页帧按照最近最多使用到最近最少使用进行排序,再次访问一个页帧时,将该页帧移到表头,替换时将表尾的页帧换出。