操作系统重点知识梳理

一、操作系统引论

1. 操作系统的基本特征

  • 并发(Concurrence):在一段时间内同时存在多道运行的程序(进程)
    • 宏观上:多道程序同时在执行。
    • 微观上:在单处理机系统中,任何时刻只有一道程序在执行,即微观上多道程序在CPU上交替执行。
  • 并行(Parallel):指多道程序在同一时刻执行,通常需要多个硬件支持。
  • 并发执行能有校改善系统资源利用率,但是系统复杂化,因此操作系统必须对并发活动进行控制和管理(引入进程和线程)

2. 操作系统的主要功能

  • 处理机管理
  • 存储器管理
  • 设备管理
  • 文件管理
  • 用户接口

二、进程的描述与控制

1. 进程的定义

  • 进程是程序的依次执行
  • 进程是一个程序及其数据在处理机上顺序执行时所发生的活动
  • 进程是程序在一个数据集合上的运行过程,他是系统进行资源分配和调度的一个独立单位。
  • 进入进程实体的概念后(程序段+数据段+进程控制块),进程可以定义为:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。

为了描述和记录进程的运动变化过程,并使之能正确的运行,每个进程都应配置一个进程控制块(PCB)。从结构上看,每个进程(进程实体)都是由程序段,相关数据段及进程控制块组成。

  1. 进程实际上是指进程实体。
  2. 创建、撤销进程实际上是指创建、撤销进程实体的PCB。
  3. PCB是进程存在的位以标志

  • 进程独立运行基本单位的标志:PCB
  • 进程是程序的一次执行
  • 动态性是进程最基本的特征

2. 进程的描述与控制

  • 进程控制块pcb的作用

    1. 作为独立运行基本单位的标志
      1. 系统根据PCB而感知进程的存在,PCB是进程存在的唯一标志
      2. 系统创建一个新进程时,就为它建立了一个PCB;进程结束时就回收其PCB,进程于时也随之消亡
    2. 能实现间断性运行方式
      1. 利用PCB保存处理机状态信息,保护和恢复CPU现场。
    3. 提供进程管理虽需要的信息
      1. 根据PCB中的程序和数据内存地址,找到程序和数据。
      2. 系统根据PCB了解进程所需的全部资源。
    4. 提供进程控制所需要的信息
      1. OS要调度某进程执行时,从PCB中查现行状态及优先级。
    5. 实现以其他进程的同步和通信

  • 进程标志符

    • 内部标识符。由系统创建进程时分配给进程的惟一标识号,通常为一整数,称为进程号,用于区分不同进程。
    • 外部标识符。用户在访问该进程时使用,称为用户号。设置父进程标识及子进程标识。还可设置用户标识,以指示拥有该进程的用户。

  • 进程控制块PCB的组织方式

    • 链接方式
      1. 把同一状态的PCB链接成一个队列,这样就形成了就绪队列、阻塞队列等
    • 索引方式
      1. 将同一状态的进程组织在一个索引表中,索引表的表项指向相同的PCB,不同状态对应不同的索引表。
  • Suspend 挂起原语; Active 激活原语。
  • 原语操作与一般操作的区别在于:他们是”原子操作(Action Operation)“

三、处理机调度与死锁

处理机调度的集中算法

3.2作业调度(高级调度)

  • FCFS 先来先服务调度算法(作业等待的时间)
  • SPF 段进程优先算法(作业运行的时间)
  • HRRN 高相应比优先调度算法 (即考虑作业等待时间,又考虑作业运行时间)

3.3 进程调度(低级调度)

  • SRT 最短剩余时间调度算法
  • RR 时间片轮转调度算法
  • 非抢占式优先级
  • 抢占式优先级

3.4 实时调度

  • 最早截止时间优先算法(EDF算法, Earliest Deadline First)
    • 算法是依据任务的开始截止时间和完成截止时间来确定任务的优先级。截止时间越早,其优先级越高。就绪队列中任务按其截止时间排列,队首任务先分配处理机。
  1. 非抢占方式调度方式用于非周期实时任务。
  2. 抢占方式调度方式用于周期实时任务。

  • 最低松弛度优先算法(LLF,Least Laxity First)
    • 低松弛 = 高紧急
    • 算法是根据任务紧急(或松弛)的程度,来确定任务的优先级。任务的紧急程度越高,其优先级越高,并使之优先执行。
    • 算法采用抢占调度方式,可用于调度具有完成截止时间的周期性实时任务。
    • 松弛度 = 必须完成时间 - 本身剩余运行时间 - 当前时间

多处理器系统进程调度方式

多处理器系统中的进程调度方式:

  1. 自调度
  2. 专用处理器分配
  3. 成组调度
  4. 动态调度

3.5 计算机系统中的死锁

死锁式多个进程在运行过程中因争夺资源而造成的一种僵局(Deadli-Embrace),若无外力作用,这些进程都将无法向前推进。

死锁产生的原因:

  1. 竞争不可抢占资源引起死锁
  2. 竞争可消耗资源引起死锁
  3. 进程间推进顺序不当引起死锁

产生死锁的必要条件:4个

  1. 互斥条件(mutual exclusion)
    • 进程对所分配到的资源进行排他性使用。
  2. 请求和保持条件(hold-while-applying)
    • 进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时进程被阻塞,但对自己已获得的资源保持不放。
  3. 不可剥夺条件(non preemption)
    • 进程已获得的资源,在未使用完之前不能被抢占,只能在进程使用完时由自己释放。
  4. 环路等待条件(circular wait)
    • 只在发生死锁时,必然存在一个进程-资源的循环链,即进程集合P0, P1, P2,......, Pn中的P0,正在等待一个P1占用的资源,P1正在等待P2占用的资源, ......, Pn正在等待已被P0占用的资源。

处理死锁的方法

  1. 鸵鸟方法:对死锁视而不见,即忽略死锁。
  2. 预防死锁:通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或几个条件,来防止死锁的发生。
  3. 避免死锁:在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免死锁的发生。
  4. 检测死锁:允许系统在运行过程中发生死锁,但可设置检测机构及时检测死锁的发生,并采取适当措施加以清除。
  5. 解除死锁:当检测处死锁后,便采取适当措施将进程从死锁状态中解脱出来。

2. 预防死锁

1. 破坏互斥条件

  • 即允许多个进程同时访问资源。但由于资源本身固有特性的限制,此方法不可行。

2. 破坏请求和保持条件

  1. 全分配,全释放。弃了请求条件,也摒弃了保持条件。
  2. 摒弃保持条件:进程运行过程中必须释放已分配给自己 的且已经用完的全部资源,然后才能再请求新的所需资源。

3. 破坏不可剥夺条件

  1. 在允许进程动态申请资源前提下,规定一个进程在申请 新的资源不能立即得到满足而变为等待状态之前,必须 释放已占有的全部资源,若需要再重新申请。

4. 破坏环路等待条件


3. 避免死锁

银行家算法简介

  • 银行家算法的实质:设法保证系统动态分配资源后不进入不安全状态,以避免可能产生的死锁。
  • 银行家算法执行的前提条件:要求进程必须预先提出自 己的最大资源请求数量,这一数量不能超过系统资源的 总量,系统资源的总量是一定的。

银行家算法中的数据结构

假定系统中有n个进程(P1, P2, ......, Pn),m类资源(R1, R2,......, Rm),银行家算法中使用的数据结构如下:

  • 可利用资源向量:Avaliable[j] = k,表示Rj类资源有k个可用
  • 最大需求矩阵:Max[i, j] = k,进程Pi最大请求k个Rj类资源。
  • 分配矩阵:Allocation[i, j] = k,进程Pi已分配到k个Rj类资源
  • 需求矩阵:Need[i, j] = k,进程Pi还需要k个Rj类资源。
  • Need[i, j] = Max[i, j] - Allocation[i, j];

银行家算法描述(资源分配算法)

假定进程Pi请求分配Rj类资源K个,设Request[i, j] = k。当进程Pi发出资源请求后,系统按如下步骤进行检查。

  1. 如果Request[i, j] <= Need[i, j],转(2);否则出错,因为进程申请资源超过他声名的最大量
  2. 如果Request[i, j] <= Available[j],转(3);否则表示资源不够,需等待。
  3. 系统试分配资源给进程Pi,并作如下修改:
    • Available[j] = Available[j] - Request[i, j];
    • Allocation[i, j] = Allocation[i, j] + Request[i, j];
    • Need[i, j] = Need[i, j] - Request[i, j];
  4. 系统执行安全算法。若安全,则正式进行分配,否则回复原状态让Pi进程等待。

银行家算法描述(安全性算法)

为了进行安全性检查,需要定义如下数据结构:

  1. 工作变量Work[m]:记录可用资源。开始时,Work = Available。
  2. Finish[n]:记录系统是否有足够的资源分配给进程,使之运行完成。开始时,Finish[i] = false;当有足够资源分配给进程Pi时,令Finish[i] = true。

步骤如下:

  1. Work := Available; Finish[i] = false
  2. 寻找满足如下条件的进程Pi
    • Finish[i] = false;
    • Need[i, j] <= Work[j],如果找到,转(3),否则转(4)
  3. 当进程Pi获得资源后,可顺利执行完,并释放分配给他的资源,故执行:
    • Work[j] := Work[j] + Alocation[i, j];
    • Finish[i] := true; 转(2)
  4. 若所有进程的Finish[i] = true,则表示系统处于安全状态,否则处于不安全状态。

