408-OS笔记

第一章 计算机系统概述

  • 操作系统软件:操作系统,数据库管理系统,语言处理程序,服务性程序,标准库程序等。
  • 编译器的实质是一段程序指令,它存储于计算机中。
  • 源程序:是一种计算机的代码,是程序设计语言编写的程序,经编译或解释后可形成具有一定功能的可执行文件,是直接面向程序员用户的,而不是操作系统的管理的内容。
  • 操作系统管理文件:指操作系统关心计算机中的文件的逻辑结构,物理结构,文件内部结构,多文件之间如何组织的问题,而不关心文件的具体的内容.
  • 系统调用:操作系统为应用程序使用内核功能所提供的接口,用户程序通过系统调用的方式来请求内核及其服务,间接地使用各种资源。
  • 程序接口图形接口命令接口三者并没有从属关系。
  • 按命令控制方式,命令接口可分为联机用户接口脱机用户接口shell与命令解释器都是命令接口。
  • 操作系统接口主要有命令接口程序接口(也称为系统调用)
  • 库函数:高级语言中提供的与系统调用对应的函数–也有些库函数与系统调用无关,目的是隐藏“访管指令”的细节,是系统调用更为方便,抽象。但是,库函数属于用户程序而非系统调用,属于系统调用的上层。
  • 多道程序设计技术:由于同时在主存中运行多个程序,在一个程序等待时,可以去执行其它程序,因此提高了系统资源的利用率。
  • 脱机技术用于解决独占设备问题。
  • 虚拟技术与交换技术以多道程序设计技术为前提。
  • 批处理系统中,作业执行时用户用户无法干预其运行,只能通过事先编制其作业控制说明书来间接干预。
  • 静态页式管理和代码可重入与系统响应时间无关。
  • 分时系统追求的目标是比较快速的响应目标。
  • 分时系统的响应时间T的比例关系可表达为T~QN,Q为时间片,N为用户数。
  • 操作系统有多种类型,允许多个用户以交互的方式使用计算机的操作系统,称为分时操作系统,允许多个用户将若干作业提交给计算机系统集中处理的操作系统,称为批处理系统,在实时操作系统的控制下,计算机系统能及时处理有过程控制反馈的数据,并及时做出响应;在IBM-PC中,操作系统称为微型计算机操作系统
  • 现代操作系统都是多任务的主要特点是并发和并行并不一定需要运行在CPU的硬件上。
  • 几种操作系统的对比
    • 批处理操作系统的用户脱机使用计算机,作业是成批处理的,系统内多道程序并发执行,交互能力差。
    • 分时操作系统可让多个用户同时使用计算机,人机交互性较强,具有每个用户独立使用计算机的独占性,系统响应及时。
    • 实时操作系统能对控制对象做出及时反应,可靠性高,响应及时,但资源利用率低。
  • 应用程序请求操作系统内核的服务,此时会执行一条特殊的指令–陷入指令,该指令会引发一个内部中断信号。
    • 执行“陷入指令”,意味着应用程序主动地将CPU控制权还给操作系统内核。**“系统调用”**就是通过陷入指令完成。(其不属于特权指令)
  • 陷入指令=trap指令=访管指令
  • 编译器是操作系统的上层软件,不是操作系统提供的功能。
  • 批处理的主要缺点是缺少互动性。
  • I/O通道实际上是一种特殊的处理器,它具有执行I/O指令的功能,并通过执行通道程序来控制I/O操作。
  • 中断是操作系统必须的提供的功能,计算机通过硬件中断机制完成有用户态到核心态的转换,这是通过中断机制来实现的。发生中断事件时(有可能是用户程序发出的系统调用),触发中断,,硬件中断机制将计算机状态变为核心态。
  • 中断系统和地址映射都需要映射支持,在时钟管理中,重置时钟等是由硬件直接完成的进程调度由调度算法决定CPU使用权,由操作系统实现,无须硬件支持。
  • 置时间指令即为设置时间。
  • 广义指令(系统调用)的调用可能发生在用户态,调用广义指令的那条指令不一定是特权指令,但广义指令存在与核心态中,所以执行一定在核心态
  • 子程序调用只需保存程序断点,即该指令的下一条指令的地址;
  • 中断调用不仅要保存断点(PC的内容),还是保存程序状态字寄存器(PSW)的内容。在中断处理中,最重要的两个寄存器是PC和PSW
  • 对于特殊情况,如除数为零和自行中断都会自动跳过中断指令,所以不会返回到发生异常的指令继续执行。
  • 内中断是指来自CPU和内存内部产生的中断,包括程序运算引起的各种错误,如地址非法,校验错,页面失效,非指令,用户程序执行特权指令自行中断(INT)和除数为零等。
  • 中断(外中断):是指来自CPU执行指令以外事件的发生,如设备发送的I/O结束中断,时钟中断等,这一类中断通常是与当前程序运行无关的事件,即它们与当前处理机运行的程序无关
  • 时钟中断的主要工作是处理和时间有关的信息及决定是否执行调度程序。和时间有关的所有信息包括系统时间,进程的时间片,延时。使用CPU的时间,各种定时器。
  • 大内核主要功能包括进程管理,存储器管理,设备管理,时钟管理,中断管理和原语。
  • 微内核主要包括时钟管理,中断处理,原语。

第二章 进程管理

1、进程与线程

1.1进程

  1. 进程控制块(PCB):描述进程的基本情况和运行状态,进而控制和管理进程。

  2. 进程映像(进程实体):有程序段、相关数据段和PCB三部分组成。

  3. 创建进程:实质上是创建进程映像中的PCB;撤销进程:实质上是撤销进程的PCB.

  4. 程序:是静态的,就是存放在磁盘里的可执行文件,就是一系列的指令集合。

  5. 进程的定义

    • 进程是程序的一次执行过程。
    • 进程是一个程序及其数据在处理机上顺序执行时所发生的活动。
    • 进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。
  6. 就绪态:进程获得了除处理机外的一切所需资源,一旦得到处理机,便可立即运行。

  7. 阻塞态(等待态):进程正在等待某一事件而暂停运行,如等待某资源为可用(不包括处理即机)或等待输入/输出完成。

  8. 创建态:创建进程通常需要多个步骤:首先申请一个空白的PCB,并向PCB中填写一些控制和管理进程的信息;然后由系统为该进程分配运行时所必须的资源,最后把该进程转入就绪态。

  9. 挂起与阻塞的区别:两种状态都是暂时不能获得CPU的服务,但挂起状态是将进程映像调到外存中去了,而阻塞态下进程映像还在内存中。

  10. 一个进程从运行态变成阻塞态的主动的行为自身进程需要的东西在忙,主动的去申请和退出而从阻塞态变成就绪态是被动行为被动等待资源的释放

1.2进程控制

  1. 进程的控制:就是实现进程状态的转换。

  2. 进程的创建:终端用户登录系统、作业调度、系统提供服务、用户程序的应用请求等都会引起进程的创建。其过程如下

    • 为新进程分配一个唯一的进程标识号,并申请一个空白的PCB(PCB是有限的)。若PCB申请失败则创建失败。
    • 为进程分配资源,为新进程的程序和数据用户栈分配必要的内存空间(在PCB中体现)。注意,若资源不足(内存空间),并不是创建失败,而是处于阻塞态,等待内存资源。
    • 初始化PCB,主要包括初始化信息标志信息,初始化处理机状态信息和初始化处理机控制信息,以及设置进程的优先等级等。
    • 若进程就绪队列能够接纳新进程,则将新进程插入就绪队列中,等待被调度运行。
  3. 进程终止

    引起终止的事件
    - 正常结束
    - 异常结束,如存储区越界、保护错、非法指令、特权指令错、运行超时、算数运算错、I/O故障等
    - 外界干预,如操作员或操作系统干预、父进程请求和父进程终止。
    

    过程如下:

    • 根据被终止进程的标识符,检索PCB,从中读出该进程的状态。
    • 若被终止处于执行状态,立即终止该进程的执行,将处理机资源分配给其它进程。
    • 若该进程还有子孙进程,则应将其所有子孙进程终止。
    • 将该进程所拥有的全部资源,归还给其父进程,或归还给操作系统。
    • 将该PCB从所在队列(链表)中删除。
  4. 进程的阻塞:由系统自动执行阻塞原语,将自己有运行态变为阻塞态。阻塞原语执行的过程:

  • 找到将要被阻塞的进程的标识号对应的PCB。
  • 若该进程为运行态,则保护其现场,将其转换为阻塞态,停止运行。-- 这里所说的保护现场指的是将一些资源放在寄存器中。
  • 把PCB插入相应事件的等待队列,将处理机资源调度给其他就绪进程。
  1. 进程的唤醒:当被阻塞进程所期待的事件出现时,由有关进程**(比如,释放该I/O设备的进程,或提供数据的进程)**调用唤醒原语,将等待该事件的进程唤醒。唤醒原语的执行过程如下:

    • 在该事件的等待队列中找到相应进程的PCB。
    • 将其从等待队列中移出,并置其状态为就绪态。
    • 把该PCB插入就绪队列,等待调度程序调度。
    block原语和wakeup原语是一对作用刚好相反的原语,必须成对使用。
    
  2. 进程的切换:指处理机从一个进程的运行转到另一个进程上运行,在这个过程中,进程的运行环境产生实质性的变化。过程如下:

  • 保存处理机上下文,包括程序计数器和其他寄存器。
  • 更新PCB信息。
  • 把进程的PCB移入相应的队列,如就绪,在某件事阻塞等队列。
  • 选择另一个程序执行,并更新其PCB。
  • 更新内存管理的数据结构。
  • 恢复处理机上下文。
--"调度"和“切换”的区别。调度是指决定资源分配给哪个进程的行为,是一种决策行为;
--切换是指实际分配的行为,是执行行为。
--一般来说,先有资源调度,然后才有进程的切换。
  1. 原语的执行具有原子性,即执行过程只能一气呵成,期间不允许被中断。可以用“关中断指令”和“开中断指令“这两个特权指令实现原子性。CPU执行了关中断指令之后,就不再例行检查中断信号,直到执行开中断指令之后才会恢复检查。

