操作系统学习笔记(10)——虚拟存储管理
1、程序访问局部性原理
- 指CPU对指令和数据的存取在时间、空间和顺序上往往集中在一定的范围内。
- 3种分类
- 时间局部性:由于程序存在循环结构、临时变量和子程序调用,如果某条指令被执行或某个数据结构被访问,则不久的一段时间内该指令可能再次执行,该数据结构可能再次被访问。
- 空间局部性:若某个存储单元被访问,则在不久之后,其附近的存储单元也可能再次被访问。
- 顺序局部性:通常情况下,CPU跟踪程序的执行是按照在内存中的连续地址进行的。只有在遇到转移指令时,才会跳转到一个不连续的地址空间,但跳转到新的地址空间后,指令又是顺序进行 。
2、虚拟存储器
- 指用户对待作为可编址内存的存储空间,是由操作系统提供的一个假象的存储器,它不是实际的内存,而是操作系统对物理内存的逻辑扩充。
- 虚拟存储技术就是基于程序运行的局部性规则,将大程序种当前正在使用的部分放在内存种,而其余部分放在磁盘中。当一个进程访问的程序和数据在内存中,执行就可以顺利进行。弱国处理器访问了不在内存的程序或数据,为了继续执行下去,需要由系统自动将这部分信息装入内存,这叫部分装入。若内存中没有足够空闲空间,便需要把内存中暂时不用的信息从内存移到辅存上去,这叫部分对换。
- 4个基本特性:离散型、多次性、对换性、虚拟性。最基本特性是离散型,所表现出来的最重要特性是虚拟性。
- 3种实现方式:请求页式存储管理、请求段式储存管理、请求段页式储存管理
3、请求页式存储管理
- 3个基本问题:
- 系统如何获知进程当前所需页面不在内存中。
- 当发现缺页时,如何让把所缺页面调入内存。
- 当内存中没有空闲页面时,为了接收一个新页,需要把老的淘汰出去,这又根据什么策略选择淘汰页面。
- 解决问题的方法:扩充页表
-
- 页号和页框号。其作用与页式存储管理相同
- 中断位。指示页是否在内存中。若不在,则产生缺页中断
- 访问位。记录该页在一段时间内被访问的次数,或记录最近已有多长时间未被访问,提供给置换算法在选择换出页面时参考
- 修改位。表示该页在调入内存后是否被修改过。当CPU以写的方式 访问页面时,设置该页的修改位,在置换该页时必须将该页重写到 外存上;若没修改,则在置换时不需将该页写回外存。
- 外存地址。指出该页在外存上的地址,供调入该页时使用。
- 地址转换过程
- 存储管理单元自动按页面大小把逻辑地址从某位起分解成两部分:页号和页内地址;
- 以页号为索引搜索快表;
- 如果在快表中命中,立即送出页框号,并与页内地址拼接成物理地址,然后,进行权限检查,如获通过进程就可以访问物理地址了;
- 如果在快表中不命中,以页号为索引搜索进程页表,页表的始址由硬件页表控制寄存器指出;
- 如果在页表中找到此页面,说明访问页面己在内存,那么, 可送出页框号,并与页内地址拼接成物理地址,然后,进行权限检查,如获通过进程就可以访问物理地址了;
- 同时要把这个页面的信息装入快表,以备再次访问;
- 如果发现页表中对应页面页失效,存储管理单元就发出一个缺页中断,请求系统进行处理;
- 这时由存储管理软件按置换策略进行调页;
- 接着把该页面装入内存,修改页表,返回用户进程重新执行被中断的指令。
- 地址转换过程流程
- 地址转换过程
- 缺页中断与一般中断的区别
- 在指令执行期间产生和处理中断信号。通常,CPU都是在一条指令执行完后去检查是否有中断请求到达。然而,缺页中断是在指令执行期间,发现所要访问的 指令或数据不在内存时产生和处理的。
- 一条指令执行期间,可能产生多次缺页中断。硬件机构应能保存多次中断时的状态,并保证最后能返回到中断前产生缺页中断的指令处,继续执行。
- 页面调用策略和清除策略
- 两种调用策略:请页式调入和预调式调入
- 两种清除策略:请页式清除和预调式清除
- 页面分配策略
- 两种策略:固定分配和可变分配
- 固定分配策略:缺少灵活性
- 可变分配:性能会更好些,采用可变分配策略的困难在于操作系统要经常监视活动进程的行为和进程缺页中断率的情况,这会增加操作系统的开销。
- 在进行页面置换时,也可采用两种策略:局部置换和全局置换
- 固定分配往往和局部置换策略配合使用
- 可变分配往往和全局置换策略配合使用
- 两种策略:固定分配和可变分配
4、页面置换算法
- 页面置换算法是指在需要调入页面且内存已满时,确定将要换出页面的算法。
- 一个理论算法:假定进程P共计N页,而系统分配给它的内存块只有M块(M,N均为正整数,且1≤M≤N)。如果进程P在运行中成功的访问次数为S(即所访问的页在内存中),不成功的访问次数为F(即缺页中断次数),则缺页中断率为:R=F/(S+F)
- 最佳置换算法:选择用不使用的或者在最长时间内不在被访问的页面进行置换
- 先进先出置换算法(FIFO):选择最先进入内存的页面进行置换,即选择在内存中驻留时间最久的页面进行淘汰。
-
- 优点:直观,实现简单,可通过链表按时间先后顺序链接。
- 缺点:它与进程实际运行的规律不相适应,性能较差,将出现Belady现象,即当分配页面数增加,缺页率和缺页次数反而提高的异常现象,故实际应用极少。
- 最近最久未使用置换算法(LRU):选择最近一度按时间内最长时间没有被访问的页面进行置换。
- 缺点:系统开销和硬件开销增大
- 时间置换算法(Clock):又称最近未使用算法(NRU),是LRU和FIFO的折衷算法。将内存中的所有页面都通过指针链接成循环队列,每页设置一位访问位,若某页被访问时,其访问位被置1。置换时首先检查访问位,如果是0,就选择该页换出;若为l,则重新将它复0,暂不换出而给该页第二次驻留内存的机会,再按照FIFO算法检查下一个页面。当检查到队列中的最后一个页面时,若其访问位仍为1,则再返回到队首再去检查第一个页面。
- 最少使用置换算法(LFU):其基本思想是把到当前为止被访问次数最少的页面淘汰。 类似于LRU算法,该算法为内存的每个页面设置访问计数器,用来记录该页面被访问的频率。当页面被访问,该页面计数器加1,发生缺页中断时,淘汰计数值最小的页面,并将所有计数清零。
5、性能分析
- 性能分析的两个方面:1)缺页率和有效访问时间;2)工作集
- 缺页率和有效访问时间
- 缺页率是指出现缺页的概率,或是缺页时间间隔的概率。
- 有效访问时间可表示为:有效访问时间=(1−p)*存储器访问时间+p*缺页中断时间。
- 要使缺页率不至于对有效访问时间造成过大的影响,必须保证虚存请求分页管理方式非常低的缺页率;否则,程序的执行速度将受到严重影响。
- 此外,提高磁盘I/O的速度,对改善虚存页式管理系统的性能至关重要,应尽量选用高速磁盘和高速磁盘接口。
- 工作集
- 工作集是指在某段时间间隔∆里,进程实际要访问的页面的集合
- 把某进程在时间 t 的工作集记为w(t,∆),把变量 ∆ 称为工作集 “窗口尺寸”。
6、请求段式存储
- 基本原理
- 请求段式存储管理是在段式存储管理的基础上建立的
- 其基本思想和段式存储管理类似,只是在请求段式管理中,程序运行前只需先装入若干段,便可启动运行,在执行过程中,进程可请求系统将所缺的段调入内存。
- 同样,请求分段存储管理方式需要有硬件支持。
- 请求段式管理中所设置的主要数据结构仍是段表,但因为进程的只有一部分段装入内存,其余仍在外存上,故需在段表中增加若干项,以供程序在缺段中断时使用。如图所示给出了段表中的段表项。
- 地址转换
7、请求段页式存储管理
- 基本原理
- 请求段页式存储管理是在段页式存储管理的基础上建立的。
- 其基本思想和段页式存储管理类似,只是在请求段页式管理中,程序运行前只需先装入段中的若干页,便可启动运行,在执行过程中,进程可请求系统将所缺的段或页调入内存。
- 同样,请求段页式存储管理方式需要有硬件支持。
- 动态地址
8、Linux系统存储管理
- Linux中的页表
-
- Linux采用三级分页存储结构。这是Linux提供的与硬件无关的分页管理方式。
- 页面的分配与回收
- 页面分配
- 在Linux系统中,所有的物理页都用数据结构men_map来描述,而men_map又是由men_map_t结构组成的链表,系统启动时对men_map_t初始化。每个men_map_t结构描述系统中的一个物理页,其主要内容如下。
- count:记录使用此页面的用户数。当多个进程共享此物理内存页时,值大于1。
- age:描述该页面的年龄,以决定该页是否被淘汰或换出。
- map_nr:描述men_map_t对应页面的物理页框号。
- 页面分配采用链表和位图结合的方法。
- 页面回收
- Linux中内存块的释放由调用free_pages()函数完成。当回收空闲块时,change_bit()函数根据map指针指向的位表,判断回收块的前后页块也即它的伙伴是否也为空,若空则合并,并修改位表中对应位,从free_area的空闲链中取下该相邻块。这个递归过程一直进行到找不到相邻空闲块为止。最后,合并的最大块插入free_area的相应list链表中。
- 页面的换入换出
- Linux 将页面换出操作从缺页中断和页面换入中分离出来,独立设计了页面换出后台进程kswapd
- kswapd是一种特殊的进程,称作内核态线程。它是一种没有虚拟存储空间的进程,运行在内核态中,直接使用物理地址空间。内核态交换过程kswapd使页面换出至交换空间,保证了系统中有足够的空闲页面,以使存储管理系统可以高效地运行。
- 页面分配