银行家算法流程图

操作系统重点知识梳理_第1张图片

死锁避免优缺点

  • 优点
    • 比死锁预防限制少
    • 无死锁检测方法中的资源剥夺,进程重启。
  • 缺点
    • 必须事先声明每个进程的最大资源请求。
    • 考虑的进程必须是无关的,也就是说,它们执行的顺序没有任何同步要求的限制。
    • 进程的数量保持固定不变,且分配的资源数目必须是固定的。

4. 死锁的检测和解除

检测死锁的基本思想:在操作系统中保存资源的请求和分配信息,利用某种算法对这些信息加以检查,以判断是否存在死锁。

资源分配图

操作系统重点知识梳理_第2张图片

  • 重要结论: 如果资源分配图中不存在环路,则系统中不存在死锁;反之,如果资源分配图中存在环路,则系统中可能存在死锁,也可能不存在死锁。
  • 死锁定理:出现死锁状态的充分条件是资源分配图不可完全简化。即:若资源分配图不可化简则出现死锁状态
    • 孤立节点:没有请求边和分配边与之相连。
    • 阻塞节点:有请求边但资源无法满足其要求。

死锁的检测

  • 死锁检测算法思想
    • 死锁检测算法的思想是基于资源分配图化简和死锁定理来检测死锁。
  • 死锁检测的原因
    • 系统没有采取任何预先限制死锁的措施。资源分配时不检查系统是否会进入不安全状态,被请求的资源被授予进程。需要周期性检测是否出现死锁。
  • 检测时机
    • 在每个资源请求时都进行(相当于死锁避免)
    • 定时检测。
    • 系统资源利用率下降时检测死锁。

死锁检测流程

操作系统重点知识梳理_第3张图片

死锁的解除

一旦检测出系统中出现了死锁,就应将陷入死锁的进程从死锁中解脱出来,常用的解除死锁的方法有两种:

  • 资源剥夺法:当发现死锁后,从其他进程剥夺足够数量的资源给死锁进程,以解除死锁状态。
  • 撤销进程法:采用强制手段从系统中撤销一个/一部分死锁进程,并剥夺这些进程的资源供其他死锁进程使用。
    • 撤销全部死锁进程。
    • 按某种顺序逐个地撤销进程,直至有足够的资源可用,使死锁状态消除。

基于最小代价原则一次只终止一个进程直到取消死锁循环为止。撤销进程选择原则如下:

  • 已消耗CPU资源时间最少
  • 到目前为止产生的输出量最少
  • 预计剩余的时间最长
  • 目前为止分配的资源总量最少
  • 优先级最低

四、存储器管理

4.1、存储器的层次结构

操作系统重点知识梳理_第4张图片

4.2、 程序的装入和链接

一个用户源程序要变为在内存中可执行的程序,通常要进行以下处理:

  • 编译:由编译程序将用户源程序编译成若干个目标模块。
  • 链接:由链接程序将目标模块和相应的库函数链接成装入模块。
  • 装入:由装入程序将装入模块装入内存。

1. 基本概念

  • 逻辑地址(相对地址,虚地址)
    • 其首地址为0,其余指令中的地址都相对于首地址而编址。用户的程序经过汇编或编译后形成目标代码,目标代码通常采用相对地址的形式。
    • 不能用逻辑地址在内存中读取信息。
  • 物理地址(绝对地址,实地址)
    • 内存中存储单元的地址,可直接寻址。
  • 地址映射(地址转换)
    • 为了保证CPU 执行指令时可正确访问存储单元,需将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址,这一过程称为地址映射。

2. 程序装入的方式

2.1. 绝对装入方式

  • 在编译时,如果能够事先知道程序将驻留在内存的什么位置,那么编译程序将产生绝对地址的目标代码。
  • 绝对装入程序按照装入模块中的地址,将程序和数据装入内存。装入模块被装入内存后,由于程序中的逻辑地址与实际内存中的地址完全相同,故不需对程序和数据的地址进行修改。
  • 该装入方式只适用于单道程序环境。
  • 绝对地址既可在编译时给出,也可由程序员直接赋予。
  • 要求程序员熟悉内存的使用情况。一旦程序或数据被修改后,可能要改变程序中的所有地址。

2.2. 可重定位装入方式

重定位的基本概念。

