操作系统复习

操作系统复习

操作系统概述

操作系统的主要任务和功能

  • 1、管理处理机:完成处理机资源的分配调度等功能。
    • 进程控制:创建和撤销进程以及控制进程的状态转换;
    • 进程同步与互斥:协调执行进度,互斥访问临界资源;
    • 进程通信:进程间的信息交换;
    • 处理机调度:按一定算法从进程就绪队列中选出一个进程,把处理机分配给它,使之运行。
  • 2、管理存储器
    • 内存分配与回收;
    • 内存保护:保护进程间互不干扰;
    • 地址映射:进程逻辑地址到内存物理地址的映射;
    • 内存扩充:虚拟存储技术,提高内存利用率、扩大进程的内存空间。
  • 3、管理设备
    • 设备分配与回收:在多用户间共享I/O设备资源;
    • 设备处理:启动设备、中断处理;
    • 虚拟设备功能:设备由多个进程共享,每个进程如同独占;
    • 缓冲区管理:匹配CPU和外设的速度,提高两者的利用率;
    • 磁盘调度。
  • 4、管理文件
    • 目录管理:解决信息检索问题。文件的属性(如文件名)、单一副本赋予多文件名;
    • 文件的逻辑组织与访问方式;
    • 文件存储空间管理(物理组织):解决如何存放信息,以提高空间利用率和读写性能;
    • 文件共享与安全。
  • 5、提供接口服务
    • 接口指操作系统为用户提供的人机交互界面。
    • 目标:提供一个友好的用户访问计算机系统的接口。
    • 操作系统向上提供两种接口:
      • 命令接口:供用户组织控制自己的计算机系统。
        • (1)命令行:以命令行方式供用户通过键盘终端与计算机交互,如UNIX、DOS;
        • (2)图形化用户接口:如Windows系列操作系统提供了形象、生动的图形化界面,用户只需拖动并点击鼠标,便可轻松操作计算机。
      • 编程接口:以系统调用的形式供用户编程时使用操作系统功能。
        • (1)系统调用是操作系统提供的最基本的一级服务,供用户程序调用;
        • (2)系统调用只能在程序中作为程序语句使用,不能单独使用。

现代操作系统的发展

  • 多道批处理系统:作业成批提交,根据用户提供的作业控制相关信息,处理机自动切换处理,提高系统资源利用率和吞吐量;
    • 多道批处理的运行特征
      • 多道:允许多个程序同时存在于内存中,按照某种原则分派处理机,逐个执行这些程序;
        • 宏观上同时运行:都处于运行状态,但都未运行完;
        • 微观上串行运行:各作业交替使用CPU。
      • 批处理:用户提交的作业首先存放在外存,并排成一个队列,由作业调度程序按照一定的算法从该队列中一次选取一个或若干个作业装入内存执行
  • 分时系统:及时响应提供交互式操作环境
    • 分时系统的特点
      • 交互性:计算机系统和用户用会话方式工作。
      • 多路性:多个用户同时在自己的终端上上机,共享计算机的CPU和其它资源。
      • 及时性:计算机系统应该在用户能够忍受的等待时间内对用户的请求予以响应。
      • 独立性:系统内每个用户程序独立工作,让用户有独占主机资源的感觉。
    • 设计分时系统优先考虑的目标是:交互性响应的及时性
    • 现代操作系统常兼有分时和批处理功能。
  • 实时系统:即时响应系统可靠
    • 分时系统为交互式作业提供了快速的响应服务,但还不能满足某些对响应时间要求非常严格的任务需要。
    • 例如,用于工业过程控制、军事实时控制、金融等领域,包括实时控制、实时信息处理等。
    • 如炼钢/炼油控制系统,战斗机应急控制系统,航空/铁路售票系统,行车电脑等,对任务的响应时间及可靠性有更严格的要求。

现代操作系统的特征

  • 1、共行性:并发是重点
    • 宏观上,指系统中有多个任务同时运行;
    • 微观上,指在单处理机系统中的任务并发,即多个任务在单个处理机上交替运行;或多处理机系统中的任务并行,即多个任务在多个处理机上同时运行
      • 并发,多个事件在同一时间段内发生;
      • 并行,指在同一时刻发生。
  • 2、共享性
    • 多个进程共享有限的计算机系统资源。
      • 宏观上多个任务可以同时使用系统资源;
      • 微观上多个任务可能交替的使用系统中的某个资源。
  • 3、虚拟性
    • 指将一个物理上的实体变为若干个逻辑上的对应物;
      • 如,采用分时技术,将一台处理机虚拟为若干台处理机。还可以虚拟存储、虚拟设备、虚拟通道、虚拟文件等。
  • 4、异步性(不确定性)
    • 程序执行结果不确定,程序不可再现。(不允许)
    • 多道程序环境下,进程以异步方式执行,即进程的执行顺序执行时间不确定性
      • 进程的运行速度不可预知:当多个进程并发执行,“时走时停”,不可预知每个进程的运行推进快慢;
      • 无论快慢,应该结果相同:通过进程互斥和同步手段来保证。

重要概念

  • 多道程序设计技术
    • 为了提高系统吞吐量资源利用率,允许多个程序同时驻留内存,使处理机在这些程序之间切换,在一段时间内,执行完多个程序的处理技术称为多道程序设计技术。
    • 现代操作系统基本都采用了多道程序设计技术。
  • 分时
    • 在多道程序技术的基础之上,按时间片(time slice)分配各个程序在CPU上执行的轮换时间。
    • 使用户与应用程序及时交互,适于商业和事务处理等应用。

处理机管理

进程基本概念

  • 进程:
    • 程序在一个数据集合上的运行过程
  • 程序:
    • 静态概念,是指令数据的结合,可长期存储。
  • 进程与程序的区别:进程是动态的,程序是静态的;进程是暂时的,程序是永久的。
    • 一个程序可以对应一个进程或多个进程;
    • 一个进程可以对应一个程序或一段程序。
  • 进程的特征
    • 动态性,进程对应程序的执行过程
      • 进程动态产生、动态消亡;
      • 进程状态转换;
      • 动态的地址空间。
    • 并发性:进程可以同其他进程一起向前推进
    • 独立性:进程是资源分配(调度)的独立单位
    • 异步性:每个进程都以其相对独立的不可预知的速度向前推进。
  • 进程的组成
    • 程序、数据集合、进程控制块PCB
  • PCB:系统为了管理进程设置的一个专门的数据结构,用它来记录进程的外部特征,描述进程的运动变化过程。
    • PCB是进程存在的唯一标志。创建进程时,创建PCB;进程结束时,系统将撤销其PCB。
  • PCB包含的内容
    • 进程标识信息:进程内部和外部标识符;
    • 处理机状态信息(在当前进程被迫让出处理机时,保存当前进程运行的现场环境,为进程的再次运行做好准备) :通用寄存器值、指令计数器值、程序状态字PSW值、用户栈指针值等;
    • 进程调度信息:进程状态、进程优先级、进程调度的其他相关信息等;
    • 进程控制信息:程序及数据地址、进程同步和通信机制、资源清单、链接指针等;
  • PCB组成方式
    • 单一队列:
      • 所有进程的PCB通过链表组织成一个单一队列,适用于进程数目不多的系统。
    • 多级链表结构:
      • PCB按进程状态不同组成不同队列:就绪进程队列、阻塞进程队列(可按阻塞原因不同分别组织);
      • 系统分别记载各PCB链表的起始地址。
    • 索引表结构:
      • PCB按进程状态不同,组织成不同的表格:就绪进程表、执行进程表(多机系统中)、阻塞进程表;
      • 系统分别记载各PCB表的起始地址。