1.3 进程的组织

  1. 进程:有以下三个部分组成进程控制块、程序段和数据段

    进程控制块PCB是给操作系统使用的。
     -其组织方式有链接方式和索引方式两种。
     -链接方式将同一状态的PCB链接成一个队列,不同状态对应不同的队列,也可把处于阻塞态的进程的PCB,根据其阻塞原因的不同,排成多个阻塞队列。 
     -索引方式将同一状态的进程组织在一个索引表中,索引表的表项指向相应的PCB,不同状态对应不同的索引表,如就绪索引表和阻塞索引表等。
    
    • 程序段就是能被进程调度程序调度到CPU执行的程序代码段。
    • 数据段是进程对应的程序加工处理的原始数据,也可以是程序执行时产生的中间结果或最终结果。
    • 程序段和数据段是给进程自己用的,与进程自身的运行逻辑有关。

1.4 进程的通信

  1. 共享存储:在通信的进程之间存在一块可以直接访问的共享空间,通过对这片共享空间进行写/读操作实现进程间的信息交换。

    -对共享空间进行读写操作时,需要使用同步互斥工具(如p操作,v操作)。
    -共享存储分为两种:
     1.低级方式的共享是基于数据结构的共享;
     2.高级方式的共享则是基于存储区的共享。
    
  2. 消息传递:j进程间的数据交换是以格式化的消息为单位的。

    -直接通信方式:发送进程直接把消息发送给接收进程,并将它挂在接受进程的消息缓冲队列上,接收进程从消息缓冲队列中取出消息。
    -间接通信方式:发送进程把消息发送到一个中间实体,接收进程从中间实体,接收进程从中间实体取得消息。这个中间实体一般称为信箱,这种通信方式又称为信箱通信方式。
    
  3. 管道通信:所谓的”管道”,是指用于连接一个读进程和一个写进程以实现它们之间的通信的一个共享文件,又名pipe文件。

    • 向管道(共享文件)提供输入的发送进程(即写进程),以字符流形式将大量的数据送入(写)管道。
    • 而接收管道输出的接收进程(即读进程)则从管道中接收(读)数据。
    从管道读数据是一次性操作,数据一旦被读取,它就从管道中被抛弃,释放空间以便写更多的数据。
    
    • 管道与一般文件的不同

      - 限制管道的大小--管道是一个固定大小的缓冲区
      - 读进程也可能工作的比写进程快
      

1.5 线程

  1. 线程的基本概念:

    • 可理解为“轻量级进程”,它是一个基本的CPU执行单元,也是程序执行流的最小单元。
    • 其由线程ID、程序寄存器、寄存器集合和堆栈组成。
    • 线程是进程中的一个实体,是被系统独立调用和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但可与同属一个进程的其他线程共享进程所拥有的全部资源
  2. 线程的属性:

    • 每个线程是一个轻量级实体,不拥有系统资源,但每一个线程都应有一个唯一的标识符和一个线程控制块(TCB),线程控制块记录了线程执行的寄存器和栈的等待现状
    • 同一进程中的各个线程共享该进程的所有资源。
    • 线程是处理机的独立调度单位,多个线程是可以并发执行的。
    • 一个线程被创建后,便开始了它的生命周期,直至结束 。
    • 不同的线程可以执行相同的程序,即同一个服务程序被不同的用户调用时,操作系统把他们创建成不同的线程。
  3. 线程的实现方式:

    • 线程的实现可以分为两类:用户级线程和内核级线程,内核级线程又称为内核支持的线程。

      - 用户级线程:
      -- 优点:用户线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高。
      -- 缺点:当一个用户级线程被阻塞后,整个进程都被阻塞并发度不高。多个线程不可在多核处理机上并行运行。
      - 内核级线程:
      -- 优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。
      -- 缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。
      
  4. 多线程模型:

    • 多对一模型:将多个用户级线程映射到一个内核级线程,线程管理在用户空间完成。
    • 一对一模型:将每个用户级线程映射到一个内核线程。
    • 多对多模型:将n个用户级线程映射到m个内核级线程上,要求m <= n;

1.6 其他

  1. 进程的地址空间:每一个进程包含独立的地址空间,进程各自的地址空间是私有的,只能执行自己地址空间中的程序,且只能访问自己的地址空间的数据,相互访问会导致指针的越界错误。

  2. 操作系统引入进程的概念,是为了从变化的角度动态地分析

  3. 进程获得处理机运行是通过调度得到的。

  4. 进程控制块(PCB)是常驻内存的。

  5. 一个进程的基本状态可以从其他两种基本状态转变过去—就绪态

    - 运行态-》就绪态----时间片用完了,进程需要重新等待cpu的使用。
    - 阻塞态-》就绪态----当所需资源到达时。
    
  6. 程序封闭性:指进程执行的结果只取决于进程本身,不受外界影响。

  7. 在多对一的线程模型中,当一个多线程进程中的某个线程中的某个线程被阻塞后,整个进程都将被阻塞

    - 在多对一的线程模型中,用户级线程的“多”对操作系统透明,--即操作系统并不知道用户有多少线程--,因此该进程的一个线程被阻塞,进程的其他线程当然都被阻塞。
    
  8. 下列数据结构对应于进程的哪一个段。

    - 全局赋值变量---正文段(数据段)
    - 未赋值的局部变量---栈段
    - 函数调用实参传递值---栈段
    - 用malloc()要求动态分配的存储区---堆段
    - 常量值---正文段
    - 进程的优先级---PCB
    
  9. 进程的最大数目取决于系统内存的大小,它在系统安装时就已确定–若后期内存增加系统能够创建的进程总数也应增加,但一般要重启。

  10. 若就绪队列不为空,就绪的进程数目越多,处理机的效率不变

    -- 原因是只要就绪队列不为空,CPU就总是可以调度进程运行。
    
  11. 在单处理机系统中,某一时刻只有一个进程能获得处理机的资源。

  12. 进程的状态的变化

    a.从运行态到阻塞态---进程的资源不够时
    b.从运行态到就绪态---进程的时间片用完了
    c.从就绪态到运行态---获得了处理机的资源
    d.从阻塞态到就绪态---所需资源准备好了
    
  13. 设备分配是通过在系统中设置相应的数据结构实现的。

  14. 线程的切换,可能引起进程的切换。

  15. 同一进程或不同进程内的线程都可以并发执行—线程继承于进程

  16. 不同进程拥有不同的代码段和数据段,全局变量是对同一进程而言的在不同进程而言的不同进程中不同的变量

  17. 进程刚完成I/O操作,进入就绪队列,为了尽快PCB处理I/O结果,应该提高优先级。

  18. 进程长期处于就绪队列,为了不产生饥饿现象,应当提高优先级。

  19. 进程可以创建进程和线程,线程可以创建线程,但是不能够创建进程

  20. 管道是一种特殊的文件,它常驻于内存,类似于通信中半双工信道的进程通信机制。

    • 管道容量大小,通常为内存上的一页,它的大小不受磁盘容量的限制。
    • 当管道满时,写管道阻塞。
    • 当管道空时,读管道阻塞
  21. 应用程序没有进行线程管理的代码,只有一个到内核级编程接口,内核为进程及其内部的每个线程维护上下文的信息,调度也是在内核中有操作系统完成的

  22. 用户级线程的切换可以在用户空间完成,内核级线程的切换需要OS的帮助进行调度,因此用户级线程效率高。

  23. 进程与程序:

a.执行一条命令或运行一个应用程序时,进程和程序之间形成**一对一**的关系。
b.进程在执行过程中可以加载执行不同的应用程序,从而形成**一对多的关系**。
c.以不同的参数或数据多次执行同一个应用程序,形成**多对一的关系**。
d.并发地执行不同的应用程序,形成**多对多的关系**。

24.父进程和子进程,主程序和子程序

a.父程序创建子程序后,父进程与子进程同时执行(并发)。
b.主程序调用子程序后,主程序暂停在调用点,子进程开始执行,直到子程序返回,主程序才开始执行。

25.为什么进程间的通信必须要借助OS内核功能?

因为进程都有自己的独立地址空间,进程无法访问其他进程的地址空间,所以必须借助于操作系统调用函数实现。
  1. 若系统中未运行进程,则系统很快会选择一个就绪进程运行。只有就绪队列中的无进程时,CPU才能处于空闲状态。

2、处理机的调度

  1. 调度的概念

调度的层次:一个作业从提交到完成,往往会经历以下三级调度:

  • 作业调度:又称为高级调度,主要指的是从外存上的后备状态的作业中挑选一个作业,给它们分配内存、输入/输出设备等必要的资源,并建立相应的进程,以使它获得竞争处理机的权利。(是内存与辅存之间的调度,每个作业之调入一次、调出一次。)

    作业:具体指某一具体的任务。
    
  • 中级调度:又称为内存调度,按照某种策略决定将那个处于挂起状态的进程重新调入内存。(从外存到内存的)

    其作用是提高内存利用率和系统吞吐量。
    
  • 进程调度:又称为低级调度,其主要任务是按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给它。(处理机的使用)

    # 发生频率
    -- 高级调度 < 中级调度 < 低级调度
    
  1. 临界资源:一个时间段内只允许一个进程使用的资源。各进程需要互斥地访问临界资源。

  2. 临界区:访问临界资源的那段代码,访问普通临界区时可以进行调度与切换

    # 内核程序临界区一般是用来访问某种内核的数据结构,其不能在使用时,进行切换与调度。
    
  3. 系统吞吐量 = (总共完成了多少道作业) / (总共花了多少时间)。

  4. 先来先服务调度算法:算法每次从后备作业队列中选择最先进入该队列的一个或几个作业,将它们调入内存分配必要的资源,创建进程并放入就绪队列中。

  5. 优先级调度算法

# 非剥夺式优先级调度算法--按队列顺序来。
# 按优先级来执行,优先级越高,越先执行,可打断进程。
  1. 进程优先级的设置可参照原则

    • 系统进程 > 用户进程

    • 交互型进程 > 非交互型进程(或前台进程 > 后台进程)

    • I/O型进程 > 计算机型进程

      # 所谓I/O型进程,是指那些会频繁使用I/O设备的进程,而计算型进程是那些频繁使用CPU的进程(很少使用I/O设备)。
      
  2. 时间片轮转调度算法:用于进程调度(只有作业放入内存建立了相应的进程后,才能被分配处理机的时间片),可能会出现时间饥饿。

    # 在使用完一个时间片后,即使进程并未完成其运行,他也必须释放(即被剥夺)处理机给下一个就绪的进程。
    # 在时间片轮转调度算法中,时间片的大小对系统性能的影响很大。
    - 若时间片足够大,以至于所有进程都能在一个时间片内执行完毕,则时间片轮转调度算法就退化为先来先服务调度算法。
    - 若时间片很小,则处理机将在进程间过于频繁地切换,使处理机的开销增大,而真正用于运行用户进程的时间将减少。
    
    1. 时间片的长短通常由以下因素确定:

      # 系统的响应时间、就绪队列中的进程数目和系统的处理能力。
      # 其常用于分时操作系统,更注重"响应时间",因而此处不计算周转周期。
      