根据地址变换进行的时间及采用技术手段不同,可分为静态重定位和动态重定位两类。

  • 静态重定位
    • 当用户程序被装入内存时,一次性实现逻辑地址到物理地址的转换,以后不再转换。
    • 一般在装入内存时由软件完成。
  • 动态重定位
    • 在程序运行过程中要访问数据时再进行地址变换(即在逐条指令执行时完成地址映射)。一般为了提高效率,此工作由硬件地址映射机制来完成。
    • 硬件(寄存器)支持,软硬件结合完成。

2.3. 动态运行时装入方式

  • 程序运行时在内存中移动位置。

3. 程序的链接

根据链接时间的不同,可将链接分为三种:

  • 静态链接
    • 静态链接方式是一种事先链接方式,即在程序运行之前,先将各目标模块及它们所需的库函数,链接成一个完整的装入模块(执行文件),以后不再拆开。
  • 装入时动态链接
    • 装入时动态链接方式是把一组目标模块在装入内存时边装入边链接的方式。
  • 运行时动态链接
    • 运行时动态链接方式在程序运行中需要某些目标模块时,才对它们进行链接的方式。具有高效且节省内存空间的优点。

4.3、连续分配存储管理方式

连续分配方式(分区技术):指为一个用户程序分配一片连续的内存空间。

  • 静态分区:作业装入时一次完成,分区大小及边界在运行时不能改变。
  • 动态分去:根据作业大小动态地建立分区,分区的大小、数目可变。

1. 单一连续分配

静态分区技术,仅用于单用户但任务系统

  • 存储管理方法:将内存分为系统去(内存低端,分配给OS用)和用户区(内存高端,分配给用户用)
  • 采用静态分配方式,即作业一旦进入内存,就要等待它运行结束后才能释放内存。
  • 最简单的一种存储管理方式,但只能用于单用户、单任务OS中。
  • 主要特点:管理简单,只需要少量的软件和硬件支持,便于用户了解和使用。但因内存中之装入一道作业运行,内存空间浪费大,各类资源的利用率也不高。

2. 固定分区分配方式

固定分区分配方式是最早使用的一种可运行多道程序的存储管理方法。

  • 存储管理方法:将内存空间划分为若干个固定大小的分区,除OS占一区外,其余的一个分区装入一道程序。分区的大小可以相等,也可以不等,但事先必须确定,在运行时不能改变。即分区大小及边界在运行时不能改
  • 系统需建立一张分区说明表或使用表,以记录分区号、分区大小、分区的起始地址及状态(已分配或未分配)。

划分分区的方法

  • 分区大小相等
    • 用于利用一台计算机去控制多个相同对象的场合。缺点是缺乏灵活性。 -分区大小不等
    • 把分区划分成含有多个较小的分区,适量的中等分区极少量的大分区。

3. 动态分区分配的方式

动态分区分配是一种动态划分存储器的分区方法。

  • 存储管理方法:
    • 内存不是预先划分好的,作业装入时,根据作业的需求和内存的使用情况来决定是否分配
    • 若有足够的空间,则按需要分割一部分分区给该进程;否则令其等待内存空间。
  • 主要特点:管理简单,只需要少量的软件和硬件支持,便于用户了解和使用,主存的利用率有所提高。

动态分区分配中的数据结构

  • 空闲分区表: 用来登记系统中的空闲分区(分区号,分区起始地址,分区大小及状态)
  • 空闲分区链:
    • 前、后向链接指针用于把所有的空闲分区链接成一个双向链。当分区被分配出去以后,前、后向指针无意义。
    • 状态位0:未分配
    • 状态位1:已分配
    • 操作系统重点知识梳理_第5张图片

3.4基于搜索的动态分区算法

顺序搜索动态分配算法

  • 首次适应算法
  • 循环首次适应算法
  • 最佳适应算法
  • 最坏适应算法

3.4.1. 首次适应算法

  • 空闲分区(链)按地址递增的次序排列
  • 在进行内存分配时,从空闲分区表/链首开始顺序查找,直到找到第一个满足其大小要求的空闲分区为止。
  • 然后再按照作业大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲分区表(链)中。

首次适应算法的特点:优先利用内存低地址部分的空闲分区。但由于低地址部分不断被划分,留下许多难以利用的很小的空闲分区(碎片或零头),而每次查找又都是从低地址部分开始,增加了查找可用空闲分区的开销。


3.4.2. 循环首次适应算法

  • 循环首次适应算法又称为下次适应算法,由首次适应算法演变而来。在为作业分配内存空间时,不再每次从空闲分区表/链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直到找到第一个能满足其大小要求的空闲分区为止。
  • 然后再按照作业大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲分区表(链)中。

循环首次适应算法的特点:使存储空间的利用更加均衡,不致使小的空闲区集中在存储区的一端,但这会导致缺乏大的空闲分区。