进程的状态及变换

  • 进程可以在两状态之间转换:执行、未执行
  • 进程的五状态:
    • 执行状态(Running):占用处理机(单处理机环境中,某一时刻仅一个进程占用处理机);
    • 就绪状态(Ready):准备执行;
    • 阻塞状态(Blocked):等待某事件发生才能继续执行,如等待I/O完成等;
    • 新状态(New):进程已创建,但未被OS接纳为可执行进程;
    • 终止状态(Terminated)/退出(Exit):因停止或取消,被OS从执行状态释放;
  • 进程状态转换
    • 1、空→新状态:新创建的进程首先处于新状态
    • 2、新状态→就绪状态:当系统允许增加就绪进程时,操作系统接纳新建状态进程,将它变为就绪状态,插入就绪队列中;
    • 3、就绪状态→执行状态:当处理机空闲时,将从就绪队列中选择一个进程执行,该选择过程称为进程调度,或将处理机分派给一个进程,该进程状态从就绪转变为执行;
    • 4、执行状态→终止状态:执行状态的进程执行完毕,或出现诸如访问地址越界非法指令等错误,而被异常结束,则进程从执行状态转换为终止状态
    • 5、执行状态→就绪状态:分时系统中,时间片用完,或优先级高的进程到来,将中断较低优先级进程的执行,进程从执行状态转变为就绪状态,等待下一次调度
    • 6、执行状态→阻塞状态:执行进程需要等待某事件发生。通常,会因为进程需要的系统调用不能立即完成,如读文件、共享虚拟内存、等待I/O操作、等待另一进程与之通信等事件而阻塞;
    • 7、阻塞状态→就绪状态:当阻塞进程等待的事件发生,就转换为就绪状态,进入就绪队列排队,等待被调度执行。
  • 两种执行模式
    • 系统模式(系统态)、控制模式或内核模式:
      • 具有较高的特权
      • 运行系统特定的指令,包括读/写控制寄存器的指令、基本I/O指令及与存储器管理有关的指令,及一些访问特定内存区的指令
      • 系统模式下的处理机及其指令、寄存器和内存都受到完全控制和保护
    • 用户模式(用户态):
      • 具有较低的特权
      • 用户程序一般运行在用户模式
    • 模式切换
      • 用户模式→系统模式:用户程序执行到一条系统调用,进入操作系统内核执行;
      • 系统模式→用户模式:执行完系统调用的功能,返回到用户程序;
      • 特殊情况:程序执行到结束语句时,切换到系统模式,不再返回到用户程序。

进程控制及原语

  • 原语的定义
    • 操作系统提供的为完成某系统功能的最基本的不可分割的操作。
      • 由若干条指令构成的“原子操作(atomic operation)”过程,作为一个整体而不可分割-要么全都完成,要么全都不做。
  • 进程控制
    • 系统使用具有特定功能的程序段创建撤销进程以及完成进程各状态间的转换过程。
    • 通过进程控制,可以达到多进程高效率并发执行,同时也能很好的协调并发进程之间的推进速度,实现资源共享。
    • 操作系统中通过原语完成对进程的控制。
  • 进程控制原语
    • 创建(create)与终止(terminate)
    • 阻塞(block(q))与唤醒(wakeup(q))
    • 挂起(suspend)与激活(activate)
    • 进程切换(dispatch)

处理机调度

  • 调度衡量标准:面向用户
    • 响应时间:从用户提交请求开始,到系统首次产生响应为止的时间。常用于评价分时系统的性能。
    • 周转时间:从作业提交给系统开始,到作业完成为止的时间。常用于评价批处理系统的性能。
    • 截止时间:某任务必须开始执行的最迟时间,或必须完成的最迟时间。常用于评价实时系统的性能。
  • 调度的原则:面向系统
    • 系统吞吐量、处理机利用率、各类资源的平衡使用、公平性及优先级。
  • 调度的层次:作业从进入系统成为后备作业开始,直到运行结束退出系统为止,通常需要经历不同级别的调度:
    • 高级调度(长程调度),又称宏观调度、作业调度;
      • 作业调度,决定哪些位于外存上、处于后备状态的作业调入内存,并为它创建进程,分配必要的资源,准备运行
    • 低级调度(短程调度),又称微观调度、进程调度;
      • 进程调度,决定哪个进程可以获得CPU
    • 中级调度(中程调度),又称交换调度。
      • 进程交换,决定哪些进程可参与竞争CPU,目的是提高内存利用率和系统吞吐量,操作包括换出(挂起)、换入(激活)。
  • 进程调度的方式
    • 非抢占式调度:
      • 非抢占式调度:只有当正在执行的进程:
        • 执行完毕;
        • 或因申请I/O阻塞自己;
        • 或进程同步互斥过程中,执行了某种原语操作,如Block原语。
      • 才中断其执行并释放处理机,调度新的进程执行。
      • 非抢占式很难满足交互式系统和实时系统的需求,主要用于批处理系统。
    • 抢占式:操作系统可以在新进程到来时,或某个具有较高优先权的进程插入就绪队列时,或在基于时间片调度的系统中,时间片用完而中断当前进程的执行,调度新的进程执行;
      • 这种方式会产生较多的中断,主要用于性能要求较高的批处理系统、分时系统和实时系统。

