虚拟存储器概述及发展历史
虚拟内存引言
在谈虚拟内存之前,我们先来聊聊物理内存。物理内存是真实存在的,比如在8086系统中,CPU提供的地址可以直接到主存中寻址,并且获取数据,这是因为8086是单道程序执行,所有资源被独大的程序使用,这很合理。
一台电脑如果一次只能调用一个进程,此时我在打字,屏幕上不一定会即时显示。随着多道程序处理的出现,一个系统中的进程和其他进程共享CPU和主存资源,存储资源是有限的,如果程序失去了存储空间,那程序就无法执行。当多个进程共享内存时,容易出现“争斗”。
为了有效管理内存,现代系统提供了一种叫虚拟内存的抽象概念,这个虚拟并不是指fake,而是pretend,假装我在使用内存。
①虚拟内存为每个进程提供了一个独立的小空间,并且编址方式等等都是一样的,进程会以为自己在独立使用内存,其实这些数据都在磁盘中放着,只有需要的数据会放入内存。
②虚拟内存为进程提供了保护机制
早期分页存储器管理
- 早期:内存有限,程序员自己管理主存,每条指令要标出这个数据应该放在哪里。1961年,研究人员提出一种自动执行overlay的方式,程序自动分配内存。
- 为了减少程序员的工作量,人们把地址空间和主存容量的概念区分开,程序员在地址空间内编写程序,计算机系统将程序员的地址空间映射到计算机的实际主存
什么是地址空间?
存放数据的空间,从程序员角度,这个数据在虚拟地址空间中,从CPU角度,这个数据在物理地址空间中,所以在不同的空间,一个数字的地址不一样(就好像空间的每个点在极坐标和直角坐标中的表示不一样)
比如虚拟地址有16位,物理地址有12位,虚拟的空间比实际物理空间大,那怎么存放这些多出来的数据呢? - 分页方式的实现:
我们将216bit分为24页,每页有212bit,需要哪一页我就放进去哪一页(这利用了数据的空间局部性和时间局部性),同时改变地址值,将每个虚拟地址一一对应到0-212-1的地址中
早期一个内存里放一页,现在根据需求不同可放多页。 - 是否需要将一个进程全部装入内存呢?
答案是不需要,按需调页正是虚拟存储管理概念
可能会浪费最后一页(最后一页不满但是也要全部调入并且独占一个页框)
- 地址之间的转换由硬件完成:因为这是在指令执行阶段的任务
段式和段页式虚拟存储管理
- 分页方式的缺陷:
由于页的大小往往确定,并且不会根据单一程序的实际情况改变。 如果一个数据跨页,就需要将两个页都调入内存,代价过高。一页中可能有数据段也有代码段,比较混乱。 - 引入分段系统
一个程序由多个代码段和数据段构成,按照程序的逻辑结构(考虑了其实际意义)划分为多个相对独立的部分。(代码段,只读数据段,可读写数据段等等) - 段的属性
段名,段基址,段长,属性(分页方式尤其不利于说明数据或程序的属性)
缺点:造成碎片(碎片空间放不下一个段) - 段页式存储
程序的虚拟地址空间先按段分,在段内分页。