3.4.3. 最佳适应算法

  • 空闲分区表/链按容量大小递增的次序排列。在进行内存分配时,从空闲分区表/链首开始顺序查找,直到找到第一个满足其大小要求的空闲分区为止。分配完一个后会将空闲分区按照容量递增的次序重新排列。
  • 按这种方式为作业分配内存,就能把既满足作业要求又与作业大小最接近的空闲分区分配给作业。将剩余空闲分区仍留在空闲分区表/链中。
  • 第一次找到的能满足要求的空闲区必然是最佳的。

最佳适应算法的特点:若存在与作业大小一致的空闲分区,则它必然被选中,若不存在与作业大小一致的空闲分区,则只划分比作业稍大的空闲分区,从而保留了大的空闲分区。最佳适应算法往往使剩下的空闲区非常小,从而在存储器中留下许多难以利用的小空闲区(碎片)。


3.4.4. 最坏适应算法

  • 空闲分区表/链按容量大小递减的次序排列。在进行内存分配时,从空闲分区表/链首开始顺序查找,直到找到第一个满足其大小要求的空闲分区为止。
  • 总是挑选一个最大的空闲区分割给作业使用,其优点是可使剩下的空闲区不至于太小,产生碎片的几率最小,对中、小作业有利。

最坏适应算法的特点:总是挑选满足作业要求的最大的分区分配给作业。这样使分给作业后剩下的空闲分区也较大,可装下其它作业。由于最大的空闲分区总是因首先分配而划分,当有大作业到来时,其存储空间的申请往往会得不到满足。


3.5. 基于索引的动态分区分配算法

基于顺序搜索的动态分区分配算法一般只是适合于较小的系统,如果系统的分区很多,空闲分区表(链)可能很大(很长),检索速度会比较慢。为了提高搜索空闲分区的速度,大中型系统采用了基于索引搜索的动态分区分配算法。

3.5.1 快速适应算法(Quick Fit)

  • 快速适应算法,又称为分类搜索法,把空闲分区按容量大小进行分类,经常用到长度的空闲区设立单独的空闲区链表。系统为多个空闲链表设立一张管理索引表。

3.5.2 伙伴系统(Buddy system)

  • 伙伴系统是介于固定分区与可变分区之间的动态分区技术。
  • 伙伴:在分配存储块时将一个大的存储块分裂成两个大小相等,这两个小块就称为“伙伴”。
  • 伙伴系统规定,无论已分配分区或空闲分区,其大小均为2的K次幂,K为整数,n<= k <=m,其中:2n表示分配的最小分区的大小,2m表示分配的最打分区的大小,通常2^m是真个可分配内存的大小。

伙伴系统的内存分配 操作系统重点知识梳理_第6张图片


3.6. 系统中的碎片

内存中无法被利用的存储空间称为碎片。

  • 内部碎片:指分配给作业的存储空间中未被利用的部分,如固定分区中存在的碎片。
  • 外部碎片:指系统中无法利用的小的空闲分区。如分区与分区之间存在的碎片。这些不连续的区间就是外部碎片。

4.4 覆盖与对换

4.4.1. 覆盖

把一个程序划分为一系列功能相对独立的程序段,让执行时不要求同时装入内存的程序段组成一组(称为覆盖段),共享主存的同一个区域,这种内存扩充技术就是覆盖。

4.4.2 对换

将暂时不用的某个进程及数据(首先是处于阻塞状态优先级最低的)部分(或全部)从内存移到到外存(备份区或对换区)中去,让出内存空间,同时将某个需要的进程调入到内存中,让其运行。

对换与覆盖的区别

  • 覆盖可减少一个进程运行所需的空间。对换可让整个进程暂存于外存中,让出内存空间。
  • 覆盖是由程序员实现的,操作系统根据程序员提供的覆盖结构来完成程序段之间的覆盖。对换技术不要求程序员给出程序段之间的覆盖结构。
  • 覆盖技术主要在同一个作业或进程中进行。对换主要在作业或进程之间进行。

4.5 分页存储管理方式

给定一个逻辑地址空间中的地址为A,页面的大小为L,则页号P和页内地址d(从0开始编号)可按下式求得:P = A / L; d = A % L; int型

4.5.3. 访问内存的有效时间

有效时间(Effective Access Time, EAT)是指从给定逻辑地址,经过地址变换,到在内存中找到对应物理地址单元 并取出数据所用的总时间。

  • 基本地址变换机构
    • 设TM为内存的访问时间
    • EAT = 2TM
  • 具有块表的地址变换机构
    • 设PTLB为块表的命中率,TTLB为快表的访问时间
    • EAT = PTLB*(TTLB + TM) + (1 - PTLB)*(TTLB + 2TM)