3、其他

  1. 设备利用率 = (设备被使用时间) / (作业从开始到全部执行结束时间)。
  2. 每次进程切换需要 1次调度,1次切换。
  3. 响应比 = (等待时间 + 要求服务时间) / (要求服务时间)。

4、进程的同步

  1. 进程具有异步性的特性,异步性是指各并发执行的进程以各自独立的,不可预知的速度推进。

  2. 同步:亦称直接制约关系,为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而等待、传递信息所产生的制约关系。(相互唤醒)

  3. 互斥:亦称间接制约关系。当一个进程进入临界区使用临界资源时,另一个进程必须等待,当占用临界资源的进程退出临界区后,另一进程才允许去访问此临界资源。(相互制约)

  4. 同步机制应遵循以下准则:

    # 空闲让进:临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区。
    # 忙则等待:当已有进程进入临界区时,其他试图进入临界区的进程必须等待。
    # 有限等待:对请求访问的进程,应保证能在有限时间内进入临界区。
    # 让权等待:当进程不能进入临界区时,应立即释放处理器,防止进程忙等待。
    
  5. 实现临界区互斥的基本方法

    # 软件实现方法
    
    • 单标志法:该算法设置一个公用整型变量turn。用于指示被允许进入临界区的进程编号,若turn = 0,则允许P0进程进入临界区。、
      • 只能交替使用临界资源
      • 不遵循”空闲让进“原则
      • 其可以”实现同一时刻最多只允许一个进程访问临界区”。
    • 双标志法先检查:设置一个数据flag[i],如第i个元素值为FALSE,表示Pi进程未进入临界区,值为TRUE,表示Pi进程进入临界区。
      • 不遵从“忙则等待”
    • 双标志法后检查:其将自己的标志设置为TRUE,在检测对方的状态标志,若对方标志为TRUE,则进程等待;否则进入临界区。
      • 不遵循空闲让进,有限等待。
    • Peterson‘s Algorithm:考虑进程Pi,一旦设置flag[i] = true,就表示想要进入临界区,同时turn = j,此时
    # 硬件指令方法
    
    • testAndSet指令:不满足"让权等待原则"
    • Swap指令:不满足“让权等待”。
  6. 信号量:其实就是一个变量(可以是整数,也可以是更复杂的记录型变量)。

  • 整型信号量

    • 存在的问题:不满足“让权等待”原则,会发生忙等。

      wait(S)
      {
      	while(S <= 0)
              S = S-1;
      }
       signal(S)
       {
      	S = S+1;
       }
      
  • 记录型信号量

    typedef struct
    {
    	int value;//剩余资源量
        struct process *L;//等待队列
    } semphore;
    // 相应的wait(S)和sighal(S)的操作如下:
    void wait(semaphore S)
    {
    	S.value--;
        if(S.value < 0)
            add this process to S.L;
        block(S.L);
    }//运行态-》阻塞态 , 阻塞原语,在wait内部。
    void sighal(semaphore S)
    {
        S.value++;
        if(S.value <= 0)
        {
            remove a process P from S.L;
            wakeup(P);
        }
    }//阻塞态-》运行态, 唤醒原语在其内部。
    
  • 利用信号量实现同步–一对P,V
    • 进程同步:要让各并发进程按要求有序的推进。
      • 技巧口诀:前V后P
  • 利用信号量实现进程互斥—两对PV
  1. 利用信号量实现前驱关系

    • 其实每一对前驱关系,都是一个进程同步问题(需保证一前一后的操作)
      • 要为每一对前驱关系设置一个同步信号量。
      • 在“前操作”之后对相应的同步信号量执行V操作。
      • 在“后操作“之前对相应的同步信号量执行P操作。
  2. 管程–新的进程同步的工具

    • 定义:代表资源的数据结构,以及由对该共享数据结构和能为并发进程所组成的资源管理程序。
    • 组成
      • 进程的名称
      • 局部于管程内部的共享结构数据说明
      • 对该数据结构进行操作的一组过程(或函数)
      • 对局部于管程内部的共享数据设置初始值的语句
    • 基本特征
      • 局部于管程的数据只能被局部于管程中的过程所访问;
      • 一个进程只有通过调用管程内的过程(函数)才能进入管程访问数据,
      • 每次仅允许一个进程进入管程。

5、其他

  1. 互斥关系:指进程之间相互竞争使用独占性资源(互斥资源)所产生的制约关系。

  2. 同步关系:指进程之间为协同工作需要交换信息,相互等待而产生制约关系。

  3. 资源信号量的初值可以是任意整数,表示可用的资源数,当资源小于零时,表示资源已经全部用完。

  4. 信号量机制:一种有效实现进程同步和互斥的工具。

  5. 互斥量

    • 互斥量的初值一般为1,表示临界区只允许一个进程进入,从而实现互斥
    • 互斥量的绝对值表示在临界区外等待进入的进程数。
  6. 信号量表示相关资源的当前可用数量,当信号量k > 0时,表示还有k个相关资源可用,当信号量 k < 0时,表示|K|个进程在等待该资源。

  7. 同步机制:空闲让进,忙则等待,让权等待和有限等待。

  8. 临界资源是互斥共享资源,非共享数据不属于临界资源。

  9. 共享资源:一段时间内多个可并发使用,临界资源:一段时间内只可供一个进程使用。

  10. 共享程序段:可能同时被多个进程使用,所以必须重入编码。

  11. 因为每次允许两个进程进入该程序段,信号量最大值取2。至多有三个进程申请,则信号量最小为-1。

  12. 管程的signal操作与信号量机制的V操作不同,信号量机制中的V操作一定会改变信号量的S=S+1.而管程中的signal操作是针对某个条件变量的,若不存在因该条件而阻塞的进程,则signal不会产生任何影响。

  13. p操作和v操作都属于原子操作。

  14. S.value > 0,表示某类可用资源的数量,每次P操作,意味着请求分配一个单位的资源

  15. S.value <= 0,表示某类资源已经没有了,或者说还有请求该资源而被阻塞的进程,S.value <= 0时的绝对值,表示等待进程的数目。

  16. 记录型信号量由于引入阻塞机制,消除了不让权等待的情况。

  17. “条件变量”是管程内部说明和使用的一个特殊变量,其作用类似于信号量机制中的“信号量”,都用于实现进程同步。在同一时刻,管程中只能有一个进程在执行。

# 若进程A执行了x.wait()操作,则该进程会阻塞,并挂到条件变量x对应的阻塞队列上。
  1. 硬件方法实现进程同步时不能实现让权等待,peterson算法满足有限等待但不满足让权等待。

6、死锁

  1. 死锁、饥饿和死循环
# 概念
- 死锁:是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程将无法向前推进。
- 饥饿:由长期得不到想要的资源,某进程无法向前推进的现象。
- 死循环:某进程执行过程中一直跳不出某个循环的现象。
# 三者相同点
- 都是进程无法顺利向前推进的现象(故意设计的死循环除外)。
# 区别
- 至少有两个或两个以上的进程同时发生死锁
- 可能只有一个进程发生饥饿
- 死锁和饥饿是管理者(OS)的问题,死循环是被管理者的问题
- 死循环是被管理者的问题
  1. 死锁产生的必要条件
  1. 互斥条件:一段时间进程独占一个资源。

  2. 不剥夺条件:已获资源不能被其他进程强行夺走。

  3. 请求并保持条件:进程以获得资源,又发出新的请求。

  4. 循环等待条件:存在一个循环等待链,链中进程已获资源同时为链中下一进程所请求。

    # 发生死锁时一定有循环等待,但是循环等待未必死锁。
    
  1. 死锁的处理策略
# 死锁预防
- 设置某些限制条件,破坏产生死锁的四个必要条件中的一个或几个,以防止发生死锁。
# 避免死锁
- 在资源的动态分配过程中,用某种方法防止系统进入不安全状态,从而避免死锁。
# 死锁的检测与解除
- 无须采取任何限制性措施,允许进程在运行过程中发生死锁。通过系统的检测机构及时地检测出死锁的发生,然后采取某种措施解除死锁。
  1. 银行家算法的核心:在进程提出资源申请时,先预判几次分配是否会导致系统进入不安全状态。如果会进入不安全状态,就暂时不答应此次请求,让其先阻塞等待。
  2. 资源分配图
# 如何描述
- 圆圈代表一个进程
- 框代表一类资源
- 框内的一个圆代表一类资源中的一个资源。
- 从进程到资源的有向边称为请求边,表示该进程申请一个单元的该类资源。
- 从资源到进程的边称为分配边,表示该类资源已有一个资源分配给了该进程。
  1. 死锁定理:简化资源分配图可检测系统状态S是否为死锁状态。依次消除与不阻塞进程相连的边。直到无边可消。

  2. 死锁解除

    # 资源剥夺法
    - 挂起某些死锁进程,并抢占它的资源。
    # 撤销进程法
    - 强制撤销部分甚至全部死锁进程并剥夺这些进程的资源。
    # 进程回退法
    - 让一个或多个进程回退到足以回避死锁的地步。
    

    如何决定“对谁先动手”

    • 进程优先级
    • 已执行多长时间
    • 不要多久能完成
    • 进程已经使用了多少资源
    • 进程是交互式的还是批处理式的。
  3. 一次分配所有资源的方法可以预防死锁的发生,但是它需要凑齐所有资源,因此当一个进程所需资源较多时,资源的利用率会较低,甚至造成进程的饥饿。

  4. 空间上,系统产生死锁的原因有独占资源的分配不当。时间上,由于进程运行中推进顺序不当,即调度时机不合适,不该切换进程时进行了切换,可能会造成死锁。

  5. 解除死锁的方法有

    # 资源剥夺法
    - 挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程;
    # 撤销进程法
    - 强制撤销部分甚至全部死锁进程并剥夺这些进程的资源
    # 不同点
    - 资源剥夺法允许一个进程强行剥夺其他进程所占有的系统的资源
    - 而撤销进程强行释放一个进程已有的系统资源
    
    1. 死锁检测一般采用两种方法:资源有向图和资源矩阵法
    2. 颠簸:也就是抖动,这是请求分页系统中页面调度不当而导致的现象。
    3. 回退:是指从此时此刻的状态退回到一分钟之前的状态,假如一分钟之前的状态,假如一分钟之间拥有资源它可能释放了资源X,那就不称回到一分钟之前的状态,也就不是回退。
    4. 系统的资源分配图中,判断下列情况是否处于死锁状态
