在早期的单用户单任务的操作系统中,每台计算机仅有一个用户,每次运行一个程序,程序还不是很大,单个程序完全可以存放在实际内存中,此时虚拟存储并没有多大用处。
随着社会的进步,科技的发展,人们需要计算机处理更庞大更复杂的问题,运行在计算机中的程序越来越大,也越来越多,原来的单用户单任务系统不够用了,出现了多用户多任务系统。此时,有一个问题出现了:在程序设计时,程序需要的存储器容量往往与计算机系统实际配备的主存储器的容量之间存在矛盾。如,某些程序需要很大的内存的才能运行,而计算机的物理内存较小,不能满足;又如,多个程序/多个用户同时共享主存,同时运行,同时运行中的程序到底占用实际内存的哪一部分?这一问题在编写程序时是无法确定的,只有在程序运行时操作系统才动态为其分配内存。
基于以上背景,人们想在编写程序时独立编址,既不考虑物理内存能否放得下程序,也不考虑程序到底应该放在哪。只需要在程序运行时,操作系统能够分配给程序一定的运行空间,地址转换部件(硬/软)将编程时的地址转换成实际物理内存中的地址。
用户编程时使用的地址称为虚地址/逻辑地址,其对应的存储空间称为虚存空间/逻辑地址空间;
计算机物理内存的访问地址称为实地址/物理地址,对应的存储空间称为物理存储空间/主存空间。
虚存空间的用户程序按照虚地址编程并存放在辅存中。程序运行时,地址变换机构依据当时分配给该程序的实地址空间把程序的一部分调入内存。
每次访存时,首先判断该虚地址对应的部分是否存在于实存中:如果存在,则进行地址转换,并用实地址访问主存;不存在,则按照一定的规则将辅存中的部分程序调度进内存,再按同样的方式访问主存 。
由此可见,每个程序的虚地址空间可以远大于实地址空间,也可以远小于实地址空间
在页式虚拟存储系统中:
虚地址空间被分为等长大小的页,称为逻辑页;
主存空间也被分为同样大小的页,称为物理页。
虚地址分为两个字段:逻辑页号(高字段),页内地址/偏移量(低字段)
实存地址分为两个字段:物理页号(高字段),页内地址(低字段)
在多数系统中,每个进程对应一个页表。页表中对应每一个虚存页面有一个表项,每一个表项含有:虚存页面对应的主存页面的物理页号;指示该逻辑页是否已经调入主存的有效位。
用虚存地址的逻辑页号作为页表内的偏移地址索引页表,找到相应的主存页面号,用主存页面号作为实存地址的高字段,再拼接上虚存地址的页内地址作为实存地址的低字段,就得到了完整的物理地址。
优点:
· 页长固定,便于构造,易于管理,不存在外碎片
缺点
· 页长与程序的逻辑大小不相关
【注意】!!!!!
1.每个进程需要的页数并不固定,所以页表长度可变
2.页表存在二级结构,有些系统给进程分配一个页目录表,页目录表中的每一项指向一个页表。如,存在一个页目录表长度为m,页目录表中的每一项指向一个长度为n的页表,则一个进程最多有m*n个页。
3.页表长度较大的系统,可以采用反向页表实现物理页号到逻辑页号的反向映射
另一种划分可寻址的存储空间的方法称为分段。
段是按照程序的自然分界划分的长度可动态改变的区域。
在段式虚拟存储系统中:
虚地址由段号与段内地址(偏移量)组成,虚地址到实存地址的变换通过段表实现。每个程序设置一个段表,段表的每一表项对应一个段。每一个表项含有:
1.有效位:指示该段是否已经被调入实存
2.段起址:该段在实存中的首地址
3.段长:记录该段的实际长度。设置段长的目的在于防止越界访问,保护其他段。
段表本身也是一个段,一般驻留在主存中,但可以存在辅存中。
存储管理部件先以段号s为索引访问段表的第s个表项。若该表项的有效位为1,则将虚地址的段内偏移量d与该表项的段长字段比较:若偏移量大于段长,则说明会产生地址越界,导致地址越界中断;否则,将该表项的段起址与段内偏移量相加,求得主存地址并访存。若有效位为0,则产生调页中断,从辅存中调入该页,修改段表。
优点:
1.段的逻辑独立性使其易于编译、管理、修改与保护,便于多道程序共享
2.段长可以动态改动,允许自由调度,以便有效利用主存空间
缺点:
1.主存空间分配较麻烦
2.容易在段间留下外碎片,降低存储空间利用率
3.段长不一定是2的整数次幂,所以不能简单地像分页那样将两个字段拼接起来,而是要用加法求得实存地址,所以需要更多的硬件支持。
段页式虚拟存储器是段式虚拟存储器与页式虚拟存储器的结合。
实存被等分为页。每个程序先按逻辑结构分段,每段再按实存的页大小分页,程序按页进行调入与调出操作,但可按段进行编程、保护与共享。
在段页式虚拟存储器中,每个程序均通过一个段表和多个页表进行二级再定位。
段表中每个表项对应一个段,每个表项有一个指针指向该段的页表,页表再指明该段各页在主存中的位置,以及是否已经调入主存,是否已修改等状态信息。
虚地址构成:段、段内页号、页内偏移量。
在多任务系统中,虚地址前还会增加一个表明该程序在系统中的编号——基号,因此,虚地址的构成也可以认为是4个。
假设有3个程序,基号分别为A,B,C,其基址寄存器的内容分别为SA,SB和SC。程序A由4个段构成,程序C由3个段构成。