五、虚拟存储器

5.1 虚拟存储器的定义和特征

定义

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

虚拟存储器的特征

  • 多次性:作业被分成多次调入内存运行。正是由于多次性,虚拟存储器才具备了逻辑上扩大内存的功能。多次性是虚拟存储器最重要的特征,其它任何存储器不具备这个特征。
  • 对换性:允许在作业运行过程中进行换进、换出。换进换出可提高内存利用率。
  • 虚拟性:指能够从逻辑上扩充内存容量,使用户所看到的内存容量远大于实际内存容量。虚拟性是实现虚拟存储器最重要的目标。
  • 虚拟性以多次性和对换性为基础,而多次性和对换性必须以离散分配为基础。

虚拟存储技术的概念

  • 速度和容量:虚拟存储量的扩大是以牺牲CPU 工作时间以及内外存交换时间为代价。
  • 虚拟存储器的容量取决于主存与辅存的容量,最大容量是由计算机的地址结构决定。
  • 虚拟存储器的逻辑地址空间理论上不受物理存储器的限制。如32 位机器,虚拟存储器的最大容量就是4G,再大CPU 无法直接访问。
  • 虚拟存储器的实现方法:请求分页、请求分段、请求段页式。

虚拟存储器的实现方法

选项 header 2 请求分段系统
基本单位
长度 固定 可变
分配方式 固定分配 可变分配
复杂性 较简单 较复杂

5.2 请求分页存储管理方式

  1. 状态位P:指示该页是否已被调入内存。供程序访问时参考
  2. 访问字段A:记录页在一段时间内被访问的次数或最近未被访问的时间。供选择页面换出时参考
  3. 修改位M:表示该页在调入内存后是否被修改过。若修改过,则置换该页时需要重写该页至外存。供置换页面时参考
  4. 外存地址:指出该页在外存上的地址。供调入该页时参考

地址变换机构流程图

操作系统重点知识梳理_第7张图片

页面调入策略

从何处调入

在请求分页系统中,外存分成了按离散分配方式存放文件的文件区和按连续分配方式存放的对换页的对换区。进程发出缺页请求时,从何处将缺页调入内存呢?

  • 对换区:如果系统有足够的对换区空间,运行前可将与进程相关的文件从文件区复制至对换区,以后缺页时全部从对换区调页。
  • 文件区:如果系统中没有足够的对换区空间,凡是不会被修改的文件,直接从文件区调页,换出时换至对换区,以后从对换区调页。
  • UNIX方式:凡是未运行过的页面均从文件区调页,运行过的页面和换出的页面从对换区调页。

缺页率