# 出现环路
- 只是满足了循环等待的必要条件,而满足必要条件不一定会导致死锁。
# 没有环路
- 破坏了循坏等待条件,一定不会发生死锁。
# 每种资源只有一个,又出现了环路
- 这是死锁的充分必要条件
# 每一个进程结点至少有一条请求边
- 若资源足够,则不会死锁,但资源不充足,则有发生死锁的可能。	

​ 15. 死锁预防采用破坏产生死锁的4个必要条件中的一个或多个来防止发生死锁。其中之一的“破坏循环等待条件”,一般采用顺序资源分配法,首先给系统的资源编号,规定每个进程必须按编号递增的顺序请求资源,即限制用户申请资源的顺序。

第三章 内存管理

1、内存管理概念

  1. 内存管理的功能有
  • 内存空间的分配和回收
  • 地址转换
  • 内存空间的扩充
  • 存储保护
2. 程序的装入与链接
 - 编译:由程序将用户源代码编译成若干目标文件
 - 链接:有链接程序将编译后形成的一组目标模块及所需的库函数链接在一起,形成一个完整的装入模块。
 - 装入:由装入程序将装入模块装入内存运行。
3. 重定位
# 目的
- 将装入模块装入内存的适当位置。
# 概念
- 装入时对目标程序中指令和数据的修改过程
  1. 内存保护

    # 采取两种方法
    - 在CPU中设置一对上、下限寄存器,存放用户作业在主存中的上下限地址,每当CPU要访问一个地址时,分别和两个寄存器的值相比,判断有无越界。
    - 采用重定位寄存器(或基址寄存器)和界地址寄存器(限长寄存器)来实现这种保护。
    

2、交换与覆盖

1. 覆盖
# 目的
- 用来解决“程序大小超过物理内存总和”的问题。
# 概念
- 按照自身逻辑结构,让那些不可能同时被访问的程序段共享一个覆盖区。
# 缺点
- 必须由程序员声明覆盖结构,操作系统完全自动覆盖。
- 对用户不透明,增加用户编程负担。
- 覆盖技术只用于早期的OS中。

​ 1. 交换

# 基本思想
- 把处于等待状态(或在CPU调度原则下被剥夺运行权力)的程序从内存到辅存,把内存空间腾出来,这一过程又称为换出;把准备好竞争CPU运行的程序从辅存移到内存,这一过程又称换入。
# 交换技术
- 内存紧张时,换出某些进程以腾出内存空间,再换入某些进程。
- 磁盘分为文件区和对换区,换出的进程放在对换区。
  1. 覆盖与交换的区别
- 覆盖是在同一进程或程序中的。
- 交换是在不同进程(或作业)之间。

3、连续分配管理方式

  1. 单一连续分配:内存中只有一道程序

    # 无外部碎片,有内部碎片
    
  2. 固定分区分配:每个分区都装入一道程序。当有空闲分区时,便可再从外存的后备作业队列中选择适当大小的作业装入该分区,如此循环。

    # 无外有内
    
  3. 动态分区分配:在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。

    # 无内有外--可用拼接技术为已解决外部碎片
    
  4. 内部碎片:分配给某些进程的内存区域中,如果有些部分没有用上,(动态分配,按需分配,对于进程来说,没有空的)。

  5. 外部碎片:是指内存中的一些空闲分区由于太小而难以利用。

  6. 动态分区的分配策略:在进程装入或换入主存时,若内存中有足够大的空闲块,则操作系统必须确定分配那个内存块给进程使用。

# 首次适应算法
- 空闲分区以地址递增的次序链接。分配内存时顺序查找,找到大小能满足要求的第一个空闲分区,每次从头开始查找。
# 最佳适应算法
- 空闲分区按容量递增的方式形成分区链,找到第一个能满足要求的空闲区,会存在许多外部碎片。
# 最坏适应算法
- 又称最大适应算法,空闲分区以容量递减的次序链接,找到第一个能满足要求的空闲分区,即挑选出最大的分区。
# 邻近适应算法
- 又称为循环首次适应算法,由首次适应算法演变而成。不同之处是,分配内存时从上次查找结束的位置开始继续执行。
  1. 首次适应算法不仅是最简单的,而且通常也是最好最快的。但是缺点,会使高地址的大分区也被用完。

4、非连续分配管理方式

  1. 分页存储:将内存分为一个大小相等的分区(比如:每个分区4kB),每个分区就是一个“页框”(页框 = 页帧 = 内存块=物理块=物理页面)。每一页框有一个编号,即“页框号”(页框号 = 页帧号=内存块号=物理块号=物理页号),页框号从0开始.将进程的逻辑地址空间也分为与页框大小相等的一个个部分,每个部分称为一个“页”或“页面”。每个页面也有一个编号,即“页号”,页号也是从0开始。页式管理中的地址是一维的,即只要给出一个逻辑地址,系统就可以自动算出页号,页内偏移两个部分。
  2. 页表:与内存中的页面的概念是不一样的,它记录进程在内存中块的多少个。它记录页面在内存中对应的物理块号,页表一般存放在内存中。
  3. 页表
# 页号即页表中的一列页的编号,其可以是隐含的,不占存储空间(类比数组)。
- 页号(在页表中的页表项的编号) = 逻辑地址 / 页面长度(取除法的整数部分)
- 页内偏移量 = 逻辑地址 % 页面长度(取除法余数部分)--内存中块内偏移量
- 页表寄存器:存放着页表的起始地址,和页表中页表项的个数。
  1. 块表:其不在内存中,是一个单独的存储器,具有并行查找能力的高速缓存器-----快表,又称相连存储器(TLB)。
# 快表存储页表中的一部分--》这里页表称为“慢表”。
  1. 两级页表:若采用多级页表机制,则各级页表的大小不能超过一个页面。

  2. 引入二级页表的原因

    # 页表必须连续存放,因此页表很大时,需要占用很多个连续的页框。
    # 没有必要让整个页表常驻内存,因为进程在一段时间内可能只需要访问几个特定的页面。
    
    1. 时间局部性:如果执行了程序中的某条指令,那么不久后这条指令很有可能再次执行;如果是个数据被访问过,不久之后数据很可能再次被访问。(因为程序中存在大量的循环)——》针对指令。

    2. 空间局部性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元,也很有可能被访问。(因为很多数据在内存中都是连续存放的)。---->针对存储结构,固定结构。

    3. 两级页表的访存次数分析(假如没有快表机构)

      • 第一次访存:访问内存中的页目录表。
      • 第二次访存:访问内存中的二级页表。
      • 第三次访存:访问目标内存。
    4. 基本分段存储管理方式

      • 段的长度可变
      • 段号的位数决定了每个进程最多可分成几个段。
      • 段内地址位数决定了每个段的最大长度是多少。
      • 页号位数决定了每个段最大有多少页。
      • 页内偏移量决定了页面大小,内存块是多少。
      • 分段:段式管理方式按照用户进程中的自然段划分逻辑空间,所以段的长度是可变的。
    5. 不能修改的代码称为纯代码或可重入代码(它不属于临界资源),这样的代码和不能修改的数据可以共享,而可修改的代码和数据不能共享。

    6. 分段存储管理方式的访存分析

      # 第一次访存:查内存中的段表
      # 第二次访存:访问目标内存单元
      
    7. 段页式系统:其中段号 和页号都要进行越界检查,看其是否超过段(页)表的长度。

    8. 分段:对用户是可见的,程序员编程时需要显式地给出段号,段内 地址。而将各段“分页“对用户是不可见的。系统会根据段内地址自动划分页号和页内偏移量。因此段页式管理的地址结构是二维的。

    9. 分段与分页对比

      # 分页
      - 页是信息的物理单位。
      - 分页的主要目的是为了实现离散分配,提高内存利用率。分页仅仅是系统管理上的需求,完全是系统行为,对用户是不可见的。
      # 分段
      - 段是信息的逻辑单位。
      - 分段的主要目的更好地满足用户需求。一个段通常包含着一组属于一个逻辑模块的信息。分段对于用户是可见的,用户编程是需要显示地给出段名。
      # 不同
      - 页的大小固定由系统决定。段的长度却不固定,决定户编码的程序。
      

5、习题

  1. c程序产生可执行文件的过程

    # 预处理-》编译-》汇编-》链接-》
    - 其中链接的其前一步是产生可重定位的二进制目标文件。
    - 链接阶段主要完成重定位,形成整个过程的完整逻辑空间。
    
  2. 编址空间的大小取决于硬件的访存能力,一般有地址总线宽度决定。

  3. 虚拟内存的管理需要由相关的硬件和软件支持,有请求分页机制 、缺页中断机构、地址变换机构。

  4. 覆盖和交换的提出就是为了解决主存空间不足的问题,但不是物理上扩充主存,只是将暂时不用的部分换出主存,以节省空间,从而逻辑上扩充主存。

  5. 最佳适应算法是指每次为作业分配内存空间时,总能找到能满足空间大小需要的最小空闲分区给作业,可以产生最小的内存空闲分区。

  6. 静态装入:是指在编程阶段就把物理地址计算好。

  7. 可重定位:是指在装入时把逻辑地址转换成物理地址,但装入后不能改。

  8. 动态重定位是指在执行时逻辑地址并装入,装入后有可能会换出,所以同一模板在内存中的物理地址是可能改变的。其是指在作业运行过程中执行到一条访存指令时,再把逻辑地址转换为主存中的物理地址,实际中是通过硬件转换机制实现。

  9. 碎片

- 分页式存储管理-》内部碎片
- 分段式存储结构-》外部碎片
- 固定分区存储管理方式-》内部碎片
- 段页式存储管理方式-》内部碎片
  1. 页表和段表