调度算法

  • 周转时间:完成时刻-提交时刻

  • 带权周转时间:周转时间/所需运转时间

    • 为了提高系统的性能,要让若干个用户的平均作业周转时间和平均带权周转时间尽量小。
  • 先来先服务(FCFS)

    • 按照作业进入后备状态或进程变为就绪状态的先后次序排队,每次调度队首的作业(进程)。
    • 属于非抢占调度方式,实现简单。
    • 但对于那些后进入队列而运行时间较短的作业(进程),或I/O型的作业(进程)而言,可能需要长时间等待。
  • 短进程(作业)优先(SPF/SJF)

    • 当需要调度进程(或作业)时,通过计算判断就绪进程队列中哪一个进程的预期执行时间最短,或后备作业队列中哪一个或几个作业的预期执行时间最短,就调度谁。
    • 属于非抢占调度算法,后来的短进程不抢先正在执行的进程。当某进程获得处理机,直到其执行完成,或需要等待某事件而阻塞时,才自动释放处理机。
  • 时间片轮转调度法

    • 本算法主要用于微观调度,说明怎样并发运行,即切换的方式。
    • 其基本思路是通过时间片轮转,提高进程并发性和响应时间特性,常用于分时系统
    • 过程:每当执行进程调度时,进程调度程序总是选出就绪队列的队首进程,让它在CPU上运行一个时间片的时间。当进程用完分给它的时间片后,调度程序便停止该进程的运行,把它放入就绪队列的末尾,重新选择队首进程开始运行。
  • 最短剩余时间优先(SRT)

    • 调度程序总是选择剩余执行时间最短的进程调度执行,使将要结束的进程尽早结束,释放系统资源;
    • 如果新到进程需要的CPU时间比当前正在执行的进程剩余下来还需的CPU时间短,则强行赶走当前正在执行的进程。
    • 该算法是抢占式的短进程优先调度方法。
    • 缺点:很难准确估计进程的剩余执行时间。
    • 优点:它不像FCFS算法偏袒长进程,也不像短进程(作业)优先算法偏袒短进程。考虑了进程运行中的动态变化,通常采用此调度算法获得的平均周转时间比短进程优先算法短。
  • 最高响应比优先(HRRN)

    • FCFS与短进程优先是片面的调度算法:FCFS只考虑进程等候时间而忽视其运行时间,短进程优先只考虑预期的进程运行时间而忽视其等待时间。
    • 最高响应比优先是介乎这两者之间的折衷算法,将进程(作业)等待时间和进程预期执行时间纳入优先级的计算:
      • 进程预期执行时间越长优先级越低
      • 随着进程等待时间增长优先级上升
      • 即进程的优先级与等待时间成正比,与进程预期执行时间成反比,既照顾短进程又不使长进程的等待时间过长,改进了调度性能。
    • 响应比:R=(W+T)/T=1+W/T
      其中W表示已等待时间,T表示预期运行时间
    • 调度方法:若当前进程执行完毕,或阻塞等待某事件而释放处理机,调度程序选择就绪队列中响应比最大的进程执行。
    • 调度方式:非抢占
    • 缺点:
      • 很难准确估计进程的预期执行时间;
      • 每次调度之前都需要计算响应比,增加了系统开销。
    • 优点:短进程容易得到较高响应比;长进程等待时间足够长后,也将获得足够高的响应比,避免饥饿现象发生。
  • 多级反馈队列调度算法(FB)

    • 根据进程执行历史调整调度策略,结合了优先级和时间片轮转调度思想,不必事先知道进程预期执行时间,还可以满足各类进程的需要。
  • 如何选择调度算法

    • 交互式多任务系统,主要考虑联机用户对响应时间的要求,一般采用基于时间片轮转调度算法,同时,根据进程性质设置不同的优先级;
    • 批处理系统往往以作业的平均周转时间来衡量调度性能,常选用基于优先级的短进程(作业)优先调度算法。

进程的同步和互斥

  • 临界资源:必须互斥使用的资源;
  • 临界区:访问临界资源的那段代码。
  • 互斥:是指散布在不同进程之间的若干程序片段,当某个进程执行其中的一个程序片段时,其他进程就不能运行它们之中的任一程序片段,只能等到该进程运行完之后才可以继续运行。
  • 同步:是指散布在不同进程之间的若干程序片段,它们的运行必须严格按照一定的先后次序来运行,这种次序依赖于要完成的任务。比如数据的收发,必须发送方发送了接收方才能收。
  • 实现进程同步与互斥的基本方法:信号量方法
    • 定义对信号量的两个原子操作wait(s)和signal(s)(早期这两个原语被称为P(s)和V(s) , Dijkstra 提出,荷兰)
wait(s)
s.count :=s.count-1;
   if s.count<0 then
   begin
    进程阻塞;
    进程进入s.queue队列;
   end;
signal(s)
s.count :=s.count+1;
   if s.count ≤0 then
   begin
     唤醒队首进程;
     将进程从s.queue阻塞队列中移出;
    end;

  • wait(s)/signal(s)的应用
    • 进程进入临界区之前,首先执行wait(s)原语,若s.count-1之后s.count<0,则进程调用阻塞原语,将自己阻塞,并插入到s.queue队列排队;
    • 一旦其它某个进程执行了signal(s)原语中的s.count+1操作后,发现s.count ≤0,即阻塞队列中还有被阻塞进程,则调用唤醒原语,把s.queue中第一个进程修改为就绪状态,送就绪队列,准备执行临界区代码。
    • wait操作用于申请资源(或使用权),进程执行wait原语时,可能会阻塞自己;
    • signal操作用于释放资源(或归还资源使用权),进程执行signal原语时,有责任唤醒一个阻塞进程。
  • 信号量的类型
    • 互斥信号量用于申请或释放临界资源的使用权,常初始化为1;
    • 资源信号量用于申请或归还资源,可以初始化为大于1的正整数,表示系统中某类资源的可用个数。
  • 信号量的物理意义
    • s.count >0时,s.count代表可用资源数,即还可执行wait(s)而不会阻塞的进程数。
    • s.count ≤0时,表示已无资源可用,申请资源的进程将被阻塞,此时s.count代表阻塞队列中的等待进程数,即若s.count<0,表示s.queue队列中还有被阻塞的进程,需要唤醒该队列中的第一个进程,将它转移到就绪队列中。
  • s.count的取值范围
    • 当仅有两个并发进程共享临界资源时,互斥信号量仅能取值0、1、-1。其中:
      • s.count=1,表示无进程进入临界区
      • s.count=0,表示已有一个进程进入临界区
      • s.count= -1,表示有一个进程正在等待进入临界区
    • 当用s来实现n个进程的互斥时,s.count的取值范围为1~ -(n-1)
    • 当n个进程共享m个同种资源(n>m)时, s.count的取值范围?
      • m~-(n-m)
  • 关于信号量的使用
    • 进程应先申请资源信号量,再申请互斥信号量,顺序不能颠倒;
    • 对任何信号量的wait与signal操作必须配对,同一个信号量的wait与signal可以不在同一个进程中;
    • 同一进程中的多对wait与signal操作只能嵌套,不能交叉;
    • wait与signal语句不能颠倒顺序,wait语句一定先于signal语句。

