外存资源管理
外存空间划分
静态等长,2i, 称为一块(block),块是外存分配的基本单位,也是IO传输的基本单位。
如果需求不足一个完整块,会形成块内“零头”。由于外存空间很大,块内零头忽略。
外存空间分配
空闲块链(慢):所有空闲块连成一个链
空闲块表(UNIX):相连的空闲块记录在同一表项中
字位映像图:用1位表示一个块的状态
界地址
每进程占一组外存连续块;
每进程占二组外存连续块(双对界)。
页式
内存一页,外存一块。内存页与外存块长度相同。
段式
每段占外存若干连续块,进程的多个段之间在外存可以不连续。
段页式
内存一页,外存一块。内存页与外存块长度相同。段内多页所对应的外存块可以不连续,一个进程的多段可以分散在外存的不同区域中。
虚拟存储系统
虚拟存储
进程部分装入内存,部分(或全部)装入外存,运行时访问在外存部分动态调入,内存不够淘汰。
虚拟页式存储管理
进程运行前:
部分(全部)装入外存,部分装入内存。
进程运行时:
访问页不在内存,发生缺页中断,中断处理程序:
找到访问页在外存的地址;
在内存找一空闲页面;
如没有,按淘汰算法淘汰一个;
如需要,将淘汰页面写回外存,修改页表和总页表;
读入所需页面(切换进程);
重新启动中断指令。
内存页框分配策略(静态策略)
1. 平均分配:将内存中的所有物理页框等分给进入系统中的进程。如内存128页,进程25个,每个进程5个页框
2. 按进程长度比例分配:按程序长度的比例确定分配内存的物理页框数。
pi共si个页面;S=si;内存共m个页框分配给进程pi的物理页框数ai=(si/S)*m
例:内存物理页框62,系统2个进程,p1逻辑页面127,p2逻辑页面10,则p1分得57个物理页框,p2分得5个物理页框。
3. 按进程优先级比例分配:根据优先级别按比例分配内存物理页面。方法2中si表示进程pi的优先级。
4. 按进程长度和优先级别比例分配:方法2和方法3的结合。此时,方法2中si为进程pi逻辑页面数与优先级之和。
以上4种方法都是静态的,静态策略没有反映:
(1)程序结构;
(2)程序在不同时刻的行为特性。
外存块的分配策略
1. 静态分配:外存保持进程的全部页面, 当某一外存页面被调入内
存,所占用的外存页面并不释放:
优点:速度快--淘汰时不必写回(未修改情况)
缺点:外存浪费
2. 动态分配
外存仅保持进程不在内存的页面,当某一外存页面被调
入内存,将释放所占用的外存页面:
优点:节省外存
缺点:速度慢--淘汰时必须写回
页面调入时机
1. 请调(demand paging)upon page fault, 发生缺页中断时调入。
缺点:从缺页中断到所需页面被调入内存,期间对应的进
程需要等待,将影响进程的推进速度。
2. 预调(prepaging)
before page fault, 将要访问时调入(根据程序顺序行为,
不一定准)。预调可以节省因页故障而等待的时间。
当访问预先未调入内存的页面时,会发生缺页中断,因此
预调必须辅以请调。
置换算法(replacement algorithm)
最佳淘汰算法(OPT--optimal):淘汰以后不再需要的或者在最长时间以后才会用到的页面。
先进先出(FIFO):淘汰最先调入内存的页面。
依据: 先进入的可能已经使用完毕。
实现:将所有页面按照进入内存的次序排成一个队列,当一个页面由外存调入内存时排入队尾,当需要淘汰时取队头页面。
使用过最久的先淘汰(LRU)
淘汰最近一次访问时间距离当前时间间隔最长的页面。stack
当一页面被访问时,如在栈中,取出压到栈顶;否则直接压入栈顶,满时淘汰栈底。
最近不用的先淘汰(not used recently,NUR):淘汰最近一段时间未用过的页面。
在实现时,为每一个页面增加两个硬件位,分别为
①引用位=0,此页未被访问过;
②引用位=1,此页曾被访问过;
③修改位=0,此页未被修改过;
④修改位=1,此页曾被修改过。
一个页面由外存调入内存时,其引用位和修改位均为0.当对某页面执行写操作时,其引用位和修改位均为1;当对某页执行读操作时,其引用位为1;每隔固定时间将所有引用位清零。
最不经常使用的先淘汰(LFU): 淘汰使用次数最少的。
依据: 活跃访问页面应有较大的访问次数.
最经常使用的先淘汰(MFU)
淘汰使用次数最多的。
二次机会:淘汰装入最久且最近未被访问的页面。
实现时:采用拉链数据结构。
时钟算法:将页面组织成环形,有一个指针指向当前位置。每次需要淘汰页面时,从指针所指的页面开始检查。如果当前页面的访问位为0,即从上次检测到目前,该页没有访问过,则将该页替换。如果当前页面的访问位为1,则将其清0,并顺时针移动指针到下一个位置。重复上述步骤直至找到一个访问位为0的页面。
考虑修改标志m
r=0, m=0:最佳
r=0, m=1:次佳,淘汰前回写
r=1, m=0:再次
r=1, m=1:最后,淘汰前写回
改进时钟算法:
步骤1:
由指针当前位置开始扫描,选择最佳淘汰页面,不改变引用位,将第一个遇到的r=0且m=0的页面作为淘汰页面;
步骤2:
如步骤1失败,再次从原位置开始,找r=0且m=1的页面,将第一个满足上述要求的页面作为淘汰页面,同时将扫描过页面的r位清0;
步骤3:
若步骤2失败,指针再次回到原位置,重新执行步骤1。若还失败再次执行步骤2,此时定能找到。
颠簸(thrashing)
页面在内存与外存之间频繁换入换出。原因: (1) 分给进程物理页架过少;
(2) 淘汰算法不合理;
(3) 程序结构不好。
处理:(1) 增加分给进程物理页架数;
(2) 改进淘汰算法;
(3) 改善程序结构。
在某些虚拟页式存储管理系统中,内存中总保持一个空闲的物理页框,这样做有什么好处?
答:在内存没有空闲页框的情况下,需要按照置换算法淘汰一个内存页框,然后读入所缺页面,缺页进程一般需要 等待两次I/O传输。
若内存总保持一个空闲页框,当发生页故障时,所缺页面可以被立即调入内存,缺页进程只需等待一次I/O传输时间。读入后立即淘汰一个内存页面,此时可能也需执行一次I/O传输,但对缺页进程来说不需等待,因而提高了响应速度。
工作集模型:进程在一段时间内所访问页面的集合。
与时间和窗口尺寸有关
页故障率反馈模型
PFFB(Page Fault Feed Back):动态调整页面的分配
页故障率高(达到某上界阈值):内存页框少,增加。
页故障率低(达到某下界阈值):内存页框多,减少。
虚拟段式存储系统
进程运行前,主程序段装入内存,其它段装入外存,访问段不再内存时,发生缺段中断。
若内存空间不够
紧凑:将内存中的所有空闲区合并
淘汰:将内存中的某段移至外存
段的动态连接
动态连接 vs. 静态连接
静态连接:运行前连接,由link完成(对程序库进行扫描,将整个程序涉及到的目标模块逐个调入内存并连接在一起);一个程序共有多少个段是确定的,因而link可以为每一个段分配一个段号;
动态连接:运行时连接,由OS完成.(在程序运行过程中需要某一个段时才将该段连接上);一个程序共有多少个段是不确定的,因而段名到段号的转换需要由操作系统来完成的。
动态连接与共享的矛盾
动态连接:修改连接字(代码)段的共享:要求纯代码(pure code)
解决方法
共享代码分为“纯段”和“杂段”
纯段共享,
杂段私用。
虚拟段页式存储系统
一个段对应一个程序单位,是二维地址
方便存储共享和保护
可以实现段长度的动态变化,以及段间的动态连接
但对存储空间的分配和去配较复杂,可能形成碎片
中断处理:
连接中断 缺页中断 越界中断 (段号,段内页号) 越权中断
分页对用户是透明的,分段对用户是可见的