# 页表和段表常驻内存(用户所拥有的)
# 系统提供给用户的物理地址空间为总空间的大小减去同在内存的页表or段表的长度。
  1. 内存分页管理是在硬件和操作系统层面实现的,对用户,编译系统,链接装配程序上层是不可见的。

  2. 页表的功能有一组专门的存储器实现,其始地址放在页表基址寄存器中。这样才能满足在地址变换时能够较快地完成逻辑地址和物理地址之间的转换。

  3. 编译

    # 编译后一个目标程序所限定的地址范围称为该作业的逻辑地址。换句话说,地址空间仅指程序用来访问信息所用的一系列地址单元的集合。这些地址单元的集合。这些单元的编号,称为”逻辑地址“。通常,编译地址都是相对始址”0“的,因而也称逻辑地址为相对地址。
    
  4. 实现分页,分段和段页式。支持页表,段表等特定的数据结构,为提高性能,还需要硬件提供快存和地址加法器。

  5. 覆盖和交换技术,即在较小的内存空间中采用重复使用的方法来节省存储空间,以时间换空间。

  6. 页式存储管理中选择页面的大小

# 页面大
- 用于管理的页面就少,但是页内碎片会比较大。
# 页面小
- 用于管理页面的页表就大,但是页内碎片小。
  1. 引入段式管理方式,主要是为了满足用户下列要求
- 方便编程
- 分段共享
- 分段保护
- 动态链接
- 动态增长
  1. 平时进程未执行时,页表的始址和页表长度存放在本进程的PCB中,当调度到某进程时,才将这两个数据装入页表寄存器中,每个进程都是一个单独的逻辑地址,逻辑地址有一张属于自己的页表。
  2. 凡是分区固定的都会产生内部碎片,而无外部碎片。
  3. 段共享是通过两个作业的段表中相应表项指向被共享的段的同一物理地址副本来实现,因此在内存中仅保存一份段S的内容。
  4. 分段系统的逻辑地址A到物理地址E之间的地址变换过程如下:
# 1
- 从逻辑地址A中取出前几位为段号S,后几位为段内偏移量W,注意段式存储管理的题目中,逻辑地址一般为二进制数给出,而在页式存储管理中,逻辑地址一般以十进制数给出。
# 2 
- 比较段号S和段表长度M,若S >= M,则产生越界异常,否则继续执行。
# 3
- 段表中段号S对应的段表项地址 = 段表始址F + 段号S * 段表项长度M,取出该段表项的前几位得到段长C。若段内偏移量 >= C,则产生越界异常,否则继续执行。
# 4
- 取出段表项中该段的基址b,计算E= b + W ,用得到的物理地址E去访问内存。

  1. 对于比较复杂的情况,如多级页表,若页表划分为N级,则需要访问内存N+ 1次,若系统中有快表命中时,只需要访问一次
  2. 注意
# 在有快表的分页存储系统中,计算有效存取时间时,需注意访问的时间关系,通常的系统中,未命中时再内存;在有些系统中,快表与内存的访问同时进行,当快表命中时停止对内存的访问。
- 这里题目未具体指明,我们就按照前者进行计算。但题目有说明时就应该注意。
  1. 位示图利用二进制的一位来表示磁盘中一个盘块的使用情况,其值为”0“时表示对应盘块空闲,为”1“时表示已分配,地址空间分页,每页为1KB,对应的盘块大小为1KB,主存总容量为256KB,可分为256个盘块。

6、虚拟内存的基本概念

  1. 传统存储管理

    # 一次性
    - 作业必须一次性全部装入内存后才能开始运行。
    # 驻留性
    - 一旦作业被装入内存,就会一直驻留在内存中直至作业运行结束。
    
  2. 高速缓存技术:使用频繁的数据放到更高速的存储器中。

  3. 虚拟存储器

    # 虚拟存储器的大小由计算机的地址结构决定,并不是内存和外存的简单相加。
    # 多次性
    - 是指无须在作业运行时一次性地全部装入内存,而允许被分成多次调入内存运行。
    # 对换性
    - 指无须在作业运行时一直常驻内存,而允许在作业的运行过程中,进行换进和换出。
    # 虚拟性
    - 指从逻辑上扩充内存的容量,使用户所看到的内存容量远大于实际内存容量。
    
  4. 虚拟内存:需要建立在离散分配的内存管理方式的基础上。

# 实现有以下三种方式
- 请求分页存储管理
- 请求分段存储管理
- 请求段页式存储管理
  1. 与传统非连续分配存储管理的区别
# 在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。
- 操作系统要提供请求调页(掉段)功能。
# 若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存。
- 提供页面置换
  1. 缺页中断机构:为实现请求调页的功能
# 缺页中断作为中断,其与一般的中断相比,它有以下两个明显的区别:
- 在指令执行期间而非一条指令执行完后产生和处理的中断信号,属于内部中断。
- 一条指令在执行期间,可能产生多次缺页中断。
  1. 中断的分类
# 内中断--内部异常
- 陷阱,陷入(系统调用)
- 故障(缺页中断)
- 终止(整除零)
# 外中断
- I/o中断请求
- 人工干预
  1. 与基本机制相比

    # 新增
    - 请求调页(查到页表项时进行判断)
    - 页面置换(需要调入页面,但没有空闲内存时进行)
    - 需要修改请求页表中断新增的表项
    
  2. 在请求分页中的地址变换过程中

    # 修改访问位和修改位
    - 只有进行写指令时,才会对修改位,进行修改。
    # 将一页从外存换入内存
    - 页面调入内存后,需要修改慢表,同时也需要将表项复制到快表。
    
  3. 页面的换入,换出需要磁盘I/O,会有较大的开销。

  4. 最佳置换算法–理想的算法,实际很难实现

    # 其选择被淘汰页面是以后永不使用的页面,或是最长时间内不在被访问的页面。
    - 只要访问页面的一个提前预读,看最长时间没有没访问的页面,其被换出。
    
  5. 先进先出页面置换算法:优先淘汰最早进入内存的页面,即在内存中驻留时间最久的页面,设置一个指针总指向最早的页面

    • FIFO算法还会产生所分配的物理块增大而页故障数不减反增的异常现象,称其为Belady异常。
  6. 最近最久未使用置换算法:需要硬件支持

    • 选择最近最长时间为访问过的页面予以淘汰,它认为过去一段时间内未访问过的页面,在最近的将来可能也不会被访问。该算法为每个页面设置一个访问字段,来记录页面自上次被访问以来所经历的时间,淘汰页面时选择现有页面中值最大的予以淘汰。
    # 在手动做题时,若需要淘汰页面,可以逆向检查此时在内存中的几个页面号。在逆向扫描过程中最后一个出现的页号就是要淘汰页面。
    
  7. 时钟置换算法:也可称最近未使用算法

    # 简单的CLOCK算法
    - 给每帧关联一个附加位,称为使用位(访问位)。
    - 当某页首次装入主存时,将该帧的使用位设置为1
    - 访问位为1,表示最近访问过
    - 访问位为0,表示最近没有访问过。
    
    # 改进的CLOCK算法
    - 新增了一个修改位
    - 分为使用过但未修改过和使用过且修改过。因此,若有未使用过的页面,则当然首先把它换出,若全部页面都使用过,则当然优先把修改过的页面换出。
    # 优先级(优先级越高的越先被换出)
    - 第一优先级:u=0,m=0
    - 第二优先级:u=0,m=1
    - 第三优先级:u=1,m=0
    - 第四优先级:u=1,m=1
    

7、页面分配策略

  1. 驻留集:给一个进程分配的物理页框的集合

  2. 页面分配策略

    # 固定分配:驻留集大小不变
    # 可变分配:驻留集大小可变
    # 局部置换:发生缺页只能选进程自己的物理块
    # 全局置换:可以将OS保留的空闲物理块分配给缺页进程,也可以将别的进程持有的物理块置换到外存,再分配到缺页进程
    # 可变分配全局置换:只要缺页就给分配新物理块。
    # 可变分配局部置换:要根据发生缺页的**频率**来动态地增加or减少进程物理块。
    # 固定分配局部置换
    
  3. 调入页面时机

    - 预调页策略在运行前,一次调入若干相邻的页可能会比一次调入一页更高效
    - 请求调页策略:在运行期间调入,在运行期间发现缺页时才将所缺页面调入内存。
    
  4. 抖动:在页面置换过程中,一种最糟糕的情形是,刚刚换出的页面马上又要换出的页面马上又要换入主存,刚刚换入的页面马上又要换出主存,这种频繁的页面调度行为。

  5. 工作集:指在某段时间间隔里,进程要访问的页面集合

  6. 驻留集小于工作集时,会出现抖动。

  7. 实际应用中,工作集窗口会设置得很大,即对于局部性好的程序,工作集大小一般会比工作集窗口&小很多。工作集反应了进程在接下来的一段时间内很有可能频繁缺页,所以为了防止这种抖动现象,一般来说分配给进程的物理块数(驻留集大小)要大于工作集大小。

8、习题

  1. 请求分页存储管理中,若把页面尺寸增大一倍而且可容纳的最大页数不变,则在程序顺序执行时缺页中断次数会减少*。
    • 由于页面变大,容量不变,则装入的页面变少,中断的机会就会变少。
  2. 缺页中断:访存指令引起的,说明所要访问的页面不在内存中,进行缺页中断处理并调入所要访问页后,访存指令是应该重新执行。
  3. 多次性、对换性和离散性是虚拟内存的特性
  4. 一次性则是传统存储系统的特性。
  5. 无论采用什么页面置换算法,每种页面第一次访问时不可能在内存中,必然发生缺页,所以缺页次数大于等于 n (进程的实际页面数)。
  6. 虽然从实际使用来说,虚拟存储器能使得进程的可用内存扩大到内外存容量之和,但进程的内存寻址仍由计算机的地址结构决定,这就决定了虚拟存储器理论上的容量
  7. 最近最久未使用置换算法(LRU):选择最近最长时间未访问过的页面予以淘汰,它认为过去一段时间内未访问过的页面,在不久的将来可能也不会被访问。