死锁

  • 死锁的含义
    • 一组进程中,每个进程都无限等待被另一进程所占有的资源,并在得到资源之前,绝不释放自己所占有的资源,因而永远无法继续执行,这种现象称为进程死锁,这一组进程就称为死锁进程。
  • 死锁的预防
    • 1、禁止互斥:互斥使用是临界资源固有的属性,不可行;
    • 2、破坏“占有且等待”条件—预先静态分配法
      • 要求每个进程在运行前必须一次性申请它所要求的所有资源,且仅当该进程所要资源均可满足时才给予一次性分配,这样保证不等待资源。
      • 缺点:
        • 降低了对资源的利用率,对于很少使用的资源,是极大的浪费;
        • 降低进程的并发程度,经常会发生进程饥饿现象。
    • 3、破坏“不可剥夺”条件
      • 在允许进程动态申请资源前提下规定,若一个进程已经占有了某些资源又要申请新资源,而新资源不能满足(已被其他进程占用)必须等待时,系统可以抢夺该进程已占有的资源。具体实现:
        • 一个进程申请的资源尚未被占用,则系统可把资源分配给该进程;
        • 若进程A申请的资源r已被进程B占用,则查看进程B的状态,如果进程B处于等待另一个资源的状态,那么就抢夺进程B已占用的资源r并把r分配给进程A;如果进程B不是处于等待状态,则让进程A处于等待资源r的状态;
        • 一个等待资源的进程只有在得到自己所申请的新资源和所有被抢夺的老资源后才能继续执行。
      • 缺点:
        • 这种资源分配策略并不是对所有资源都适用;
        • 实现起来困难,而且需付出一定代价。
    • 4、破坏“循环等待”条件—资源有序分配法:
      • 把系统中所有资源按类型线性编号(例如打印机为1、磁带机为2、磁盘为3等等),进程在申请资源时必须严格按资源编号的增序进行;释放资源时,逆序释放。
      • 缺点:
        • 为系统中各资源分配序号必须相对稳定,新设备的增加将带来程序的修改;
        • 会经常发生资源使用的顺序与申请顺序不同的情况,造成资源浪费;
        • 增加了程序设计难度。
  • 死锁避免
    • 在系统运行过程中,对进程发出的每一个系统能够满足的资源申请进行动态检查;
    • 并根据检查结果预测是否可能导致死锁,决定是否分配资源;
    • 若分配后系统可能发生死锁,则不予分配,否则予以分配。
  • 安全状态:系统能按某种进程顺序如<P1, P2, …,Pn>,来为每个进程分配所需资源,直至最大需求,使每个进程都可顺利完成,则系统处于安全状态。
    • 称<P1,…Pn>序列为安全序列;
    • 安全状态一定是没有死锁发生的。
  • 不安全状态:不存在一个安全序列,称系统处于不安全状态。
  • 安全性算法:
    • 1、为进行安全性检查,定义数据结构:
      • Work: int ARRAY[1..m] ;(工作向量)
        • 表示系统可提供给进程继续运行的资源的集合。
        • 安全性算法刚开始执行时: Work:=Available;
      • Finish: int(Boolean) ARRAY[1..n] ;(状态标志)
        • Finish[i]=True(0≤i ≤n,n为系统中的进程数)时,表示进程Pi可以获得其所需的全部资源,顺利执行完成。
    • 2、从进程集合中找到一个满足条件的进程i:
      • Finish[i]=false;并且 Need[i]≤Work;
      • 若找到该进程,则执行3,否则转4;
    • 3、当进程Pi获得资源后,将顺利执行直至完成,并释放其所拥有的全部资源,故应执行以下操作:
      • Work:=Work+Allocation[i];
      • Finish[i]:=true; 转步骤2;
    • 4、若对所有进程i,Finish[i]=true,则系统处于安全状态,否则处于不安全状态 。
  • 避免死锁的限制条件和缺点
    • 避免死锁比预防死锁施加的限制条件要弱得多,但它仍有限制条件:
    • 进程之间相互独立,其执行顺序取决于系统安全,而非进程间的同步要求;
    • 系统必须提供固定数量的资源供进程使用。
    • 系统需要额外开销来预测并避免死锁。
  • 死锁检测:
    • 允许死锁发生,操作系统通过监视系统进展情况,判断死锁是否发生。
    • 一旦死锁发生则采取专门的措施解除死锁,并以最小的代价恢复操作系统运行。
    • 检测时机:
      • 当进程等待时检测死锁;
      • 定时检测;
      • 系统资源利用率下降时检测死锁。
    • 检测方法:简化资源分配图。(死锁定理)
  • 死锁定理
    • 若能消去资源分配图中所有结点的连接边,使全部结点都成为孤立结点,则称该图是可完全简化图;若不能使该图完全简化,则称该图是不可完全简化图。
    • 可以证明:当且仅当系统某状态S所对应的资源分配图是不可完全简化的,则S是死锁状态。该充分条件称为死锁定理。
  • 解除死锁:
    • 撤消死锁进程:该方法是目前操作系统中解除死锁的常用方法;
    • 把死锁进程恢复到前一个检查点,重新执行每个进程;
    • 按照某种原则逐个选择死锁进程进行撤消,直到解除死锁;
    • 按照某种原则逐个剥夺进程资源,直到解除死锁。

存储管理

存储管理的任务

  • 存储分配:管理内存空间的分配与回收;
  • 地址映射:又称地址重定位,指将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址,保证CPU执行指令时可正确访问存储单元;
  • 存储保护:为多个进程共享内存提供保障,使在内存中的各道进程,只能访问它自己的区域;
    • 防止地址越界
    • 防止操作越权
  • 存储共享:为了进程通信或节约存储空间,两个或多个进程共用内存中相同区域;
  • 存储扩充:采用软件手段、在硬件的配
    合下,将部分外存空间虚拟为内存空间,并将内存和外存有机的结合起来,得到一个比实际内存容量大得多、速度接近于内存、价格便宜的虚拟存储系统。