如果一个进程的逻辑空间为n页,分配到的物理块为m(m

影响缺页的因素:

  • 页面大小:页面大则缺页率低,反之缺页率高。
  • 分配到的物理块数:块数多则缺页率低。
  • 页面置换算法:缺页率是衡量置换算法优势的指标
  • 程序特性:局部化程度高则缺页率低,反之缺页率高。

5.3 页面置换算法

最佳置换算法OPT

  • 选择永远不再需要的页面或最长时间以后才需要访问的页面予以淘汰。
  • 最佳置换算法是一种理想化的算法,性能好,实际上这种算法无法实现,因为页面访问的未来顺序很难精确预测,但可用该算法评价其他算法的优劣。

先进先处置换算法FIFO

  • 选择先进入内存的页面予以淘汰;
  • 先进先出算法存在一种异常现象,即在某些情况下会出现分配给进程的物理块数增多,缺页次数有时增加,有时减少的奇怪现象,这种现象成为Belady异常现象

最近最久未使用算法(LRU)

  • 选择最近一段时间最长时间没有被访问过的页面予以淘汰。
  • 算法的出发点:如果某个页面被访问了,则它可能马上还要访问。如果很长时间未被访问,则他在最近一段时间也不会被访问。(OPT向前看, LRU向后看)
  • 每当进程访问某页面时,将该页面对应寄存器的最高位(Rn?1) 置1,系统定期(如100ms) 将寄存器右移一位并将最高位补0,如果把n 位寄存器的数看作是一个整数,于是寄存器数值最小的页面是最久未使用的页面。

最近最少使用置换算法(LFU)

  • 最近最少使用置换算法LFU:选择在最近时期使用最少的页面为淘汰页。
  • LFU置换算法为在内存中的每个页面设置一个位移寄存器来记录该页面被访问的频率。
  • 每当进程访问某页面时,将该页面对应寄存器的最高位(Rn-1)置1,系统定期(如100ms)将寄存器右移一位,并将最高位补0.在一段时间内,Ri加和最小的页面就是最近最少使用的页面

Clock置换算法

  • Clock置换算法是LRU和FIFO的折衷(LRU的近似算法,减少硬件消耗)。也称最近未使用算法(Not Recently Used,NRU)
  • 该算法为每页设置一个访问位,并将内存中的所有页链接成一个循环队列。当某页被访问时,其访问位被置1。
  • 置换算法在选择一页淘汰时,只需要检查页的访问位。如果是0,就选择该页换出;若为1,则重新将他置0,暂不换出,而给该页第二次驻留内存的机会,再按照FIFO算法检查下一个页面(循环,不是回到队首)。
  • 当检查到队列中的最后一个页面时,若其访问位仍为1,则再返回到队首去检查第一个页面。

双指针Clock算法,改进型Clock

  • 从指针所指示的当前位置开始扫描循环队列,寻找A=0且M=0 的第一类页面,将所遇到的第一个页面作为所选中的淘汰页。在第一次扫描期间不改变访问位A。
  • 如果第一步失败,开始第二轮扫描,寻找A=0 且M=1的第二类页面,将所遇到的第一个这类页面作为淘汰页。在第二轮扫描期间,将所有扫描过的页面的访问位都置0。
  • 如果第二步也失败,则将指针返回到开始的位置,并将所有的访问位复0。然后重复第一步,如果仍失败,必要时再重复第二步。

影响页面换入换出效率的若干因素

  • 页面置换算法。
  • 回写磁盘的频率。已经被修改过的页面,换出时应当回写磁盘。如果建立一个已修改换出的页面链表,可以暂不回写。当达到一定数目后,再将他们一起写入磁盘,这样能大大减少I/O操作的次数。
  • 读入内存的频率。已修改换出页面链表上的页面在回写前,如果需要被再次访问,就不需要从外存调入,直接从链表中获取。

5.3.4页面缓冲算法PBA

  • 页面缓冲算法:用FIFO算法选择被置换页,选择换出的页面不是立即换出,而是放入两个链表之一,如果页面未被修改,就将其归入到空闲页面链表的末尾,否则将其归入已修改页面链表末尾。
  • 这些空闲页面和已修改页面会在内存中停留一段时间。如果这些页面被再次访问,只需将其从相应链表中移出,就可以返回进程,从而减少一次I/O 开销。
  • 需调入新页,则将新页读入到空闲页面链表的第一个页面中,然后将其从该链表中移出。
  • 当已修改的页面达到一定数目后,再将他们一起写入磁盘。这样能大大减少I/O操作的次数。

页面置换算法比较

操作系统重点知识梳理_第8张图片

5.3.5. 访问内存的有效时间EAT

  1. 被访问页面在内存,且对应的页表项在快表中。设访问快表的时间为λ,访问内存的时间为t。
    • EAT = λ + t
  2. 访问页面在内存,但对应的页面表项不在快表中。这种情况不缺页,但需两次访问内存。一次读页表,并更新快表,一次读数据。
    • EAT = λ + t + λ + t 或 EAT = λ + t + t
    • 更新快表λ与读数据t可并行。
  3. 被访问页面不在内存。
    • 缺页。设缺页中断处理时间为ϵ
    • EAT = λ + t + ϵ + λ + t
  4. 如果考虑快表的命中率a 和缺页率f
    • EAT = a(λ + t) + (1-a)[λ + t + λ + f(ϵ + t) + (1-f)t]
  5. 如果不考虑快表,仅考虑缺页率f,即令上式中λ = 0 和 a = 0;
    • EAT = t + f(ϵ + t) + (1-f)t

内存访问时间t 约为 100ns(纳秒) = 0.1us(微秒) 
缺页中断时间ϵ 约为25ms(毫秒) = 25000us(微秒)


六、输入输出系统

6.1 I/O系统的功能、模型和接口

  • 提高设备利用率的关键是实现设备的并行操作。

6.1.2 I/O软件的层次结构

  • 用户层I/O软件
  • 设备独立性软件
  • 设备驱动程序
  • 中断处理程序 操作系统重点知识梳理_第9张图片

6.1.3 I/O系统接口

  • 块设备接口
  • 流设备接口
  • 网络通信接口

6.2 I/O设备

设备控制器与处理机的接口

  1. 设备控制器与处理机的接口
  2. 设备控制器与设备接口
  3. I/O逻辑
  4. 寄存器

6.3 中断机构和中断处理程序

  • 当一个进程请求I/O时,进程被阻塞,知道I/O完成/
  • I/O完成后,设备控制器向CPU发出一个中断请求,CPU相应中断请求后转向中断处理程序。
  • 中断处理程序执行相应的处理后,唤醒被阻塞的进程。

中断处理程序是操作系统中与硬件最接近的一部分。


6.4.3 对I/O设备控制方式。

  • 采用轮询的可编程I/O方式(程序直接控制方式)。
  • 采用中断可编程I/O方式
  • 直接存储器访问方式(DMA)
  • I/O通道方式

6.8 磁盘存储器的性能和调度

提高磁盘I/O速度的主要途径。

  1. 选择性能好的磁盘。
  2. 采用好的磁盘调度算法。
  3. 设置磁盘告诉缓存。
  4. 其他方法(提前读、延迟写、虚拟盘)
  5. 采用度可靠、快速的磁盘系统:独立磁盘冗余阵列(RAID)

磁盘结构 操作系统重点知识梳理_第10张图片


数据的组织

  • 磁盘结构:盘面、磁道、扇区
  • 磁盘物理块的地址:磁头号、柱面号、扇区号
  • 存储容量=磁头(盘面)数× 磁道(柱面)数 × 每道扇区数 × 每扇区字节数

6.8 磁盘调度算法

  • 早期的磁盘调度算法
    • 先来先服务FCFS
    • 最短寻道时间优先SSTF
  • 扫描算法
    • 扫描(SCAN)/电梯(LOOK)算法
    • 循环扫描(CSCAN)算法
    • N-STEP-SCAN调度算法和FSCAN调度算法

先来先服务调度算法(FCFS)

  • 只考虑申请者申请的先后次序完成磁盘访问操作。
  • 可能造成磁头臂来回反复移动,增加了等待时间,而且对机械结构不利。

最短寻道时间优先算法(SSTF)

  • 以申请着要求磁头移动距离的大小最为优先的因素
  • 靠近当前磁头位置的申请者迅速得到满足,防止了磁头的大幅度来回摆动。可能使一些申请者在较长时间内得不到服务

循环扫描算法(Circular SCAN,CSCAN)

  • 循环扫描算法是为了消除边缘柱面与中部柱面等待时间差异而进行的改进。
  • 磁头只在单方向移动过程中才为途经的请求服务,一旦达到边缘,则立即快速移动至另一边缘,在此移动过程中并不处理访问请求,然后重新开始新一轮扫描
  • 特点:消除了对两端磁道请求的不公平。

N-STEP-SCAN调度算法

  • N-STEP-SCAN调度算法将磁盘请求队列分成若干个长度为N的子队列,而磁盘调度将按FCFS算法依次处理这些子队列,而每一子队列按SCAN算法处理。 N = 1 => FCFS算法 N很大 => SCAN算法

FSCAN调度算法

  • FSCAN 算法实质上是N 步SCAN 算法的简化。FSCAN 只将磁盘请求队列分成两个子队列。一个是由当前所有请求磁盘I/O的进程形成的队列,由磁盘调度按SCAN 算法进行处理。
  • 在扫描期间,将新出现的所有请求磁盘I/O 的进程放入另一个等待处理的请求队列。这样所有的新请求都将被推迟到下一次扫描时处理。

Linux时限调度算法

  • 时限(deadline)调度算法:在传统的电梯算法中加入了请求超时的机制
  • 时限调度算法需要维护三个队列。一个室按照山区或磁道排序的读写请求队列(电梯队列);另外两个是按照过期时限(deadline)排序的读写请求队列。 操作系统重点知识梳理_第11张图片
  • 系统在处理每个I/O 请求时,都被附加一个最后执行期限(deadline),也就是为其规定在相应FIFO 队列里等待的时限。
  • 这个时限是可调整的,比如:对于读请求默认时限值是0.5s,写请求默认时限值是5s。
  • 在一个新I/O 请求到达时,按所请求块号的大小顺序,在“排序的电梯队列”里排队。
  • 此外,如果是读请求,就按到达的时间顺序,排在“读”FIFO 队列末尾;如果是写请求,就按到达的时间顺序,排在“写”FIFO 队列的末尾。
  • 调度程序对排序的电梯队列里的请求进行调度服务。在一个I/O 请求处理完成时,就将其从排序电梯队列和相应的FIFO 队列里移走。
  • 如果扫描到了电梯的末尾,按传统的电梯算法需要返回到电梯首部。但时限调度算法是返回到等待时间最久的那个I/O 请求(读写请求队列队首的请求),从那个I/O请求开始,沿磁道递增方向继续扫描。
  • 上面的过程中,如果有I/O 请求超时,调度程序就立即对它进行调度服务,处理完成后将其从排序电梯队列和相应的FIFO 队列里移走。然后从这个I/O 请求开始,沿磁道递增方向继续扫描。

你可能感兴趣的:(操作系统,操作系统,LINUX,UNIX)