# LRU算法
- 需要对所有页进行一次被访问的时间进行记录,查找时间最久的进行替换,这涉及排序,对置换算法而言,开销太大。为此需要在页表项中增加LRU位原因是要进行排序。
  1. 请求分页存储管理就是为了解决内存容量不足而使用的方法,它基于局部性原理实现了以时间换取空间的目的。

    • 主要特点是间接扩充内存
    • 虚拟存储扩充内存的基本方法是将一些页或段从内存中调入、调出,而调入、调出的基本手段是覆盖与交换。
  2. 虚拟存储技术是基于页或段从内存的调入/调出实现的,需要有请求机制的支持。

  3. 地址映射机制中的快表:相联存储器

  4. 提高CPU的利用率

    # 增大内存的容量
    - 增大内存可使每个程序得到更多的页面,能减少缺页率,进而减少换入/换出过程。
    # 减少多道程序的度数
    - 因为从给定的条件知道磁盘交换区的利用率为99.7%,说明系统现在已经处于频繁的换入/换出过程中,可减少主存的程序数。
    
  5. 改进型CLOCK置换算法执行的步骤如下

    # 
    - 从指针的当前位置开始,扫描帧缓冲区。在这次扫描过程中,对使用位不做任何修改。选择遇到的第一个帧(A = 0,M = 0)用于替换。
    # 
    - 若第一步失败,则重新扫描,查找(A = 0,M = 1)的帧。选择遇到的第一个这样的帧用于替换。在这个扫描过程中,对每个跳过的帧,将其使用位设置成0.
    # 
    - 若第二步失败,则指针将回到它的最初位置,并且集合中所有帧的使用位均为0。重复第一步,并在必要时重复第二步,这样将可以找到供替换的帧。
    
  6. 在任意时刻 t ,都存在一个集合,它包含所有最近K次内存访问所访问过的页面。这个集合w(k,t)就是工作集。

第四章 文件管理

1、文件系统基础

  1. 文件的结构

    # 数据项:是文件系统中最低级的数据组织形式可分为两种类型
    - 基本数据项:用于描述一个对象的某种属性的一个值,是数据中可命名的最小逻辑数据单元,即原子数据。
    - 组合数据项:有多个基本数据项组成
    # 记录:一组相关的数据项的集合,用于描述一个对象在某方面的属性。
    # 文件:由创建者所定义的一组相关的信息集合,逻辑上可分为有结构文件和无结构文件
    - 有结构文件(记录式文件):由一组相似的记录组成
    - 无结构式文件(流式文件):被视作一个字符流,
    
  2. 文件属性

    • 创建文件------create调用
    • 写文件------write调用
    • 读文件-----read调用
    • 删除文件-----delete调用
  3. 进程使用完文件后,要“关闭文件”,OS在处理close系统调用时,主要步骤

    • 进程的打开文件表相应表项删除
    • 回收分配给文件的内存空间等资源
    • 系统的打开文件表的打开计数器count减 1,若count = 0,则删除对应表项。
  4. OS在处理open系统调用时,主要做了几件事

    • 根据文件存放路径的相应目录文件,从目录中找到文件名对应的目录项,并检查该用户是否有指定的操作权限
    • 将目录项复制到内存中的“打开文件表”中。并将对应表目的编号返回给用户。之后用户使用打开文件表的编号来指明要操作的文件。
  5. 文件的打开与关闭

    • 读/写文件之前-----需要“打开文件”。
    • 读/写文件结束之后,需要“关闭文件”。
  6. 系统的打开文件表:操作系统维护一个包含所有打开文件信息的打开文件表,整个系统只有一张

    • 进程在使用文件时,也会被分配一个打开文件表。
    • 打开文件表–编号、文件名、读写指针、访问权限和系统表索引号
  7. 文件的逻辑结构

    # 无结构文件(流式文件)
    # 有结构文件(记录式文件)
    - 顺序文件:文件中的记录一个接一个地顺序排列,记录通常是定长的。可以**顺序存储或链表形式存储**,若采用链式存储,则无法实现随机存储。
    -- 顺序文件的效率是所有逻辑文件中最高的;此外,**也只有顺序文件才能存储在磁带上**,并能有效地工作,但顺序文件对查找、修改、增加或删除单条记录的操作比较困难。
    # 索引文件:每一项指向一个记录。
    - 变长记录文件只能顺序查找,系统开销大
    - 索引表本身是定长记录的顺序文件,**支持随机访问**。
    # 索引顺序文件:每一项指向一个组,多级索引顺序文件,多次分组。
    - 索引顺序文件将顺序文件中的所有记录分为若干组,为顺序文件建立一张索引表,在索引表中为每组中的第一条记录建立一个索引表。
    # 直接文件或散列文件:给定记录的键值或通过散列函数转换的键值直接决定记录的物理地址。
    
  8. 目录结构

    • 为了实现目录管理,操作系统中引入了文件控制块的数据结构。
    # 文件控制块
    - 是用来存放控制文件需要的各种信息的数据结构,以实现“按名存取”。**FCB**的有序集合称为文件目录,**一个FCB就是一个文件目录项**。
    # FCB的内容
    - 基本信息:如文件名、文件的物理位置、文件的逻辑结构、文件的物理结构等。
    - 存取控制信息:如文件存取权限。
    - 使用信息:如文件建立时间、修改时间等
    
    • 在UNIX采用了文件名和文件描述信息分开的方法,文件描述信息单独形成一个称为索引结点的数据结构,简称 i 结点。在文件目录中的每个目录项仅有文件名和指向该文件所对应的 i 结点的指针构成。

      # FCB 
      - 一个FCB的大小是64B,盘块大小是1kb,因此在每个盘块中可以存放16个FCB(注意FCB必须连续存放)。而在UNIX系统中,一个目录项仅占16B,其中14B是文件名,2B是i的指针结点。在1KB的盘块中可存放64个目录项。这样,就可使查找文件时的平均启动磁盘次数到原来的1/4,大大节省了系统开销。
      
      # 存放在磁盘上的索引结点称为磁盘索引结点,UNIX中的每个文件都有一个唯一的磁盘索引结点。包括
      - 文件主标识符
      - 文件类型
      - 文件存取权限
      - 文件物理地址
      - 文件长度
      
  9. 单级目录结构:单级目录结构实现了“按名存取”,但是存在查找速度慢、文件不允许重名、不便于文件共享等缺点,而且对于多用户的操作系统显然是不适用的。

  10. 二级目录结构主文件目录项记录用户名及相应用户文件目录所在的存储位置。文件目录项记录该用户文件的FCB信息。

    • 当某用户欲对其文件进行访问时,只需搜索该用户对应的UFD,这即解决了不同用户文件的“重名”问题。
    • 但是两级目录结构缺乏灵活性,不能对文件分类。
  11. 多级目录结构(树形目录结构)

    • 缺点:其不便于实现文件的共享
    • 树形目录结构可以很方便地对文件进行分类,层次结构清晰,也能够更有效地进行文件管理和保护。但是,在树形目录中查找一个文件时,需要按路径名逐级访问中间结点,这就增加了磁盘访问次数,无疑将影响查询速度。
  12. 无环图目录结构:引入的目的为了实现文件共享

    • 实现
      • 为此,可为每个共享结点设置一个共享计数器,每当图中增加对该结点的共享链时,计数器加1;每当某用户提出删除该结点时,计数器减1.仅当共享计数器为0时,才认真删除该结点。
  13. 共享文件不同于复制文件。在共享文件中,由于各用户指向的是同一个文件,因此只要其中一个用户修改了文件数据,那么所有用户都可以看到文件数据的变化。

  14. 文件共享

    # 基于索引结点的共享方式(硬链接)
    - 只有当计数器count = 0时,表示没有用户在使用,此时才可删除文件。
    - 诸如文件的物理地址及其他的文件属性等消息,不放在目录项中,**而放在索引结点中**。
    - 在文件目录中只设置文件名及指向相应索引结点的指针,在索引结点中还应有一个链接计数count,用于表示连接到本索引结点(即文件)上的用户目录项的数目。
    # 利用符号链实现文件共享(软链接)
    - 文件删除,则该符号连接失效,类似快捷方式
    - 在新文件中只包含被链接文件F的路径名。这样的链接方法被称为符号链接。
    - 在利用符号链方式实现文件共享时,只有文件的拥有者才拥有指向其索引结点的指针。而共享该文件的其他用户只有该文件的路径名,并不拥有指向其索引结点的指针。这样,也就不会发生在文件主删除一个共享文件后留下一个悬空指针(硬链接中的索引结点)的情况。
    - 当文件的拥有者把一个共享文件删除后,其他用户通过符号链去访问它时,会出现访问失败,于是将符号链删除,此时不会产生任何影响。
    
  15. 文件保护

    • 文件保护通过口令保护、加密保护和访问控制等方式实现。其中,口令保护和加密保护是为了防止用户文件被他人存取和窃取,而访问控制则用于控制用户对文件的访问方式。

      # 访问控制
      - 如果对某个目录进行访问权限的控制,那也要对目录下的所有文件进行相同的访问权限控制。
      - 解决访问控制最常用的方法是根据用户身份进行控制。而实现基于身份访问的最为普通的方法是**为每个文件和目录增加一个访问控制列表,以规定每个用户名及其所允许的访问类型**
      # 口令
      - 口令指用户在建立一个文件时提供一个口令,**系统为其建立FCB**时附上相应口令,同时告诉允许共享该文件的其他用户。这种方法时间和空间的开销不多,**缺点**是口令直接存在系统内部,不够安全。
      # 密码
      - 密码指用户对文件加密,文件被访问时需要使用密钥(这种密钥,不需要保存在系统中,加密和解密是相同的密钥)。这种方法保密性强,节省了存储空间,不过编码和译码要花费一定的时间。
      

习题

  1. 此文件所在目录下可能还存在其他文件,因此删除文件时不能(也不需要)删除文件所在的目录,而与此文件关联的文件控制块需要随着文件一同删除,同时释放文件关联的内存缓冲区。

  2. 当前目录又称工作目录,进程对各个文件的访问都相对与当前目录进行,而不需要从根目录一层一层地检索,加快了文件的检索速度。

  3. 打开文件操作的主要工作是把指定文件的目录复制到内存指定的区域

  4. UNIX操作系统中,所有设备都被视作特殊文件,因为UNIX操作系统控制和访问外部设备的方式和访问一个文件的方式是相同的

  5. 从系统角度看,文件系统负责对文件的存储空间进行组织分配,负责文件的存储并对存入文件进行保护,检索。

  6. 从用户角度看,文件系统根据一定的格式将用户的文件存储器中适合的地方,当用户需要使用文件时,系统根据用户所给的文件名能够从文件存储器中找到所需要的文件。

  7. # 
    - 逻辑文件的组织形式取决于用户
    物理结构的选择取决于文件系统设计针对硬件结构所采取的策略
    
  8. 索引文件由逻辑文件和索引表组成,文件的逻辑结构和物理结构都有索引的概念,引入逻辑索引和物理索引的目的是截然不同的,逻辑索引的目的是加快文件数据的定位,是从用户角度出发的,而物理索引的主要目的是管理不连续的物理块是从系统管理的角度出发。

  9. read要求用户提供三个参数;

    # 
    - 文件描述符 fd
    - buff缓存区首址
    - 传送的字节数 n
    # read 的功能是试图从fd所指示的文件中读入n个字节的数据,并将它们送至由指针buf所指示的缓冲区中
    
  10. 采用多级目录的目的

    1. 提高文件的查找速度
    2. 允许用户建立同名文件
  11. 单级目录结构要首先检索所有的目录项,以保证新文件名在目录中是唯一的

  12. 符号链接和硬链接

    • 建立符号链接时引用计数值直接复制。
    • 建立硬链接时,引用计数值加 1,
    • 删除文件时,删除操作对于符号链接是不可见的,这并不影响文件系统,当以后再通过符号链接访问时,发现文件不存在,直接删除符号链接。但是对于硬链接则不可直接删除,引用计数值减 1,若值不为 0.则不能删除此文件,因为还有其他硬链接指向此文件。
  13. 文件访问权限是指用户有没有权限访问该文件

  14. 文件优先级是指在多个用户同时请求该文件时应该满足谁。

  15. 可以把用户访问权限抽象为一个矩阵,行代表用户,列代表访问权限。

  16. 对于一个文件的访问,常由用户访问权限和文件属性共同限制

  17. 防止受损常采用备份的方法保护文件,而存取控制矩阵的方法用于多用户之间的存取权限

  18. 提前读是指在读当前盘块时将下一个可能需要访问的盘块数据读入缓冲区,以便需要时直接从缓冲取读取,提高了文件的访问速度

  19. 延迟写是指先将数据写入缓冲区,并置上“延迟写”的标志,以备不久之后访问,当缓冲区需要再次被分配出去时,才将缓冲区数据写入磁盘的次数,提高了文件的访问速度。