简单存储管理技术-连续存储

  • 分区存储管理
    • 把内存分为若干大小相等或不等的分区(partition),除操作系统占用其中一个分区外,其余由多道环境下的各并发进程共享;
    • 分区管理的基本原理是给每一个内存中的进程划分一块适当大小的存储区,以连续存储各进程的程序和数据;
    • 分区的时机:固定分区和动态分区。
  • 固定分区
    • 内存空间的静态分配;
    • 操作系统事先将内存划分为若干个固定大小的连续分区,分区一旦划定,整个执行过程中每个分区的大小及内存中的分区个数固定不变,每个分区只能装一个进程。
      • 分区大小相等
        • 优点:分配简单,只要进程大小不超过分区大小,就可以装到任何一个分区中运行。
        • 缺点:
          • 浪费存储空间:若进程申请的存储空间很小,却需要占用整个分区。
          • 无法运行超过分区大小的程序。
      • 分区大小不等:将内存空间划分为若干个长度不同的分区,以适合于不同大小的进程需要,根据程序的大小,分配当前空闲的、适当大小的分区。
        • 优点:既提高存储空间的利用率,减少浪费,又尽量使长进程能装入运行。
    • 内碎片:分区内存在不可用的浪费空间,称为内碎片(internal fragment)。
  • 固定分区的优缺点
    • 优点:管理简单,易于实现,只需要建立一张分区使用表,登记分区的使用情况,对于等长的固定分区只需标明分区状态是已分配还是空闲。
    • 缺点:
      • 产生较多内碎片,内存利用率不高;
      • 分区总数固定,限制了并发执行的程序数目;
      • 无法运行超过分区大小的程序。
  • 动态分区
    • 基本思想:
      • 内存不是预先划分好的,系统初始化时,内存用户区是一个大分区;
      • 进程装入时,根据进程的需求和内存空间的使用情况来决定是否分配;
      • 若有足够的空间,则按需要分割一部分分区给该进程,否则令其等待内存空间。
    • 动态分区解决了固定分区的内碎片,但可能产生很多较小的分区:外碎片;
    • 动态分区的分区长度和数目都是可变的,为了实施存储分配,系统需要维护一张空闲分区表,登记内存中的各个空闲分区。
  • 紧凑技术:把内存中较小的空闲分区(外碎片)移动到内存的一端,拼接成一个较大的空闲分区。
  • 动态分区内存分配算法
    • 首次适应算法
      • 从低地址端开始搜寻分区;
      • 若找到的空闲分区恰好与进程申请的存储空间大小相等,或分配给该进程后,仅剩下一个非常小的空间(小于系统设置的阈值),则将该分区全部分配给申请进程;
      • 否则将该分区划分为两个分区:一个分区的长度等于进程申请的空间大小,并将其分配给申请进程;另一个子分区登记到空闲分区表中。
      • 优点:
        • 尽量使用低地址空间,因而高地址空间可能会保留较大的空闲分区,所以大进程申请的存储空间有可能在高地址端得到满足。
      • 缺点:
        • 随着低端分区不断划分而产生较多小分区;
        • 每次查找空闲区都从低地址开始,对大进程会增加查找的开销。
    • 循环首次适应算法
      • 循环首次适应算法能记住上次分配分区的位置,下一次实施分配时,从上一次的分配位置之后开始查找(到最后分区时再回到开头),找到符合要求的第一个分区。
      • 优点:
        • 均衡使用整个内存空间,使空闲分区分布得更均匀,加快大分区的查找速度。
      • 缺点:
        • 常常会导致内存中缺乏大分区;
        • 可能导致大量的外碎片,需要频繁实施紧凑操作。
    • 最佳适应算法
      • 总是选择满足申请要求且长度最小的空闲分区;
      • 为了提高查找效率,可以将所有的空闲分区按照长度由小到大的次序依次排列在空闲分区表中;
      • 为进程分配存储空间时,从表头开始查找,第一个满足进程申请存储空间大小的分区就是最适合的分区。
      • 优点:
        • 尽量不分割大的空闲分区;
      • 缺点:
        • 可能会形成大量较小的、难以再分配的分区——产生大量的碎片。
    • 最差适应算法
      • 选择满足要求且长度最大的空闲分区,使分割出来的剩余空闲分区较大,空闲分区登记表可以按照分区从大到小的顺序排列。
      • 优点:
        • 可以避免形成大量较小的外碎片;
      • 缺点:
        • 总是分割大的空闲分区,当遇到大进程申请大空间时,难以找到一个足够大的空闲分区。
  • 伙伴系统
    • 存储分配
      • 伙伴系统中内存的用户可用空间通常是2m字节;
      • 系统总是为进程分配大小为2k字节的一个空闲分区。
      • 如果进程申请的存储空间大小为n字节,且存在空闲分区2i-1< n ≤2i,则将2i大小的分区分配给该进程;
      • 如果找不到2i大小的空闲分区,则在2i+1大小的空闲分区中查找,若找到,则将该空闲分区分为相等的两个分区,这两个大小为2i的分区称为一对伙伴,其中一个分区用于分配,另一个加入空闲分区;
      • 若仍找不上述空闲分区,则在2i+2大小的空闲分区中查找,并重复以上分割过程。
    • 存储空间回收
      • 当进程执行完毕,释放一个尺寸为2i的分区时,若被回收的分区的伙伴分区非空闲,则保留该分区为一个独立的空闲分区;
      • 否则合并回收分区及其伙伴分区,从而得到一个尺寸为2i+1的空闲分区;
      • 如果该2i+1大小的空闲分区的伙伴分区也空闲,则重复以上合并步骤。

简单存储管理技术-非连续存储

  • 分页存储管理是一种特殊的固定分区方法:
    • 系统预先将物理内存划分成许多尺寸相同的页框(Page Frame);
    • 当一个进程被装入物理内存时,将进程分割成许多大小相同的页面(Page),页面与页框大小相同,系统将为进程的每个页面分配一个独立的页框;
    • 同一个进程的多个页面不必存放在连续的页框中。
  • 页式存储管理的逻辑地址表示
    • 进程被分割成许多页面,每个页面内的指令和数据是连续的,它们的地址相对于其所属页的第一条语句的地址,称为页内偏移量(页内地址)。
    • 逻辑地址被分为两部分:页号和页内偏移量。
      • 其中,高位部分为页号,低位部分为页内偏移量。
  • 数据结构:页表
    • 页表:系统为每个进程建立一张页表,用于记载进程的各页面到物理内存中页框的映射信息。
    • 进程的每个页面依次对应页表中的一个表项,其中包含相应页在内存中对应的物理页框号和页面存取控制权限等字段。
  • 内存的分配和回收
    • 计算一个进程所需要的页框数N ;
    • 查空闲页框表,看是否还有N个空闲页框;
    • 如果有相应空闲页框,则页表长度为N,可填入PCB中;
    • 分配N个空闲页框,将页框号和页号填入页表;
    • 修改空闲页框表。
  • 页式管理中地址变换过程如下:
    • 根据逻辑地址,计算出页号和页内偏移量;
    • 用页号检索页表,查找指定页面对应的物理页框号;
    • 根据页框号和页内偏移量,计算出物理地址。
  • 页表寄存器:实现快速地址映射,存储执行进程的页表起始地址;
    • 当进程被创建时,其页表起始地址记载于进程PCB中;
    • 当进程被调度执行时,页表的起始地址将从该进程的PCB中取出,并填入页表寄存器中;
    • 进行地址变换时,处理机从页表寄存器中查找页表的起始地址。
  • 快表:
    • 作用:快速地址映射;
    • 根据局部性原理,在一个很短的时间段内,程序的执行总是局部于某一个范围,即进程最近访问过的页面在不久的将来还可能被访问。
    • 通过逻辑地址中的页号,查找快表中是否存在对应的页表项;
    • 若快表中存在该表项,称为命中(hit),取出其中的页框号,加上页内偏移量,计算出物理地址;
    • 若快表中不存在该页表项,命中失败,再查找页表找到逻辑地址中指定页号对应的页框号;
    • 同时,更新快表,将该表项插入快表中。
  • 页的大小
    • 影响页的大小的主要因素:
      • 较小的页面有利于减少页内碎片,从而有利于提高内存利用率;
      • 较小的页面也将导致页表过大,从而降低处理机访问页表时的效率或访问快表时的命中率;
      • 对于支持交换技术的系统,较大的页面有利于提高页面换入/换出内存的效率。
  • 分页存储管理优缺点
    • 优点:
      • 一个程序不必连续存放;
      • 没有外碎片,仅存在很少的内碎片,提高内存利用率;
      • 便于管理,尤其是虚拟存储中的内存管理。
    • 缺点:
      • 分页操作由系统自动进行,一个页面不能实现某种逻辑功能,不利于调试执行其中某个子程序或子函数,不利于实现存储共享。
  • 简单段式存储管理
    • 基于模块化程序设计时,常常需要将一个大任务划分成若干相对独立的子任务,对应于子任务编写子程序,称为段(Segment);
    • 将程序的地址空间划分为若干个相对独立的段(Segment),程序加载时,以段为单位,分配其所需的所有段,每个段占据内存连续的分区,这些段不必连续;
    • 页式管理是把内存视为一维线性空间;而段式管理是把内存视为二维空间,与进程逻辑相一致。
    • 优点:
      • 动态划分内存,有效消除内碎片;
      • 便于实现存储共享;
      • 容易满足程序段的动态增长需要。
    • 缺点:
      • 产生外碎片,但可以通过紧凑技术消除;
      • 管理复杂性。
    • 页是信息的物理单位,大小是系统固定的;而段是信息的逻辑单位,大小不固定,每一段具有一定的逻辑含义;
    • 分页是出于系统管理的需要,分段是出于用户应用和模块化设计的需要,由用户实施:一条指令或一个操作数可能会跨越两个页的分界处,而不会跨越两个段的分界处。
  • 段页式存储管理
    • 基本思想:采用分段方法组织用户程序,采用分页方法分配和管理内存。
    • 用户可以按照模块化思想进行程序设计,一个用户程序由若干段构成。
    • 系统将内存划分成固定大小的页框,并将程序的每一段分页后装入内存执行。
    • 优点:
      • 综合了分段和分页技术的优点,既能有效利用存储空间,又能方便用户进行程序设计;
    • 缺点:
      • 实现段页式存储系统管理需要增加硬件成本,系统复杂度和管理开销也大大增加。

