校招季——操作系统的存储管理

来源:互联网 发布:淘宝卖家引流技巧 编辑:程序博客网 时间:2024/05/01 21:12

                                                      第3章 存储管理

现在的存储器体系为分层存储器体系,操作系统的工作是将这个存储体系抽象为一个有用的模型并进行管理。

3.1 无存储器抽象

每个程序都直接访问物理内存。这种情况下,想在内存中同时运行两个程序是不可能的。这种系统中实现并行的一种方法是使用多线程来编程。

运行多道程序的方法是操作系统将当前内存中内容保存到磁盘上,再读入下个程序,保证同时只有一个进程在运行。也可以在特殊硬件的帮助下并发地运行多个进程,但要保证进程不会访问其他进程的内存。

这种系统的问题是程序都引用绝对物理地址。IBM的方案是使用静态重定位技术,为每个程序地址加上一个静态偏移。这不是一种通用的解决办法,同时会减慢装载速度。

3.2 一种存储器抽象:地址空间

3.2.1地址空间的概念

地址空间是一个进程可用于寻址内存的一套地址集合。每个进程都有一个自己的地址空间。

一种方案是用基址寄存器和界限寄存器进行简单的动态重定位,把每个进程的地址空间映射到物理内存的不同部分。缺点是每次访问内存都需要进行加法和比较运算。

3.2.2交换技术

有两种处理内存超载的通用方法:

1.  最简单的是交换技术:进程完整调入内存,运行一段时间后把它存回磁盘。空闲进程主要存储在磁盘上,不运行时就不会占用内存。

2.  虚拟内存:能使程序在只有一部分被调入内存的情况下运行。

交换在内存中产生了多个空闲区,可以把所有的进程尽可能向下移动,将小的空闲区合成一大块,称为内存紧缩。这个操作要耗费大量CPU时间,通常不进行。

若进程的数据段可以增长,它可能需要移到更大空间的一块内存区中。若找不到这样的内存区,且磁盘上的交换区也满了,这个进程只能挂起或者结束。

3.2.3空闲内存管理

动态分配内存时,有两种方式跟踪内存使用情况:

1.  位图:主要缺点是查找符合要求的连续0串很耗时。

2.  链表:用链表分配内存的几种算法:

a)  首次分配:找到的第一个足够大的空闲区。速度很快。

b)  下次适配:每次查找时从上次结束的地方开始。比首次分配略慢。

c)  最佳适配:找出能容纳进程的最小空闲区。比首次分配慢,且会浪费更多内存。

d)  最差适配:总是分配最大的空闲区。性能也不好。

e)  快速适配:为常用大小的空闲区维护单独的链表。查找很快,合并很慢。

3.3 虚拟内存

要解决的问题:需要运行的程序往往大到内存无法容纳,而且需要系统能够支持多个程序同时运行。

虚拟内存:每个地址空间分成多个块,称为页面,每一页有连续的地址范围。只有部分页面被映射到物理内存。当进程引用到在内存中的页面时,由硬件立即执行映射。当进程引用不在内存中的页面时,由操作系统负责装入需要的页面并重新执行映射。

3.3.1分页

使用虚拟内存时,需要访问的虚拟地址会被送到内存管理单元(MMU)映射成物理地址。虚拟内存和物理内存的映射关系保存在MMU中,若访问到没有映射的页面,MMU会产生缺页中断,操作系统负责选择一个很少使用的页面,回写后将所需页面载入进来,然后重启指令。

3.3.2页表

映射可以概括为:虚拟地址被分成虚拟页号和偏移量两部分,不同的划分对应不同的页面大小。虚拟页号可用做页表的索引,然后用对应的页框号替换掉虚拟页号即为物理地址。

页表项的结构是与机器密切相关的,包括页框号,在/不在位,保护位,修改位,访问位,高速缓存禁止位。

页表项中不包括保存该页面的磁盘地址,这部分由操作系统负责保存,硬件不负责。

3.3.3加速分页过程

任何分页式系统中需要考虑两个问题:

1.  虚拟地址到物理地址的映射必须非常快。

2.  如果虚拟地址空间很大,页表也会很大。而且每个进程都需要自己的页表。

最简单的设计是使用由一组“快速硬件寄存器”组成的单一页表,优点是简单且映射过程不需要访问内存。缺点是页表很大时代价高昂,而且每次上下文切换都必须装载整个页表。

一种极端方法是:整个页表都在内存中,硬件仅需一个指向页表的指针。优点是上下文切换时只需重新装入页表的指针,缺点是每次映射都要一次或多次内存访问,速度非常慢。

下面是两种可行方案:

1.  转换检测缓冲区。

分页技术的缺点是内存访问性能损失较大,解决方案是增加一个硬件,用于将虚拟地址直接映射到物理地址而不访问页表,称为转换检测缓冲区(TLB)。

将一个虚拟地址放入MMU中转换时,硬件首先通过将该页号与TLB中所有表项同时(并行)匹配,若发现有效匹配则直接取出页框号而不访问页表。若缺页,则在载入该页同时修改TLB

2.  软件TLB管理