2、文件系统的实现

  1. 显示链接是指把用于链接文件各物理块的指针,从每一个物理块的块末尾中提取出来,显式地存放在内存的链接表中。该表在整个磁盘中仅设置一张,称为文件分配表(FAT)。
    • 注意:一个磁盘仅能够设置一张FAT。开机时将FAT读入内存,并常驻内存。
    • FAT的各个表项在物理上连续存储且每一个表项长度相同,因此“物理块号”字段可以隐含。
  2. 索引表:其功能类似于内存管理中页表—建立逻辑页面到物理页面的映射关系
    • 索引表为一个相当于页表的磁盘块,与其他文件一样只是存储的内容不同。其与FAT不同,其文件块不含指针,指向其后面的文件块。
    • FAT常驻内存,文件分配表是一个磁盘对应一张,而索引表是一个文件对应一张。
  3. 混合索引:多种索引分配方式的结合,列如,一个文件的顶级索引表中,既包含直接地址索引(直接指向数据块),又包含一级索引(指向单层索引表),还包含两级间接索引==》最大文件(总的数据块)----》几种之和。
    • 索引文件的索引表:用户自己建立的–》映射:由关键字—》记录存放的逻辑地址
    • 索引分配分配的索引表:操作系统建立的。----》映射:逻辑块号----》物理块号
  4. 位示图------理解相当于二维数组(序号转换)

习题

  1. 文件的物理包括连续,链式,索引三种,其中链式结构不能实现随机访问,连续结构的文件不易于扩展。因此随机访问且易于扩展是索引结构的特性。

    # 
    - 随机访问:直接first+N,便可以得到第N个元素的地址,因为这些相邻元素是按顺序连续存储的。比如普通数组就是可随机访问的。
    - 而链表不支持随机访问,链表存储的元素,它们的存储地址也不是连续的,是随机的。要想访问第N个元素,只能从second = first->next遍历第2个元素,然后再three = first->next遍历第3个元素… 这样一直到第N个元素。所以这样的访问速度就没有随机访问快。
    
  2. 直接存取即随机存取,采用连续分配和索引分配的文件都适合于直接存取的方式,只有采用链接分配的文件不具有随机存取特性。

  3. 在连续分配方式中,为了是系统能找到文件存放的地址,应在目录项的“文件物理地址”字段中,记录该文件第一条记录所在的盘块号和文件长度。

  4. 将文件描述信息从目录项中分离,即应用了索引结点的方法,磁盘的盘块中可以存放更多的目录项,查找文件时可以大大减少其 I/o信息量。

  5. 传统文件系统管理空闲磁盘的方法包括空闲表法,空闲链表法,位示图和成组链接法

  6. 文件分配表(FAT)的表项与物理磁盘块一一对应,并且可以用一个特殊的数字 -1表示文件的最后一块,用 -2 表示这个磁盘块是空闲的(当然,规定用 -3,-4来表示也是可行的)。因此文件分配(FAT)不仅记录文件中各个块的先后链接关系,同时还标记空闲的磁盘块,OS可以通过FAT对文件存储空间进行管理。

  7. 文件存储空间管理即文件空闲空间管理,文件管理要解决的问题是,如何创建文件分配存储空间,即如何找到空闲盘块,并对其管理。

  8. 修改还需要写回操作,由于写回时以获得该块的物理地址,只需一次访问磁盘。即从硬盘中拿出来,到内存中修改,然后再将记录放回到硬盘中。

  9. 而文件的物理结构是由操作系统的设计者根据文件存储器的特性来确定的,一旦确定就由操作系统管理。

  10. 打开文件表仅存放已打开文件信息的表,将指明文件的属性从外村复制到内存,在使用该文件时直接返回索引。

  11. 索引结点是os为了实现文件名与文件信息分开而设计的数据结构,存储了文件描述信息,索引结点属于文件描述信息,索引结点属于文件目录管理部分的内容。

3、 磁盘管理系统

  1. 磁盘的水平存储:(盘面号,柱面,扇区),会更容易移动磁头,但是浪费时间。纵向存储:(柱面号、盘面号、扇区号)进行定位。

  2. 延迟时间和传输时间都与磁盘转速相关,且为线性相关,而转速是硬件的固有属性,因此操作系统也无法优化延迟时间和传输时间。

  3. 一次磁盘读写操作的时间由寻找(寻道)时间、延迟时间和传输时间决定。

    • 寻找时间:将磁头移动到指定磁道所需要的时间。
    • 延迟时间:到达指定磁道后,到达指定扇区所需要的时间。
    • 传输时间:磁头到达有效区域后,读取(写入)内容所需的时间。
  4. 磁道调度算法:用来优化寻道时间(寻找时间)。

    • 先来先服务算法:根据进程请求访问磁盘的先后顺序进行调度,即在磁盘请求队列中的请求顺序。
    • 最短寻找时间优先:首先处理与当前磁头最近的算法,缺点:可能产生 “饥饿" 现象.
    • 扫描算法(又称电梯调度算法):只有到达最外侧,才能向内移动,只有到达最内侧,才能向外移动。对于磁道来说,它们的响应频率不平均。
    • 循环扫描算法:在电梯算法的基础上,增加一个判断,若为该方向上最后一个,则立即转向。每次单向移动一整轮返回过程中不处理任何磁道
  5. 减少延迟时间也是提高磁盘传输效率的重要因素。可以对盘面扇区进行交替编号,对磁盘片组中的不同盘面错位命名。

    • 每扫描一个有效区域后,会有一段时间的处理时间,此时磁头不在读取。那么对于连续的磁道,则需要重新定位(因为盘面是一直在旋转的)。
    1. 对坏块的处理实质上就是用某种机制,使系统不去使用坏块。坏块属于硬件故障,操作系统是不能够修复盘块的。

习题

  1. 可共享设备是指某一段时间内可以有多个用户进行访问。但某一时刻只能有一个作业可以访问。

  2. 文件以块为单位存放磁盘中,文件的读写也以块为单位。

  3. 磁盘调度中对读写时间影响最大的是寻找时间,寻找过程为机械运动,时间较长,影响较大。

  4. 文件的物理结构与磁盘空间分配方式相对应,包括连续分配,链接分配和索引分配。连续分配的磁盘中,文件的物理地址连续;而链接分配方式的磁盘中,文件的物理地址不连续,因此与旋转延迟有关。

  5. 当系统总是持续出现某个磁道的访问请求日,均持续满足最短寻道时间优先、扫描算法和循环扫描算法的访问条件,会一直服务该访问请求。而先来先服务按照请求次序进行调度,比较公平。

  6. 绝大多数操作系统为了改善磁盘访问时间,以簇为单位进行空间分配。

  7. 磁盘的初始化

    • 新磁盘是空白的,必须分成各个扇区以便于磁盘控制器能读和写,这个过程称为低级格式化(或物理格式化)。低级格式化为磁盘的每个扇区采用特别的数据结构,包括校验码。
    • 为了使用磁盘存储文件,操作系统还需要将自己的数据结构记录在磁盘上。
    • 这分为两步。第一步是将磁盘分为一个或多个柱面组成的分区,每个分区可以作为一个独立的磁盘。
    • 在分区后,第二步是逻辑格式化(创建文件系统)。这一步,操作系统将初始的文件系统数据结构存储到磁盘上。这些数据结构包括空闲和已分配的空间及一个初始为空的目录。

第五章 输入/输出(I/O)管理

1、I/O层次结构

  1. I /O控制器的功能

    # 接受和识别CPU发出的命令
    - 如CPU发来的read/write命令。I/o控制器中会有相应的控制寄存器,来存放命令和参数。
    # 向CPU报告设备的状态
    - I/O控制器中会有相应的状态寄存器,用于记录I/o设备的当前状态。
    # 数据交换
    - I/O控制器中会设置相应的数据寄存器
    # 地址识别
     - 类似于内存的地址,为了区分设备控制器中的各个寄存器,也需要给各个寄存器设置一个特定的“地址”。
     a.内存映射--》统一映射
     b.寄存器独立编址--》1. 寄存器独立编制,2. 需设置专门指令操作控制器
    
    
  2. 块设备:由于信息的存取总是以数据块为单位的,可寻址

  3. 字符设备:用于数据输入输出的设备为字符设备,因为其传输的基本单位是字符。不可寻址。

  4. DMA控制器,在数据传输时,首先会在控制器中形成一个数据块(并不是一个具体的值,而是一个集合),其实每次读都是读一个字,暂存在数据寄存器中,直到累积到一个块的时候就进行传输。

  5. 通道:一种硬件,可以理解为是“弱鸡版的CPU”,通道可以识别并执行一系列通道指令。

  6. 通道与一般处理机的区别是:通道指令的类型单一,没有自己的内存,通道所执行的通道程序是放在主机的内存中的,也就是说通道与CPU共享内存

    • 通道数据传输的单位一组数据块(并不是固定值,而是由CPU事先指定)。
    • 通道程序是一种任务清单
  7. 通道与DNA方式的区别是:DMA方式需要CPU来控制传输的数据大小、传输的内存位置,而通道方式这些信息是由通道控制的。

  8. 设备独立性软件:用于实现用户程序与设备驱动器的统一接口、设备命令、设备保护及设备分配与释放等,同时为设备管理和数据传送提供必要的存储设备。

  9. 设备独立性软件需要通过“逻辑设备表(LUT)”来确定逻辑设备对应的物理设备,并找到该设备对应的设备驱动程序。

  10. 中断处理层的主要任务:进行进程上下文的切换,对处理中断信号源进行测试,读取设备状态和修改进程状态等。

