操作系统【十】

五、虚拟存储器

1、虚拟存储器概述

前面所介绍的存储器管理方式都有一个共同的特点,即他们都要求将一个作业全部装入内存后方能运行,于是,出现了下面两种情况

① 有的作业很大,其所要求的内存空间超过了内存总容量,作业不能全部被装入内存,致使该作业无法运行。

② 做大量作业要求运行,但由于内存容量不足以容纳所有这些作业,只能将少数作业装入内存让他们先运行,而将其他大量作业留在外存上等待。

为了解决上述问题,可以增加物理内存,但是其不太现实,另外是从逻辑上扩充内存容量。

基于程序的局部性原理(时间局限性和空闲局限性),程序在运行之前,没有必要全部装入内存,仅需将那些当前要运行的少数页面或段先装入内存便可运行。

其余部分暂留在磁盘上,程序运行时,如果它所要访问的页(段)已经调入内存,便可继续执行下去,但如果程序所要访问的页(段)尚未调入内存(缺页或缺段),此时程序应利用OS的请求调页(段)功能,将它们调入内存,以使进程继续执行下去。

如果此时内存已满,无法再装入新的页(段),则还需利用页(段)的置换功能,将内存中暂时不用的页(段)调至磁盘上,再将要访问的页(段)调入内存,使程序继续执行。

这样,可以使很大的用户程序在较小的内存空间中运行。从用户的调入看,该系统具有很大的内存容量,但是,用户看到的大容量只是一种感觉,这种存储器被称为虚拟存储器。

2、虚拟存储器定义和特征

定义:所谓虚拟存储器,是指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统,其逻辑容量由内存容量和外存容量之和决定,其运行速度接近内存,成本接近外存。

可见,虚拟存储技术是一种性能非常优越的存储器管理技术,虚拟存储器的实现都是建立在离散分配的存储管理方式的基础上!

(1)==多次性==:一个作业被分成多次调入内存运行

(2)==对换性==:允许在作业的运行过程中进行换进、换出。

(3) ==虚拟性==:能够从逻辑上扩充内存容量,使用户所看到的内存容量远大于实际内存容量。

虚拟性以多次性和对换性为基础;多次性和对换性又必须建立在离散分配的基础上。

3、虚拟存储器的实现方法

(1)请求分页系统

在分页系统的基础上,增加了请求调页功能和页面置换功能所形成的页式虚拟存储系统。它允许只装入部分页面的程序(及数据),便启动运行。以后再通过调页功能及页面置换功能, 再将要运行的页面调入内存,同时把暂不运行的页面换出到外存上,置换时以页面为单位。

为实现请求调页和置换功能,系统必须提供必要的支持:

  • ①请求分页的页表机制(它是在纯分页的页表机制上增加若干项而形成的,作为请求分页的数据结构)
  • ②缺页中断机构(每当用户程序要访问的页面尚未调入内存时,便产生一缺页中断,请求OS将所缺的页调入内存)、
  • ③地址变换机构(在纯分页的基础上发展形成)

软件支持:实现请求调页的软件和实现页面置换的软件

请求分页系统是建立在基本分页基础上的,增加了请求调页功能和页面置换功能。换入和换出的基本单位都是长度固定的页面,因而在实现上比请求分段系统简单。

①硬件支持
I.页表

基本作用仍是将用户地址空间中的逻辑地址变换为内存空间中的物理地址。

由于只将程序的一部分装入内存,还有一部分在外存中,因此须在页表中增加若干项,供程序或数据在换进、换出时参考。

  • (1) 状态位P :指示该页是否已调入内存。供程序访问时参考;供程序访问时参考;
  • (2) 访问字段A :用于记录本页在一段时间内被访问的次数,或记录本页最近已有多长时间未被访问。供选择换出页面时参考;
  • (3) 修改位M :表示该页在调入内存后是否被修改过。供置换页面时参考;
  • (4) 外存地址:用于指出该页在外存上的地址。供调入该页时参考。
II. 缺页中断机构