虚拟存储技术

  • 为什么要引入虚拟存储技术
    • 简单存储要求将一个进程所需的程序和数据全部装入内存方可执行。存在两个很严重的问题:
      • 对于大进程,如果其所需空间超过了内存的最大容量,则无法执行;
      • 对于多道程序系统,由于每一个进程需要全部装入内存,使同时驻留内存的进程数量受到限制,提高内存容量使成本增加。
    • 如果能将一部分价格较低的外存空间当作内存使用,从逻辑上扩充内存容量,将获得更高的性价比。
  • 虚拟存储的理论依据
    • 局部性原理(principle of locality):程序的执行总是呈现局部性。
      • 时间局部性:一条指令的一次执行和下次执行,一个数据的一次访问和下次访问都集中在一个较短时期内;
      • 空间局部性:当前指令和邻近的几条指令,当前访问的数据和邻近的数据都集中在一个较小区域内。
    • 因此,只要保证进程执行所需的部分程序和数据驻留在内存,一段时间内进程是很可能顺利执行的。
  • 虚拟存储:通过系统提供的缺页/缺段中断功能交换技术,动态装入进程的程序代码和数据,使得一个大的用户程序能在一个相对较小的内存空间中运行,也使得有限的内存能同时容纳更多的进程。将这种用户感觉上的、由实际内存和部分外存共同构成的存储空间称为虚拟存储。
  • 交换技术
    • 将内存中暂时不能运行的进程,或暂时不用的数据和程序,换出到外存,以腾出足够的内存空间;
    • 把已具备运行条件的进程,或进程所需要的数据和程序,换入内存。
  • 虚拟页式:在简单页式存储管理的基础上,增加请求调页和页面置换功能,是目前常用的一种虚拟存储管理技术。
    • 基本思想:
      • 在进程开始运行之前,不是装入全部页面,而是装入一个或几个页面,甚至初始不装入任何页面,之后根据进程运行的需要,动态装入其它页面;
      • 当分配给该进程的内存空间已满,而又需要装入新的页面时,则根据某种算法淘汰某个页面,以装入新的页面。
  • 缺页中断处理过程
1.地址映射过程中,如果在页表中发现所要访问的页不在内存,则产生缺页中断;
2.操作系统接到此中断信号后,启动缺页中断处理程序,保留处理机现场;
3.根据页表中给出的外存地址,操作系统通知处理机从外存读取指定页面;
4.处理机激活I/O设备;
5.检查内存有无足够的空闲空间装入该页面,若有转7,否则执行6;
6.利用页面置换算法,选择内存中的某个页面,换出到外存;
7.将指定页面从外存装入内存;
8.更新该进程的页表;
9.更新快表;
10.计算物理地址。
  • 抖动
    • 如果被交换出去的页面很快将再次被进程使用,则需要将其再次装入内存;
    • 如果系统花费大量的时间把程序和数据频繁地装入和移出内存而不是执行用户指令,称系统出现了抖动;
    • 出现抖动现象时,系统显得非常繁忙,但是吞吐量很低。
    • 引起抖动的根本原因:选择的页面不恰当。

置换算法

  • 置换算法:在指定的置换范围内,决定将哪一个页面换出内存。置换算法的好坏将直接影响系统的性能,不适当的置换算法可能导致系统出现“抖动”现象。
  • 进程的驻留集:虚拟存储系统中,每个进程分到的物理页框集合。
  • 最佳置换算法:OPT
    • 基本思想:被置换的页面是将来不再访问,或在最远的将来才被访问的页面。
    • 但是,无法预知一个进程在内存的若干页面中,哪一个页面是将来不再访问的,或者最长时间内将不再被访问的,因而该算法是无法实现的;
    • 该算法可用于评价其它置换算法的性能。
  • 常用置换算法设计原理
    • 根据局部性原理,如果一个页面最近被访问过,那么它在不久的将来将再次被访问;
    • 如果一个页面已经很长时间未被访问过,则在未来的很长时间内,它也不再被访问;
    • 因此可以根据页面的使用历史,判断其将来的行为。
  • 先进先出置换算法:FIFO
    • 淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。
    • 实现时,只需把一个进程已调入内存的页面按先后次序链接成一个队列,并设置一个指针,使它总是指向最老的页面。
    • 评价:
      • FIFO算法的置换特征与进程访问内存的动态特征有可能是矛盾的,即被置换的页面并不是进程不会访问的。
      • 较早调入的页可能是经常被访问的页,这些页在FIFO算法下被反复调入和调出,降低系统性能。
  • 最近最少使用置换算法:LRU
    • LRU根据页面装入内存以后的使用情况,选择淘汰最近最久未被使用的一个页面。
    • 性能比较接近OPT算法,但实现开销大。
    • 实现的方法:
      • 为每一个页面增加一个访问字段,用以标注该页最后一次被访问的时间,需要选择淘汰页面时,比较置换范围内所有页面的最后访问时间,选择访问时间最远的页面;
    • 另一种方法:
      • 将访问页面组织在一个堆栈中,最近访问的页面位于栈顶,栈底的页面即是最久未被访问的。
  • 最不经常使用页面置换算法:LFU
    • LFU算法在需要置换页面时,选择到当前时刻为止,被访问次数最少的页面进行置换;
    • 实现方法:
      • 在页表中给每个页增设一个访问计数器;
      • 当某页被访问时,其访问计数器增1;
      • 需要置换页面时,则选择计数值最小的那个页面进行置换,并将所有计数器清零。