习题

  1. 中断寄存器位于计算机主机

  2. 编程空间一般是由体系结构和操作系统共同决定。

  3. 设备映射表中记录了逻辑设备所对应的物理设备,体现了两者的对应关系。对设备映射表来说,不能实现具体的功能及管理物理设备。

  4. DMA是一种不经过CPU而直接从主存存取数据的数据交换模式,它在I/o设备和主存之间建立了一条直接的数据通路,如磁盘

    • 这条数据通路只是逻辑上的,实际并未直接建立一条物理线路,而通过总线进行。
  5. spooling、缓冲池、内存覆盖都是在内存的基础上通过软件实现。

  6. 在DMA方式中,设备和内存之间可以成批地进行数据交换而不用CPU干预,CPU只参与预处理和结束过程。

  7. 设置通道后,CPU只需要向通道发送一条I/O指令。通道在收到该指令后,便从内存中取出本次要执行的通道程序,然后执行该通道程序,仅当通道完成规定的I/O任务后,才向CPU发出中断信号。因此通道用于完成内存与外设的信息交换。

  8. 键盘是典型的通过中断I/o方式工作的外设,当用户输入信息时,计算机响应中断并通过中断处理程序获得输入信息。

  9. CPU启动通道时不管启动成功与否,通道都要回答CPU,通道在执行通道程序的过程中,CPU与通道并行,通道完成通道程序的执行后,便发出I/o中断向CPU报告。

  10. 系统调用命令是操作系统提供给用户程序的通用接口,不会因为具体设备的不同而改变。而设备驱动程序负责执行操作系统发出的I/o命令,它因设备不同而不同。

  11. 计算磁盘号,磁头号和扇区号的工作是由设备驱动程序完成的.

  12. 输入/输出软件一般从上到下分为四个阶段

    • 用户层、与设备无关的软件层—也就是系统调用的处理程序、设备驱动程序、中断处理程序
    # 
    - 当用户使用设备时,首先在用户程序中发起一次系统调用,操作系统内核接到该系统调用请求后,请求调用程序进行处理,再转到相应的**设备驱动程序**,当设备准备好或者所需要的数据到达后,**设备硬件**发出中断,将数据按上述调用顺序逆用回传到用户程序中。
    

2. I/o调度

  1. I/O调度就是确定一个好的顺序来执行这些I/o请求。

  2. 缓冲区–利用内存区域做缓冲区

    # 单缓冲区
    - 题目中没有特别说明,一个缓冲区的大小就是一个块
    - 缓冲区的特性:当缓冲区数据非空时,不能往缓冲区冲入数据,只能从缓冲区把数据传出,当缓冲区为空时,可以往缓冲区存数据,但必须把缓冲区充满以后,才能从缓冲区把数据传出。
    - 记一块数据输入缓冲区的时间为**T**,从缓冲区的数据传送到用户区的时间为** M **,CPU对一块数据处理时间为 C。
    - 则单缓冲区处理每块的用时为Max(C,T) + M
    # 双缓冲区
    - 处理一块数据的用时为MAX(C+M,T)。
    - 管道通信中的“管道”其实就是缓冲区,要实现数据的双向传输,必须设置两个管道。
    # 循环缓冲
    - 循环队列
    - 包含多个大小相等的缓冲区,每个缓冲区中有一个链接指针指向下一个缓冲区,最后一个缓冲区指针指向第一个缓冲区,多个缓冲区构成一个环形。
    # 缓冲池
    - 由多个系统公用的缓冲区组成,缓冲区按其使用状况可以形成三个队列:空缓冲队列、装满输入数据的缓冲队列(输入队列)和装满输出数据的缓冲队列(输出队列)。
    
  3. 高速缓存和缓冲区

    • 高速缓存存放的是低速设备上某些数据的复制数据,高速缓存上有的,低速设备上必然有,若高速设备要访问的数据不在高速缓存中,则高速设备就要访问低速设备
    • 缓冲区是高速设备和低速设备之间传送数据的过渡区,两者之间的通信都必须经过缓冲区,高速设备永远不会直接访问低速设备

3.设备分配

# DCT --设备控制表,COCT---控制器控制表,通道控制表---CHCT和系统设备表---SDT
- 一个设备控制表就表征一个设备
- DCT与COCT有一一对应的关系。
- CHCT与COCT的关系是一对多的关系
- 整个系统只有一张SDT,它记录已连接到系统中的所有物理设备情况,每个物理设备占一个表目。

4.SPOOLing技术(假脱机技术)

  1. 为了缓和CPU的高速性与I/O设备之间低速性的矛盾而引入了SPOOLing技术,是一种将独占设备改造为共享设备的技术,实现了虚拟设备功能,该技术利用外围控制机将低速I/O设备上的数据传输到高速磁盘上,或者相反**。

  2. SPOOLing系统的组成:

    • 输入井和输出井:磁盘上开辟出的两个存储区域,用于收容I/O设备输入的数据和用户程序输出的数据
    • 输入缓冲区和输出缓冲区:内存中开辟的两个缓冲区,输入缓冲区暂存由输入设备送来的数据,之后再送到输入井,输出缓冲区同理
    • 输入进程和输出进程:分别模拟输入输出进程的外围控制机
  3. 要实现spooling技术,必须要有多道程序技术的支持。系统会建立“输入进程“ 和 ” 输出进程”。

习题

  1. 用户程序对 I/O设备的请求采用逻辑设备名,而程序实际执行时使用物理设备名,它们之间的转换是由设备无关软件完成的。
  2. 重排 I /O请求次序也就是进行I/O调度,使进程之间公平地共享磁盘访问减少 I/O完成所需的平均等待时间。
  3. 在一个磁盘上设置多个分区与改善设备 I/O性能并无多大联系,相反还会带来处理的复杂性,降低利用率。
  4. 缓冲区机制中,无论是单缓冲,多缓冲还是缓冲池,由于缓冲区是一种临界资源,所以使用缓冲区时都有一个申请和释放(即互斥)的问题需要考虑。
  5. 在单机系统中,最关键的资源是处理器资源,最大化地提高处理器利用率就是最大化地提高系统效率。多道程序设计技术是提高处理器利用率的关键技术,
  6. 在鼠标移动时若有高优先级的操作产生,为了记录鼠标的活动的情况,必须使用缓冲技术。

以后,才能从缓冲区把数据传出。

  • 记一块数据输入缓冲区的时间为T,从缓冲区的数据传送到用户区的时间为** M **,CPU对一块数据处理时间为 C。
  • 则单缓冲区处理每块的用时为Max(C,T) + M

双缓冲区

  • 处理一块数据的用时为MAX(C+M,T)。
  • 管道通信中的“管道”其实就是缓冲区,要实现数据的双向传输,必须设置两个管道。

循环缓冲

  • 循环队列
  • 包含多个大小相等的缓冲区,每个缓冲区中有一个链接指针指向下一个缓冲区,最后一个缓冲区指针指向第一个缓冲区,多个缓冲区构成一个环形。

缓冲池

  • 由多个系统公用的缓冲区组成,缓冲区按其使用状况可以形成三个队列:空缓冲队列、装满输入数据的缓冲队列(输入队列)和装满输出数据的缓冲队列(输出队列)。

3. ### 高速缓存和缓冲区

- **高速缓存存放**的是低速设备上某些数据的复制数据,高速缓存上有的,低速设备上必然有,若高速设备要访问的数据不在高速缓存中,则高速设备就要访问低速设备
- **缓冲区**是高速设备和低速设备之间传送数据的过渡区,两者之间的通信都必须经过缓冲区,高速设备永远不会直接访问低速设备

### 3.设备分配

```markdown
# DCT --设备控制表,COCT---控制器控制表,通道控制表---CHCT和系统设备表---SDT
- 一个设备控制表就表征一个设备
- DCT与COCT有一一对应的关系。
- CHCT与COCT的关系是一对多的关系
- 整个系统只有一张SDT,它记录已连接到系统中的所有物理设备情况,每个物理设备占一个表目。

4.SPOOLing技术(假脱机技术)

  1. 为了缓和CPU的高速性与I/O设备之间低速性的矛盾而引入了SPOOLing技术,是一种将独占设备改造为共享设备的技术,实现了虚拟设备功能,该技术利用外围控制机将低速I/O设备上的数据传输到高速磁盘上,或者相反**。

  2. SPOOLing系统的组成:

    • 输入井和输出井:磁盘上开辟出的两个存储区域,用于收容I/O设备输入的数据和用户程序输出的数据
    • 输入缓冲区和输出缓冲区:内存中开辟的两个缓冲区,输入缓冲区暂存由输入设备送来的数据,之后再送到输入井,输出缓冲区同理
    • 输入进程和输出进程:分别模拟输入输出进程的外围控制机
  3. 要实现spooling技术,必须要有多道程序技术的支持。系统会建立“输入进程“ 和 ” 输出进程”。

习题

  1. 用户程序对 I/O设备的请求采用逻辑设备名,而程序实际执行时使用物理设备名,它们之间的转换是由设备无关软件完成的。
  2. 重排 I /O请求次序也就是进行I/O调度,使进程之间公平地共享磁盘访问减少 I/O完成所需的平均等待时间。
  3. 在一个磁盘上设置多个分区与改善设备 I/O性能并无多大联系,相反还会带来处理的复杂性,降低利用率。
  4. 缓冲区机制中,无论是单缓冲,多缓冲还是缓冲池,由于缓冲区是一种临界资源,所以使用缓冲区时都有一个申请和释放(即互斥)的问题需要考虑。
  5. 在单机系统中,最关键的资源是处理器资源,最大化地提高处理器利用率就是最大化地提高系统效率。多道程序设计技术是提高处理器利用率的关键技术,
  6. 在鼠标移动时若有高优先级的操作产生,为了记录鼠标的活动的情况,必须使用缓冲技术。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值