当要访问的页面不在内存时,产生一个缺页中断,请求OS将缺的页面调入内存,缺页作为中断,也需要经过保护CPU现场、分析中断原因、转入中断处理程序进行处理、恢复CPU环境等。

但是,其与一般中断相比有一些不同,主要在于:

  • 在指令执行期间产生和处理中断信号(通常CPU都是在一条指令执行完后,才检查是否有中断请求到达,若有,则响应,否则,继续执行下一条指令,然而,缺页中断是在指令执行期间,发现所要访问的指令或数据不再内存时所产生和处理的
  • 一条指令在执行期间,可能产生多次缺页中断。
III. 地址变换机构

请求分页系统中的地址变换机构,是在分页系统地址变换机构的基础上,为实现虚拟存储器增加了处理缺页中断,以及从内存中换出一页的功能实现的。

注意,最终置换的是内存中的页,所以页表中只需要修改逻辑页号,因为是吧之前逻辑页号映射的物理块号中的内容置换了。

请求分页中的内存分配
I.最小物理块数的确定

最小物理块数,是指能保证进程正常运行所需的最小物理块数。当系统为进程分配的物理块数少于此值时,进程将无法运行。进程应获得的最小物理块数与计算机的硬件结构有关,取决于指令的格式、功能和寻址方式。

对于某些简单机器,若是单地址指令且采用直接寻址方式,最小物理块数应为2,如果该机器允许间接寻址,则至少要求3个物理块。对于某些功能较强的机器,指令长度可能是两个或两个以上字节,至少要为进程分配6个物理块。

II. 物理块的分配策略

在请求分页系统中,可采取两种内存分配策略,固定和可变分配策略,在进行置换时,也可采用全局置换和局部置换,可组合出如下三种适用的策略。

  • 固定分配局部置换
    • 为每个进程分配一定数目的物理块,整个运行期不再改变,如果进程在运行中发现缺页,则只能从该进程在内存的n个页面中选出一页换出,然后再调入一页,以保证分配给该进程的内存空间不变,若开始为进程分配的物理块数太少,则会频繁缺页,降低系统吞吐量,若太多,则使内存中驻留的进程数目减少,进而造成CPU空闲或其他资源空闲的情况。
    • 困难:应为每个进程分配多少个物理块难以确定。
  • 可变分配全局置换
    • 先为系统中的每个进程分配一定数目的物理块,而OS自身也保持一个空闲物理块队列,当某进程发现缺页时,由系统从空闲物理块队列中取出一个物理块分配给该进程,并将欲调入的缺页装入其中,仅当空闲物理队列的物理块用完时,OS才能从内存中选择一页调出,该页可能是系统中任一进程的页,这样,会是那个进程的物理块减少,进而使缺页率增加
  • 可变分配局部置换
    • 为每个进程分配一定数目的物理块,当进程缺页时,只允许从该进程在内存中的页面中选出一页换出,这样不会影响其他进程的运行,如果该进程频繁发生缺页,则系统需要再为该进程分配若干附加的物理块,直至该进程的缺页率减少到适当程度为止,反之,若一个进程正在运行过程中的缺页率特别低,则此时可适当减少分配给该进程的物理块数,但不应该引起缺页率明显增加
III. 物理块分配算法
  • 平均分配算法(将系统中所有可供分配的物理块平均分配给各个进程)
  • 按比例分配(根据进程的大小按比例分配物理块)
  • 考虑优先权的分配算法(将重要的,紧迫的作业分配较多的内存空间,可将系统的物理块分成两部分,一部分按比例分配给各进程,另一部分则根据进程的优先权适当地增加相应份额后,分配给进程)
③实现请求调页的软件和实现页面置换的软件
I.页面调入策略

1.何时调入页面

  • 预调页策略
    • 采用以预测为基础的预调页策略,将那些预计在不久之后便会被访问的页面,预先调入内存,目前预调页的成功率仅为50%。主要用于进程的首次调入时.(毕竟预测实在是太难了)
  • 请求调页策略
    • 当程序在运行中需要访问某部分程序和数据时,若发现其所在的页面不在内存,便立即提出请求,由OS将其所需要的页面调入内存。
    • 优点:由请求调页策略所调入的页,一定会被访问且较易实现。
    • 缺点:每次仅调入一页,需花费较大的系统开销,增加了磁盘I/O的启动频率。

2.从何处调入页面

在请求分页系统中的外存分为文件区和对换区。

每当发生缺页时,系统应从何处将缺页调入内存,可分成三种情况:

  • 系统拥有足够的对换区空间:可以全部从对换区调入所需页面,以提高调页速度。
  • 系统缺少足够的对换区空间:凡不会被修改的文件,直接从文件区调入;换出时不用换,再调入时仍从文件区调入。可能被修改的部分,换出时需调到对换区,换入时从对换区调入。

UNIX方式:与进程有关的文件放在文件区,故未运行的页面应从文件区调入。

曾经运行但又被换出的页面被放在对换区,下次调入应从对换区调入。

进程请求的共享页面可能已被其它进程调入,无需再从对换区调入。

II.页面调入过程

3.是如何进行调入的

(1)每当程序所要访问的页面未在内存时,便向CPU发出一缺页中断,中断处理程序首先保留CPU环境,分析中断原因后,转入缺页中断处理程序。

(2)缺页中断处理程序通过查找页表,得到该页在外存上的物理块后,如果此时内存能容纳新页,则启动磁盘I/O将所缺之页调入内存,然后修改页表。

(3)如果内存已满,则需按照某种置换算法从内存中选出一页准备换出;如果该页未被修改过,可不必写回磁盘;但如果此页已被修改,则必须将它写回磁盘,然后把所缺的页调入内存,并修改页表中的相应表项,置其存在位为“1”,并将此页表项写入快表。

(4)在缺页调入内存后,利用修改后的页表,形成所要访问的物理地址,再去访问内存数据。

4.缺页率

缺页率 受以下几个因素的影响:

(1)页面大小。页面划分较大,则f较低,反之f较高;

(2)进程所分配的物理块数目。所分配的物理块数目多,则f较低,反之f较高;

(3)页面置换算法。算法的优劣决定了进程执行过程中的缺页中断次数,因此f是衡量页面置换算法的重要指标;

(4)程序固有特性。局部性越高,则f 越低。

III. 页面调入算法

把选择换出页面的算法称为页面置换算法,其好坏直接影响系统的性能。一个好的置换算法应具有较低的页面更换频率。从理论上讲,应将那些以后不会再访问的页面换出,或者把那些在较长时间内不会再访问的页面换出。

如果选用了一个不合适的调度算法就会出现这样的现象:刚被调出的页又立即要用,因而又要把它调入;而调入不久又被调出;调出不久又再次被调入。如此反复,使调度非常频繁,以至于使大部分时间都花费在页面置换上,这种现象称为抖动,又称颠簸。因而应该选择一种好的调度算法,有较低的页面更换频率,以减少和避免抖动现象。

  • ==最佳置换算法OPT==

是一种理论上的算法,所选择的被淘汰页面将是以后用不使用的,或者是在最长时间内不再被访问的,采用最佳置换算法,可以保证获得最低的缺页率,由于无法预知一个进程在内存的若干个页面中,哪个页面是未来最长时间内不再被访问的,因而该算法无法实现,但可以以此评价其他算法。

假设系统为某进程分配了三个物理块,并考虑如下的页面号引用串:7, 0 ,1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1。在进程运行后的置换如下图。

缺页次数:9

置换次数:6

缺页率:9/20=45%

  • ==先进先出FIFO置换算法==

该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰,该算法实现简单,只需要把一个进程已调入内存的页面,按照先后次序链接成一个队列,并设置一个指针,称为替换指针,使之指向最老的页面,但该算法与进程实际运行的规律不相适应,因为在进程中,有些页面经常被访问,FIFO算法并不能保证这些页面不被淘汰。

缺页次数:15

置换次数:12

缺页率:15/20=75%

先进先出算法的另一个缺点是它有一种异常现象。一般来说,对于任一作业或进程,如果给它分配的内存页面数越接近于它所要求的页面数,则发生缺页的次数会越少。但是,使用FIFO算法时,有时会出现分配的页面数增多,缺页次数反而增加的奇怪现象。这种现象称为Belady现象。先进先出算法产生Belady现象的原因在于它基于CPU按线性顺序访问地址空间这个假设,根本没有考虑程序执行的动态特征。

  • ==最近最久未使用(LRU)置换算法==

该算法根据页面调入内存后的使用情况来进行决策,由于无法预测各页面将来的使用情况,LRU只能使用”最近的过去”代替”最近的将来”,因此,LRU置换算法是选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次访问以来所经历的时间t,当需要淘汰一个页面时,选择现有页面中其t值最大的,即最近最久未使用的页面予以淘汰。

选择最后一次访问时间距离当前时间最长的一页并淘汰之。

缺页次数:12

置换次数:9

缺页率:12/20=60%

把LRU算法作为页面置换算法是比较好的,它对于各种类型的程序都能适用,但实现起来有相当大的难度,因为它要求系统具有较多的支持硬件。所要解决的问题有:一个进程在内存中的各个页面各有多久时间未被进程访问;如何快速地知道哪一页最近最久未使用的页面。

为此,须利用以下两类支持硬件:

1.移位寄存器:定时右移

  • 为每个在内存中的页面配置一个移位寄存器,用来记录某进程在内存中各页的使用情况。

    移位寄存器表示为R=Rn-1Rn-2Rn-3…R2R1R0当进程访问某物理块时,要将相应寄存器的Rn-1位置成1。

    此时,定时信号将每隔一定时间将寄存器右移一位。

    如果把n位寄存器的数看作一个整数,那么具有最小数值的寄存器所对应的页面,就是最近最久未使用的页面。

    其实本质上就是把访问过的页刷新为最大,每一次clock寄存器自动右移,代表除以2同步减少,最小的就是最长时间没使用的

2.栈:当进程访问某页时,将其移出压入“栈顶”,“栈底”换出。

利用一个特殊的栈来保存当前使用的各个页面的页面号。每当进程访问某页面时,便将该页面的页面号从栈中移出,将它压入栈顶。因此,栈顶始终是最新被访问页面的编号,而栈底则是最近最久未使用页面的页面号。

  • ==最少使用置换算法LFU==

为内存中的每个页面设置一个移位寄存器,用来记录该页面被访问的频率该算法选择在最近时期使用最少的页面作为淘汰页。

这种算法并不能真正反映出页面的使用情况,因在每一时间 间隔内, 只是用寄存器的一位来记录页的使用情况,因此在 每一时间间隔内访问1次和10000次是等效的

LFU与LRU的区别

  • LRU是最近最少使用页面置换算法(Least Recently Used),也就是首先淘汰最长时间未被使用的页面!
  • LFU是最近最不常用页面置换算法(Least Frequently Used),也就是淘汰一定时期内被访问次数最少的页!
  • 比如,第二种方法的时间T为10分钟,如果每分钟进行一次调页,主存块为3,若所需页面走向为2 1 2 1 2 3 4 注意,当调页面4时会发生缺页中断
    • 若按LRU算法,应换页面1(1页面最久未被使用)
    • 但按LFU算法应换页面3(十分钟内,页面3只使用了一次)
    • 可见LRU关键是看页面最后一次被使用到发生调度的时间长短
    • 而LFU关键是看一定时间段内页面被使用的频率!
  • ==CLOCK置换算法【NRU(Not Recently Used)算法】==

为每一页设置一位访问位,再将内存中的所有页面都通过链接指针链接成一个循环队列,当某页被访问时,其访问位置为1,置换算法在选择一页淘汰时,只需要检查页的访问位,如果是0,就选择该页换出;若为1,则重新置为0,暂不换出,给该页第二次驻留内存的机会,再按照FIFO算法检查下一页面。当检查到队列中的最后一个页面时,若其访问位仍然是1,则再返回到队首去检查第一个页面,该算法只有一位访问位,只能用它表示该页是否已经使用过,而置换时是将未使用过的页面置换出去,故又把该算法称为最近未用算法NRU(Not Recently Used)

在将一个页面换出时,如果该页已经被修改过,便需要将该页重新写回到磁盘上,但如果没有被修改过,则不必将它拷回磁盘,在改进的Clock算法中,增加了一个置换代价的因素,这样,选择页面换出时,既要是未使用过的页面,又是要未被修改过的页面,把同时满足这两个条件的页面作为首选淘汰页面。由访问位A和修改位M可以组合如下四种类型的页面

① (A = 0, M = 0),表示该页最近既未被访问,又未被修改,是最佳淘汰页面。

② (A = 0, M = 1),表示该页最近未被访问,但已被修改,并不是很好的淘汰页面。

③ (A = 1, M = 0),表示该页最近已被访问,但未被修改,该页可能被再次访问。

④ (A = 1, M = 1),表示该页最近已被访问且被修改,该页可能再被访问。

对于置换而言,执行如下几步。

① 从指针所指示的当前位置开始,扫描循环队列,寻找A = 0 且 M = 0的第一类页面,将所遇到的第一个页面作为所选中的淘汰页,在第一次扫描期间不改变访问位A。

② 如果第一步失败,即查找一周后未遇到第一类页面,则开始第二轮扫描,寻找A = 0 且 M = 1的第二类页面,将所遇到的第一个这类页面作为淘汰页。在第二轮扫描期间,将所有扫描过的页面的访问位A置为0。

③ 如果第二步也失败,即未找到第二类页面,则将指针返回到开始位置,并将所有的访问位复为0,然后重复第一步,如果仍然失败,则重复第二步,则一定能够找到被淘汰的页。

请求分页系统性能优越,是目前最常用的一种存储管理方式。但缺页情况影响着程序运行的速度及系统的性能;而缺页率的高低又直接与每个进程所占用的物理块数目有关。

(1)页面置换算法(2)写回磁盘的频率(3)读入内存的频率

IV.页面缓冲算法PBA

虽然LRU和Clock置换算法都比FIFO算法好,但都需要硬件支持,页面缓冲算法则既可改善分页系统的性能,又可采用一种较简单的置换策略。页面缓冲算法采用了可变分配和局部置换方式,页面缓冲算法中,设置了两个链表(队列)存放被淘汰的页:空闲页链表(实际上就是空闲物理块链表)和已修改页面链表。(都用来存放被淘汰的页,只不过进入的标准不一样。

当需要读入一个页面时,便利用空闲物理块链表中的第一个物理块来装入。

  • 当有一个未被修改的页要换出时,并不将它换出内存,而是直接把它所在的物理块挂在空闲页链表的末尾。
  • 换出一个已修改的页面时,则将其所在的物理块挂在修改页面链表的末尾。

注意:换出页面时,页面在内存并不做物理上的移动,只是将页表中的表项移到上述两个链表之一中。

这种方式可使已被修改的页面和未被修改的页面,都仍留在内存中。当进程以后再次访问这些页面时,就有可能只须花费较小的开销。只有当被修改页面达到一定数量,例如64个页面时,再将它们一起写回到磁盘,从而显著地减少了磁盘I/O的操作次数。

④访问内存的有效时间

注意:快表是一种寄存器,非内存中的部分分区。

λ:查找快表的时间

t:存储器的访问时间

ε:是缺页中断处理时间

a:命中率

f:缺页率

  • 请求分页系统中不发生缺页情况, 且对应的页表项在快表中

    • (EAT)= λ+t
      • λ+t:查找块表+内存取数据
  • 被访问页在内存中且对应的页表项在不快表中

    • EAT= λ+t +λ+t=2(λ+t)
      • 第一个λ+t:查找快表+访问存储器的页表
      • 第二个λ+t:存入快表+访问存储器中数据
  • 被访问页不在内存

    • EAT= λ+t +ε+λ+t=ε+2(λ+t)
      • 第一个λ+t:查找快表+访问存储器的页表
      • ε:缺页中断处理。
      • 第二个λ+t:存入快表+访问存储器中数据
  • 考虑快表的命中率及缺页率

    • EAT=λ+a×t+(1-a)×[t+f×(ε+λ+t)+(1-f)(λ+t)]
      • λ:访问页表
      • a×t:访问页表命中则访问内存取数据
      • (1-a):访问快表未命中
      • t:未命中则取访问页表
      • f×(ε+λ+t):缺页,发生中断处理将数据调入内存,地址存入快表,取数据
      • (1-f)(λ+t):不缺页,则地址存入快表,取数据
  • 不考虑快表的命中率只考虑缺页率

    • EAT=t+f×(ε+t)+(1-f)×t
      • 即a=λ=0
⑤抖动与工作集
I.抖动

在多道程序环境下,适当提高多道程序度(在内存中并发执行的程序数目),可以提高系统的吞吐量。否则将会出现“抖动”现象,反而使系统吞吐量下降。

在虚存中,页面在内存与外存之间频繁调度,以至于调度页面所需时间比进程实际运行的时间还多,此时系统效率急剧下降,甚至导致系统崩溃。这种现象称为颠簸或抖动

原因:

  • 分配给进程的物理块数太少(根本原因)

  • 页面淘汰算法不合理

II.工作集

所谓工作集是指,在某段时间间隔△里,进程实际要访问的页面的集合。

程序在什么时刻将访问哪些页面无法预知,只能利用程序过去某段时间内的行为,作为程序在将来某段时间内的行为的近似。把某进程在时间t 的工作集记为w(t, △),把变量△称为工作集“窗口尺寸”。下图显示了进程访问页面的序列及当窗口尺寸分别为3、4、5时的工作集。

其实就是把过去使用过的页存起来。满了就把最先放进去的顶出去。

据前表可以看出:

工作集与时间t有关:不同时间t 的工作集的大小不同,所包含的页面数也不相同;

工作集与窗口尺寸△有关:△选择得很大,以致能将一个进程的整个地址空间全部装入内存,存储器不会得以充分地利用,从而失去了虚拟存储器的意义。选择得过小,不能将进程所需的工作集全部装入内存,则会频繁地产生缺页中断,降低系统的吞吐率。

因此,工作集的大小应选择适中,使拐点附近的缺页率保持在适当合理的水平上。

III.抖动的预防方法

通过调节多道程序度可以防止抖动现象的产生和扩展,具体方法有:

  • 采取局部置换策略
    • 系统采取可变分配、局部置换。这样,即使有某个进程发生“抖动”,也不致引起其它进程也产生抖动,从而把抖动局限于较小的范围内。这种方法不能从根本上防止抖动的发生;而且发生抖动的进程还会长期地处于磁盘I/O的等待队列中,使其它进程缺页中断的处理时间增长,延长了有效的访问时间。
  • 在CPU调度程序中引入工作集算法
    • 当调度程序发现CPU利用率低时,自动地从外存调入一新作业进入内存。在调度程序从外存调入作业前,必须检查每个进程在内存的驻留集是否足够大,仅当每个进程在内存中有足够大的驻留集时,才再从外存上调入新的作业,以防新作业的调入而导致缺页率增加。
  • L=S准则
    • 当产生缺页的平均时间L等于系统处理进程缺页的平均时间S时,CPU利用率最高,以此原则调整多道程序度。
  • 挂起若干进程
    • 挂起某些进程,腾出内存分配给抖动的进程。被挂起的进程通常是优先权最低或较低的、不很重要但较大的进程(当内存非常拥挤时)、或者是具有最多剩余执行时间的进程。
思考题

1、在一个采用分页式虚拟存储管理的系统中,有一用户作业,它依次要访问的字节地址序列是:115,228,120,88,446,102,321,432,260,167。 若分配给作业可使用的主存空间共300个字节,作业的页面大小为100个字节,且第0页已经装人主存,请回答下列问题:

(1)按FIFO页面调度算法将产生多少次缺页中断?写出依次淘汰的页号。

(2)按LRU页面调度算法将产生多少次缺页中断?写出依次淘汰的页号。

答(过程略)

(1)FIFO页面调度算法将产生5次缺页中断,依次淘汰的页号:0、1、2

(2)按LRU页面调度算法将产生6次缺页中断,依次淘汰的页号:2、0、1、3

(2)请求分段存储管理方式

只需先调入若干个分段便可启动运行,当所访问的段不在内存中时,可请求OS将所缺的段调入内存。也同样需要硬件的支持。

①请求分段中的硬件支持

为了快速完成请求分段功能,需要支持的硬件有段表机制、缺段中断机制、地址变换机构。

I.段表

段表机制,由于只有一部分段装入内存,其余段仍留在外存上,需要再段表中增加若干项,以供程序调进、调出时参考。

  • 存取方式 :用于标识本分段的存取属性,只执行\只读或允许读/写。
  • 访问字段A :用于记录本段被访问的频繁程度。
  • 修改位M:表示该页在进入内存后是否已被修改过,供置换时参考)
  • 存在位P:表示本段是否已调入内存,供程序访问时参考
  • 增补位:用于表示本段在运行过程中是否做过动态增长
  • 外存始址:本段在外存中的起始地址,即起始盘块号。
II.缺页中断机构

进程运行时发现所需的段尚未调入内存,便由缺段中断机构产生一个缺段中断信号,进入OS后由缺段中断处理程序将所需要的段调入内存。需要在一条指令的执行期间,产生和处理中断,以及一条指令执行期间,可能会产生多次缺段中断。

缺段中断同样需要在一条指令的执行期间,产生和处理中断,以及在一条指令执行期间,可能产生多次缺段中断。

但不会出现一条指令被分割在两个分段中或一组信息被分割在两个分段中的情况。

对缺段中断的处理要比对缺页中断的处理复杂,因为段是不定长的。

III.地址变换机构

其在分段系统地址变换机构基础上形成,增加了缺段中断的请求和处理功能。

②分段的共享和保护

为了实现共享,可在内存中配置一张共享段表,所有各共享段都在共享段表中占有一表项。

除了段表再设置一个共享段表

(1) 共享计数count:共享段为多个进程所需要,当某进程不再需要它而释放它时,系统并不回收该段所占内存区,仅当所有共享该段的进程全都不再需要它时,才由系统回收该段所占内存区。设置count用于记录有多少个进程需要

(2) 存取控制字段:对于一个共享段,应给不同的进程以不同的存取权限。

(3) 段号:对于一个共享段,不同的进程可以各用不同的段号去共享该段。

分配与回收

为共享段分配内存时,对第一个请求使用该共享段的进程,由系统为该共享段分配一物理区,再把共享段调入该区,同时将该区的始址填入请求进程的段表的相应项中,还须在共享段表中增加一表项,填写有关数据,把count置为1;之后,当又有其他进程需要调用该共享段时,无需再为该段分配内存,只需在调用进程的段表中,增加一表项,填写该共享段的物理地址;在共享段的段表中,填上调用进程的进程名、存取控制等,再执行count:=count+1操作。

当共享该段的进程不再需要该段时,应将该段释放,包括撤消在该进程段表中共享段所对应的表项,以及执行count:=count-1操作。如果结果为0,则需由系统回收该共享段的物理内存,以及取消在共享段表中该段所对应的表项,否则只取消调用者进程在共享段表中的有关记录。

分段保护

  • 越界检查
    • 段表寄存器存放了段表长度;段表中存放了每个段的段长。在进行存储访问时,将段号与段表长度比较,段内地址与段长比较。
  • 存取控制检查
    • 段表中的每个表项都设置了“存取控制”字段,用于规定该段的访问方式。
      • 只读
      • 只执行
      • 读/写
  • 环保护机构
    • 规定:低编号的环具有高优先权
      • 一个程序可以访问驻留在相同环或较低特权环中的数据。
      • 一个程序可以调用驻留在相同环或较高特权环中的服务。

4、四、五章节存储器管理总结

页式方法会产生少量内部碎片。

段没有内部碎片,解决内部碎片最好的就是段式,但是会造成外部碎片。

碎片 一般默认是外部碎片。

-----------------------本文结束 感谢阅读-----------------------
坚持原创技术分享,您的支持将鼓励我继续创作!恰饭^.^~