文件系统

文件

  • 文件:文件是一种具有符号名的、相关联元素(字符流或记录)的有序集合。
  • 文件逻辑结构:文件如何组成
    • 无结构文件(流式文件、字符流文件):
      • 无结构文件对文件内的信息不再划分单位,是依次的一串信息(字符流)组成,其文件元素为一个字符 ,又称为流文件,如用户作业的源程序。
    • 有结构文件(记录式文件)
      • 有结构文件的文件元素是一条记录,文件由若干相关记录组成。
      • 根据记录的组织方式不同,可以分为堆文件、顺序文件、索引顺序文件、索引文件等。
  • 文件的物理结构:文件在外存上如何存储
    • 连续(顺序)文件:把文件中的信息顺序、连续的存储到若干相邻的盘块(block)中。
    • 非连续文件:链接文件、索引文件
      • 链接文件
        • 文件中逻辑上连续的信息可以存储到分散的盘块中,各盘块通过其内的链接指针相连;
        • 一个文件的所有盘块形成一个链表
      • 索引文件
        • 文件中逻辑上连续的信息可以存储到分散的盘块中;
        • 系统为每个文件建立一张索引表,一个索引表项记载一个盘块或一组连续盘块的起始地址。

空闲空间的管理

  • 空闲分区表
    • 将存储空间中各个空闲分区登记在一张表中,一个分区对应一个表项,并根据不同的分配算法将空闲分区按一定的次序排列。
    • 为文件分配连续存储空间时,首先顺序查找空闲分区表中的各个表项,直至找到第一个大小适合的空闲分区,可采用首次适应最佳适应等分配算法;
    • 将该分区分配给文件,同时修改空闲分区表;
    • 当删除文件释放空间时,系统回收其存储空间,合并相邻空闲分区。
    • 评价:
      • 实现简单;
      • 但是,当存储空间中的空闲分区分布较分散且数量多时,空闲分区表将会较大,占用内存空间,降低空闲分区表的检索效率;
      • 不利于基于单个扇区作为文件分区方式下非连续文件的存储空间分配;
      • 适合于连续存储方式文件的分配。
  • 空闲分区链表:可以通过指针将各个空闲分区连接起来,并记载各空闲分区大小。
    • 若文件申请连续存储空间,则需要花费较长的时间查找连续的空闲分区;
    • 为基于单个扇区作为文件分区的非连续文件分配空闲分区时,会导致大量修改链接指针和分区大小的操作;
    • 这种空闲空间组织方法更适合于基于可变扇区作为文件分区的非连续文件,每次分配之后,仍需要修改链接指针和分区大小;
    • 删除文件时,若将回收的分区合并到空闲分区链表中需要较大开销,而省略合并步骤将导致过多小分区;
    • 空闲分区信息保存在空闲盘块中,将盘块分配出去之前,必须首先读出其中的有关空闲分区信息,否则将丢失链接指针,如果一个文件需要很多空闲分区,这种操作模式将大大降低文件存取速度。
  • 索引
    • 为空闲分区建立索引,索引表中为每一组局部连续的空闲分区建立一个索引项,根据索引项查找空闲分区,将会提高文件存储效率。
    • 利用索引方法管理空闲空间,适合于各种文件分配法。
  • 位示图
    • 利用二进制位0、1表示存储空间中盘块的使用状态:空闲盘块0,已分配盘块1。
    • 由所有盘块对应的位构成一个向量,称为位示图:

文件目录

  • 从用户结构,文件目录和目录文件的作用:文件按名存取
  • 目录结构
    • 单级目录结构
      • 所有用户的全部文件目录保存在一张目录文件中,每个文件的目录项占用一个表项。
    • 两级目录结构
    • 层次目录结构:树形目录

设备管理

设备管理的主要功能

  • 设备分配
    • 多道程序系统中的设备不允许用户直接使用,而是由操作系统统一调度和控制;
    • 设备分配功能是设备管理的基本任务;
    • 设备分配程序按照一定的策略,为申请设备的用户进程分配设备,记录设备的使用情况。
  • 设备映射
    • 为了提高应用软件对运行平台的适应能力,方便实现应用软件I/O重定向,大多数现代操作系统均支持应用软件对设备的无关性,即通常说的设备无关性。
      • 设备无关性:应用软件所引用的、用于实现I/O操作的设备与物理I/O系统中实际安装的设备没有固定的联系。
    • 逻辑设备和物理设备
      • 逻辑设备:应用软件所引用的用于实现I/O操作的设备;
      • 物理设备:物理I/O系统中实际安装的设备。
    • 从应用软件的角度看,逻辑设备是一类物理设备的抽象;
    • 从操作系统设备管理程序的角度看,物理设备则是某种逻辑设备的实例。
    • 在应用软件运行期间,操作系统的设备管理程序需要将该应用软件对逻辑设备的引用转换成对相关物理设备的引用,;设备管理的这种功能称为设备映射。
  • 设备驱动:指对物理设备进行控制,实现真正的I/O操作。
    • 设备驱动主要任务:
      • 接收上层软件发来的抽象服务请求,将其转换为具体的I/O指令,控制设备完成请求的操作;
      • 将设备发来的有关信号传送给上层软件,如设备是否可用等。
  • I/O缓冲区的管理
    • 为了缓和处理机与外部设备间速度不匹配的矛盾,提高处理机和外部设备间的并行性,现代操作系统在设备管理部分引入了缓冲技术。
    • I/O缓冲区:通常指内存中的部分特殊区域,用于缓存进程与外部设备间的数据传输。
    • I/O缓冲区管理的任务:组织I/O缓冲区,并为使用者提供获得和释放I/O缓冲区的手段。

磁盘设备的管理

  • 磁盘的基本存储单元(扇区)的寻址方式为三维地址:盘面号,柱面号,扇区号;
  • 从磁盘读数据的过程
    • 磁盘接收到读指令后,磁头从当前位置移动到目标磁道位置,所需的时间称为寻道时间;
    • 然后,旋转磁盘,定位数据所在的扇区,所需的时间称为旋转延迟;
    • 最后,从磁盘上读取数据,所需的时间称为数据传输时间。
  • 访问时间=寻道时间+旋转延迟+传输时间
  • 访问效率还与磁盘缓存有关
  • 寻道时间:把磁头从当前位置移动到指定磁道所需要的时间。是影响磁盘数据传输率的重要参数,与磁头移过的磁道数成正比。
  • 旋转延迟:与磁盘转速直接相关,是指旋转磁盘,将指定扇区移动到磁头下面所需要的时间。
  • 传输时间:传输时间是指把数据从磁盘读出或向磁盘写入数据所经历的时间,与硬盘转速和所读/写的数据长度有关。

磁盘调度算法

  • 磁盘调度算法
    • 当有多个进程都请求访问磁盘时,他们访问的位置(这里主要关心磁道)各不一样,磁头需要来回频繁移动进行寻道操作;
    • 磁头的寻道操作属于机械运动,花费的时间较长,而且过度的寻道操作会缩短磁盘的寿命;
    • 必须采用适当的磁盘调度算法,使得在尽可能公平的情况下,使磁头移动距离最小,缩短寻道时间。
  • 先到先服务算法FCFS
    • 按照输入/输出请求的先后次序为各个进程服务。
    • 磁头在磁道之间来回频繁移动,时间开销大,而且容易使磁臂疲劳,磁盘容易损坏;
    • 这种简单算法只适合于负载很轻的系统。
  • 最短寻道时间优先算法SSTF
    • 即优先为距离磁头当前所在位置最近的磁道服务。
  • 电梯算法
    • 假定开始时磁头处于最外磁道,并向内磁道方向移动,在磁头移动过程中,如果经过的磁道有访问请求,则为其服务;
    • 然后判断当前磁道以内的磁道是否还有访问请求,如果有,则磁头继续向内磁道方向移动;
    • 否则,判断当前磁道以外的磁道是否有访问请求,若有则磁头调转方向朝外移动;
    • 若此时当前磁道里外都没有访问请求,则磁头引臂停止不动。
    • 评价:
      • 这种算法比较公平,效率较高;
      • 但是,若在某一段时间内某一磁道的访问请求不断,则磁头引臂将停留在该磁道上不动,称为磁臂粘着
      • 磁盘被相应进程垄断,所有其他磁道上的请求将在较长时间内得不到服务。

I/O缓冲技术

  • 引入I/O缓冲技术的意义
    • 缓解处理机与设备间速度不匹配的矛盾;
    • 减少对CPU的中断频率;
    • 提高设备与处理机之间的并行性。
  • 提前读
    • 指用户进程从I/O缓冲区中取走前一个数据以后,立即发出对下一个数据的输入请求;
    • 操作系统将在适当的时候响应该请求以便把用户进程需要的下一个数据从用户进程指定的输入设备读入到I/O缓冲区中;
    • 用户进程加工前一个数据的工作与输入下一个数据的工作可以同时进行。
  • 延后写
    • 指当用户进程请求输出数据时,操作系统将很快把用户进程请求输出的数据从用户进程的工作区中取走并将其暂时存放在I/O缓冲区中;
    • 直到用户进程指定的输出设备空闲时,操作系统才把暂时存放在I/O缓冲区中的用户进程的输出数据写入用户进程指定的输出设备上;
    • 用户进程生成下一个输出数据的工作与输出前一个输出数据的工作可以同时进行。
  • 硬件缓冲和软件缓冲
    • 硬件缓冲区配置在设备中,对处理机透明,不需要处理机的直接管理;
    • 软件实现的缓冲区是内存空间的一部分,其目的是为了弥补硬件缓冲区的不足,因为并非所有外设都拥有,或足够拥有硬件缓冲区;
    • 操作系统中介绍的缓冲区是指软件缓冲区。
  • 缓冲区的组织形式
    • 单缓冲
      • 是操作系统提供的最简单的一种缓冲形式;
      • 每当一个进程发出一个I/O请求时,操作系统便在主存中为之分配一个缓冲区,该缓冲区用来临时存放输入/输出数据。
    • 双缓冲
      • 增加一个缓冲区,两个缓冲区可以交替使用;
      • 当数据从缓冲区复制到用户进程空间时,输入设备不必等待,可立即开始向另一个缓冲区输入数据;
      • 与单缓冲方式相比,能进一步提高CPU和外设之间的并行程度。
    • 循环缓冲
      • 当用户进程处理数据的速度较快、外部设备处理数据的速度较慢,或用户进程阵发性I/O的数据较多时,必须考虑增加缓冲区的数量以改善系统性能,这就是多缓冲区方式;
      • 多个I/O缓冲区常常被组织成一个环形队列,也称为循环缓冲;
      • 双缓冲可以看作是循环缓冲的一个特例。
    • 缓冲池
      • 上述三种缓冲区的组织形式仅适用于某种特定的I/O进程和计算进程,属于专用缓冲;
      • 当系统中的设备很多时,将会有许多这样的循环缓冲区,消耗大量的内存空间,而且其利用率也不高;
      • 为了提高缓冲区的利用率,可以采用缓冲池技术,其中的缓冲区可为多个设备和进程服务。
      • 事实上,缓冲池可以看成用于管理缓冲区的一种数据结构,缓冲池中的缓冲区通常组织成链表结构,用户进程需要缓冲区时,从链表申请一个或多个缓冲区,使用完毕释放的缓冲区将被链接到链表中。
      • 缓冲池结构
        • 缓冲池由多个缓冲区组成。
        • 每个缓冲区由两部分构成:
          • 标识该缓冲区和用于管理的缓冲首部;
          • 存放数据的缓冲体。

虚拟设备

  • 虚拟设备的意义:在共享型设备上实现的,独占型设备的数据转储区。通过共享型设备,逻辑上将一个物理上的独占型设备虚拟成多个对应的逻辑设备,满足更多进程使用独占型设备的需求。
  • SPOOLing系统
    • SPOOLing系统是虚拟设备最典型的代表,包括假脱机输入和输出系统两个部分。
    • 核心思想:在快速辅助存储设备中建立I/O缓冲区,用于缓存从慢速输入设备流入内存的数据,或缓存从内存流向慢速输出设备的数据。
    • 若有进程申请打印输出,SPOOLing系统并不直接给进程分配打印机,而是在共享设备(如磁盘)上的输出井中为其分配一块存储空间,进程的输出数据以文件形式存放于此;
    • 各进程的输出文件形成了一个输出队列,由SPOOLing输出程序控制这台打印机进程,依次将队列中的输出文件实际打印输出。
    • 在SPOOLing系统中,实际没有为任何进程分配设备,而只是在输入和输出井中,为进程分配存储区和建立I/O请求表,这样,便把独占型设备改造成共享型设备。
posted @ 2020-01-04 14:57  20175214lzc  阅读(400)  评论(0编辑  收藏  举报