许多现在的RISC机器几乎所有的页面管理都在软件中实现,TLB表项被操作系统显式装载,当发生TLB访问失效时不是由MMU处理,而是交由操作系统处理。

如果TLB足够大(如64项),它的软件管理就足够有效,最大的好处是获得一个非常简单的MMU。可以为TLB在内存中维护一个高速缓存,能实质的减少TLB失效。

硬失效(页面不在内存中)的处理时间往往是软失效(不在TLB中)的百万倍。

3.3.4针对大内存的页表

1.  多级页表:避免把全部页表一直保存在内存中。

2.  倒排页表:每一个页框有一个表项,而不是每个虚拟页面。优点是节省了大量的空间,缺点是虚拟地址到物理地址的转换会很困难。解决方案是使用TLB和内存中维护一个散列表。

3.4 页面置换算法

页面置换算法可以用于各种高速缓存的置换问题。

3.4.1最优页面置换算法

将下次访问时间最靠后的页面换出去。最好的算法,但无法实现。

3.4.2最近未使用页面置换算法(NRU

R位(访问)和M位(修改)将页面分为4类,NRU算法淘汰类编号最小的页面。优点是易于理解和有效实现,性能不是最好的但一般够用。

3.4.3先进先出页面置换算法(FIFO

淘汰最早载入的页面。很少使用纯粹的FIFO算法。

3.4.4第二次机会页面置换算法

FIFO算法的改进,若最老的页面的R位为1则将其置为0并放入链表的尾端。即寻找一个最近tick以来没被访问过的页面。若都被访问过则与FIFO算法相同。

3.4.5时钟页面置换算法

把所有的页面保存在环形链表中,表针指向最老的页面。淘汰时若R位为1则清0并表针向前。

3.4.6最近最少使用页面置换算法(LRU

置换未使用时间最长的页面。实现的代价很高,需要维护一个链表,每次访问内存时都要更新链表,且很难被硬件加速。

有两种特殊硬件可用于实现LRU算法:1)计数器;2)矩阵。

3.4.7用软件模拟LRU

NFU是一种用软件模拟LRU的算法,每次时钟中断时将各页面的R位加到对应的计数器上,置换时选择计数器值最小的页面。问题是前面的扫描会对后面的选择有较大影响。

NFU的改进为老化算法:R位加之前计数器的值右移一位,再将R位加到最左端。

3.4.8工作集页面置换算法

一个进程当前正在使用的页面的集合称为它的工作集。若内存无法容纳下整个工作集,就会产生大量缺页中断,称为颠簸。不少分页系统会设法预先调入整个工作集,称为工作集模型,目的是大大减少缺页中断。

基于工作集的页面置换算法的基本思路是淘汰一个不在工作集中的页面。

可以结合时钟算法改进工作集置换算法的性能,称为WSClock(工作集时钟)算法。

3.4.9小结

最好的两种算法是老化算法和工作集时钟算法。

3.5 分页系统中的设计问题

3.5.1分配策略

分配页面要考虑到进程间的竞争关系。可以为每个进程固定分配一定数量的页面,或者为每个进程指定一个最小页面数,以避免进程出现颠簸。也可以用PFF(缺页中断率)为指标动态分配内存。

3.5.2负载控制

如果有进程发生了颠簸,就需要将一部分进程交换到磁盘中,甚至需要结束一些进程。

3.5.3页面大小

小页面的优势是内存碎片较少,浪费内存较少。缺点是页面数更多,页表更大,装入页面寄存器的时间更长。

假设进程平均大小是s,页面大小是p,每个页表大小是e,则最优页面大小为:


3.5.4分离的指令空间和数据空间

可以将指令和数据分在不同的地址空间,这样没有明显增加复杂性,但可用的地址空间翻倍。

3.5.5共享页面

可以令同一程序的不同进程共享一部分页面,效率更高。只读的页面如程序文本很适合共享。共享数据要比共享代码麻烦,Unixfork后父进程和子进程要共享程序文本和数据,但所有映射的页面都是只读的,在某个进程修改时触发只读保护,然后生成副本,这是写时复制技术。

3.5.6共享库

当程序和共享库链接时,链接器没有加载被调用的函数,而是加载了一小段能够在运行时绑定被调用函数的存根例程。共享库被调用时是以页面为单位载入的,没被调用的函数不会被载入。

优点是使可执行文件更小,节省内存空间,还能让可执行文件不必重新编译链接就能享受共享库的更新。

共享库中代码的跳转要指定为相对地址跳转,被称作位置无关代码。

3.5.7内存映射文件

把一个文件当作一个内存中的大字符数组来访问,可以为进程间提供一个高带宽通道。

3.6 分段

分段:将地址空间分成多个互相独立的称为段的地址空间,各个段的长度不定,且可以动态改变。一个段就是一个逻辑实体,如代码段、全局变量段、栈段、堆段等,一般不会同时包含多种不同类型的内容。

优点:

1.  简化对长度经常变动的数据结构的管理。

2.  简化不同编译单元间的链接。

3.  有助于在几个进程间共享过程和数据。

4.  不同的段可以有不同种类的保护。

分段的目的是简化程序员对地址空间的管理,正如虚拟内存简化了程序员对物理内存的管理一样。

原创粉丝点击