为解决日益增长的内存需要,有以下几种解决办法:
1.覆盖:
将程序划分成几个模块,将没有调用关系的模块(即不会同时运行的模块)分成一组,其中每组所占的内存大小为组内所需内存最大的模块的内存,然后一组内的模块可以进行替换,这样可以减小程序所占内存大小。
示例:
有两种分组方法:
1)A一组,B,C一组,D,E,F一组。所需空间为20+50+40=110K
2)A一组,B,E,F一组,C,D一组。所需空间为20+50+30=100K
所以第二种方法比较好。
2.交换:
把当前在内存里的且处于非运行状态的进程移到外存中,然后就空出内存中的区域给运行状态的进程使用。不考虑进程的空间大于内存总空间的情况。
覆盖和交换的特点:
3.虚拟存储:
1)局部性原理:
就是说 一段时间内 访问的数据是在一个小区域内的,且一个数据的一次访问和下次访问的间隔很短,对于跳转指令,两次跳转的内存地址很可能相同,这就算是局部性原理。
因为局部性原理的存在,使得在内存中的数据的命中率较高,从而虚拟存储能获得较好的性能,所以虚拟存储才得以实现。
2)虚拟存储概念:
把目前用不到的进程快暂移到外存。与交换不同的是,交换是把整个进程都移出内存,而虚拟存储是把进程的部分模块移出去,且在最开始加载的 时候也是把进程的部分模块加载进内存,而不是整个进程都加载进去。
3)虚拟页式存储管理:
就是在之前的非连续内存管理中的页式存储的基础上,可以根据需要把内存中的页帧移到外存,也可以把要外存上要运行的页帧移到内存中来。
为此在页表中加入了几个标志位:
驻留位是说逻辑页在内存中有没有对应的页帧,根据此来确定是否发生缺页中断。
修改位是说对应的物理页帧有没有进行过修改,这是在页面调度把此页调度到外存时用的,如果进行过修改就得把此页帧写入外存中来进行更 新,否则直接把这页从内存中移除然后修改页表中的驻留位为0就行了。
保护位是说该页是只读啊,可读可写啊,还是可执行等。
访问位是说这个页面近期有没有被访问过,用于页面置换算法的。
4)缺页中断的处理请求: