第一轮:从当前位置开始扫描到第一个(A =0, M = 0)的帧用于替换。表示该页面最近既未被访问,又未被修改,是最佳淘汰页
第二轮:若第一轮扫描失败,则重新扫描,查找第一个(A =0, M = 1)的帧用于替换。本轮将所有扫描过的帧访问位设为0。表示该页面最近未被访问,但已被修改,并不是很好的淘汰页。
第三轮:若第二轮扫描失败,则重新扫描,查找第一个(A =1, M = 0)的帧用于替换。本轮扫描不修改任何标志位。表示该页面最近已被访问,但未被修改,该页有可能再被访问。
第四轮:若第三轮扫描失败,则重新扫描,查找第一个A =1, M = 1)的帧用于替换。表示该页最近已被访问且被修改,该页可能再被访问。

目录

第一章 计算机系统概述

1.1 操作系统的基本概念

1.1.1 操作系统的概念

1.1.2 操作系统的特征

 1.2 操作系统的发展与分类

1.3 操作系统的运行环境

1.3.1 操作系统的运行机制

1.3.2 中断与异常的概念

1.3.3 系统调用

1.4 操作系统的体系结构

第一章 练习题

第二章 进程管理

2.1 进程与线程

2.1.1 进程的概念和特征

2.1.2 进程的状态与转换 

2.1.4 进程的组织

2.1.3 进程控制

2.1.5 进程的通信 

2.1.6 线程概念和多线程模型

2.2 处理机调度

2.2.1 调度的概念、层次

2.2.2 调度的时机、切换与过程

2.2.3 进程调度的方式:

2.2.4 调度算法的评价指标

2.2.5 典型的调度算法

2.3 进程同步

2.3.1 进程同步的基本概念

2.3.2 实现临界区互斥的基本方法

2.3.3 信号量

2.3.4 管程

2.3.5 经典同步问题

2.4 死锁

2.4.1 死锁的概念

2.4.2 死锁的处理策略

2.4.3 死锁预防——不允许死锁发生——静态策略

2.4.4 死锁避免——不允许死锁发生——动态策略

2.4.5 死锁检测和解除——允许死锁发生

第二章 练习题

2.2 处理机调度练习题

2.3 进程同步练习题

2.4死锁练习题 

第三章 内存管理

3.1 内存管理概念

3.1.3 覆盖与交换

3.1.3 连续分配管理方式

3.1.4 非连续分配管理方式

3.2 虚拟内存管理 

3.2.1 虚拟内存的基本概念

3.2.2  请求分页管理方式

3.2.3 页面置换算法——决定应该换入哪页、换出哪页

3.2.4 页面分配策略

第三章 练习题

3.2 虚拟内存管理 练习题

第四章 文件管理

4.1 文件系统基础

4.1.1文件的概念

4.1.2 文件的逻辑结构

4.1.3 目录结构

4.1.4 文件共享

4.1.5 文件保护

4.2 文件系统实现

4.2.1 文件系统层次结构

4.2.3 文件实现

4.3 磁盘组织管理

4.3.1 磁盘的结构

4.3.2 磁盘调度算法

4.3.3 磁盘的管理

第四章 练习题

4.1 文件系统基础 练习题

4.2 文件系统实现 练习题

4.3 磁盘组织与管理 练习题

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

5.1 I/O管理概述

 5.1.2 I/O控制方式

​​5.1 I/O管理概述练习题

5.2 核心子系统

5.2.3 高速缓存与缓冲区

5.2.4 设备分配与回收

5.2.5 SPOOLing技术(假脱机技术)

5.2. SPOOLing技术(假脱机技术)练习题

 


——所有题集来源《王道2021年操作系统考研复习指导》,知识点参考《操作系统第六版》《王道2021考研复习指导》。感恩感谢这两本书的所有工作者!!还有推荐王道的咸鱼师哥!讲课逻辑清晰,生动有趣!!!


第一章 计算机系统概述


1.1 操作系统的基本概念


1.1.1 操作系统的概念

操作系统(Operating System,0S) 是指控制和管理整个计算机系统的硬件和软件资源【操作系统是系统资源的管理者】,并合理地组织调度计算机的工作和资源的分配:以提供给用户和其他软件方便的接口和环境【向上层提供方便易用的服务】;它是计算机系统中最基本的系统软件。【是最接近硬件的一层软件】
作为系统资源的管理者,其提供的功能有处理机管理、存储器管理、文件管理、设备管理

向上层提供方便易用的服务采用封装思想:操作系统把些丑陋的硬件功能封装成简单易用的服务,使用户能更方便地使用计算机,用户无需关心底层硬件的原理,只需要对操作系统发出命令即可

联机命令接口实例(Windows系统)——联机命令接口=交互式命令接口

特点:用户说一句,系统跟着做一句

脱机命令接口实例(Windows 系统)——脱机命令接口=批处理命令接口.

特点:用户说一堆,系统跟着做一堆

程序接口:可以在程序中进行系统调用来使用程序接口。普通用户不能直接使用程序接口,只能通过程序代码间接使用。【即系统调用,用户通过程序间接使用】

系统调用类似于函数调用,是应用程序请求操作系统服务的唯一方式


1.1.2 操作系统的特征

并发——共享——虚拟——异步


并发共享两个最基本的特征,二者互为存在条件

并发性指计算机系统中在一段时间内同时存在着多个运行着的程序。
共享性是指系统中的资源可供内存中多个并发执行的进程共同使用。
如果失去并发性,则系统中只有一个程序正在运行,则共享性失去存在的意义
如果失去共享性,则QQ和微信不能同时访问硬盘资源,就无法实现同时发送文件,也就无法并发

并发:同一时间段。并行:同一时刻

操作系统的并发性指计算机系统中“同时”运行着多个程序,这些程序宏观上看是同时运行着的,而微观上看是交替运行的。
操作系统就是伴随着“多道程序技术”而出现的。因此,操作系统和程序并发是一起诞生的。

单核CPU同一时刻只能执行一个程序,各个程序只能并发地执行
多核CPU同一时刻可以同时执行多个程序,多个程序可以并行地执行

共享即资源共享,是指系统中的资源可供内存中多个并发执行的进程共同使用。

互斥共享方式:系统中的某些资源,虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资源【对摄像头设备的共享使用】
同时共享方式:系统中的某些资源,允许一个时间段内由多个进程“同时”对它们进行访问

【对硬盘资源的共享使用】

【所谓的“同时”往往是宏观上的,而在微观上,这些进程可能是交替地对该资源进行访问的(即分时共享)


虚拟:是指把一个物理上的实体变为若干个逻辑上的对应物。物理实体(前者)是实际存在的,而逻辑上对应物(后者)是用户感受到的。
 

空分复用技术(如虚拟存储器技术)

【GTA5需要4GB的运行内存,QQ需要256MB的内存,迅雷需要256MB的内
存,网易云音乐需要256MB的内....而我的电脑: 4GB内存
问题:这些程序同时运行需要的内存远大于4GB,那么为什么它们还可以
在我的电脑上同时运行呢?
答:这是虚拟存储器技术。实际只有4GB的内存,在用户看来似乎远远大.
于4GB】
时分复用技术(如虚拟处理器)

【即使使用单核CPU,为什么我们还可以打开多个应用软件。这是虚拟处理器技术。实际只有一个单核CPU,但是在用户看来似乎有多个CPU在同时为自己服务】

【“时分复用技术”。微观上处理机在各个微小的时间段内交替着为各个进程服务】

【显然,如果失去了并发性,则一个时间段内系统中只需运行一道程序,那么就失去了实现虚拟性的意义了。因此,没有并发性,就谈不上虚拟性


异步:在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底的,而是走走停停,以不可预知的速度向前推进,这就是进程的异步性。

如果失去了并发性,即系统只能串行地运行各个程序,那么每个程序的执行会一贯到底。只有系统拥有并发性,才有可能导致异步性。


1.2 操作系统的发展与分类


  • 手工操作阶段
  • 批处理阶段【单道批处理系统、多道批处理系统(操作系统开始出现)】
  • 分时操作系统
  • 实时操作系统
  • 网络操作系统
  • 分布式操作系统
  • 个人计算机操作系统

手工操作阶段:用户独占全机,人机速度矛盾导致资源利用率极低
批处理阶段【单道批处理阶段】:引入脱机输入/输出技术(用外围机+磁带完成),并用监督程序【操作系统的雏形】负责控制作业的输入输出。

主要优点:缓解了一定程度的人机速度矛盾,资源利用率有所提升。
主要缺点:内存中仅能有一道程序运行,只有该程序运行结束之后才能调入下一道程序。CPU有大量的时间是在空闲等待I/O完成。资源利用率依然很低。

批处理阶段【多道批处理系统】:每次往内存中读入多道程序。操作系统正式诞生,用于支持多道程序并发运行

主要优点:多道程序并发执行,共享计算机资源。资源利用率大幅提升,CPU和其他资源更能保持“忙碌”状态,系统吞吐量增大。
主要缺点:用户响应时间长,没有人机交互功能(用户提交自己的作业之后就只能等待计算机处理完成,中间不能控制自己的作业执行。eg:无法调试程序/无法在程序运行过程中输入一些参数)

分时操作系统:计算机以时间片为单位轮流为各个用户/作业服务,各个用户可通过终端与计算机进行交互。

主要优点:用户请求可以被即时响应,解决了人机交互问题。允许多个用户同时使用一台计算机,并且用户对计算机的操作相互独立,感受不到别人的存在。
主要缺点:不能优先处理一 些紧急任务。操作系统对各个用户/作业都是完全公平的,循环地为每个用户/作业服务一一个时间片, 不区分任务的紧急性。

实时操作系统:
主要优点:能够优先响应一 些紧急任务,某些紧急任务不需时间片排队。
在实时操作系统的控制下,计算机系统接收到外部信号后及时进行处理,并且要在严格的时限内处理完事件。实时操作系统的主要特点是及时性和可靠性

硬实时系统:必须在绝对严格的规定时间内完成处理【例如;导弹控制系统自动驾驶系统】

软实时系统:能接受偶尔违反时间规定【12306火车订票系统】

网络操作系统:是伴随着计算机网络的发展而诞生的,能把网络中各个计算机有机地结合起来,实现数据传送等功能,实现网络中各种资源的共享(如文件共享)和各台计算机之间的通信。( 如: Windows NT就是一种典型的网络操作系统,网站服务器就可以使用)
分布式操作系统:主要特点是分布性和并行性。系统中的各台计算机地位相同,任何工作都可以分布在这些计算机上,由它们并行、协同完成这个任务。
个人计算机操作系统:如Windows XP、MacOS, 方便个人使用。


1.3 操作系统的运行环境


1.3.1 操作系统的运行机制

  • 两种指令【特权指令、非特权指令】
  • 两种处理器状态【核心态、用户态】
  • 两种程序【内核程序.应用程序.】

C语言代码经过编译器翻译后变为二进制的机器指令

  • 【一条高级语言的代码翻译过来可能会对应多条机器指令】
  • 【程序运行的过程其实就是CPU执行一条一条的机器指令的过程】【在CPU设计和生产的时
    候就划分了特权指令和非特权指令,因此CPU执行一条指令前就能判断出其类型】
  • 【指令是CPU能识别执行的最基本命令】

我们普通程序员写的程序就是“应用程序”——应用程序只能使用“非特权指令”,如:加法指令、减法指令普通的运算指令等
微软、苹果有一帮人负责实现操作系统,他们写的就是“内核程序”。——操作系统内核作为“管理者”,有时会让CPU执行一些“特权指令”,如:内存清零指令。这些指令影响重大,只允许“管理者”--即操作系统内核来使用

CPU能判断出指令类型,但是它怎么区分此时正在运行的是内核程序or应用程序?
CPU有两种状态,“内核态” 和“用户态”
处于内核态时,说明此时正在运行的是内核程序,此时可以执行特权指令
处于用户态时,说明此时正在运行的是应用程序,此时只能执行非特权指令
拓展: CPU中有一个寄存器叫程序状态字寄存器(PSW),其中有个二进制位,1表示“内核态”,0表示“用户态”
别名:内核态=核心态=管态;用户态=目态

内核态、用户态的切换
内核态→用户态:执行一条特权指令-- -修改PSW【程序状态寄存器】的标志位为“用户态”,这个动作意味着操作系统将主动让出CPU使用权

【操作系统内核在让出CPU之前,会用一条特又指令把PSW的标志位设置为“用户态”】
用户态>内核态:由“中断”引发,硬件自动完成变态过程,触发中断信号意味着操作系统将强行夺回CPU的使用权

【CPU检测到中断信号后,会立即变为“核心态”,并停止运行当前的应用程序,转而运行处理中断信号的内核程序】

【除了非法使用特权指令之外,还有很多事件会触发中断信号。一个共性是,但凡需要操
作系统介入的地方,都会触发中断信号】

内核是计算机上配置的底层软件,是操作系统最基本最核心的部分

实现操作系统内核功能的哪那些程序就是内核程序

时钟管理、中断处理、原语是与硬件关联较紧密的模块

  • 时钟管理:实现计时功能;
  • 中断处理:负责实现中断机制
  • 原语:是一种特殊的程序、处于操作系统最底层,是最接近硬件的部分、这种程序的运行具有原子性、其运行只能一气呵成,不可中断、运行时间较短、调用频繁
  • 对系统资源进行管理的功能:进程管理、存储器管理、设备管理【有的操作系统不把这部分功能归为“内核功能”。也就是说,不同的操作系统,对内核功能的划分可能并不一样】

1.3.2 中断与异常的概念

中断的作用:“中断”会使CPU由用户态变为内核态,使操作系统重新夺回对CPU的控制权

“中断”是让操作系统内核夺回CPU使用权的唯一途径
如果没有“中断”机制,那么一旦应用程序上CPU运行,CPU就会一直运行这个应用程序
中断的类型:

  • 内中断(也称为异常,例外):与当前执行的指令有关,中断信号来源于CPU内部【试图在用户态下执行特权指令执行除法指令时发现除数为0】【若当前执行的指令是非法的,则会引发一个中断信号】
  1. 陷阱、陷入(trap)【陷入指令= trap指令=访管指令】:由陷入指令引发,是应用程序故意引发的
  2. 故障(fault):由错误条件引起的,可能被内核程序修复。内核程序修复故障后会把CPU使用权还给应用程序,让它继续执行下去。 如:缺页故障。
  3. 终止(abort):由致命错误引起,内核程序无法修复该错误,因此一般不再将CPU使用权还给引发终止的应用程序,而是直接终止该应用程序。如:整数除0、非法使用特权指令
  • 外中断:与当前执行的指令无关,中断信号来源于CPU外部
  1. 时钟中断:由时钟部件发来的中断信号。时钟部件每隔一个时间片(如50ms)会给CPU发送一个时钟中断信号,时钟部件每隔一个时间片(如50ms)会给CPU发送一个时钟中断信号
  2. I/0中断:由输入/输出设备发来的中断信号

不同的中断信号,需要用不同的中断处理程序来处理。当CPU检测到中断信号后,会根据中断信号
的类型去查询“中断向量表”,以此来找到相应的中断处理程序在内存中的存放位置。

检查中断信号

  • 内中断: CPU在执行指令时会检查是否有异常发生
  • 外中断:每个指令周期末尾,CPU都会检查是否有外中断信号需要处理

1.3.3 系统调用

操作系统作为用户和计算机硬件之间的接口,需要向上提供一些简单易用的服务。主要包括命令接
口和程序接口。其中,程序接口由一组系统调用组成

“系统调用”是操作系统提供给应用程序(程序员/编程人员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以通过系统调用来请求获得操作系统内核的服务

  • 普通应用程序:可直接进行系统调用,也可使用库函数。有的库函数涉及系统调用,有的不涉及
  • 编程语言:向上提供库函数。有时会将系统调用封装成库函数,以隐藏系统调用的一些细节,使程序员编程更加方便。
  • 操作系统:向上提供系统调用,使得上层程序能请求内核的服务
  • 裸机:

不涉及系统调用的库函数:如的“取绝对值”的函数
涉及系统调用的库函数:如“创建一个新文件”的函数

应用程序通过系统调用请求操作系统的服务。而系统中的各种共享资源都由操作系统内核统一掌管, 因此凡是与共享资源有关的操作( 如存储分配、I/0操作、 文件管理等),都必须通过系统调用的方式向操作系统内核提出服务请求由操作系统内核代为完成。这样可以保证系统的稳定性和安全性,防止用户进行非法操作。
系统调用(按功能分类)

  • 设备管理:完成设备的请求/释放/启动等功能
  • 文件管理:完成文件的读/写/创建/删除等功能
  • 进程控制:完成进程的创建/撤销/阻塞/唤醒等功能
  • 进程通信:完成进程之间的消息传递/信号传递等功能
  • 内存管理:完成内存的分配/回收等功能

系统调用的过程

传递系统调用参数->执行陷入指令(用户态)->执行相应的内请求核程序处理系统调用(核心态)->返回
应用程序
注意: 1.陷入指令是在用户态执行的,执行陷入指令之后立即引发一个内中断,使CPU进入核心态
2.发出系统调用请求是在用户态,而对系统调用的相应处理核心态下进行
 


1.4 操作系统的体系结构

大内核:将操作系统的主要功能模块都作为系统内核,运行在核心态
优点:高性能
缺点:内核代码庞大,结构混乱,难以维护
微内核:只把最基本的功能保留在内核
优点:内核功能少,结构清晰,方便维护
缺点:需要频繁地在核心态和用户态之间切换,性能低

注意:变态的过程是有成本的,要消耗不少时间,频繁地变态会降低系统性能

第一章 练习题


1、系统调用是由操作系统提供给用户的,它()。

A.直接通过键盘交互方式使用
B.只能通过用户程序间接使用

C.是命令接口中的命令
D.与系统的命令一样

系统调用是操作系统为应用程序使用内核功能所提供的接口。

B


2.操作系统与用户通信接口通常不包括().
A. shell
B.命令解释器
C.广义指令
D.缓存管理指令

广义指令就是系统调用命令,而命令解释器属于命令接口,shell 是命令解析器,它也属于命令接口。系统中的缓存全部由操作系统管理,对用户是透明的,操作系统不提供管理系统缓存的系统调用。
D


3、下列选项中,不属于多道程序设计的基本特征是()。

A.制约性
B.间断性
C.顺序性
D.共享性

引入多道程序设计后,程序的执行就失去了封闭性和顺序性。程序执行因为共享资源及相互协同的原因产生了竞争,相互制约。考虑到竞争的公平性,程序的执行是断续的。顺序性是单道程序设计的基本特征。
C


4、【2013统考真题】计算机开机后,操作系统最终被加载到()。

A. BIOS
B. ROM
C. EPROM
D. RAM
系统开机后,操作系统的程序会被自动加载到内存中的系统区,这段区域是 RAM.
D

随机存取存储器(英语:Random Access Memory,缩写:RAM),也叫主存,是与CPU直接交换数据的内部存储器。它可以随时读写(刷新时除外),而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储介质。RAM工作时可以随时从任何一个指定的地址写入(存入)或读出(取出)信息。它与ROM的最大区别是数据的易失性,即一旦断电所存储的数据将随之丢失。RAM在计算机和数字系统中用来暂时存储程序、数据和中间结果。

只读存储器(Read-Only Memory,ROM)以非破坏性读出方式工作,只能读出无法写入信息。信息一旦写入后就固定下来,即使切断电源,信息也不会丢失,所以又称为固定存储器。


5、在IBM-PC中,操作系统称为(微型计算机操作系统 ).


6、在中断发生后,进入中断处理的程序属于( )。
A.用户程序
B.可能是应用程序,也可能是操作系统程序
C.操作系统程序
D.既不是应用程序,又不是操作系统程序

进入中断处理的程序在核心态执行,是操作系统程序。.
C


7、计算机区分核心态和用户态指令后,从核心态到用户态的转换是由操作系统程序执行后
完成的,而用户态到核心态的转换则是由( ) 完成的。
A.硬件
B.核心态程序
C.用户程序
D.中断处理程序
计算机通过硬件中断机制完成由用户态到核心态的转换。B显然不正确,核心态程序只有在
操作系统进入核心态后才可以执行。D中的中断处理程序一般也在核心态执行,因此无法完成“转
换成核心态”这一任务。若由用户程序将操作系统由用户态转换到核心态,则用户程序中就可使
用核心态指令,这就会威胁到计算机的安全,所以C不正确。
计算机通过硬件完成操作系统由用户态到核心态的转换,这是通过中断机制来实现的。发生
中断事件时(有可能是用户程序发出的系统调用),触发中断,硬件中断机制将计算机状态置为
核心态。

A


8、[2012统考真题]下列选项中,不可能在用户态发生的事件是( )。
A.系统调用
B.外部中断
C.进程切换
D.缺页

本题的关键是对“在用户态发生”(与上题的“执行”区分)的理解。对于A,系统调用是
操作系统提供给用户程序的接口,系统调用发生在用户态,被调用程序在核心态下执行。对于B,
外部中断是用户态到核心态的“门”,也发生在用户态,在核心态完成中断过程。对于C,进程切
换属于系统调用执行过程中的事件,只能发生在核心态;对于D,缺页产生后,在用户态发生缺
页中断,然后进入核心态执行缺页中断服务程序。

C


9. 只能在核心态下运行的指令是( )。
A.读时钟指令
B.置时钟指令
C.取数指令
D.寄存器清零.
若在用户态下执行“置时钟指令”,则一个用户进程可在时间片还未到之前把时钟改回去,
从而导致时间片永远不会用完,进而导致该用户进程一直占用CPU,这显然不合理。
B


10.“访管”指令()使用。
A.仅在用户态下
B.仅在核心态下
C.在规定时间内
D.在调度时间内
“访管”指令仅在用户态下使用,执行“访管”指令将用户态转变为核心态。
A


11. 在操作系统中,只能在核心态下执行的指令是( )。
A.读时钟
B.取数
C.广义指令
D.寄存器清“0”
广义指令即系统调用命令,它必然工作在核心态,所以答案为C.要注意区分“调用”和“执行”,广义指令的调用可能发生在用户态,调用广义指令的那条指令不一定是特权指令,但广义指令存在于核心态中,所以执行一定在核心态。
C


12. [2012 统考真题]中断处理和子程序调用都需要压栈以保护现场,中断处理一定会保存。而子程序调用不需要保存其内容的是( )。
A.程序计数器
B.程序状态字寄存器
C.通用数据寄存器
D.通用地址寄存器

广义指令即系统调用命令,它必然工作在核心态,所以答案为C.要注意区分“调用”和“执行”,广义指令的调用可能发生在用户态,调用广义指令的那条指令不一定是特权指令,但广义指令存在于核心态中,所以执行一定在核心态。
B


13. [2015 统考真题]内部异常(内中断)可分为故障( fault).陷阱( trap)和终止( abort)
三类。下列有关内部异常的叙述中,错误的是( )。
A.内部异常的产生与当前执行指令相关
B.内部异常的检测由CPU内部逻辑实现
C.内部异常的响应发生在指令执行过程中
D.内部异常处理后返回到发生异常的指令继续执行
内中断是指来自CPU和内存内部产生的中断,包括程序运算引起的各种错误,如地址非法、
校验错、页面失效、非法指令、用户程序执行特权指令自行中断(INT) 和除数为零等,以上都
是在指令的执行过程中产生的,因此A正确。这种检测异常的工作肯定是由CPU (包括控制器和
运算器)实现的,因此B正确。内中断不能被屏蔽,一旦出现应立即处理,C正确。对于D,考
虑到特殊情况,如除数为零和自行中断(INT)都会自动跳过中断指令,所以不会返回到发生异
常的指令继续执行,因此错误。
D


14. [2015 统考真题]假定下列指令已装入指令寄存器,则执行时不可能导致CPU从用户态变为内核态(系统态)的是( )。
A. DIV R0, R1. ; (R0)(R1)-→R0
B. INT n;产生软中断
C. NOT R0;寄存器R0的内容取非
D. MOV R0, addr;把地址addr处的内存数据放入寄存器RO

考虑到部分指令可能出现异常(导致中断),从而转到核心态。指令A有除零异常的可能,
指令B为中断指令,指令D有缺页异常的可能,指令C不会发生异常。

C


15、[2015统考真题]处理外部中断时,应该由操作系统保存的是( )。
A.程序计数器(PC)的内容
B.通用寄存器的内容
C.块表(TLB)中的内容
D.Cache中的内容
外部中断处理过程,PC值由中断隐指令自动保存,而通用寄存器内容由操作系统保存。
B


16. [2017统考 真题]执行系统调用的过程包括如下主要操作: 
①返回用户态
②执行陷入(trap) 指令
③传递系统调用参数
④执行相应的服务程序
正确的执行顺序是( )。
A.2)→(3)→(①)→(4)
B.②→④→③-→①
C.③-②-④→①
D.3-4-2-1
执行系统调用的过程如下:正在运行的进程先传递系统调用参数,然后由陷入(trap) 指令负责将用户态转换为内核态,并将返回地址压入堆栈以备后用,接下来CPU执行相应的内核态服务程序,最后返回用户态。所以选项C正确。
C


17. [2018 统考真题]定时器产生时钟中断后,由时钟中断服务程序更新的部分内容是( )。
I.内核中时钟变量的值
II.当前进程占用CPU的时间
II.当前进程在时间片内的剩余执行时间
A.仅I、II
B.仅II、 III
C.仅I III
D. I、II、III
时钟中断的主要工作是处理和时间有关的信息及决定是否执行调度程序。和时间有关的所
有信息包括系统时间、进程的时间片、延时、使用CPU的时间、各种定时器,因此I、II、II
均正确。
D


18、为什么说直到出现中断和通道技术后,多道程序概念才变得有用?
多道程序并发执行是指有的程序正在CPU.上执行,而另一些程序正在I/O设备上进行传
输,即通过CPU操作与外设传输在时间上的重叠必须有中断和通道技术的支持,原因如下:
1)通道是一种控制一台或多台外部设备的硬件机构,它一旦被启动就独立于CPU运行,因
而做到了输入/輸出操作与CPU并行工作。但早期CPU与通道的联络方法是由CPU向通
道发出询问指令来了解通道工作是否完成的。若未完成,则主机就循环询问直到通道工
作结束为止。因此,这种询问方式是无法真正做到CPU与I/O设备并行工作的。.
2)在硬件.上引入了中断技术。所谓中断,就是在输入/输出结束时,或硬件发生某种故障时,
由相应的硬件(即中断机构)向CPU发出信号,这时CPU立即停下工作而转向处理中
断请求,待处理完中断后再继续原来的工作。
因此,通道技术和中断技术结合起来就可实现CPU与I/O设备并行工作,即CPU启动通道
传输数据后便去执行其他程序的计算工作,而通道则进行输入/输出操作;当通道工作结束时,再
通过中断机构向CPU发出中断请求,CPU 则暂停正在执行的操作,对出现的中断进行处理,处
理完后再继续原来的工作。这样,就真正做到了CPU与I/O设备并行工作。此时,多道程序的概
念才变为现实。


第二章 进程管理


2.1 进程与线程


2.1.1 进程的概念和特征


程序:是静态的,就是个存放在磁盘里的可执行文件,就是一系列的指令集合。
进程(Process) :是动态的,是程序的一次执行过程【同一个程序多次执行会对应多个进程】
当进程被创建时,操作系统会为该进程分配一个唯一的、不重复的“身份证号”——PID (Process ID,进程ID)
数据结构PCB ( Process Control Block)中,即进程控制块。操作系统需要对各个并发运行的进程进行管理,但凡管理时所需要的信息,都会被放在PCB中。

PCB是进程存在的唯一标志!

基本的进程描述信息,可以让操作系统区分各个进程【eg:操作系统要记录PID(进程标识符)、进程所属用户ID (UID——用户标识符)】
实现操作系统对资源的管理【记录给进程分配了哪些资源(如:分配了多少内存、正在使用哪些I/o设备、正在使用哪些文件)】
实现操作系统对进程的控制、调度eg:记录进程的运行情况(如:CPU使用时间、磁盘使用情况、网络流量使用情况等)】

以上信息都被保存在PCB中

PCB是给操作系统用的,程序段、数据段是给进程自己用的

  • 一个进程实体(进程映像)由PCB、程序段、数据段组成。
  • 进程是动态的,进程实体(进程映像)是静态的。
  • 进程是进程实体的运行过程,是系统进行资源分配和调度的一个的独立单位

进程的组成

进程的特征

  • 动态性:进程是程序的一次执行过程,是动态地产生、变化和消亡的【动态性是进程的最基本特征】
  • 并发性:内存中有多个进程实体,各进程可并发执行
  • 独立性:进程是能独立运行、独立获得资源、独立接受调度的基本单位
  • 异步性:各进程按各自独立的、不可预知的速度向前推进,操作系统要提供"进程同步机制"来解决异步问题【异步性会导致并发程序执行结果的不确定性】
  • 结构性:每个进程都会配置一个PCB。结构上看,进程由程序段、数据段、PCB组成

进程的组织方式

  • 链接方式:按照进程状态将PCB分为多个队列。操作系统持有指向各个队列的指针
  • 索引方式:根据进程状态的不同,建立几张索引表。操作系统持有指向各个索引表的指针


2.1.2 进程的状态与转换

状态共有六种:运行、就绪、阻塞状态为基本状态

  • 运行状态:如果一个进程此刻正在CPU上运行,那么这个进程处于“运行态”。【单核CPU时,同一个时刻只会有一个进程处于运行态 ,多核CPU情况下,可能有多个进程处于运行态】
  • 就绪状态:当进程创建完成后,便进入“就绪态”,处于就绪态的进程已经具备运行条件,但由于没有空闲CPU,就暂时不能运行【万事俱备,只欠CPU】
  • 阻塞状态(又称等待态):在进程运行的过程中,可能会请求等待某个事件的发生(如等待某种系统资源的分配,或者等待其他进程的响应)。在这个事件发生之前,进程无法继续往下执行,此时操作系统会让这个进程下CPU,并让它进入“阻塞态”。当CPU空闲时,又会选择另一个“就绪态”进程上CPU运行。【如:等待操作系统分配打印机、等待读磁盘操作的结果。CPU是计算机中最昂贵的部件,为了提高CPU的利用率,需要先将其他进程需要的资源分配到位,才能得到CPU的服务】
  • 创建状态:进程正在被创建时,状态是“创建态”,在这个阶段操作系统会为进程分配资源、初始化PCB
  • 终止状态:一个进程可以执行exit系统调用,请求操作系统终止该进程。此时该进程会进入“终止态”,操作系统会让该进程下CPU,并回收内存空间等资源,最后还要回收该进程的PCB。
    当终止进程的工作完成之后,这个进程就彻底消失了。

进程状态的转换

  • 就绪态—>运行态:进程被调度
  • 运行态—>就绪态:时间片到,或CPU被其他高优先级的进程抢占
  • 运行态—>阻塞态:等待系统资源分配,或等待某事件发生(主动行为)
  • 阻塞态—>就绪态:资源分配到位,等待的事件发生(被动行为)
  • 创建态—>就绪态:系统完成创建进程相关的工作
  • 运行态—>终止态:进程运行结束,或运行过程中遇到不可修复的错误


2.1.4 进程的组织

根据阻塞原因,再分为多个阻塞队列。例如:等待磁盘的阻塞队列

 


2.1.3 进程控制

进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销己有进程、实现进程状态转换等功能。

那如何实现进行控制呢?用“原语”实现。进程控制的状态转换过程要一气呵成,否则就有可能导致操作系统中的某些关键数据结构不能统一的情况,会影响操作系统进行别的管理工作。

原语的执行具有原子性,即执行过程只能一气呵成,期间不允许被中断

可以用“关中断指令”和“开中断指令”这两个特权指令实现原子性
中断结束后也不一定会直接回到原进程执行

正常情况:CPU每执行完一条指令都会例行检查是否有中断信号需要处理,如果有,则暂停运行当前这段程序,转而执行相应的中断处理程序。
但当CPU执行了关中断指令之后,就不再例行检查中断信号,直到执行开中断指令之后才会恢复检查。这样,关中断、开中断之间的这些指令序列就是不可被中断的,这就实现了“原子性”。【关开中断指令为内核程序,运行在核心态

无论哪个进程控制原语,要做的无非三类事情:

1.更新PCB中的信息【修改进程状态(state),保存/恢复运行环境】

  • a.所有的进程控制原语一定都会修改进程状态标志
  • b.剥夺当前运行进程的CPU使用权必然需要保存其运行环境
  • c.某进程开始运行前必然要恢复期运行环境

2.将PCB插入合适的队列
3.分配/回收资源

进程控制的相关原语
 

进程创建:

创建原语(操作系统创建一个进程时使用的原语):申请空白PCB、为新进程分配所需资源、初始化PCB、将PCB插入就绪队列

会引起进程创建的事件:

用户登录:分时系统中,用户登录成功,系统会建立为其建立一个新的进程
作业调度:多道批处理系统中,有新的作业放入内存时,会为其建立一个新的进程
提供服务:用户向操作系统提出某些请求时,会新建一个进程处理该请求
应用请求:由用户进程主动请求创建一个子进程
 

进程终止:

撤销原语:

  • 从PCB集合中找到终止进程的PCB
  • 若进程正在运行,立即剥夺CPU,将CPU分配给其他进程
  • 终止其所有子进程【进程间的关系是树形结构】
  • 将该进程拥有的所有资源归还给父进程或操作系统
  • 删除PCB

引起进程终止的事件:

正常结束:进程自己请求终止(exit系统调用)
异常结束:整数除以0、非法使用特权指令,然后被操作系统强行杀掉
外界干预:Ctrl+Alt+delete,用户选择杀掉进程

进程的阻塞和唤醒

阻塞原语唤醒原语必须成对使用

进程的阻塞——阻塞原语【运行态—>阻塞态】

  • 找到要阻塞的进程对应的PCB
  • 保护进程运行现场。将PCB状态信息设置为“阻塞态",暂时停止进程运行
  • 将PCB插入相应事件的等待队列

引起进程阻塞的事件:

  • 需要等待系统分配某种资源
  • 需要等待相互合作的其他进程完成工作

进程的唤醒——唤醒原语【阻塞态->就绪态】

  • 在事件等待队列中找到PCB
  • 将PCB从等待队列移除,设置进程为就绪态
  • 将PCB插入就绪队列,等待被调度

引起进程唤醒的事件:
等待的事件发生【因何事阻塞,就应由何事唤醒】

进程的切换【运行态->就绪态、就绪态->运行态】

切换原语:

  • 运行环境信息【进程上下文(context)】存入PCB【当原来的进程再次投入运行时,可以通过PCB恢复他的运行环境
  • PCB移入相应队列
  • 选择另一个进程执行,并更新其PCB
  • 根据PCB恢复新进程所需的运行环境

引起进程切换的事件:

  • 当前进程时间片到
  • 有更高优先级的进程到达
  • 当前进程主动阻塞
  • 当前进程终止


2.1.5 进程的通信

进程通信:就是指进程之间的信息交换
进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立

为了保证安全,一个进程不能直接访问另一个进程的地址空间。
但是进程之间的信息交换又是必须实现的。为了保证进程间的安全通信,操作系统提供了一些方法。

  • 共享存储【基于数据结构的共享、基于存储区的共享】
  • 消息传递【直接通信方式、间接通信方式】
  • 管道通信

共享存储

管道通信

 1.管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道。
2.各进程要互斥地访问管道。
3.数据以字符流的形式写入管道,当管道写满时,写进程的write()系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取走后,管道变空,此时读进程的read()系统调用将被阻塞
4.如果没写满,就不允许读如果没读空,就不允许写。
5.数据一旦被读出,就从管道中被抛弃,这就意味着读进程最多只能有一个,否则可能会有读错数据的情况。

消息传递

进程间的数据交换以格式化的消息(Message)为单位。进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换。


2.1.6 线程概念和多线程模型

进程是程序的一次执行,传统的进程只能串行地执行一系列程序,但有的进程可能需要“同时”做很多事情,为此,引入了“线程”,来增加并发度。

可以把线程理解为“轻量级进程”。
线程是一个基本的CPU执行单元,也是程序执行流的最小单位。引入线程之后,不仅是进程之间可以并发,进程内的各线程之间也可以并发,进一步提升了系统的并发度.使得一个进程内也可以并发处理各种任务(如QQ视频、文字聊天、传文件)
引入线程后,进程只作为除CPU之外的系统资源的分配单元(如打印机、内存地址空间等都是分配给进程的)。
线程则作为处理机的分配单元。

引入线程机制后,带来的变化:

  • 资源分配、调度:传统进程机制中,进程是资源分配、调度的基本单位——>引入线程后,进程是资源分配的基本单位,线程是调度的基本单位
  • 并发性:传统进程机制中,只能进程间并发——>引入线程后,各线程间也能并发,提升了并发度
  • 系统开销:传统的进程间并发,需要切换进程的运行环境,系统开销很大——>线程间并发,如果是同一进程内的线程切换,则不需要切换进程环境,系统开销小。引入线程后,并发所带来的系统开销减小
     

线程的属性:

  • 线程是处理机调度的单位
  • 多CPU计算机中,各个线程可占用不同的CPU
  • 每个线程都有一个线程ID、 线程控制块(TCB)
  • 线程也有就绪、阻塞、运行三种基本状态
  • 线程几乎不拥有系统资源
  • 同-进程的不同线程间共享进程的资源
  • 由于共享内存地址空间,同-进程中的线程间通信甚至无需系统干预
  • 同一进程中的线程切换,不会引起进程切换
  • 不同进程中的线程切换,会引起进程切换
  • 切换同进程内的线程,系统开销很小
  • 切换进程,系统开销较大

线程的实现方式

线程的实现方式:用户级线程、内核级线程

用户级线程

1.用户级线程由应用程序通过线程库实现,所有的线程管理工作都由应用程序负责(包括线程切换)
2.用户级线程中,线程切换可以在用户态下即可完成,无需操作系统干预。
3.在用户看来,是有多个线程。但是在操作系统内核看来,并意识不到线程的存在“用户级线程”就是“从用户视角看能看到的线程
4.优缺点
优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高
缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行。

内核级线程(由操作系统支持的线程)

1.内核级线程的管理工作操作系统内核完成。
2.线程调度、切换等工作都由内核负责,因此内核级线程的切换必然需要在核心态下才能完成。
3.操作系统会为每个内核级线程建立相应的TCB (Thread Control Block,线程控制块) ,通过TCB对线程进行管理。“内核级线程”就是“从操作系统内核视角看能看到的线程”
4.优缺点
优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。
缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。
 

进程实现的多模型模型【在支持内核级线程的系统中,根据用户级线程和内核级线程的映射关系,可以划分为几种多线程模型

多线程模型:一对一模型、多对一模型、多对多模型

一对一模型:一个用户级线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程。
优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。
缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。

多对一模型:多个用户级线程映射到一个内核级线程。且一个进程只被分配一个内核级线程
优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高
缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行
操作系统只“看得见”内核级线程,因此只有内核级线程才是处理机分配的单位。

多对多模型: n用户及线程映射到m个内核级线程(n >=m)。每个用户进程对应m个内核级线程。
克服了多对一模型并发度不高的缺点(一个阻塞全体阻塞),又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点【集二者之长】。可以这么理解:

  • 用户级线程是“代码逻辑”的载体
  • 内核级线程是“运行机会”的载体
  • 内核级线程才是处理机分配的单位。例如:多核CPU环境下,下边这个进程最多能被分配两个核。
  • 一段“代码逻辑”只有获得了“运行机会”才能被CPU执行
  • 内核级线程中可以运行任意一个有映射关系的用户级线程代码,只有两个内核级线程中正在运行的代码逻辑都阻塞时,这个进程才会阻塞


2.2 处理机调度

2.2.1 调度的概念、层次

当有一堆任务要处理,但由于资源有限,这些事情没法同时处理。这就需要确定某种规则决定处理 这些任务的顺序,这就是“调度”研究的问题。

调度的三个层次——高级调度

高级调度(作业调度)。按一定的原则从外存的作业后备队列中挑选一个作业调入内存,并创建进 程。每个作业只调入一次,调出一次。作业调入时会建立PCB,调出时才撤销PCB。【可以简化理解为:好几个程序需要启动,到底启动哪一个】

低级调度(进程调度/处理机调度)—— 按照某种策略从就绪队列中选取一个进程,将处理机分配 给它。进程调度是操作系统中最基本的一种调度,在一般的操作系统中都必须配置进程调度。 进程调度的频率很高,一般几十毫秒一次。

中级调度(内存调度)——按照某种策略决定将哪个处于挂起状态的进程重新调入内存。 一个进程可能会被多次调出、调入内存,因此中级调度发生的频率要比高级调度更高

暂时调到外存等待的进程状态为挂起状态(挂起态,suspend)

挂起态又可以进一步细分为就绪挂起、阻塞挂起两种状态

【注意“挂起”和“阻塞”的区别,两种 状态都是暂时不能获得CPU的服务,但挂起态是将进程映像调到外存去了,而 阻塞态下进程映像还在内存中。 有的操作系统会把就绪挂起、阻塞挂起 分为两个挂起队列,甚至会根据阻塞原 因不同再把阻塞挂起进程进一步细分为多个对列】


2.2.2 调度的时机、切换与过程

需要进行进程调度与切换的情况:

当前运行的进程主动放弃处理机:

  • 进程正常终止
  • 运行过程中发生异常而终止
  • 进程主动请求阻塞(如 等待I/O)

当前运行的进程被动放弃处理机:

  • 分给进程的时间片用完
  • 有更紧急的事需要处理(如 I/O中断)
  • 有更高优先级的进程进入就绪队列

进程调度的时机:

进程在操作系统内核程序临界区不能进行调度与切换【内核程序临界区一般是用来访问某个内核数据结构的,比如进程的就绪队列(由各就绪进程的PCB组成)】

临界资源:一个时间段内只允许一个进程使用的资源。各进程需要互斥地访问临界资源。

临界区:访问临界资源的那段代码。

内核程序临界区访问的临界资源如果不尽快释放的话,极有可能影响到操作系统内核的其他管理工作。因此在访问内核程序临界区期间不能进行调度与切换

 普通临界区访问的临界资源不会直接影响操作系统内核的管理工作。因此在访问普通临界区时可以进行调度与切换。

2.2.3 进程调度的方式:

非剥夺调度方式,又称非抢占方式。即,只允许进程主动放弃处理机。在运行过程中即便有更紧迫 的任务到达,当前进程依然会继续使用处理机,直到该进程终止或主动要求进入阻塞态。

实现简单,系统开销小但是无法及时处 理紧急任务,适合于早期的批处理系统

剥夺调度方式,又称抢占方式。当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进 程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要紧迫的那个进程

可以优先处理更紧急的进程,也可实现让各 进程按时间片轮流执行的功能(通过时钟中 断)。适合于分时操作系统、实时操作系统

进程的切换与过程:

“狭义的进程调度”与“进程切换”的区别:

  • 狭义的进程调度指的是从就绪队列中选中一个要运行的进程。(这个进程可以是刚刚被暂停执行的进程, 也可能是另一个进程,后一种情况就需要进程切换
  • 进程切换是指一个进程让出处理机,由另一个进程占用处理机的过程。
  • 广义的进程调度包含了选择一个进程和进程切换两个步骤。

进程切换的过程主要完成了:

  • 1. 对原来运行进程各种数据的保存
  • 2. 对新的进程各种数据的恢复 (如:程序计数器、程序状态字、各种数据寄存器等处理机现场信息,这些信息一般保存在进程控制块)

注意:进程切换是有代价的,因此如果过于频繁的进行进程调度、切换,必然会使整个系统的效率降低, 使系统大部分时间都花在了进程切换上,而真正用于执行进程的时间减少。


2.2.4 调度算法的评价指标

  • CPU利用率
  • 系统吞吐量
  • 周转时间【周转时间、平均周转时间】【带权周转时间、平均带权周转时间】
  • 等待时间
  • 响应时间

CPU利用率:指CPU “忙碌”的时间占总时间的比例。

利用率 = 忙碌的时间 / 总时间

系统吞吐量:单位时间内完成作业的数量

系统吞吐量= 总共完成了多少道作业 / 总共花了多少时间

周转时间:是指从作业被提交给系统开始,到作业完成为止的这段时间间隔。

它包括四个部分:作业在外存后备队列上等待作业调度(高级调度)的时间、进程在就绪队列上等 待进程调度(低级调度)的时间、进程在CPU上执行的时间、进程等待I/O操作完成的时间。后三项 在一个作业的整个处理过程中,可能发生多次。

(作业)周转时间 = 作业完成时间 – 作业提交时间

平均周转时间 = 各作业周转时间之和 / 作业数

带权周转时间 = 作业周转时间 / 作业实际运行的时间

                       = (作业完成时间 – 作业提交时间) / 作业实际运行的时间

平均带权周转时间 = 各作业带权周转时间之和 / 作业数

等待时间:指进程/作业处于等待处理机状态时间之和,等待时间越长,用户满意度越低。

  • 等待时间 = 周转时间 - 运行时间
  • 对于进程来说,等待时间就是指进程建立后等待被服务的时间之和,在等待I/O完成的期间其实进 程也是在被服务的,所以不计入等待时间。
  • 对于作业来说,不仅要考虑建立进程后的等待时间,还要加上作业在外存后备队列中等待的时间

响应时间:指从用户提交请求到首次产生响应所用的时间。


2.2.5 典型的调度算法

以下三种: 主要关心对用户的公平性、平均周转时间、平均等待时间等评价系统整体性能的指标,但是不关心“响应时间”,也并不区分任务的紧急程度,因此对于用户来说,交互性很糟糕。因此这三种算法一般适合用于早期的批处理系统

  • 先来先服务(FCFS)
  • 短作业优先(SJF)
  • 高响应比优先 (HRRN)

以下三种:适合用于交互式系统(例如:UNIX使用的就是多级反馈队列调度算法)

  • 时间片轮转调度算法(RR)
  • 优先级调度算法
  • 多级反馈队列调度算法
     

先来先服务(FCFS, First Come First Serve)

  • 算法思想:主要从“公平”角度考虑,(类似于我们生活中排队买东西的例子)
  • 算法规则:按照作业/进程到达的先后顺序进行服务
  • 用于作业/进程调度:用于作业调度时,考虑的是哪个作业先到达后备队列;用于进程调度时,考虑的是哪个进程先到达就绪队列
  • 是否可抢占?:非抢占式的算法
  • 优缺点:优点:公平、算法实现简单 缺点:排在长作业(进程)后面的短作业需要等待很长时 间,带权周转时间很大,对短作业来说用户体验不好。即, FCFS算法对长作业有利,对短作业不利(Eg :排队买奶茶…)
  • 是否会导致饥饿(某进程/作业长时间得不到服务):不会

周转时间 = 完成时间 - 到达时间

带权周转时间 = 周转时间/运行时间

等待时间 = 周转时间 – 运行时间

短作业优先(SJF, Shortest Job First)

  • 算法思想:追求最少的平均等待时间,最少的平均周转时间、最少的平均平均带权周转时间
  • 算法规则:最短的作业/进程优先得到服务(所谓“最短”,是指要求服务时间最短)
  • 用于作业/进程调度:即可用于作业调度,也可用于进程调度。用于进程调度时 称为“短进程优先(SPF, Shortest Process First)算法”:
  • 是否可抢占?:SJF(短作业)和SPF(短进程)是非抢占式的算法。但是也有抢占式的版本——最短剩余时间优先算法(SRTN, Shortest Remaining Time Next)
  • 优缺点:优点:“最短的”平均等待时间、平均周转时间 缺点:不公平。对短作业有利,对长作业不利。可能产生饥饿现象。另外,作业/进程的运行时间是由用户提供的, 并不一定真实,不一定能做到真正的短作业优先
  • 是否会导致饥饿:会。如果源源不断地有短作业/进程到来,可能使长作业/进程长时间得不到服务,产生“饥饿”现象。

最短剩余时间优先算法【抢占式的短作业优先算法】:每当有进程加入就绪队列改变时就需 要调度,如果新到达的进程剩余时间比当前运行的进程剩余时 间更短,则由新进程抢占处理机,当前运行进程重新回到就绪 队列。另外,当一个进程完成时也需要调度。

需要注意的是,当有新进程到达时就绪队列就会改变,就要按照上述规则进行检查。

以下 Pn(m)表示当前 Pn进程剩余时间为 m。各个时刻的情况如下:

  • 0时刻(P1到达) : P1(7)
  • 2时刻(P2到达): P1(5)、 P2(4)
  • 4时刻(P3到达): P1(5)、 P2(2)、 P3(1)
  • 5时刻(P3完成且P4刚好到达):P1(5)、 P2(2)、 P4(4)
  • 7时刻(P2完成):P1(5)、 P4(4)
  • 11时刻(P4完成) :P1(5)

 注意几个小细节:

1. 如果题目中未特别说明,所提到的“短作业/进程优先算法”默认是非抢占式的

2. 很多书上都会说“SJF 调度算法的平均等待时间、平均周转时间最少” 严格来说,这个表述是错误的,不严谨的。之前的例子表明,最短剩余时间优先算法得到的平均等待 时间、平均周转时间还要更少。

应该加上一个条件“在所有进程同时可运行时,采用SJF调度算法的平均等待时间、平均周转时间最少”; 或者说“在所有进程都几乎同时到达时,采用SJF调度算法的平均等待时间、平均周转时间最少”; 如果不加上述前提条件,则应该说“抢占式的短作业/进程优先调度算法(最短剩余时间优先, SRNT算 法)的平均等待时间、平均周转时间最少”

3. 虽然严格来说,SJF的平均等待时间、平均周转时间并不一定最少,但相比于其他算法(如 FCFS), SJF依然可以获得较少的平均等待时间、平均周转时间

4. 如果选择题中遇到“SJF 算法的平均等待时间、平均周转时间最少”的选项,那最好判断其他选项 是不是有很明显的错误,如果没有更合适的选项,那也应该选择该选项

高响应比优先(HRRN, Highest Response Ratio Next)

高响应比优先算法:非抢占式的调度算法,只有当前运行的进程主动放弃CPU时(正常/异常完成,或主动阻塞),才需要进行调度,调度时计算所有就绪进程的响应比,选响应比最高的 进程上处理机。

响应比 = (等待时间 + 要求服务时间) / 要求服务时间

  • 算法思想:要综合考虑作业/进程的等待时间和要求服务的时间
  • 算法规则:在每次调度时先计算各个作 业/进程的响应比,选择响应 比最高的作业/进程为其服务
  • 用于作业/进程调度:即可用于作业调度,也可用于进程调度
  • 是否可抢占?:非抢占式的算法。因此只有当前运行的作业/进程主动放弃 处理机时,才需要调度,才需要计算响应比
  • 优缺点:综合考虑了等待时间和运行时间(要求服务时间) 等待时间相同时,要求服务时间短的优先(SJF 的优点) 要求服务时间相同时,等待时间长的优先(FCFS 的优点) 对于长作业来说,随着等待时间越来越久,其响应比也会 越来越大,从而避免了长作业饥饿的问题
  • 是否会导致饥饿:不会

  •  这几种算法主要关心对用户的公平性、平均周转时间、平均等待时间等评价系统整体性能的指标,但是不关心“响应时间”,也并不区分任务的紧急程度,因此对于用户来说,交互性很糟糕。因此这三种算法一般适合用于早期的批处理系统

时间片轮转调度算法(RR,Round-Robin)

  • 算法思想:公平地、轮流地为各个进程服务,让每个进程在一定时间 间隔内都可以得到响应
  • 算法规则:按照各进程到达就绪队列的顺序,轮流让各个进程执行一 个时间片(如 100ms)。若进程未在一个时间片内执行完, 则剥夺处理机,将进程重新放到就绪队列队尾重新排队。
  • 用于作业/进程调度:用于进程调度(只有作业放入内存建立了相应的进程后, 才能被分配处理机时间片)
  • 是否可抢占?:若进程未能在时间片内运行完,将被强行剥夺处理机使用 权,因此时间片轮转调度算法属于抢占式的算法。由时钟装置发出时钟中断来通知CPU时间片已到
  • 优缺点:优点:公平;响应快,适用于分时操作系统; 缺点:由于高频率的进程切换,因此有一定开销;不区分 任务的紧急程度
  • 是否会导致饥饿:不会

优先级调度算法

  • 算法思想:随着计算机的发展,特别是实时操作系统的出现,越来越 多的应用场景需要根据任务的紧急程度来决定处理顺序
  • 算法规则:调度时选择优先级最高的作业/进程
  • 用于作业/进程调度:既可用于作业调度,也可用于进程调度。甚至,还会用于 在之后会学习的I/O调度中
  • 是否可抢占?:抢占式、非抢占式都有。做题时的区别在于:非抢占式只需在进程主动放弃处理机时进行调度即可,而抢占式还需在就绪队列变化时,检查是否会发生抢占。
  • 优缺点 : 优点 ;用优先级区分紧急程度、重要程度,适用于实时操作系统。可灵活地调整对各种作业/进程的偏好程度。缺点:若源源不断地有高优先级进程到来,则可能导致饥饿
  • 是否会导致饥饿:

根据优先级是否可以动态改变,可将优先级分为静态优先级和动态优先级两种。

  • 静态优先级:创建进程时确定,之后一直不变。
  • 动态优先级:创建进程时有一个初始值,之后会根据情况动态地调整优先级。

通常:

  • 系统进程优先级 高于 用户进程
  • 前台进程优先级 高于 后台进程
  • 操作系统更偏好 I/O型进程(或称 I/O繁忙型进程)
  • I/O设备和CPU可以并行工作。如果优先让I/O繁 忙型进程优先运行的话, 则越有可能让I/O设备尽早地投入工作,则资源利用率、系统吞吐量都会得到提升
  • 与I/O型进程相对的是计算型进程(或称 CPU繁忙型进程)

多级反馈队列调度算法

  • 算法思想:其他调度算法的折中权衡
  • 算法规则:新进程到达时先进入第1级队列,按FCFS原则排队等待被分配时 间片,若用完时间片进程还未结束,则进程进入下一级队列队尾。 如果此时已经是在最下级的队列,则重新放回该队列队尾 。只有第 k 级队列为空时,才会为 k+1 级队头的进程分配时间片
  • 用于作业/进程调度:用于进程调度
  • 是否可抢占?:抢占式的算法。在 k 级队列的进程运行过程中,若更上级的队列 (1~k-1级)中进入了一个新进程,则由于新进程处于优先级更高的 队列中,因此新进程会抢占处理机,原来运行的进程放回 k 级队列 队尾。
  • 优缺点 :对各类型进程相对公平(FCFS的优点);每个新到达的进程都可以 很快就得到响应(RR的优点);短进程只用较少的时间就可完成 (SPF的优点);不必实现估计进程的运行时间(避免用户作假); 可灵活地调整对各类进程的偏好程度,比如CPU密集型进程、I/O密 集型进程(拓展:可以将因I/O而阻塞的进程重新放回原队列,这样 I/O型进程就可以保持较高优先级)
  • 是否会导致饥饿:


2.3 进程同步

2.3.1 进程同步的基本概念

进程具有异步性(各并发执行的进程以各自独立的、不可预知的速度向前推进)的特征。

读进程和写进程并发地运行,由于并发必然导致异步性,因此“写数据”和“读数据”两个操作执 行的先后顺序是不确定的。而实际应用中,又必须按照“写数据——>读数据”的顺序来执行的。

如何解决这种异步问题,就是 “进程同步”所讨论的内容。

同步亦称直接制约关系,它是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某 些位置上协调它们的工作次序而产生的制约关系。进程间的直接制约关系就是源于它们之间的相互 合作

进程的“并发”需要“共享”的支持。各个并发执行的进程不可避免的需要共 享一些系统资源(比如内存,又比如打印机、摄像头这样的I/O设备)

  • 互斥共享方式:系统中的某些资源,虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资源
  • 同时共享方式:系统中的某些资源,允许一个时间段内由多个进程“同时”对它们进行访问

临界资源:一个时间段内只允许一个进程使用的资源。

  • 许多物理设备(比如摄像头、打印机)都属于临界资源。此外还有许多变量、数据、内存缓冲区等

对临界资源的访问,必须互斥地进行。互斥,亦称间接制约关系进程互斥指当一个进程访问某临界资源时,另一个想要访问该临界资源的进程必须等待。当前访问临界资源的进程访问结束,释放该资源之后, 另一个进程才能去访问临界资源。

do {
    entry section ;
    //进入区,负责检查是否可进入临界区,
若可进入,则应设置正在访问临界资源的标志(可理解为“上
锁”),以阻止其他进程同时进入临界区
    
    critical section ;
    //临界区(也可称为临界段):访问临界资源的那段代码
    
    exit section ;
    //退出区:负责解除正在访问临界资源的
标志(可理解为“解锁”)
    
    remainder section ;
    //剩余区:做其他处理
}while (true)

为了实现对临界资源的互斥访问,同时保证系统整体性能,需要遵循以下原则:

  • 1. 空闲让进。临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区;
  • 2. 忙则等待。当已有进程进入临界区时,其他试图进入临界区的进程必须等待;
  • 3. 有限等待。对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿);
  • 4. 让权等待。当进程不能进入临界区时,应立即释放处理机,防止进程忙等待。

2.3.2 实现临界区互斥的基本方法

软件实现方法

  • 单标志法
  • 双标志先检查
  • 双标志后检查
  • Peterson算法

单标志法:算法思想:两个进程在访问完临界区后会把使用临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进程赋予。因此,该算法可以实现“同一时刻最多只允许一个进程访问临界区”

双标志先检查法:算法思想:设置一个布尔型数组flag[],数组中各个元素用来标记各进程想进入临界区的意愿,比如“flag[0]= ture”意味着0号进程P0现在想要进入临界区。每个进程在进入临界区之前先检查当前有没有别的进程想进入临界区,如果没有,则把自身对应的标志 flag[i]设为true,之后开始访问临界区。

双标志后检查法:算法思想:双标志先检查法的改版。前一个算法的问题是先“检查”后“上锁”,但是这两个操作又无法一气呵成,因此导致了两个进程同时进入临界区的问题。因此,人们又想到先“上锁”后“检查”的方法,来避免上述问题。

因此,双标志后检查法虽然解决了“忙则等待”的问题,但是又违背了“空闲让进”和“有限等待” 原则会因各进程都长期无法访问临界资源而产生“饥饿”现象。 两个进程都争着想进入临界区,但是谁也不让谁,最后谁都无法进入临界区

Peterson 算法:算法思想:结合双标志法、单标志法的思想。如果双方都争着想进入临界区,那可以让进程尝试“孔 融让梨”(谦让)。做一个有礼貌的进程。

谁最后说了“客气话”,谁就失去了行动的优先权。

Eg: 过年了,某阿姨给你发压岁钱。

场景一 阿姨:乖,收下阿姨的心意~

你:不用了阿姨,您的心意我领了

阿姨:对阿姨来说你还是个孩子,你就收下吧 

end····

场景二 阿姨:乖,收下阿姨的心意~

你:不用了阿姨,您的心意我领了

阿姨:对阿姨来说你还是个孩子,你就收下吧

你:真的不用了阿姨,我已经成年了

结局…

Peterson 算法用软件方法解决了进 程互斥问题,遵循了空闲让进、忙则等待、有限等待 三个原则,但是 依然未遵循让权等待的原则。 Peterson 算法相较于之前三种软件解决方案来说,是最好的,但依然不够好

硬件实现方法:

  • 中断屏蔽方法
  • TestAndSet (TS指令/TSL指令)
  • Swap指令(xCHG指令)

中断屏蔽方法:利用“开/关中断指令”实现(与原语的实现思想相同,即在某进程开始访问临界区到结束访问为止都不允许被中断,也就不能发生进程切换,因此也不可能发生两个同时访问临界区的情况)

优点:简单、高效

缺点:不适用于多处理机;只适用于操作系统内核进程,不适用于用户进程(因为开/关中断指令只能运行在内核态,这组指令如果能让用户随意使用会很危险)

TestAndSet指令:简称 TS 指令,也有地方称为 TestAndSetLock 指令,或 TSL 指令 TSL 指令是用硬件实现的,执行的过程不允许被中断,只能一气呵成。

  • 相比软件实现方法,TSL 指令把“上锁”和“检查”操作用硬件的方式变成了一气呵成的原子操作。
  • 优点:实现简单,无需像软件实现方法那样严格检查是否会有逻辑漏洞;适用于多处理机环境
  • 缺点:不满足“让权等待”原则,暂时无法进入临界区的进程会占用CPU并循环执行TSL指令,从而导致“忙等”。

Swap指令:有的地方也叫 Exchange 指令,或简称 XCHG 指令。 Swap 指令是用硬件实现的,执行的过程不允许被中断,只能一气呵成。

  • 逻辑上来看 Swap 和 TSL 并无太大区别,都是先记录下此时临界区是否已经被上锁(记录在 old 变量上),再将上锁标记 lock 设置为 true,最后检查 old,如果 old 为 false 则说明之前没有别的进程对临界区上锁,则可跳出循环,进入临界区。
  • 优点:实现简单,无需像软件实现方法那样严格检查是否会有逻辑漏洞;适用于多处理机环境
  • 缺点:不满足“让权等待”原则,暂时无法进入临界区的进程会占用CPU并循环执行TSL指令,从而导致“忙等”


2.3.3 信号量

  • 进程互斥的四种软件实现方式(单标志法、双标志先检查、双标志后检查、Peterson算法)
  • 进程互斥的三种硬件实现方式(中断屏蔽方法、TS/TSL指令、Swap/XCHG指令)
  • 1. 在双标志先检查法中,进入区的“检查”、“上锁” 操作无法一气呵成,从而导致了两 个进程有可能同时进入临界区的问题;
  • 2. 所有的解决方案都无法实现“让权等待”

1965年,荷兰学者Dijkstra提出了一种卓有成效的实现进程互斥、同步的方法——信号量机制
用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的实现了进程互 斥、进程同步。

信号量其实就是一个变量 ,可以用一个信号量来表示系统中某种资源的数量,比如:系统中只有一台打印机,就可以设置一个初值为 1 的信号量。

原语是一种特殊的程序段,其执行只能一气呵成,不可被中断。原语是由关中断/开中断指令实现 的。软件解决方案的主要问题是由“进入区的各种操作无法一气呵成”,因此如果能把进入区、退出区的操作都用“原语”实现,使这些操作能“一气呵成”就能避免问题。

一对原语:wait(S) 原语和 signal(S) 原语,可以把原语理解为我们自己写的函数,函数名分别为 wait 和 signal,括号里的信号量 S 其实就是函数调用时传入的一个参数。

wait、signal 原语常简称为 P、V操作(来自荷兰语 proberen 和 verhogen)。因此,做题的时候常把 wait(S)、signal(S) 两个操作分别写为 P(S)、V(S),这对原语可用于实现系统资源的“申请”和“释放”

信号量类型:

  • 整型信号量
  • 记录型信号量

整型信号量:

用一个整数型的变量作为信号量,用来表示系统中某种资源的数量。

  • 对信号量的操作只有三种, 即 初始化、P操作、V操作
  • “检查”和“上锁”一气呵成, 避免了并发、异步导致的问题
  • 存在的问题:不满足“让权等待” 原则,会发生“忙等”

记录型信号量:

整型信号量的缺陷是存在“忙等”问题,因此人们又提出了“记录型信号量”,即用记录型数据结构表 示的信号量。可以用记录型信号量实现进程互斥、进程同步。

  • 如果剩余资源数不够, 使用block原语使进程从运行态进入阻塞态,并把挂到信号量 S 的等待队列(即阻塞队列)中
  • 释放资源后,若还有别的进程在等待这种资源,则使用 wakeup 原语唤醒等待队列中的 一个进程,该进程从阻塞态变为就绪态
  • S.value 的初值表示系统中某种资源的数目。
  • 对信号量 S 的一次 P 操作意味着进程请求一个单位的该类资源,因此需要执行 S.value--,表示资源数减1,当 S.value < 0 时表示该类资源已分配完毕,因此进程应调用 block 原语进行自我阻塞(当前运行的进程从运行态——>阻塞态),主动放弃处理机,并插入该类资源的等待队列 S.L 中。可见,该机制遵循了“让权等待”原则, 不会出现“忙等”现象。
  • 对信号量 S 的一次 V 操作意味着进程释放一个单位的该类资源,因此需要执行 S.value++,表示资源数加1, 若加1后仍是 S.value <= 0,表示依然有进程在等待该类资源,因此应调用 wakeup 原语唤醒等待队列中的第一个进程(被唤醒进程从阻塞态——>就绪态)。

信号量机制:

  • 实现进程互斥
  • 实现进程同步
  • 实现进程的前驱关系
     
  • 一个信号量对应一种资源
  • 信号量的值 = 这种资源的剩余数量(信号量的值如果小于0,说明此时有进程在等待这种资源)
  • P( S ) —— 申请一个资源S,如果资源不够就阻塞等待
  • V( S ) —— 释放一个资源S,如果有进程在等待该资源,则唤醒一个进程

信号量实现进程互斥

信号量 mutex 表示 “进入临界区的名额”

  • 1. 分析并发进程的关键活动,划定临界区(如:对临界资源打印机的访问就应放在临界区)
  • 2. 设置互斥信号量 mutex,初值为 1
  • 3. 在进入区 P(mutex)——申请资源
  • 4. 在退出区 V(mutex)——释放资源

 注意:对不同的临界资源需要设置 不同的互斥信号量。

P、V操作必须成对出现。缺少 P(mutex) 就不能保证临界资源的互斥访问。缺少 V(mutex) 会导致资源永不被释放,等待进程永不被唤醒。

要会自己定义记录型信号量,但如果题目中没特别说明,可以把信号量的声明简写成这种形式【semaphore mutex=1;//初始化信号量】

信号量机制实现进程同步:

进程同步:要让各并发进程按要求有序地推进。

 

比如,P1、P2 并发执行,由于存在异步性,因此二者交替推进的次序是不确定的。 若 P2 的“代码4”要基于 P1 的“代码1”和“代码2”的运行结果才能执行,那么我 们就必须保证“代码4”一定是在“代码2”之后才会执行。

这就是进程同步问题,让本来异步并发的进程互相配合,有序推进。

用信号量实现进程同步:

  • 1. 分析什么地方需要实现“同步关系”,即必须保证“一前一后”执行的两个操作(或两句代码)
  • 2. 设置同步信号量 S, 初始为 0
  • 3. 在“前操作”之后执行 V(S)
  • 4. 在“后操作”之前执行 P(S)
/*信号量机制实现同步/
semaphore s=0;初始化同步信号量,初始值为0
//理解:信号量S代表“某种资源”,刚开始是没有这种资
源的。P2需要使用这种资源,而又只能由P1产生这种资源

P1(){
代码1;
代码2;
v(S);
代码3;
}

P2(){
P(S);
代码4;
代码5;
代码6;
}
代码2释放了该资源,给代码4
保证了 代码4 一定是在 代码2 之后执行

若先执行到 V(S) 操作,则 S++ 后 S=1。之后当执行到 P(S) 操作 时,由于 S=1,表示有可用资源,会执行 S--,S 的值变回 0, P2 进程不会执行 block 原语,而是继续往下执行代码4。

若先执行到 P(S) 操作,由于 S=0,S-- 后 S=-1,表示此时没有 可用资源,因此P操作中会执行 block 原语,主动请求阻塞。 之后当执行完代码2,继而执行 V(S) 操作, S++,使 S 变回 0, 由于此时有进程在该信号量对应的阻塞队列中,因此会在 V 操作中执行 wakeup 原语,唤醒 P2 进程。这样 P2 就可以继续 执行 代码4 了

信号量机制实现前驱关系:

进程 P1 中有句代码 S1,P2 中有句代码 S2 ,P3中有句代码S3 …… P6 中有句代码 S6。

这些代码要求 按如下前驱图所示的顺序来执行:

其实每一对前驱关系都是一个进程同步问题(需要保证一前一后的操作) 因此,

  • 1. 要为每一对前驱关系各设置一个同步信号量
  • 2. 在“前操作”之后对相应的同步信号量执行 V 操作
  • 3. 在“后操作”之前对相应的同步信号量执行 P 操作

 


2.3.4 管程

管程解决了信号量机制编程麻烦,易出错的问题

1973年,Brinch Hansen 首次在程序设计语言 (Pascal) 中引入了“管程”成分——一种高级同步机制

管程是一种特殊的软件模块,有这些部分组成:

  • 1. 局部于管程的共享数据结构说明;
  • 2. 对该数据结构进行操作的一组过程;【过程就是函数】
  • 3. 对局部于管程的共享数据设置初始值的语句
  • 4. 管程有一个名字。

管程的基本特征:

  • 1. 局部于管程的数据只能被局部于管程的过程所访问;
  • 2. 一个进程只有通过调用管程内的过程才能进入管程访问共享数据;
  • 3. 每次仅允许一个进程在管程内执行某个内部过程。

引入管程的目的无非就是要

用管程解决生产者消费者问题
1. 需要在管程中定义共享数据(如生产者消费者问题的缓冲区)
2. 需要在管程中定义用于访问这些共享数据的“入口”——其实就是一些函数(如生产者消费者 问题中,可以定义一个函数用于将产品放入缓冲区,再定义一个函数用于从缓冲区取出产品)
3. 只有通过这些特定的“入口”才能访问共享数据
4. 管程中有很多“入口”,但是每次只能开放其中一个“入口”,并且只能让一个进程或线程进 入(如生产者消费者问题中,各进程需要互斥地访问共享缓冲区。管程的这种特性即可保证一 个时间段内最多只会有一个进程在访问缓冲区。注意:这种互斥特性是由编译器负责实现的, 程序员不用关心
5. 可在管程中设置条件变量及等待/唤醒操作以解决同步问题。可以让一个进程或线程在条件变量 上等待(此时,该进程应先释放管程的使用权,也就是让出“入口”);可以通过唤醒操作将 等待在条件变量上的进程或线程唤醒。

程序员可以用某种特殊的语法定义一个管程(比如: monitor ProducerConsumer …… end monitor;), 之后其他程序员就可以使用这个管程提供的特定“入口【封装思想】”很方便地使用实现进程同步/互斥了。


2.3.5 经典同步问题

图书馆有100个座位,每位进入图书馆的读者要在登记表上登记,退出时要在登记表上注销
1)当图书馆中没有座位时,后到的读者在图书馆为等待(阻塞)
2)当图书馆中没有座位时,后到的读者不等待,立即回家。

  • 可以进入阅览室的读者可以有很多,这里设为n,即 n个Reader(读者)进程 。
  • 第一步:确定进程关系
  •   同步:当教室内有空座位时,读者才可以登记,并进入阅览室
  •   互斥:同时只能有一个读者在门口处进行登记/注销
  • 第二步:设置信号量
  •   教室内空座位数量,S,初值100
  •   为门口进行登记设置互斥信号量mutex,初值 1,表示当前可用
(1)图书馆无座位,后到的读者在图书馆等待

void reader() {

   while (1){

申请座位

      登记;

      阅读;

      注销;

  释放座位

   } 

}

设信号量S=100mutex=1

void reader() {

   while (1){

    Wait(s);

Wait(mutex);

      登记;

signal(mutex);

      阅读;

Wait(mutex);

      注销;

signal(mutex);

  signal(s);  

   } 

}

(2)当图书馆中没有座位时,后到的读者不等待,立即回家

设整型变量 COUNT=100

表示目前空着的座位数为100;

 信号量MUTEX=1;

Void reader()

{

        wait(MUTEX);

        IF (COUNT==0)  {

                signal(MUTEX);                               

                回家; 

                RETURN;

        }
        COUNT=COUNT-1;

        登记;
        signal(MUTEX);
        阅读;

        wait(MUTEX);

        注销;

        COUNT=COUNT+1;

        signal(MUTEX);
         RETURN;

}

设变量count=0

表示目前阅览室中的没有人占的座位数为0

信号量mutex=1

void reader(){

        wait(MUTEX);

        if (count<100){

                count++; 

                登记;

                signal(MUTEX);

                阅读;

                wait(MUTEX);

                注销

                count--;

                signal(MUTEX);

                }

        else{

                signal(MUTEX);

                回家;

                }

}

一家四人父、母、儿子、女儿围桌而坐,桌上有一个水果盘,当水果盘空时,父亲可以放香蕉或者母亲可以放苹果,但盘中已有水果时,就不能放,父母等待。当盘中有香蕉时,女儿可吃香蕉,否则,女儿等待;当盘中有苹果时,儿子可吃,否则,儿子等待。

制约关系:

1、当水果盘空时,要么父亲可以放香蕉要么母亲可以放苹果。

2、当父亲放了香蕉、女儿才能吃香蕉,必须父亲先。

3、当母亲放了苹果、儿子才能吃苹果,必须母亲先。

设信号量 SE=1(空盘子);     

 void father(){

    while(1){

         wait(SE);

          放香蕉;

      }

}

void daughter(){

    while(1){

        拿香蕉;

        signal(SE);

        吃香蕉;

    }

}

void mother(){

    while(1){

         wait(SE);

          放苹果;

      }

}

void son(){

    while(1){

          拿苹果;

          signal(SE);

          吃苹果;

    }

}

SA=0  (放了苹果的盘子),解决母子进程之间,母先子后;

SB=0  (放了香蕉的盘子)解决父女进程之间,父先女后

void father(){

    while(1){

  wait(SE);

  放香蕉;

  signal(SB);

    }

}

void daughter(){

    while(1){

  wait(SB);

  拿香蕉;

  signal(SE);

  吃香蕉;

    }

}

void mother(){

    while(1){

  wait(SE);

  放苹果;

  signal(SA);

    }

}

void son(){

    while(1){

  wait(SA);

  拿苹果;

  signal(SE);

  吃苹果;

    }

}

 桌上有个只能盛得下一个水果的空盘子。爸爸可向盘中放苹果和桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。

规定:当盘子空时,一次只能放入一个水果供取用。

要求:试用信号量和waitsignal操作实现爸爸、儿子和女儿这三个循环进程之间的同步。

制约关系:

1、当盘子时,爸爸要么往盘子里放苹果要么往盘子里放桔子

2、当爸爸往盘子里放桔子,儿子吃桔子。(同步,爸放桔子在先,儿子吃桔子在后)

3、当爸爸往盘子里放苹果,女儿吃苹果。

当盘子时,爸爸要么往盘子里放苹果要么往盘子里放桔子。

设信号量empty,初值为1,表示盘子是空的。

Void father()

{

While (1)  {  

        WAIT(empty);      

        将水果放入盘中; 

        If (放入的是桔子)  ;  

        Else 放入的是苹果;

        }

}

Void son ()

{

While (1)  {     

        从盘中取出桔子;

        SIGNAL(empty);     

        吃桔子;

        }

}

  

Void daughter()

{

While (1)  { 

   

        从盘中取出苹果;

                           SIGNAL(empty);        

         吃苹果;

        }

}

儿子进程的同步信号量orange,初值为0,表示爸爸尚未把桔子放入盘中。用于解决爸放桔子在先,儿子吃桔子在后。

女儿进程的同步信号量apple,初值为0,表示爸爸尚未把苹果放入盘中。用于解决爸放苹果在先,儿子吃苹果在后。

Void father()

{

While (1)  {  

        WAIT(empty);      

        将水果放入盘中; 

        If (放入的是桔子

               SIGNAL(orange);  

        Else

            SIGNAL(apple);

}

}

Void son ()

{

While (1)  {           WAIT(orange);          从盘中取出桔子;         SIGNAL(empty);  

         吃桔子;

        }

}

  

Void daughter()

{

While (1)  { 

        WAIT(apple);  

        从盘中取出苹 果;                               SIGNAL(empty);  

   吃苹果;

        }

}

有一间酒吧里有3个音乐爱好者队列,第1队的音乐爱好者只有随身听,第2队的音乐爱好者只有音乐磁带,第3队的音乐爱好者只有电池。而要听音乐就必须随身听、音乐磁带和电池这三种物品俱全。酒吧老板一次出售这三种物品中的任意两种。当一名音乐爱好者得到这三种物品并听完一首乐曲后,酒吧老板才能再一次出售这三种物品中的任意两种,于是第2队音乐爱好者得到这三种物品,并开始听乐曲。全部买卖就这样进行下去。试用信号量实现他们的同步关系。

Boss(){

While(1){

提供任意两种物品出售;

IF(提供的是音乐磁带和电池)

Else if (提供的是随身听和电池)

Else(提供的是随身听和音乐磁带)

 }

}

Fan1(){

买音乐磁带和电池;

听乐曲;

}

Fan2(){

买随身听和电池;

听音乐;

}

Fan3(){

买到随身听和音乐磁带;

听乐曲;

}

出售组合一,fan1买;出售组合二,fan2买;出售组合三,fan3买;

semaphore  a=0b=0c=0

fan听完歌曲之后,老板才能出售;

semaphore      s=1

Boss(){

While(1){

waits;

提供任意两种物品出售;

IF(提供的是音乐磁带和电池)

  signala);

Else if (提供的是随身听和电池)

 signalb;

Else(提供的是随身听和音乐磁带)

 signalc;

 }

}

Fan1(){

 waita;

买音乐磁带和电池;

听乐曲;

signals;

}

Fan2(){

waitb;

买随身听和电池;

听音乐;

signals;

}

Fan3(){

waitc;

买到随身听和音乐磁带;

听乐曲;

signals;

}


2.4 死锁

2.4.1 死锁的概念

在并发环境下,各进程因竞 争资源而造成的一种互相等待对方手里的资源,导致各进程都阻塞,都无法向前推进的现象,就是“死锁”。 发生死锁后若无外力干涉, 这些进程都将无法向前推进。

死锁、饥饿、死循环的区别

死锁:各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象。

饥饿:由于长期得不到想要的资源,某进程无法向前推进的现象。比如:在短进程优先(SPF)算法 中,若有源源不断的短进程到来,则长进程将一直得不到处理机,从而发生长进程“饥饿”。

死循环:某进程执行过程中一直跳不出某个循环的现象。有时是因为程序逻辑 bug 导致的,有时是 程序员故意设计的。

死锁 饥饿 死循环的共同与区别
共同点 区别
死锁都是进程无 法顺利向前 推进的现象 (故意设计 的死循环除 外)死锁一定是“循环等待对方手里的资源”导致的,因此如果有死锁现象,那至 少有两个或两个以上的进程同时发生死锁。另外,发生死锁的进程一定处于阻 塞态
饥饿可能只有一个进程发生饥饿。发生饥饿的进程既可能是阻塞态(如长期得不到 需要的I/O设备),也可能是就绪态(长期得不到处理机)
死循环可能只有一个进程发生死循环。死循环的进程可以上处理机运行(可以是运行 态),只不过无法像期待的那样顺利推进。死锁和饥饿问题是由于操作系统分 配资源的策略不合理导致的,而死循环是由代码逻辑的错误导致的。死锁和饥 饿是管理者(操作系统)的问题,死循环是被管理者的问题

死锁产生的必要条件

产生死锁必须同时满足一下四个条件,只要其中任一条件不成立,死锁就不会发生。

死锁产生的必要条件
互斥条件只有对必须互斥使用的资源的争抢才会导致死锁(如哲学家的筷子、打印机设备)。 像内存、扬声器这样可以同时让多个进程使用的资源是不会导致死锁的(因为进程不用阻塞等待 这种资源)。
不剥夺条件进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。
请求和保持条件进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放。
循环等待条件存在一种进程资源的循环等待链,链中的 每一个进程已获得的资源同时被下一个进程所请求。

注意!发生死锁时一定有循环等待,但是发生循环等待时未必死锁(循环等待是死锁的必要不充分条件)

如果同类资源数大于1,则即使有循环等待,也未必发生死锁。但如果系统中每类资源都只有 一个,那循环等待就是死锁的充分必要条件了。

可能会导致死锁:(1)对不可剥夺资源的不合理分配(2)进程推进顺序非法(3)死锁产生的必要条件


2.4.2 死锁的处理策略

死锁处理策略的比较
资源分配策略各种可能模式主要优点主要缺点
死锁预防保守,宁可资源闲置一次请求所有资源,资源剥夺,资源按序分配适用于突发式处理的进程,不必进行剥夺效率低,进程初始化时间延长,剥夺次数过多,不变灵活申请新资源
死锁避免是预防和检测的折中(在运行时判断是否可能发生死锁)寻找可能的安全允许顺序不必进行剥夺必须知道将来的资源需求,进程不能被长时间阻塞
死锁检测宽松,只要允许就分配资源定期检查死锁是否已经发生不延长进程初始化时间,允许对死锁进行现场处理通过剥夺接触死锁,造成损失

死锁的处理策略

预防死锁 破坏死锁产生的四个必要条件中的一个或几个 避免死锁 用某种方法防止系统进入不安全状态,从而避免死锁(银行家算法) 死锁的检测和解除 允许死锁的发生,不过操作系统会负责检测出死锁的发生,然后采取某种措 施解除死锁


2.4.3 死锁预防——不允许死锁发生——静态策略

互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁

破坏互斥条件:

如果把只能互斥使用的资源改造为允许共享使用,则系统不会进入死锁状态。比如: SPOOLing技术。 操作系统可以采用 SPOOLing 技术把独占设备在逻辑上改造成共享设备。比如,用SPOOLing技术将打 印机改造为共享设备。

该策略的缺点:

  • 并不是所有的资源都可以改造成可共享使用的资源。并且为了系统安全,很多地方 还必须保护这种互斥性。因此,很多时候都无法破坏互斥条件

不剥夺条件:进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。

破坏不剥夺条件

方案一:当某个进程请求新的资源得不到满足时,它必须立即释放保持的所有资源,待以后需要时 再重新申请。也就是说,即使某些资源尚未使用完,也需要主动释放,从而破坏了不可剥夺条件。 方案二:当某个进程需要的资源被其他进程所占有的时候,可以由操作系统协助,将想要的资源强 行剥夺。这种方式一般需要考虑各进程的优先级(比如:剥夺调度方式,就是将处理机资源强行剥 夺给优先级更高的进程使用)

该策略的缺点

  • 1. 实现起来比较复杂。
  • 2. 释放已获得的资源可能造成前一阶段工作的失效。因此这种方法一般只适用于易保存和恢复状态 的资源,如CPU。
  • 3. 反复地申请和释放资源会增加系统开销,降低系统吞吐量。
  • 4. 若采用方案一,意味着只要暂时得不到某个资源,之前获得的那些资源就都需要放弃,以后再重 新申请。如果一直发生这样的情况,就会导致进程饥饿。

请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进 程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放。

破坏请求和保持条件

以采用静态分配方法,即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前, 不让它投入运行。一旦投入运行后,这些资源就一直归它所有,该进程就不会再请求别的任何资源 了。

该策略实现起来简单,但也有明显的缺点

  • 有些资源可能只需要用很短的时间,因此如果进程的整个运行期间都一直保持着所有资源,就会造成严重的资源浪费,资源利用率极低。另外,该策略也有可能导致某些进程饥饿。

循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进 程所请求。

采用顺序资源分配法。首先给系统中的资源编号,规定每个进程必须按编号递增的顺序请求资源, 同类资源(即编号相同的资源)一次申请完。

原理分析:一个进程只有已占有小编号的资源时,才有资格申请更大编号的资源。按此规则,已持 有大编号资源的进程不可能逆向地回来申请小编号的资源,从而就不会产生循环等待的现象。

该策略的缺点:

  • 1. 不方便增加新的设备,因为可能需要重新分配所有的编号;
  • 2. 进程实际使用资源的顺序可能和编号递增顺序不一致,会导致资源浪费;
  • 3. 必须按规定次序申请资源,用户编程麻烦

2.4.4 死锁避免——不允许死锁发生——动态策略

所谓安全序列,就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个 安全序列,系统就是安全状态。当然,安全序列可能有多个。

如果分配了资源之后,系统中找不出任何一个安全序列,系统就进入了不安全状态。这就意味着之后 可能所有进程都无法顺利的执行下去。当然,如果有进程提前归还了一些资源,那系统也有可能重新回到安全状态,不过我们在分配资源之前总是要考虑到最坏的情况。

如果系统处于安全状态,就一定不会发生死锁。不安全状态未必就是发生了死锁,但发生死锁时候、一定是在不安全状态。

因此可以在资源分配之前预先判断这次分配是否会导致系统进入不安全状态,以此决定是否答应资源分配请求。这也是“银行家算法”的核心思想。

银行家算法:

银行家算法是荷兰学者 Dijkstra 为银行系统设计的,以确保银行在发放现金贷款时,不会发生不能 满足所有客户需要的情况。后来该算法被用在操作系统中,用于避免死锁。

核心思想:在进程ᨀ出资源申请时,先预判此次分配是否会导致系统进入不安全状态。如果会进 入不安全状态,就暂时不答应这次请求,让该进程先阻塞等待。

数据结构:

  • 长度为 m 的一维数组 Available 表示还有多少可用资源
  • n*m 矩阵 Max 表示各进程对资源的最大需求数
  • n*m 矩阵 Allocation 表示已经给各进程分配了多少资源
  • Max – Allocation = Need 矩阵表示各进程最多还需要多少资源
  • 用长度为 m 的一位数组 Request 表示进程此次申请的各种资源数

银行家算法步骤:

  • ①检查此次申请是否超过了之前声明的最大需求数
  • ②检查此时系统剩余的可用资源是否还能满足这次请求
  • ③试探着分配,更改各数据结构
  • ④用安全性算法检查此次分配是否会导致系统进入不安全状态

安全性算法步骤:

检查当前的剩余可用资源是否能满足某个进程的最大需求,如果可以,就把该进程加入安全序列, 并把该进程持有的资源全部回收。 不断重复上述过程,看最终是否能让所有进程都加入安全序列。

  • 系统处于不安全状态未必死锁,但死锁时一定处于不安全状态。系统处于安全状态一定不会死锁

2.4.5 死锁检测和解除——允许死锁发生

如果系统中既不采取预防死锁的措施,也不采取避免死锁的措施,系统就很可能发生死锁。在这种 情况下,系统应当提供两个算法:

  • ①死锁检测算法:用于检测系统状态,以确定系统中是否发生了死锁。
  • ②死锁解除算法:当认定系统中已经发生了死锁,利用该算法可将系统从死锁状态中解脱出来。

死锁的检测

为了能对系统是否已发生了死锁进行检测,必须:

  • ①用某种数据结构来保存资源的请求和分配信息;
  • ②提供一种算法,利用上述信息来检测系统是否已进入死锁状态。

资源分配图:

两种结点:

  • 进程结点:对应一个进程
  • 资源结点:对应一类资源,一类资源可能有多个

两种边:

  • 进程结点——>资源结点:表示进程想申请几个资源(每条边代表一个)
  • 资源节点——>进程结点︰表示已经为进程分配了几个资源(每条边代表一个)

一般用矩形表示资源结点,矩形中的小圆代表该类资源的数量

如果能消除所有边,就称这个图是可完全简化的。此时一定没有发生死锁(相当于能找到一个安全序列)

如果最终不能消除所有边,那么此时就是发生了死锁

最终还连着边的那些进程就是处于死锁状态的进程。

死锁的解除

一旦检测出死锁的发生,就应该立即解除死锁。
补充:并不是系统中所有的进程都是死锁状态,用死锁检测算法化简资源分配图后,还连着边的那些进程就是死锁进程
解除死锁的主要方法有:

  • 1.资源剥夺法。挂起(暂时放到外存上)某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但是应防止被挂起的进程长时间得不到资源而饥饿。
  • 2.撤销进程法(或称终止进程法)。强制撤销部分、甚至全部死锁进程,并剥夺这些进程的资源。这种方式的优点是实现简单,但所付出的代价可能会很大。因为有些进程可能已经运行了很长时间,已经接近结束了,一旦被终止可谓功亏一篑,以后还得从头再来。
  • 3.进程回退法。让一个或多个死锁进程回退到足以避免死锁的地步。这就要求系统要记录进程的历史信息,设置还原点。

第二章 练习题


3.进程之间交换数据不能通过( )途径进行。
A.共享文件
B.消息传递
C.访问进程地址空间
D.访问共享存储区
每个进程包含独立的地址空间,进程各自的地址空间是私有的,只能执行自己地址空间中的
程序,且只能访问自己地址空间中的数据,相互访问会导致指针的越界错误( 学完内存管理将会
有更好的认识)。因此,进程之间不能直接交换数据,但可利用操作系统提供的共享文件、消息
传递、共享存储区等进行通信。

C


5.下面的叙述中,正确的是()。
A.进程获得处理器运行是通过调度得到的
B.优先级是进程调度的重要依据,一 旦确定不能改动
C.在单处理器系统中,任何时刻都只有一个进程处于运行态
D.进程申请处理器而得不到满足时,其状态变为阻塞态
选项B错在优先级分静态和动态两种,动态优先级是根据运行情况而随时调整的。选项C
错在系统发生死锁时有可能进程全部都处于阻塞态,或无进程任务,CPU空闲。选项D错在进程
申请处理器得不到满足时就处于就绪态,等待处理器的调度。
A


9.一个进程释放了一台打印机,它可能会改变( )的状态。
A.自身进程
B.输入/输出进程
C.另一个等待打印机的进程
D.所有等待打印机的进程
由于打印机独占资源,当一个进程释放打印机后,另-一个等待打印机的进程就可能从阻塞态
转到就绪态。
当然,也存在一个进程执行完毕后由运行态转为结束态时释放打印机的情况,但这并不是由
于释放打印机引起的,相反是因为运行完成才释放了打印机。
C


12. 并发进程失去封闭性,是指( ).
A.多个相对独立的进程以各自的速度向前推进
B.并发进程的执行结果与速度无关
C.并发进程执行时,在不同时刻发生的错误
D.并发进程共享变量,其执行结果与速度有关
程序封闭性是指进程执行的结果只取决于进程本身,不受外界影响。也就是说,进程在执行
过程中不管是不停顿地执行,还是走走停停,进程的执行速度都不会改变它的执行结果。失去封
闭性后,不同速度下的执行结果不同。
D


14.进程在处理器上执行时,
A.进程之间是无关的,具有封闭特性
B.进程之间都有交互性,相互依赖、相互制约,具有并发性
C.具有并发性,即同时执行的特性
D.进程之间可能是无关的,但也可能是有交互性的
A和B都说得太绝对,进程之间有可能具有相关性,也有可能是相互独立的。C错在“同时”。
C


18.下列几种关于进程的叙述,()最不符合操作系统对进程的理解。
A.进程是在多程序环境中的完整程序
B. 进程可以由程序、数据和PCB描述
C.线程(Thread)是一种特殊的进程
D.进程是程序在一个数据集合.上的运行过程,它是系统进行资源分配和调
度的一个独立单元

进程是一个独立的运行单位,也是操作系统进行资源分配和调度的基本单位,它包括PCB、
程序和数据以及执行栈区,仅仅说进程是在多程序环境下的完整程序是不合适的,因为程序是静
态的,它以文件形式存放于计算机硬盘内,而进程是动态的。
A


19. 支持多道程序设计的操作系统在运行过程中,不断地选择新进程运行来实现CPU的共
享,但其中()不是引起操作系统选择新进程的直接原因。
A.运行进程的时间片用完
B.运行进程出错
C.运行进程要等待某一事件发生
D.有新进程进入就绪态

这道题实际上问的是,哪种情况下进程不从运行态转换成其他状态。
D


20.若一个进程实体由PCB、共享正文段、数据堆段和数据栈段组成,请指出下列C语言程
序中的内容及相关数据结构各位于哪一段中。
I.全局赋值变量( B )
II.未赋值的局部变量( D )
mI.函数调用实参传递值(D  ) IV. 用malloc(0要求动态分配的存储区( C )
V.常量值(如1995、 "string") ( B ) VI. 进程的优先级( A )
A. PCB
B.正文段
C.堆段
D.栈段
C语言编写的程序在使用内存时一般分为三个段,它们一-般是正文段(即代码和赋值数据段)、
数据堆段和数据栈段。二进制代码和常量存放在正文段,动态分配的存储区在数据堆段,临时使
用的变量在数据栈段。由此,我们可以确定全局赋值变量在正文段赋值数据段,未赋值的局部变
量和实参传递在栈段,动态内存分配在堆段,常量在正文段,进程的优先级只能在PCB内。
 


22.系 统动态DLL库中的系统线程,被不同的进程所调用,它们是( ) 的线程。
A.不同
B.相同
C.可能不同,也可能相同
D.不能被调用
进程是暂时的,程序是永久的;进程是动态的,程序是静态的;进程至少由代码、数据和PCB
组成,程序仅需代码和数据即可;程序代码经过多次创建可对应不同的进程,而同-个系统的进
程(或线程)可以由系统调用的方法被不同的进程(或线程)多次使用。
B


27.在具有通道设备的单处理器系统中实现并发技术后,( )。
A.各进程在某一时刻并行运行,CPU与I/O设备间并行工作
B.各进程在某一时间段内并行运行,CPU与I/O设备间串行工作
C.各进程在某一时间段内并发运行,CPU与I/O设备间并行工作
D.各进程在某一时刻并发运行,CPU与I/O设备间串行工作
由于是单处理器,在某- -时刻只有一个进程能获得处理器资源,所以是某- -时间段内并发运
行。此外,也正是因为CPU和IO设备的并行运行,才使各进程能并发执行
C


30. [2010统考真题] 下列选项中,导致创建新进程的操作是( )。
I.用户登录成功
II. 设备分配
II.启动程序执行
A.仅I和II
B.仅II和III
C.仅I和III
D. I、II、II

I.用户登录成功后,系统要为此创建一个用户管理的进程,包括用户桌面、环境等。所有用
户进程都会在该进程下创建和管理。II.设备分配是通过在系统中设置相应的数据结构实现的,
不需要创建进程,这是操作系统中I/O核心子系统的内容。H.启动程序执行是引起创建进程的
典型事件。
C


31.下面的叙述中,正确的是( ) 。
A.引入线程后,处理器只能在线程间切换
B.引入线程后,处理器仍在进程间切换
C.线程的切换,不会引起进程的切换
D.线程的切换,可能引起进程的切换

在同-进程中,线程的切换不会引起进程的切换。当从一个进程中的线程切换到另-一个进程
中的线程时,才会引起进程的切换,因此A、B、C错误。
D


33.下面的叙述中,正确的是()。
A.同一进程内的线程可并发执行,不同进程的线程只能串行执行
B.同一-进程内的线程只能串行执行,不同进程的线程可并发执行
C.同一进程或不同进程内的线程都只能串行执行
D.同一进程或不同进程内的线程都可以并发执行
在无线程的系统中,进程是资源调度和并发执行的基本单位。在引入线程的系统中,进程退
化为资源分配的基本单位,而线程代替了进程被操作系统调度,因而线程可以并发执行。
D


35.在以下描述中,()并不是多线程系统的特长。
A.利用线程并行地执行矩阵乘法运算
B.Web服务器利用线程响应HTTP请求
C.键盘驱动程序为每个正在运行的应用配备--个线程,用以响应该应用的键盘输入
D.基于GUI的调试程序用不同的线程分别处理用户输入、计算和跟踪等操作
整个系统只有一个键盘,而且键盘输入是人的操作,速度比较慢,完全可以使用-一个线程来
处理整个系统的键盘输入。
C


39.两个合作进程( Cooperating Processes)无法利用( ) 交换数据。
A.文件系统
B.共享内存
C.高级语言程序设计中的全局变量
D.消息传递系统
不同的进程拥有不同的代码段和数据段,全局变量是对同一进程而言的,在不同的进程中是
不同的变量,没有任何联系,所以不能用于交换数据。此题也可用排除法做,A、B、D均是课本
.上所讲的。管道是一-种文件。
C


41.()必会引起进程切换。
A.一个进程创建后,进入就绪态
B.一个进程从运行态变为就绪态
C.一个进程从阻塞态变为就绪态
D.以上答案都不对
进程切换是指CPU调度不同的进程执行,当一个进程从运行态变为就绪态时,CPU 调度另
一个进程执行,引起进程切换。
B


43. [2010 统考真题]下列选项中,降低进程优先级的合理时机是( ) 。
A.进程时间片用完
B.进程刚完成I/O操作,进入就绪队列
C.进程长期处于就绪队列.
D.进程从就绪态转为运行态
A中进程时间片用完,可降低其优先级以让其他进程被调度进入执行状态。B中进程刚完成
I/O,进入就绪队列等待被处理机调度,为了让其尽快处理I/O 结果,因此应提高优先级。C中进
程长期处于就绪队列,为不至于产生饥饿现象,也应适当提高优先级。D中进程的优先级不应该
在此时降低,而应在时间片用完后再降低。
A


49. [2014 统考真题]下列关于管道(Pipe)通信的叙述中,正确的是( )。
A.一个管道可实现双向数据传输
B.管道的容量仅受磁盘容量大小限制
C.进程对管道进行读操作和写操作都可能被阻塞
D.一个管道只能有一个读进程或一个写进程对其操作
管道实际上是一种固定大小的缓冲区,管道对于管道两端的进程而言,就是-一个文件,但它
不是普通的文件,它不属于某种文件系统,而是自立门户、单独构成的一种文件系统, 并且只存
在于内存中。它类似于通信中半双工信道的进程通信机制,- 一个管道可以实现双向的数据传输,
而同一时刻只能最多有一个方向的传输,不能两个方向同时进行。管道的容量大小通常为内存上
的一页,它的大小并不受磁盘容量大小的限制。当管道满时,进程在写管道会被阻塞,而当管道
空时,进程在读管道会被阻塞,因此选C。
C


51. [2018 统考真题]下列选项中,可能导致当前进程P阻塞的事件是( )。
I. 进程P申请临界资源
II. 进程P从磁盘读数据
II.系统将CPU分配给高优先权的进程
A.仅I
B.仅II
C.仅I、II
D. I. I、III
进程等待某资源为可用(不包括处理机)或等待输入/输出完成均会进入阻塞态,因此I、II
正确; II中情况发生时,进程进入就绪态,因此II错误,答案选C
C


53. [2019 统考真题]下列关于线程的描述中,错误的是( )。
A.内核级线程的调度由操作系统完成
B.操作系统为每个用户级线程建立一个线程控制块
C.用户级线程间的切换比内核级线程间的切换效率高
D.用户级线程可以在不支持内核级线程的操作系统上实现
应用程序没有进行线程管理的代码,只有-一个到内核级线程的编程接口,内核为进程及其
内部的每个线程维护上下文信息,调度也是在内核中由操作系统完成的,A正确。在多线程模
型中,用户级线程和内核级线程的连接方式分为多对一、- -对一、多对多,“ 操作系统为每个
用户线程建立一个线程控制块”属于一对一模型,B错误。用户级线程的切换可以在用户空间
完成,内核级线程的切换需要操作系统帮助进行调度,因此用户级线程的切换效率更高,C正
确。用户级线程的管理工作可以只在用户空间中进行,因此可以在不支持内核级线程的操作系
统_上实现,D正确。
B


1.进程和程序之间可以形成一对一、一对多、多对一、多对多的关系,请分别举例说明在.
什么情况下会形成这样的关系。

进程的定义说明了两点:
1)进程与程序相关,进程包含了程序。程序是进程的核心内容,没有程序就没有进程。
2)进程不仅仅是程序,还包含程序在执行过程中使用的全部资源。没有资源,程序就无法
执行,因此进程是程序执行的载体。
运行一个程序时,操作系统首先要创建一个进程, 为进程分配内存等资源,然后加入进程队
列中执行。对单个进程在某个时刻而言,一个进程只能执行一个程序,进程与程序之间是一对一
的关系。但对整个系统中的进程集合及进程的生命周期而言,进程与程序之间可以形成一对一、
多对一、-对多、多对多的关系。

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


2.父 进程创建子进程和主程序调用子程序有何不同?

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


3.为什么进程之间的通信必须借助于操作系统内核功能?简单说明进程通信的几种主要方式。

每个进程有自己独立的地址空间。在操作系统和硬件的地址保护机制下,进程无法访问其他
进程的地址空间,所以必须借助于操作系统的系统调用函数实现进程之间的通信。进程通信的主
要方式有:
1)共享内存区。通过系统调用创建共享内存区。多个进程可以(通过系统调用)连接同一
个共享内存区,通过访问共享内存区实现进程之间的数据交换。使用共享内存区时需要
利用信号量解决同步互斥问题。
2)消息传递。通过发送/接收消息,系统调用实现进程之间的通信。当进程发送消息时,系
统将消息从用户缓冲区复制到内核中的消息缓冲区,然后将消息缓冲区挂入消息队列。
进程发送的消息保持在消息队列中,直到被另一进程接收。当进程接收消息时,系统从
消息队列中解挂消息缓冲区,将消息从内核的消息缓冲区中复制到用户缓冲区,然后释
放消息缓冲区。.
3)管道系统。管道是先进先出(FIFO) 的信息流,允许多个进程向管道写入数据,允许多
个进程从管道读出数据。在读/写过程中,操作系统保证数据的写入顺序和读出顺序是一
致的。进程通过读/写管道文件或管道设备实现彼此之间的通信。
4)共享文件。利用操作系统提供的文件共享功能实现进程之间的通信。这时,也需要信号
量来解决文件共享操作中的同步和互斥问题。


4.什么是多线程?多线程与多任务有什么区别?

多线程是指在一个程序中可以定义多个线程并同时运行它们,每个线程可以执行不同的任务。
多线程与多任务的区别:多任务是针对操作系统而言的,代表操作系统可以同时执行的程序
个数;多线程是针对一个程序而言的,代表-一个程序可以同时执行的线程个数,而每个线程可以
完成不同的任务。


5. 回答下列问题:
1)若系统中没有运行进程,是否一定没有就绪进程?为什么?
2)若系统中既没有运行进程,又没有就绪进程,系统中是否就没有进程?为什么?
3)在采用优先级进程调度时,运行进程是否一-定是系统中优先级最高的进程? 

1)是。若系统中未运行进程,则系统很快会选择-一个就绪进程运行。只有就绪队列中无进
程时,CPU才可能处于空闲状态。
2)不一定。因为系统中的所有进程可能都处于等待态,可能处于死锁状态,也有可能因为
等待的事件未发生而进入循环等待态。
3)不一定。因为高优先级的进程有可能正处在等待队列中,进程调度会从就绪队列中选择
一个进程占用CPU,这个被选中的进程可能优先级较低。


6.现代操作系统一般都提供多进程(或称多任务)运行环境,回答以下问题:
1)为支持多进程的并发执行,系统必须建立哪些关于进程的数据结构?
2)为支持进程状态的变迁,系统至少应提供哪些进程控制原语?
3)执行每个进程控制原语时,进程状态发生什么变化?相应的数据结构发生什么变化?
1)为支持多进程的并发执行,系统为每个进程建立了一一个数据结构:进程控制块(PCB),

用于进程的管理和控制。PCB中记录了有关进程的一些描述信息和控制信息,包括进程
标识符、进程当前的状态、优先级、进程放弃CPU时的现场信息,以及指示组成进程的
程序和数据在存储器中存放位置的信息、资源使用信息、进程各种队列的连接指针和反
映进程之间的隶属关系的信息等。
2)在进程的整个生命周期中,会经历多种状态。进程控制的主要职能是对系统中所有进程
实施有效的管理,它具有创建新进程、撤销已有进程、实现进程的状态转换等功能。在
操作系统内核中,有一组程序专门用于完成对进程的控制,这些原语至少需要包括创建
新进程原语、阻塞进程原语、唤醒进程原语、终止进程原语等操作。系统服务对用户开
放,即用户可以通过相应的接口来使用它们。
3)进程创建原语:从PCB集合中申请- -个空白的PCB,将调用者参数(如进程外部标识符、
初始CPU状态、进程优先数、初始内存及申请资源清单等)添入该PCB,设置记账数据。
置新进程为“就绪”态。
终止进程原语:用于终止完成的进程,回收其所占资源。包括消去其资源描述块,消去
进程的PCB。
阻塞原语:将进程从运行态变为阻塞态。进程被插入等待事件的队列,同时修改PCB中.
相应的表项,如进程状态和等待队列指针等。
唤醒原语:将进程从阻塞态变为就绪态。进程从阻塞队列中移出,插入就绪队列,等待
调度,同时修改PCB中相应的表项,如进程状态等。
 


2.2 处理机调度练习题


3. ( )有利于CPU繁忙型的作业,而不利于I/O繁忙型的作业。
A.时间片轮转调度算法.
B.先来先服务调度算法
C.短作业(进程)优先算法
D.优先权调度算法
先来先服务(FCFS) 调度算法是一种最简单的调度算法,在作业调度中采用该算法时,每次调度从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。
FCFS调度算法比较有利于长作业,而不利于短作业。所谓CPU繁忙型的作业,是指该类作
业需要大量的CPU时间进行计算,而很少请求I/O操作。I/O 繁忙型的作业是指CPU处理时,需
频繁地请求I/O操作。所以CPU繁忙型作业更接近于长作业。答案选择B选项。
 


8.现在有三个同时到达的作业JI,J和J3,它们的执行时间分别是T,T2,T3,且T1<T2<T3。系统按单道方式运行且采用短作业优先调度算法,则平均周转时
间是()。
A. T1+T2+ T3
B. (3T1+ 2T2+ T3)/3
C. (T1+ T2+ T3)/3 
D. (T1+ 2T2 + 3T3)/3
系统采用短作业优先调度算法,作业的执行顺序为J, J2, J3,JI 的周转时间为T,J2 的周转时间
为T1+ T, J3的周转时间为T1+T2+ T3;,则平均周转时间为(T1+T1+T2+T1+72+ T3)3=(3T1+2T2+ T3)/3。


10. [2013 统考真题]某系统正在执行三个进程PI, P2和P3,各进程的计算(CPU)时间和I/O时间比例如下表所示。

 为提高系统资源利用率,合理的进程优先级设置应为( ) 。
A. P1>P2> P3
B. P3> P2> P1
C. P2>P1= P3
D. P1> P2= P3

为了合理地设置进程优先级,应综合考虑进程的CPU时间和I/O时间。对于优先级调度算法,
一般来说,IO型作业的优先权高于计算型作业的优先权,这是由于I/O操作需要及时完成,它没
有办法长时间地保存所要输入/输出的数据,所以考虑到系统资源利用率,要选择I/O繁忙型作业
有更高的优先级。


12. 一个作业8:00到达系统,估计运行时间为1h。若10:00开始执行该作业,其响应比是()。
A.2
B.1
C.3
D.0.5


 14. 下列调度算法中,( )调度算法是绝对可抢占的。
A.先来先服务
B.时间片轮转
C.优先级
D.短进程优先
时间片轮转算法是按固定的时间配额来运行的,时间一到,不管是否完成,当前的进程必须
撤下,调度新的进程,因此它是由时间配额决定的、是绝对可抢占的。而优先级算法和短进程优
先算法都可分为抢占式和不可抢占式。
B


18.有以下的进程需要调度执行(见下表) :
1)若用非抢占式短进程优先调度算法,问这5个进程的平均周转时间是多少?
2)若采用抢占式短进程优先调度算法,问这5个
进程的平均周转时间是多少?
A.8.62; 6.34
B.8.62; 6.8
C.10.62; 6.34
D.10.62; 6.8

 

在0时刻,进程P1到达,于是处理器分配给P,由于是不可抢占的,所以P1一旦获得处理器,就会运行直到结束;在9时刻,所有进程已经到达,根据短进程优先调度,会把处理器分配给P3,接下来就是Ps;然后,由于P2, P4的预计运行时间一样, 所以在P2和P4之间用先来先服务调度,优先把处理器分配给P2,最后再分配给P4,完成任务。
周转时间=完成时间-作业到达时间,从图中显然可以得到各进程的完成时间,于是P1的周转时间是9- 0=9; P2 的周转时间是16- 0.4=15.6; P3 的周转时间是10- 1=9; P4 的周转时间是20-5.5= 14.5;Ps的周转时间是12- 7- 5;平均周转时间为(9+ 15.6+9+ 14.5+ 5)/5= 10.62。
同理,抢占式的周转时间也可通过画甘特图求得,而且直观、不易出错。抢占式的平均周转时间为6.8。
 


 19. 有5个批处理作业A, B,C,D,E几乎同时到达,其预计运行时间分别为10,6,2,4,8,其优先级(由外部设定)分别为3,5,2, 1,4,这里5为最高优先级。以下各种调度算法中,平均周转时间为14的是( ) 调度算法。
A.时间片轮转(时间片为1)
B.优先级调度
C.先来先服务(按照顺序10,6,2,4,8)
D.短作业优先
这5个批处理作业采用短作业优先调度算法时,平均周转时间=[2+(2+4)+(2+4+6)+(2+ 4+6+8)+(2+4+6+8+ 10)]/5= 14。
D


20.[2017统考真题]假设4个作业到达系统的时刻和运行时间如下表所示。

 系统在t = 2时开始作业调度。若分别采用先来先服务和短作业优先调度算法,则选中
的作业分别是( ) 。
A. J2,J3
B. JI,J4
C. J2,J4
D. J1,J3 

先来先服务调度算法是作业来得越早,优先级越高,因此会选择J1。短作业优先调度算法是
作业运行时间越短,优先级越高,因此会选择J3。所以选项D正确。


22. [2016 统考真题]某单CPU系统中有输入和输出设备各1台,现有3个并发执行的作业,每个作业的输入、计算和输出时间均分别为2ms,3ms和4ms,且都按输入、计算和输出的顺序执行,则执行完3个作业需要的时间最少是()。
A.15ms .
B.17ms
C.22ms
D.27ms


 24.分时操作系统通常采用( )调度算法来为用户服务。
A.时间片轮转
B.先来先服务
C.短作业优先
D.优先级
分时系统需要同时满足多个用户的需要,因此把处理器时间轮流分配给多个用户作业使用,
即采用时间片轮转调度算法。


26.假设系统中所有进程同时到达,则使进程平均周转时间最短的是( )调度算法。
A.先来先服务
B.短进程优先
C.时间片轮转
D.优先级
短进程优先调度算法具有最短的平均周转时间。平均周转时间=各进程周转时间之和/进程
数。因为每个进程的执行时间都是固定的,所以变化的是等待时间,只有短进程优先算法能最小
化等待时间。


 31. [2018 统考真题]某系统采用基于优先权的非抢占式进程调度策略,完成一次进程调度
和进程切换的系统时间开销为1μs。在T时刻就绪队列中有3个进程P1、P2和P3,其在
就绪队列中的等待时间、需要的CPU时间和优先权如下表所示。

 若优先权值大的进程优先获得CPU,从T时刻起系统开始进程调度,则系统的平均周转
时间为()。
A.54us
B.73μs
C.74μs
D.75μs 

由优先权可知,进程的执行顺序为P2-→P3→P1。P2 的周转时间为1 + 15+ 24= 40μs; P3 的周
转时间为18+ 1+24+1 + 36= 80us; P1的周转时间为30+1 +24+1+36+1+ 12= 105μs;平均
周转时间为(40 + 80 + 105)/3 = 225/3 = 75μs,因此选D.
D


32. [2019 统考真题]系统采用二级反馈队列调度算法进行进程调度。就绪队列Q1采用时间片轮转调度算法,时间片为10ms;就绪队列Q2采用短进程优先调度算法;系统优先调度Q1队列中的进程,当Q1 为空时系统才会调度Q2中的进程;新创建的进程首先进入Q; Q1中的进程执行一个时间片后,若未结束,则转入Q2。若当前Q1, Q2为空,系统依次创建进程P1,P2后即开始进程调度,P1, P2需要的CPU时间分别为30ms和20ms,则进程P1,P2在系统中的平均等待时间为( ) 。
A.25ms 
B.20ms
C.15ms 
D.10ms
进程PI,P2 依次创建后进入队列Q1,根据时间片调度算法的规则,进程PI,P2 将依次被分
配10ms的CPU时间,两个进程分别执行完-一个时间片后都会被转入队列Q2,就绪队列Q2采用
短进程优先调度算法,此时P1还需要20ms的CPU时间,P2还需要10ms的CPU时间,所以P2
会被优先调度执行,10ms 后进程P2执行完成,之后PI再调度执行,再过20ms后PI也执行完成。
运行图表述如下。

进程P1,P2的等待时间分别为图中的虚横线部分,平均等待时间=(P1等待时间+P2等待时
间)/2=(20 + 10)/2= 15,因此答案选C


2.3 进程同步练习题

进程互斥的四种软件实现方式(单标志法、双标志先检查、双标志后检查、Peterson算法)
进程互斥的三种硬件实现方式(中断屏蔽方法、TS/TSL指令、Swap/XCHG指令)
1.在双标志先检查法中,进入区的“检查”、“上锁”操作无法一气呵成,从而导致了两个进程有可能同时进入临界区的问题:
2.所有的解决方案都无法实现“让权等待”
 

 2. 不需要信号量就能实现的功能是( )。
A.进程同步
B.进程互斥
C.执行的前驱关系
D.进程的并发执行

在多道程序技术中,信号量机制是一-种有效实现进程同步和互斥的工具。进程执行的前趋关
系实质上是指进程的同步关系。除此之外,只有进程的并发执行不需要信号量来控制,因此正确
答案为D。


 3.若一个信号量的初值为3,经过多次PV操作后当前值为-1,这表示等待进入临界区的进
程数是()。
A.1
B.2
C.3
D. 4

信号量是一个特殊的整型变量,只有初始化和PV操作才能改变其值。通常,信号量分为互
斥量和资源量,互斥量的初值一般为1, 表示临界区只允许-一个进程进入,从而实现互斥。当互.
斥量等于0时,表示临界区已有- -个进程进入,临界区外尚无进程等待;当互斥量小于0时,表
示临界区中有一个进程,互斥量的绝对值表示在临界区外等待进入的进程数。同理,资源信号量
的初值可以是任意整数,表示可用的资源数,当资源量小于0时,表示所有资源已全部用完,而
且还有进程正在等待使用该资源,等待的进程数就是资源量的绝对值。

A


4. [2010 统考真题]设与某资源关联的信号量初值为3,当前值为1。若M表示该资源的可用个数,N表示等待该资源的进程数,则M,N分别是( ) 。
A.0,1
B. 1,0
C. 1,2
D.2,0
B


9.以下()不属于临界资源。
A.打印机
B.非共享数据
C.共享变量
D.共享缓冲区
临界资源是互斥共享资源,非共享数据不属于临界资源。打印机、共享变量和共享缓冲区都
只允许一次供-一个进程使用。
B


10. 以下( )属于临界资源。
A.磁盘存储介质
B.公用队列
C.私用数据
D.可重入的程序代码

临界资源与共享资源的区别在于,在-段时间内能否允许被多个进程访问(并发使用),显然磁盘属于共享设备。公用队列可供多个进程使用,但一次只可供-一个进程使用,试想若多个进程同时使用公用队列,势必造成队列中的数据混乱而无法使用。私用数据仅供一个进程使用, 不存在临界区问题,可重入的程序代码一次可供多个进程使用。.

B


12. 进程A和进程B通过共享缓冲区协作完成数据处理,进程A负责产生数据并放入缓冲区,进程B从缓冲区读数据并输出。进程A和进程B之间的制约关系是()。
A.互斥关系
B.同步关系
C.互斥和同步关系
D.无制约关系
并发进程因为共享资源而产生相互之间的制约关系,可以分为两类:①互斥关系,指进程之间因相互竞争使用独占型资源(互斥资源)所产生的制约关系;②同步关系,指进程之间为协同工作需要交换信息、相互等待而产生的制约关系。本题中两个进程之间的制约关系是同步关系,进程B必须在进程A将数据放入缓冲区后才能从缓冲区中读出数据。此外,共享的缓冲区一定是互斥访问的,所以它们也具有互斥关系。
C


13.在操作系统中,P,V 操作是一种( )。
A.机器指令
B.系统调用命令
C.作业控制命令
D.低级进程通信原语

P、V操作是一-种低级的进程通信原语,它是不能被中断的。
D


14.P操作可能导致()。
A.进程就绪
B.进程结束
C.进程阻塞
D.新进程创建
P操作即wait操作,表示等待某种资源直到可用。若这种资源暂时不可用,则进程进入阻塞态。注意,执行P操作时的进程处于运行态。
C


16.()定义了共享数据结构和各种进程在该数据结构上的全部操作。
A.管程
B.类程
C.线程
D.程序
管程定义了一个数据结构和能为并发进程所执行(在该数据结构上)的一组操作,这组操作能同步进程并改变管程中的数据。
A


21.一个进程映像由程序、数据及PCB组成,其中( )必须用可重入编码编写。
A. PCB
B.程序
C.数据
D.共享程序段

共享程序段可能同时被多个进程使用,所以必须可重入编码,否则无法实现共享的功能。
D


22.用来实现进程同步与互斥的PV操作实际上是由( ) 过程组成的。
A.一个可被中断的
B.-个不可被中断的
C.两个可被中断的
D.两个不可被中断的
P操作和V操作都属于原语操作,不可被中断。
D


26.一个进程因在互斥信号量mutex.上执行V(mutex)操作而导致唤醒另一个进程时,执行V操作后mutex的值为()。
A.大于0
B.小于0
C.大于等于0
D.小于等于0

由题意可知,系统原来存在等待进入临界区的进程, mutex小于等于-1,因此在执行V(mutex)
操作后,mutex 的值小于等于0。
D


27.若一个系统中共有5个并发进程涉及某个相同的变量A,则变量A的相关临界区是由( ) 
个临界区构成的。
A.1
B. 3
C.5
D.6
这里的临界区是指访问临界资源A的那段代码(临界区的定义)。那么5个并发进程共有5个操作共享变量A的代码段。
C


28.下述()选项不是官程的组成部分。
A.局限于管程的共享数据结构
B.对管程内数据结构进行操作的一组过程
C.管程外过程调用管程内数据结构的说明
D.对局限于管程的数据结构设置初始值的语句

管程由局限于管程的共享变量说明、对管程内的数据结构进行操作的一-组过程及对 局限于管程的数据设置初始值的语句组成。
C


29.以下关于管程的叙述中,错误的是( )。
A.管程是进程同步工具,解决信号量机制大量同步操作分散的问题
B.管程每次只允许一个进程进入管程
C.管程中signal操作的作用和信号量机制中的V操作相同
D.管程是被进程调用的,管程是语法范围,无法创建和撤销
管程的signal操作与信号量机制中的V操作不同,信号量机制中的V操作--定会改变信号量的值S=S+1。而管程中的signal操作是针对某个条件变量的,若不存在因该条件而阻塞的进程,则signal不会产生任何影响。
C


31.对信号量S执行P操作后,使该进程进入资源等待队列的条件是( ) 。
A. S.value <0
B. S.value<= 0
C. S.value> 0
D. S.value>= 0

参见记录型信号量的解析。此处极易出S.value 的物理概念题,现总结如下:
S.value>0,表示某类可用资源的数量。每次P操作,意味着请求分配一个单位的资源。
S.value<=0,表示某类资源已经没有,或者说还有因请求该资源而被阻塞的进程。
S. value <= 0时的绝对值,表示等待进程数目。
一定要看清题目中的陈述是执行P操作前还是执行P操作后。
A


32.若系统有n个进程,则就绪队列中进程的个数最多有(①)个;阻塞队列中进程的个
数最多有(②)个。
①A.n+1 B. n C. n-1 D.1
②A.n+1 B. n C.n-1 D.1
系统中有n个进程,其中至少有一个进程正在执行(处理器至少有- -个) ,因此就绪队列中的进程个数最多有n-1个。B选项容易被错选,以为出现了处理器为空、就绪队列全满的情况,实际调度无此状态。
注意:系统中有n个进程,其中至少有一个进程正在执行( 处理器至少有一个),其实这句话对于一般情况是错误的,但我们只需考虑就绪队列中进程最多这种特殊情况即可。
此题C选项容易被错选,阻塞队列有n- 1个进程这种情况是可能发生的,但不是最多的情况。可能不少读者会忽视死锁的情况,死锁就是n个进程都被阻塞,所以最多可以有n个进程在阻塞队列。
C B


33.下列关于 PV操作的说法中,正确的是( )。
I. PV操作是一种系统调用命令
II. PV 操作是一种低级进程通信原语
II. PV 操作是由一个不可被中断的过程组成
IV.PV操作是由两个不可被中断的过程组成
A. I、III
B. II、 IV
C.I、II、IV

D.I、IV
PV操作是一种低级的进程通信原语,不是系统调用,因此II正确; P操作和V操作都属于
原子操作,所以PV操作由两个不可被中断的过程组成,因此IV正确。
B


35.有一个计数信号量S:
1)假如若干进程对S进行28次P操作和18次V操作后,信号量S的值为0。
2)假如若干进程对信号量S进行了15次P操作和2次V操作。请问此时有多少个进
程等待在信号量S的队列中? ( )
.A.2
B.3
C. 5
D.7
对S进行了28次P操作和18次V操作,即S-28+ 18=0,得信号量的初值为10;然后,对信号量S进行了15次P操作和2次V操作,即S- 15+2=10-15+2=-3,s信号量的负值的绝对值表示等待队列中的进程数。所以有3个进程等待在信号量s的队列中。
B


37. [2010 统考真题]进程Po和进程P1的共享变量定义及其初值为:

则并发执行进程Po和进程PI时产生的情况是()。
A.不能保证进程互斥进入临界区,会出现“饥饿”现象
B.不能保证进程互斥进入临界区,不会出现“饥饿”现象
C.能保证进程互斥进入临界区,会出现“饥饿”现象
D.能保证进程互斥进入临界区,不会出现“饥饿”现象

 这是Peterson算法的实际实现,保证进入临界区的进程合理安全。
该算法为了防止两个进程为进入临界区而无限期等待,设置了变量turn,表示不允许进入临
界区的编号,每个进程在先设置自己的标志后再设置turn标志,不允许另一一个进程进入。这时,
再同时检测另--个进程状态标志和不允许进入表示,就可保证当两个进程同时要求进入临界区时
只允许-一个进程进入临界区。保存的是较晚的一次赋值, 因此较晚的进程等待,较早的进程进入。
先到先入,后到等待,从而完成临界区访问的要求。
其实这里可想象为两个人进门,每个人进门前都会和对方客套- -句 “你走先”。若进门时没
别人,就当和空气说句废话,然后大步登门入室;若两人同时进门,就互相先请,但各自只客套
-次,所以先客套的人请完对方,就等着对方请自己,然后光明正大地进门。

D


40. [2016统考真题] 使用TSL ( Test and Set Lock)指令实现进程互斥的伪代码如下所示。
do {
while (TSL(&1ock)) ;
critical section;
lock=FALSE ;

·········
 } while (TRUE) ;
下列与该实现机制相关的叙述中,正确的是( )。
A.退出临界区的进程负责唤醒阻塞态进程
B.等待进入临界区的进程不会主动放弃CPU
C..上述伪代码满足“让权等待” 的同步准则
D. while(TSL(&lock))语句 应在关中断状态下执行
当进程退出临界区时置lock为FALSE,会负责唤醒处于就绪态的进程,选项A错误。等待进入临界区的进程会一直停 留在执行while(TSL(&lock)的循环中,不会主动放弃CPU,选项B正确。
让权等待,即进程不能进入临界区时,应立即释放处理器,防止进程忙等待。通过B选项的分析发
现,上述伪代码并不满足“让权等待”的同步准则,选项C错误。while(TSL(&lck)在关中断状态下执行时,若TSL(&lock)一直为true,不再开中断,则系统可能会因此终止,选项D错误。

B


42.若有4个进程共享同一程序段,每次允许3个进程进入该程序段,若用P,V
操作作为同步机制,则信号量的取值范围是()。
A.4,3,2, 1,-1
B.2,1,0,-1,-2
C. 3,2, 1,0,-1

D. 2, 1,0, -2,- 3
由于每次允许三个进程进入该程序段,因此可能出现的情况是:没有进程进入,有一个进程.进入,有两个进程进入,有三个进程进入,有三个进程进入并有一一个在等待进入,因此这5种情况对应的信号量值为3,2,1,0,-1。
C


43.在9个生产者、6个消费者共享容量为8的缓冲器的生产者-消费者问题中,互斥使用缓
冲器的信号量初始值为()。
A.1
B.6
C.8
D.9
所谓互斥使用某临界资源,是指在同一时间段只允许-一个进程使用此资源,所以互斥信号量
的初值都为1.


45.有两个优先级相同的并发程序P1和P2:它们的执行过程如下所示。假设当前信号量s1=
0,s2=0。 当前的z=2,进程运行结束后,x,y和z的值分别是( )。

A.5,9,9
B. 5,9, 4
C. 5,12,9
D.5,12,4

由于进程并发,因此进程的执行具有不确定性,在PI, P2执行到第-一个P,V 操作前,应该是相互无关的。现在考虑第一个对s1的P, V操作,由于进程P2是P(s1)操作,所以它必须等待P1执行完V(s1 )操作后才可继续运行,此时的x, y, z值分别是2, 3, 4,当进程P1执行完V(s1)后便在P(s2)上阻塞,此时P2可以运行直到V(s2),此时的x, y,z值分别是5,3, 9,进程P1继续运行到结束,最终的x,y,z值分别为5, 12, 9。
C


 46. [2018 统考真题]属于同一进程的两个线程thread1和thread2并发执行,共享初值为0
的全局变量x。thread1和thread2实现对全局变量x加1的机器级代码描述如下。

在所有可能的指令执行序列中,使x的值为2的序列个数是( )。
A.1
B.2
C. 3
D.4


47. [2018统考真题]若x是管程内的条件变量,则当进程执行x.wait()时所做的工作是( )。
A.实现对变量x的互斥访问
B.唤醒一个在x上阻塞的进程
C.根据x的值判断该进程是否进入阻塞态
D.阻塞该进程,并将之插入x的阻塞队列中

“条件变量”是管程内部说明和使用的一-种特殊变量,其作用类似于信号量机制中的“信号量”,
都用于实现进程同步。需要注意的是,在同- -时刻,管程中只能有一个进程在执行。若进程A执行了x.wait()操作,则该进程会阻塞,并挂到条件变量x对应的阻塞队列上。这样,管程的使用权被释放,就可以有另一一个进程进入管程。若进程B执行了x.signal)操作,则会唤醒x对应的阻塞队列的队首进程。在Pascal语言的管程中,规定只有-一个进程要离开管程时才能调用signal(操作。
D


48.[2018统考真题]在下列同步机制中,可以实现让权等待的是( ) 。
A. Peterson 方法
B. swap 指令
C.信号量方法
D. TestAndSet 指令
硬件方法实现进程同步时不能实现让权等待,因此B、D错误; Peterson 算法满足有限等待但不
满足让权等待,因此A错误;记录型信号量由于引入阻塞机制,消除了不让权等待的情况,因此C
正确。
 


2.进程之间存在哪几种制约关系?各是什么原因引起的?以下活动各属于哪种制约关系?
1)若干学生去图书馆借书。
2)两队进行篮球比赛。
3)流水线生产的各道工序。
4)商品生产和消费。
进程之间存在两种制约关系,即同步和互斥。
同步是由于并发进程之间需要协调完成同一个任务时引起的一种关系,是-一个进程等待另一
个进程向它直接发送消息或数据时的一种制约关系。
互斥是由并发进程之间竞争系统的临界资源引起的,是一个进程等待另一个进程已经占有的
必须互斥使用的资源时的一种制约关系。
1)是互斥关系,同一本书只能被一-名学生借阅,或任何时刻只能有一名学生借阅一本书。
2)是互斥关系,篮球是互斥资源,只可被一个队伍获得。
3)是同步关系,一个工序完成后开始下一个工序。
4)是同步关系,生产商品后才能消费。


4.下面是两个并发执行的进程,它们能正确运行吗?若不能请举例说明并改正。

 Pr和P2两个并发进程的执行结果是不确定的,它们都对同一变量X进程操作,X是一个临界资源,而没有进行保护。例如:
1)若先执行完P1再执行P2,结果是x=0,y=1,z=1,t=2,u=2。
2)若先执行P1到“x=1”,然后一个中断去执行完P2,再一个中断回来执行完P1,结果是
x=0,y=0,z=0,t=2,u=2。
显然,两次执行结果不同,所以这两个并发进程不能正确运行。可将这个程序改为:.


 5. 有两个并发进程P1,P2,其程序代码如下:,

1)可能打印出的z值有多少? (假设每条赋值语句是一个原子操作)
2)可能打印出的c值有多少? (其中x为P1和P2的共享变量)

1) z的值有:- 2, 1,2,3,5, 7。
2) c的值有: 9,25, 81。


 6.在一个仓库中可以存放A和B两种产品,要求:
①每次只能存入一种产品。
②A产品数量-B产品数量< M.
③B产品数量-A产品数量<N.
其中,M,N是正整数,试用P操作、V操作描述产品A与产品B的入库过程。

使用信号量mutex控制两个进程互斥访问临界资源(仓库),使用同步信号量Sa和Sb (分别代表产品A与B的还可容纳的数量差,以及产品B与A的还可容纳的数量差)满足条件2和条件3。代码如下:


 7. 面包师有很多面包,由n名销售人员推销。每名顾客进店后取一个号,并且等待叫号,
当一名销售人员空闲时,就叫下一个号。试设计一个使销售人员和顾客同步的算法。
顾客进店后按序取号,并等待叫号;销售人员空闲后也按序叫号,并销售面包。因此同步算法只要对顾客取号和销售人员叫号进行合理同步即可。我们使用两个变量i和j分别记录当前的取号值和叫号值,并各自使用一个互斥信号量用于对i和j进行访问和修改。


  8. [2013 统考真题]某博物馆最多可容纳500 人同时参观,有一个出入口,该出入口一次
仅允许一人通过。参观者的活动描述如下:

 请添加必要的信号量和P, V [或waitO, signal0]操作,以实现上述过程中的互斥与同步。
要求写出完整的过程,说明信号量的含义并赋初值。

出入口一次仅允许-一个人通过,设置互斥信号量mutex,初值为1。博物馆最多可同时容纳
500人,因此设置信号量empty,初值为500。


 15. 设自行车生产线上有一个箱子,其中有N个位置(N≥3),每个位置可存放一个车架或一个车轮;又设有3名工人,其活动分别为:

 试分别用信号量与PV操作实现三名工人的合作,要求解中不含死锁。

用信号量与PV操作实现三名工人的合作。
首先不考虑死锁问题,工人1与工人3、工人2与工人3构成生产者与消费者关系,这两对生产/消费关系通过共同的缓冲区相联系。从资源的角度来看,箱子中的空位置相当于工人1和工人2的资源,而车架和车轮相当于工人3的资源。
分析上述解法易见,当工人1推进速度较快时,箱中空位置可能完全被车架占满或只留有一一个存放车轮的位置,此时工人3同时取2个车轮将无法得到,而工人2又无法将新加工的车轮放入箱
中;当工人2推进速度较快时,箱中空位置可能完全被车轮占满,而此时工人3取车架将无法得到,.
而工人1又无法将新加工的车架放入箱中。上述两种情况都意味着死锁。为防止死锁的发生,箱中
车架的数量不可超过N- 2,车轮的数量不可超过N- 1,这些限制可以用两个信号量来表达。


 16. 设P, Q,R共享一个缓冲区,P, Q构成一对生产者-消费者,R既为生产者又为消费者。
使用P,V操作实现其同步。

P, Q构成消费者-生产者关系,因此设三个信号量full, empty, mutex。full 和empty用来控制
缓冲池状态,mutex 用来互斥进入。R既为消费者又为生产者,因此必须在执行前判断状态,若
empty==1,则执行生产者功能;若full=1,执行消费者功能。


17. 理发店里有一位理发师、-把理发椅和n把供等候理发的顾客坐的椅子。若没有顾客,理发师便在理发椅.上睡觉,一位顾客到来时,顾客必须叫醒理发师,若理发师正在理发时又有顾客来到,若有空椅子可坐,则坐下来等待,否则就离开。试用P, V操作实现, 并说明信号量的定义和初值。
1)控制变量waiting用来记录等候理发的顾客数,初值为0,进来- -个顾客时,waiting 加1,
- -个顾客理发时,waiting 减1。
2)信号量customers用来记录等候理发的顾客数,并用作阻塞理发师进程,初值为0。
3)信号量barbers用来记录正在等候顾客的理发师数,并用作阻塞顾客进程,初值为0。


2.4死锁练习题



6.死锁预防是保证系统不进入死锁状态的静态策略,其解决办法是破坏产生死锁的四个必要条件之一。下列方法中破坏了“循环等待”条件的是( ) 。
A.银行家算法
B.一次性分配策略
C.剥夺资源法
D.资源有序分配策略
资源有序分配策略可以限制循环等待条件的发生。选项A判断是否为不安全状态;选项B破坏了占有请求条件;选项C破坏了非剥夺条件。.
D


9. [2009统考真题] 某计算机系统中有8台打印机,由K个进程竞争使用,每个进程最多.
需要3台打印机。该系统可能会发生死锁的K的最小值是( )。
A. 2
B.3
C.4
D.5
这种题要用到组合数学中鸽巢原理的思想。考虑最极端的情况,因为每个进程最多需要3台打印机,若每个进程已经占有了2台打印机,则只要还有多的打印机,总能满足-一个进程达到3台的条件,然后顺利执行,所以将8台打印机分给K个进程,每个进程有2台打印机,这个情况就是极端情况,K为4。
C


10.解除死锁通常不采用的方法是( )。
A.终止一个死锁进程
B.终止所有死锁进程
C.从死锁进程处抢夺资源
D.从非死锁进程处抢夺资源
一旦检测出死锁, 就应立即采取相应的措施来解除死锁。死锁解除的主要方法有:
1)资源剥夺法。挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但应防止被挂起的进程长时间得不到资源而处于资源匮乏的状态。
2)撤销进程法。强制撤销部分甚至全部死锁进程并剥夺这些进程的资源。撤销的原则可以按进程优先级和撤销进程代价的高低进行。
3)进程回退法。让一(或多)个进程回退到足以回避死锁的地步,进程回退时自愿释放资源而非被剥夺。要求系统保持进程的历史信息,设置还原点。


12.在下列死锁的解决方法中,属于死锁预防策略的是( ) 。
A.银行家算法
B.资源有序分配算法
C.死锁检测算法
D.资源分配图化简法
其中,银行家算法为死锁避免算法,死锁检测算法和资源分配图化简法为死锁检测,根据排除法可以得出资源有序分配算法为死锁预防策略。
B


14.三个进程共享四个同类资源,这些资源的分配与释放只能一次一个。 已知每个进程最多需要两个该类资源,则该系统( )。
A.有些进程可能永远得不到该类资源
B.必然有死锁
C.进程请求该类资源必然能得到
D.必然是死锁

不会发生死锁。因为每个进程都分得一个资源时,还有一个资源可以让任意一个进程满足,这样这个进程可以顺利运行完成进而释放它的资源。
C


15. 以下有关资源分配图的描述中,正确的是( )。
A.有向边包括进程指向资源类的分配边和资源类指向进程申请边两类
B.矩形框表示进程,其中圆点表示申请同一类资源的各个进程
C.圆圈结点表示资源类
D.资源分配图是一个有向图,用于表示某时刻系统资源与进程之间的状态
进程指向资源的有向边称为申请边,资源指向进程的有向边称为分配边,A选项张冠李戴;矩形框表示资源,其中的圆点表示资源的数目,选项B错;圆圈结点表示进程,选项C错;选项D的说法是正确的。
D


22.下面是一个并发 进程的程序代码,正确的是( )。

 A.进程不会死锁,也不会“饥饿”
B.进程不会死锁,但是会“饥饿”
C.进程会死锁,但是不会“饥饿’
D.进程会死锁,也会“饥饿”

遇到这种问题时千万不要慌张,下 面我们来慢慢分析,给读者一个清晰的解题过程:
①假设PI进程稍快,P2 进程稍慢,同时运行;②PI 进程首先进入if条件语句,因此获得了y的互斥访问权,P2 被阻塞;③在第一个P1进程未释放y之前,又有另一个P进入,c1 的值变成2,当第一个PI离开时,P2仍然被阻塞,这种情形不断发生;④在这种情况下会发生什么事? PI顺利执行,P2 很郁闷,长期被阻塞。
综上所述,不会发生死锁,但会出现饥饿现象。选择B选项。
 


23.有两个并发进程,对于如下这段程序的运行,正确的说法是( )。

 A.程序能正确运行,结果唯一
B.程序不能正确运行,可能有两种结果
C.程序不能正确运行,结果不确定
D.程序不能正确运行,可能会死锁

本题中两个进程不能正确地工作,运行结果的可能性详见下面的说明。


 25.死锁定理是用于处理死锁的( )方法。
A.预防死锁
B.避免死锁
C.检测死锁
D.解除死锁.
死锁定理是用于检测死锁的方法。
C


30. [2014 统考真题]某系统有n台互斥使用的同类设备,三个并发进程分别需要3, 4, 5台设备,可确保系统不发生死锁的设备数n最小为( )。
A.9
B. 10
C.11
D.12
三个并发进程分别需要3, 4,5台设备,当系统只有(3-1)+(4-1)+(5-1)=9台设备时,第一个进程分配2台,第二个进程分配3台,第三个进程分配4台。这种情况下,三个进程均无法继续执行下去,发生死锁。当系统中再增加1台设备,即共10台设备时,最后1台设备分配给任意一个进程都可以顺利执行完成,因此保证系统不发生死锁的最小设备数为10。
B


32. [2015 统考真题]若系统SI采用死锁避免方法,S2 采用死锁检测方法。下列叙述中,
正确的是()。
I. S1会限制用户申请资源的顺序,而S2不会
II. S1 需要进程运行所需的资源总量信息,而S2不需要.
II. S不会给可能导致死锁的进程分配资源,而S2会
A.仅I、II
B.仅II、III
C.仅I、III
D.I、I、II
死锁的处理采用三种策略:死锁预防、死锁避免、死锁检测和解除。
死锁预防采用破坏产生死锁的4个必要条件中的一-个或几个来防止发生死锁。其中之一的"破坏循环等待条件”,-般采用顺序资源分配法,首先给系统的资源编号,规定每个进程必须按编号递增的顺序请求资源,即限制了用户申请资源的顺序,因此I的前半句属于死锁预防的范畴。
银行家算法是最著名的死锁避免算法,其中的最大需求矩阵Max定义了每个进程对m类资源的最大需求量,系统在执行安全性算法中都会检查此次资源试分配后,系统是否处于安全状态,若不安全则将本次的试探分配作废。在死锁的检测和解除中,系统为进程分配资源时不采取任何措施,但提供死锁的检测和解除手段,因此I、II正确。.
B


34. [2019 统考真题]下列关于死锁的叙述中,正确的是( )。
I. 可以通过剥夺进程资源解除死锁
II. 死锁的预防方法能确保系统不发生死锁
II.银行家算法可以判断系统是否处于死锁状态.
IV.当系统出现死锁时,必然有两个或两个以上的进程处于阻塞态
A.仅I、III
B.仅I、II、IV
C.仅I、II、III
D.仅I、III、 IV
剥夺进程资源,将其分配给其他死锁进程,可以解除死锁,I正确。死锁预防是死锁处理策略(死锁预防、死锁避免、死锁检测)中最为严苛的一-种策略,破坏死锁产生的4个必要条件之一,可以确保系统不发生死锁,II正确。银行家算法是- -种死锁避免算法,用于计算动态资源分配的完全性以避免系统进入死锁状态,不能用于判断系统是否处于死锁,II 错误。通过简化资源分配图可以检测系统是否为死锁状态,当系统出现死锁时,资源分配图不可完全简化,只有两个或两个以上的进程才会出现“环”而不能被简化,IV正确。
B


第三章 内存管理

3.1 内存管理概念

内存可存放数据。程序执行前需要先放到内存中才能被CPU处理——缓和CPU与硬盘之间的速度矛盾

内存地址从0开始,每个地址对应一个存储单元

内存中也有一个一个的“小房间”,每个小房间就是一 个“存储单元”

如果计算机“按字节编址”, 则每个存储单元大小为 1字节,即 1B,即 8个二进制位

如果字长为16位的计算机 “按字编址”,则每个存储单元大小为 1个字;每个字的大小为 16 个二进制位

2^10= 1K——2^20= 1M——2^30=1G

装入的三种方式

  • 编译:由编译程序将用户源代码编译成若干个目标模块(编译就是把高级语言翻译为机器语言
  • 链接:由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块
  • 装入(装载):由装入程序将装入模块装入内存运行 

绝对装入【编译时产生绝对地址】:在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码。 装入程序按照装入模块中的地址,将程序和数据装入内存。

  • 绝对装入只适用于单道程序环境(此时还没有产生操作系统)。 程序中使用的绝对地址,可在编译或汇编时给出,也可由程序员直接赋予。通常情况下都是编译或汇编时再转换为绝对地址
  • 编译器负责地址转换

静态重定位【装入时将逻辑地址转换为物理地址】:又称可重定位装入。编译、链接后的装入模块的地址都是从0开始的,指令中使用的地 址、数据存放的地址都是相对于起始地址而言的逻辑地址。可根据内存的当前情况,将装入模块装入 到内存的适当位置。装入时对地址进行“重定位”,将逻辑地址变换为物理地址(地址变换是在装入时一次完成的)

  • 静态重定位的特点是在一个作业装入内存时,必须分配其要求 的全部内存空间,如果没有足够的内存,就不能装入该作业。 作业一旦进入内存后,在运行期间就不能再移动,也不能再申 请内存空间。
  • 用于早期的多道批处理操作系统
  • 装入程序负责地址转换

动态重定位【运行时将逻辑地址转换为物理地址,需设置重定位寄存器】:又称动态运行时装入。编译、链接后的装入模块的地址都是从0开始的。装入程序把装 入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正要执行时才进行。因此装入内存后所有的地址依然是逻辑地址。这种方式需要一个重定位寄存器的支持。采用动态重定位时允许程序在内存中发生移动

  • 重定位寄存器: 存放装入模块存放的起始位置
  • 并且可将程序分配到不连续的存储区中;在程序运行前只需装入它的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存;便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间。
  • 现代操作系统
  • 运行时才进行地址转换

链接的三种方式:

1. 静态链接:在程序运行之前, 先将各目标模块及它们所需 的库函数连接成一个完整的可执行文件(装入模块), 之后不再拆开。【装入前链接成一个完整装入模块

2. 装入时动态链接:将各目标模块装入内存时,运行前边装入边链接的链接方式。

3. 运行时动态链接:在程序执行中需要该目标模块时,才对它进行链接。其优点是便 于修改和更新,便于实现对 目标模块的共享。


  • 1. 操作系统负责内存空间的分配与回收
  • 2. 操作系统需要提供某种技术从逻辑上对内存空间进行扩充(实现虚拟性)
  • 3. 操作系统需要提供地址转换功能负责程序的逻辑地址与物理地址的转换
  • 4. 操作系统需要提供内存保护功能。保证各进程在各自存储空间内运行,互不干扰

3.1.3 覆盖与交换

2. 操作系统需要提供某种技术从逻辑上对内存空间进行扩充(实现虚拟性)

覆盖技术:

  • 程序分为多个段(多个模块)。
  • 常用的段常驻内存,不常用的段在需要时调入内存。
  • 内存中分为一个“固定区”若干个“覆盖区”。需要常驻内存的段放在“固定区”中,调入后就不再调出(除非运行结束),不常用的段放在“覆盖区”,需要用到时调入内存, 用不到时调出内存。
  • 必须由程序员声明覆盖结构,操作系统完成自动覆盖。
  • 缺点:对用户不透明,增加了用户编程负担。
  • 覆盖技术只用于早期的操作系统中,现在已成为历史。

交换(对换)技术:

  • 交换(对换)技术的设计思想:内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中 某些已具备运行条件的进程换入内存(进程在内存与磁盘间动态调度)。
  • 中级调度(内存调度),就是要决定将哪个处于挂起状态的进程重新调入内存。
  • 暂时换出外存等待的进程状态为挂起状态(挂起态,suspend)
  • 挂起态又可以进一步细分为就绪挂起、阻塞挂起两种状态
  • 具有对换功能的操作系统中,通常把磁盘空间分为文件区对换区两部分。文件区主要用于存放文件,主要追求存储空间的利用率,因此对文件区空间的管理采用离散分配方式对换区空间只占磁盘空间的小部分,被换出的进程数据就存放在对换区。由于对换的速度直接影响到系统的整体速度,因此对换区空间的管理主要追求换入换出速度,因此通常对换区采用连续分配方式。总之,对换区的I/O速度比文件区的更快。
  • 交换通常在许多进程运行且内存吃紧时进行,而系统负荷降低就暂停。例如:在 发现许多进程运行时经常发生缺页,就说明内存紧张,此时可以换出一些进程; 如果缺页率明显下降,就可以暂停换出。
  • 可优先换出阻塞进程;可换出优先级低的进程;为了防止优先级低的进程在被调 入内存后很快又被换出,有的系统还会考虑进程在内存的驻留时间… (注意:PCB 会常驻内存,不会被换出外存

覆盖和交换的区别

覆盖是在同一个程序或进程中的
交换是在不同进程(或作业)之间的

虚拟存储技术
 

3. 操作系统需要提供地址转换功能负责程序的逻辑地址与物理地址的转换

4. 操作系统需要提供内存保护功能。保证各进程在各自存储空间内运行,互不干扰

内存保护可采取两种方法:

  • 方法一:在CPU中设置一对上、下限寄存器,存放进程的上、下限地址。进程的指令要访问某个地址时,CPU检查是否越界。
  • 方法二:采用重定位寄存器(又称基址寄存器)和界地址寄存器(又称限长寄存器)进行越界检查。重定位寄存器中存放的是进程的起始物理地址。界地址寄存器中存放的是进程的最大逻辑地址。

3.1.3 连续分配管理方式

1. 操作系统负责内存空间的分配与回收

  • 非连续分配管理方式
  • 连续分配管理方式:

单一连续分配

  • 在单一连续分配方式中,内存被分为系统区用户区
  • 系统区通常位于内存的低地址部分,用于存放操作系统相关数据;用户区用于存放用户进程相关数据。
  • 内存中只能有一道用户程序,用户程序独占整个用户区空间。
  • 优点:实现简单;无外部碎片;可以采用覆盖技术扩充 内存;不一定需要采取内存保护(eg:早期的 PC 操作 系统 MS-DOS) 
  • 缺点:只能用于单用户、单任务的操作系统中;有内部碎片;存储器利用率极低。

固定分区分配

  • 为了能在内存中装入多道程序,且这些程序之间又不会相互干扰, 于是将整个用户空间划分为若干个固定大小的分区,在每个分区中只装入一道作业,这样就形成了最早的、最简单的一种可运行多道程序的内存管理方式。
  • 分区大小相等:缺乏灵活性,但是很适合用于用一台计算机控制多个相同对象的场合(比如:钢铁厂有n个相 同的炼钢炉,就可把内存分为n个大小相等的区域存放 n个炼钢炉控制程序)
  • 分区大小不等:增加了灵活性,可以满足不同大小的进程需求。根据常在系统中运行的作业大小情况进行划分 (比如:划分多个小分区、适量中等分区、少量大分区)
  • 操作系统需要建立一个数据结构——分区说明表,来实现各个分区的分配与回 收。每个表项对应一个分区,通常按分区大小排列。每个表项包括对应分区的 大小、起始地址、状态(是否已分配)。
  • 当某用户程序要装入内存时,由操作系统内核程序根据用户程序大小检索该表, 从中找到一个能满足大小的、未分配的分区,将之分配给该程序,然后修改状 态为“已分配”。
  • 优点:实现简单,无外部碎片。
  • 缺点:a. 当用户程序太大时,可能所有的分区都不能满足需求,此时不得不采 用覆盖技术来解决,但这又会降低性能;b. 会产生内部碎片,内存利用率低。

动态分区分配

动态分区分配又称为可变分区分配。这种分配方式不会预先划分内存分区,而是在进程装入内存时, 根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。因此系统分区的大小和数目是可变的。(eg:假设某计算机内存大小为 64MB,系统区 8MB,用户区共 56 MB…)

两种常用的数据结构:

  • 空闲分区表:每个空闲分区对应 一个表项。表项中包含分区号、 分区大小、分区起始地址等信息
  • 空闲分区链:每个分区的起始部分和末尾部分分别设置前向指针和后向指针。起始部分处还可记录分区大小等信息

动态分区分配算法

算法算法思想分区排列顺序优点缺点
首次适应每次都从低地址开始查找,找到第一个能满足大小的空闲分区。空闲分区以地址递增的次序排列综合看性能最好。算法开销小,回收分区后一般不需要对空闲分区队列重新排序
 
最佳适应由于动态分区分配是一种连续分配方式,为各进程分配的空间必须是连续的一整片区 域。因此为了保证当“大进程”到来时能有连续的大片空间,可以尽可能多地留下大片的空闲区, 即,优先使用更小的空闲区。空闲分区按容量递增次序链接会有更多的大分区被保留下来,更能满足大进程需求
 
缺点:每次都选最小的分区进行分配,会留下越来越多的、很小 的、难以利用的内存块。因此这种方法会产生很多的外部碎片。算法开销大,回收分区后可能需要对空闲分区队列重新排序
最坏适应为了解决最佳适应算法的问题——即留下太多难以利用的小碎片,可以在每次分配时优先使用最大的连续空闲区,这样分配后剩余的空闲区就不会太小,更方便使用。空闲分区按容量递减次序链接可以减少难以利用的小碎片缺点:算法开销大每次都选最大的分区进行分配,虽然可以让分配后留下的 空闲区更大,更可用,但是这种方式会导致较大的连续空闲区被 迅速用完。如果之后有“大进程”到达,就没有内存分区可用了。
邻近适应首次适应算法每次都从链头开始查找的。这可能会导致低地址部分出现很多小的空闲 分区,而每次分配查找时,都要经过这些分区,因此也增加了查找的开销。如果每次都从上次查 找结束的位置开始检索,就能解决上述问题。空闲分区以地址递增的顺序排列(可排成一个循环链表)。每次分配内存时从上次查 找结束的位置开始查找空闲分区链(或空闲分区表)不用每次都从低地址的小分区开始检索.算法开销小(原因同首次适应算法)
 
会使高地址的大分区也被用完
 

首次适应算法每次都要从头查找,每次都需要检索低地址的小分区。 但是这种规则也决定了当低地址部分有更小的分区可以满足需求时, 会更有可能用到低地址部分的小分区,也会更有可能把高地址部分的大分区保留下来(最佳适应算法的优点)

邻近适应算法的规则可能会导致无论低地址、高地址部分的空闲分区都有相同的概率被使用,也就导致了高地址部分的大分区更可能被使 用,划分为小分区,最后导致无大分区可用(最大适应算法的缺点)

综合来看,四种算法中,首次适应算法的效果反而更好


3.1.4 非连续分配管理方式

基本分页存储管理

何为分页存储?

将内存空间分为一个个大小相等的分区(比如:每个分区4KB),每个分区就是一个“页框”页框=页帧=内存块=物理块=物理页面)。每个页框有一个编号,即“页框号”(页框号=页帧号=内存块号=物理块号=物理页号),页框号从0开始

进程的逻辑地址空间也分为与页框大小相等的一个个部分, 每个部分称为一个“页”或“页面” 。每个页面也有一个编号, 即“页号”,页号也是从0开始

操作系统以页框为单位为各个进程分配内存空间。进程的每个 页面分别放入一个页框中。也就是说,进程的页面与内存的页框有一一对应的关系

各个页面不必连续存放,可以放到不相邻的各个页框中。

(注:进程的最后一个页面可能没有一个页框那么大。也就是说,分页存储有可能产生内部碎片,因此页框不能太大,否则可能产生过大的内部碎片造成浪费

为了能知道进程的每个页面在内存中存放的位置,操作系统要为每个进程建立一张页表(页表通常存在PCB)中

  • 1.一个进程对应一张页表
  • 2. 进程的每个页面对应一个页表项
  • 3. 每个页表项由“页号”和“块号”组成
  • 4. 页表记录进程页面和实际存放的内存块之间的映射关系
  • 5. 每个页表项的长度是相同的

【每个页表项占多少字节?】Eg:假设某系统物理内存大小为 4GB,页面大小为 4KB,则 每个页表项至少应该为多少字节?

  • 内存块大小=页面大小=4KB= 2^12 B
  • 4GB 的内存总共会被分为 2^32 / 2^12 = 2^20个内存块
  • 内存块号的范围应该是 0 ~ 2^20 -1
  • 内存块号至少要用 20 bit 来表示
  • 至少要用3B来表示块号(3*8=24bit)
  • 由于页号是隐含的( 页表项连续存放,因此页号 可以是隐含的,不占存储空间(类比数组) ),因此每个页表项占3B,存储整个页表至少需要 3*(n+1)B

【如何实现地址的转换】Eg:在某计算机系统中,页面大小是50B。某进程逻辑地址空间大小为200B,则逻辑地址 110 对应 的页号、页内偏移量是多少?

  • 页号 = 逻辑地址 / 页面长度 (取除法的整数部分)
  • 页内偏移量 = 逻辑地址 % 页面长度(取除法的余数部分)
  • 页号 = 110 / 50 = 2
  • 页内偏移量 = 110 % 50 = 10
  • 逻辑地址 可以拆分为(页号,页内偏移量)
  • 通过页号查询页表,可知页面在内存中的起始地址
  • 页面在内存中的起始地址+页内偏移量 = 实际的物理地址

【为何页面大小要取2的整数幂?】在计算机内部,地址是用二进制表示的, 如果页面大小 刚好是 2 的整数幂,则计算机硬件可以很快速的把逻辑地址拆分成(页号,页内偏移量)

优点:

  • ①逻辑地址的拆分更加迅速——如果每个页面大小为 2^KB,用二进制数表示逻辑地址,则末尾 K 位 即为页内偏移量,其余部分就是页号。因此,如果让每个页面的大小为 2 的整数幂,计算机硬件就 可以很方便地得出一个逻辑地址对应的页号和页内偏移量,而无需进行除法运算,从而提升了运行 速度。
  • ②物理地址的计算更加迅速——根据逻辑地址得到页号,根据页号查询页表从而找到页面存放的内存块号,将二进制表示的内存块号和页内偏移量拼接起来,就可以得到最终的物理地址。

分页存储管理的逻辑地址结构如下所示:

  • 地址结构包含两个部分:前一部分为页号,后一部分为页内偏移量 W。在上图所示的例子中,地址 长度为 32 位,其中 0~11位 为“页内偏移量”,或称“页内地址”;12~31 位为“页号”。
  • 如果有 K 位表示“页内偏移量”,则说明该系统中一个页面的大小是 2^K个内存单元
  • 如果有 M 位表示“页号”,则说明在该系统中,一个进程最多允许有 2^M 个页面
  • 有些奇葩题目中页面大小有可能不是2的整数次幂,这种情况还是得用最原始的方法计算: 页号 = 逻辑地址 / 页面长度 (取除法的整数部分) 页内偏移量 = 逻辑地址 % 页面长度(取除法的余数部分)

基本地址变换机构

基本地址变换机构可以借助进程的页表将逻辑地址转换为物理地址。 通常会在系统中设置一个页表寄存器(PTR),存放页表在内存中的起始地址F 页表长度M。 进程未执行时,页表的始址 和 页表长度 放在进程控制块(PCB)中,当进程被调度时,操作系 统内核会把它们放到页表寄存器中。页面大小是2的整数幂

Eg:若页面大小L 为 1K 字节,页号2对应的内存块号 b = 8,将逻辑地址 A=2500 转换为物理地址E。 等价描述:某系统按字节寻址,逻辑地址结构中,页内偏移量占10位,页号2对应的内存块号 b = 8, 将逻辑地址 A=2500 转换为物理地址E

  • ①计算页号、页内偏移量
  • 页号P = A/L = 2500/1024 = 2;
  • 页内偏移量 W = A%L = 2500%1024 = 452
  • ②根据题中条件可知,页号2没有越界,其存放的内存块号 b = 8
  • ③物理地址 E = b * L + W = 8 * 1024 + 425 = 8644

设页面大小为L,逻辑地址A到物理地址E的变换过程如下:

  • ①计算页号P和页内偏移量W (如果用十进制数手算,则P=A/L,W=A%L; 但是在计算机实际运行时,逻辑地址结构是固定不变的,因此计算机硬件可以更快地得到二进制表示的页号、页内偏移量)
  • ②比较页号P和页表长度M,若P≥M,则产生越界中断,否则继续执行。(注意: 页号是从0开始的,而页表长度至少是1,因此P=M时也会越界)
  • ③页表中页号P对应的页表项地址=页表起始地址F+页号P*页表项长度,取出该页表项内容b,即为内存块号。(注意区分页表项长度、 页表长度、页面大小的区别。页表长度指的是这个页表中总共有几个页表项,即总共有几个页:页表项长度指的是每个页表项占多大的存储空间;页面大小指的是一个页面占多大的存储空间)
  • ④计算E=b*L +W,用得到的物理地址E去访存。( 如果内存块号、页面偏移量是用二进制表示的,那么把二者拼接起来就是最终的物理地址了)

在分页存储管理(页式管理)的系统中,只要确定了每个页面的大小,逻辑地址结构就确定了。因此,页式管理中地址是一维的。即,只要给出一个逻辑地址,系统就可以自动地算出页号、页内偏移量两个部分,并不需要显式地告诉系统这个逻辑地址中,页内偏移量占多少位。

Eg:假设某系统物理内存大小为 4GB,页面大小为 4KB, 内存总共会被分为 2^32 / 2^12 = 2^20个内存块,因此内存块号的范围应该是 0 ~ 2^20 -1 因此至少要 20 个二进制位才能表示这么多的内存块号,因此至少要 3个字节才够 (每个字节 8 个二进制位,3个字节共 24 个二进制位)

各页表项会按顺序连续地存放在内存中 如果该页表在内存中存放的起始地址为 X ,则 M 号页对应的页表项是存放在内存地址为 X + 3*M

一个页面为 4KB,则每个页框可以存放 4096/3 = 1365 个 页表项,但是这个页框会剩余 4096 % 3 = 1 B 页内碎片 因此,1365 号【从0开始,实际是1366】页表项存放的地址为 X + 3*1365 + 1, 如果每个页表项占 4字节,则每个页框刚好可存放 1024 个页表项.

结论:理论上,页表项长度为 3B 即可表示内存块号的范围,但是,为了方便页表的查询, 常常会让一个页表项占更多的字节,使得每个页面恰好可以装得下整数个页表项

为了方便找到页表项,页表一般是放在连续的内存块中的


具有快表的地址变换机构

快表,又称联想寄存器(TLB, translation lookaside buffer ),是一种访问速度比内存快很多的 高速缓存(TLB不是内存),用来存放最近访问的页表项的副本,可以加速地址变换的速度。 与此对应,内存中的页表常称为慢表

  • TLB 和 普通 Cache 的区别——TLB 中只有页表项的副本,而普通 Cache 中可能会有其他各种数据的副本

①CPU给出逻辑地址,由某个硬件算得页号、页内偏移量,将页号与快表中的所有页号进行比较。

② 如果找到匹配的页号,说明要访问的页表项在快表中有副本,则直接从中取出该页对应的内存块号,再将内存块号与页内偏移量拼接形成物理地址,最后,访问该物理地址对应的内存单元。因此, 若快表命中,则访问某个逻辑地址仅需一次访存即可。

③ 如果没有找到匹配的页号,则需要访问内存中的页表,找到对应页表项,得到页面存放的内存块号,再将内存块号与页内偏移量拼接形成物理地址,最后,访问该物理地址对应的内存单元。因此, 若快表未命中,则访问某个逻辑地址需要两次访存(注意:在找到页表项后,应同时将其存入快表, 以便后面可能的再次访问。但若快表已满,则必须按照一定的算法对旧的页表项进行替换)

由于查询快表的速度比查询页表的速度快很多,因此只要快表命中,就可以节省很多时间。 因为局部性原理,一般来说快表的命中率可以达到 90% 以上。

例:某系统使用基本分页存储管理,并采用了具有快表的地址变换机构。访问一次快表耗时 1us,访问一次内存耗时 100us。若快表的命中率为 90%,那么访问一个逻辑地址的平均耗时是多少? (1+100) * 0.9 + (1+100+100) * 0.1 = 111 us

有的系统支持快表和慢表同时查找,如果是这样,平均耗时应该是 (1+100) * 0.9 + (100+100) * 0.1 = 110.9 us

若未采用快表机制,则访问一个逻辑地址需要 100+100 = 200us 显然,引入快表机制后,访问一个逻辑地址的速度快多了。

时间局部性:如果执行了程序中的某条指令,那么不久后这条指令很 有可能再次执行;如果某个数据被访问过,不久之后该数据很可能再 次被访问。(因为程序中存在大量的循环)

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

 每次要访问一个逻辑地址,都需要查询内存中的页表。由于局部性原理,可能连续很多次查到的都是同一个页表项

地址变换过程访问一个逻辑地址的访问次数
基本地址变换机构①算页号、页内偏移量
②检查页号合法性
③查页表,找到页面存放的内存块号
④根据内存块号与页内偏移量得到物理地址
⑤访问目标内存单元
 
两次访存
具有快表的地址变换机构

①算页号、页内偏移量

②检查页号合法性

查快表。若命中,即可知道页面存放的内存块号,可直接进行⑤; 若未命中则进行④

④查页表,找到页面存放的内存块号,并且将页表项复制到快表中

⑤根据内存块号与页内偏移量得到物理地址 ⑥访问目标内存单元

快表命中,只需 一次访存

快表未命中,需 要两次访存


两级页表

单级页表的问题:

  • (1)页表必须连续存放,因此当页表很大时,需要占用很多个连续的页框。
  • (2)整个页表常驻内存,但进程在一段时间内可能只需要访问某几个特定的页面。

(1)的解决方法:

  • 把页表再分页并离散存储,然后再建立一张页表记录页表各个部分 的存放位置,称为页目录表,或称外层页表,或称顶层页表

 (2)的解决方法:

可以在需要访问页面时才把页面调入内存(虚拟存储技术)。可以 在页表项中增加一个标志位,用于表示该页面是否已经调入内存。若想访问的页面不在内存中,则产生缺页中断(内中断/异常), 然后将目标页面从外存调入内存

注意:若分为两级页表后,页表依然很长,则可以采用更多级页表,一般来说各级页表的大小不能超过一个页面

例:某系统按字节编址,采用 40 位逻辑地址,页面大小为 4KB,页表项大小为 4B,假设采用纯页式存储,则要采用()级页表,页内偏移量为()位?

页面大小 = 4KB =2^12B,按字节编址,因此页内偏移量为12位

页号 = 40 - 12 = 28 位

页面大小 = 2^12B,页表项大小 = 4B ,则每个页面可存放 212 / 4 = 210 个页表项

因此各级页表最多包含 210 个页表项,需要 10 位二进制位才能映射到 210 个页表项,因此每一级的页表对应页号应为10位。总共28位的页号至少要分为三级

 如果只分为两级页表,则一级页号占 18 位, 也就是说页目录表中最多可能有 218个页表项, 显然,一个页面是放不下这么多页表项的。

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

  • 第一次访存:访问内存中的页目录表
  • 第二次访存:访问内存中的二级页表
  • 第三次访存:访问目标内存单元

基本分段存储管理

分段

进程的地址空间:按照程序自身的逻辑关系划分为若干个段,每个段都有一个段名(在低级语言中,程序员使用段名来编程),每段从0开始编址

内存分配规则:以段为单位进行分配,每个段在内存中占据连续空间,但各段之间可以不相邻。

 分段系统的逻辑地址结构由段号(段名)和段内地址(段内偏移量)所组成。如:

31 …… 1615 …… 0
段号段内地址

 段号的位数决定了每个进程最多可以分几个段

段内地址位数决定了每个段的最大长度是多少

 Eg:段号占16位,在该系统中,每个进程最多有 2^16 = 64K 个段

段内地址占 16位,因此每个段的最大长度是 2^16 = 64KB。

段表

  • 需为每个进程建立一张段映射表,简称“段表”。
  • 每个段对应一个段表项,其中记录了该段在内存中的起始位置(又称 “基址”)和段的长度各个段表项的长度是相同的。例如:某系统按字节寻址,采用分段存储管理,逻辑地址结构为(段号16位, 段内地址16位),因此用16位 即可表示最大段长。物理内存大小为4GB(可用32位表示整个物理内 存地址空间)。因此,可以让每个段表项占 16+32 = 48位,即6B。由 于段表项长度相同,因此段号可以是隐含的,不占存储空间。若段表 存放的起始地址为 M,则 K号段对应的段表项存放的地址为 M + K*6

 分段、分页管理的对比

  • 信息的物理单位。分页的主要目的是为了实现离散分配,提高内存利用率。分页仅仅是系统管 理上的需要,完全是系统行为,对用户是不可见的。
  • 信息的逻辑单位。分段的主要目的是更好地满足用户需求。一个段通常包含着一组属于一个逻辑模块的信息。分段对用户是可见的,用户编程时需要显式地给出段名。
  • 页的大小固定且由系统决定。段的长度却不固定,决定于用户编写的程序。
  • 分页的用户进程地址空间是一维的,程序员只需给出一个记忆符即可表示一个地址。
  • 分段的用户进程地址空间是二维的,程序员在标识一个地址时,既要给出段名,也要给出段内地址。
LOAD 1, [D] | //将分段D中A单元内的值读入寄存器1
STORE 1, [X] | //将寄存器1的内容存入X 分段的B单元中
写程序时使用的 段名 [D]、[X] 会 被编译程序翻译 成对应段号​单元,​单元会被编译程序翻译成段内地址
  •  分段比分页更容易实现信息的共享和保护。
  • 不能被修改的代码称为纯代码可重入代码(不属于临界资源),这样的代码是可以共享的【只需让各进程的段表项指向同一个段即可实现共享】。可修改的代码是不能共享的(比如,有一个代码段中有很多变量,各进程并发地同时访问可能造成数据不一致)
  • 访问一个逻辑地址需要几次访存? 分页(单级页表):第一次访存——查内存中的页表,第二次访存——访问目标内存单元。总共两次访存 。分段:第一次访存——查内存中的段表,第二次访存——访问目标内存单元。总共两次访存与分页系统类似,分段系统中也可以引入快表机构,将近期访问过的段表项放到快表中,这样可以少一次访问,加快地址变换速度。

段页式存储管理

分页、分段的优缺点
优点缺点
分页管理内存空间利用率高,不会产生外部碎片,只会有少量的页内碎片不方便按照逻辑模块实现信息的共享和保护
分段管理很方便按照逻辑模块实现信息的共享和保护如果段长过大,为其分配很大的连续空间会很不方便。另外,段式管理会产生外部碎片分段管理中产生的外部碎片也 可以用“紧凑”来解决,只是 需要付出较大的时间代价

分段+分页=段页式管理

将进程按逻辑模块分段,再将各段分页(如每个页面4KB)

再将内存空间分为大小相同的内存块/页框/页帧/物理块

进程前将各页面分别装入各内存块中

段页式管理的逻辑地址结构

31 …… 1615 …… 1211 …… 0
段号页号页内偏移量

若系统是按字节寻址的,则

段号占16位,因此在该系统中,每个进程最多有 2^16 = 64K 个段

页号占4位,因此每个段最多有 2^4 = 16页

页内偏移量占12位,因此每个页面\每个内存块大小为 2^12 = 4096 = 4KB

  • 段号的位数决定了每个进程最多可以分几个段
  • 页号位数决定了每个段最大有多少页
  • 页内偏移量决定了页面大小、内存块大小是多少

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

每个段对应一个段表项,每个段表项由段号、页表长度、页表存放块号(页表起始 地址)组成。每个段表项长度相等,段号是隐含的。

每个页面对应一个页表项,每个页表项由页号、页面存放的内存块号组成。每个页 表项长度相等,页号是隐含的。

 访问一个逻辑地址所需要访存次数

第一次——查段表、第二次——查页表、第三次——访问目标单元
可引入快表机构。以段号和页号为关键字查询快表,即可直接找到最终的目标页面存放位置。引入快表后仅需—次访存


3.2 虚拟内存管理


3.2.1 虚拟内存的基本概念

内存管理概念
内存空间的分配与回收连续分配、非连续分配

单一连续分配、固定分区分配动、态分区分配

虚拟分页存储管理、基本分段存储管理、基本段页式存储管理

内存空间的扩充覆盖技术、交换技术、虚拟存储技术
地址转换
存储保护

传统存储管理方式的特征和缺点

一次性:作业必须一次性全部装入内存后才能开始运行。这会造成两个问题:①作业很大时,不能全部装入内存,导致大作业无法运行;②当大量作业要求运行时,由于内存无法容纳所有作业,因此只 有少量作业能运行,导致多道程序并发度下降【可用虚拟存储技术解决问题】

驻留性:一旦作业被装入内存,就会一直驻留在内存中,直至作业运行结束。事实上,在一个时间段 内,只需要访问作业的一小部分数据即可正常运行,这就导致了内存中会驻留大量的、暂时用不到的 数据,浪费了宝贵的内存资源。

局部性原理

时间局部性:如果执行了程序中的某条指令,那么不久后这条指令很有可能再次执行;如果某个数据被访问过,不久之后该数据很可能再次被访问。(因为程序中存在大量的循环)

空间局部性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问。 (因为很多数据在内存中都是连续存放的,并且程序的指令也是顺序地在内存中存放的)

快表机构就是将近期 常访问的页表项副本 放到更高速的联想寄存器中

高速缓冲技术的思想: 将近期会频繁访问到的数据放到更高速的存储 器中,暂时用不到的数据放在更低速存储器中。

虚拟内存的定义和特征

基于局部性原理,在程序装入时,可以将程序中很快会用到的部分装入内存暂时用不到的部分留在外存, 就可以让程序开始执行。

在程序执行过程中,当所访问的信息不在内存时,由 操作系统负责将所需信息从外存调入内存,然后继续 执行程序。

若内存空间不够,由操作系统负责内存中暂时用不到的信息换出到外存

在操作系统的管理下,在用户看来似乎有一个比实际 内存大得多的内存,这就是虚拟内存

  • 易混知识点:
  • 虚拟内存的最大容量是由计算机的地址结构(CPU寻址范围)确定的
  • 虚拟内存的实际容量 = min(内存和外存容量之和,CPU寻址范围)
  • 如:某计算机地址结构为32位,按字节编址,内存大小为512MB,外存大小为2GB。
  • 则虚拟内存的最大容量为 2^32 B = 4GB
  • 虚拟内存的实际容量 = min (2^32B, 512MB+2GB) = 2GB+512MB

虚拟内存有一下三个主要特征:

  • 多次性:无需在作业运行时一次性全部装入内存,而是允许被分成多次调入内存。
  • 对换性:在作业运行时无需一直常驻内存,而是允许在作业运行过程中,将作业换入、换出。
  • 虚拟性:从逻辑上扩充了内存的容量,使用户看到的内存容量,远大于实际的容量。

如何实现虚拟内存技术

  • 请求分页存储管理
  • 请求分段存储管理
  • 请求段页式存储管理

虚拟内存技术,允许一个作业分多次调入内存。如果采用连续分配方式,会不方便实现。因此, 虚拟内存的实现需要建立在离散分配的内存管理方式基础上。

在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存(请求调页功能),然后继续执行程序。 若内存空间不够,由操作系统负责将内存 中暂时用不到的信息换出到外存。(页面置换功能)

操作系统要提供 请求调页(或请 求调段)功能

操作系统要提供页面置 换(或段置换)的功能


3.2.2 请求分页管理方式

  • 页表机制
  • 缺页中断机构
  • 地址变换机构

请求分页存储管理与基本分页存储管理的主要区别:

在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然 后继续执行程序。操作系统要提供 请求调页(或请 求调段)功能

若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存。操作系统要提供页面置 换(或段置换)的功能

页表机制:

与基本分页管理相比,请求分页管理中,为了实现“请求调页”,操作系统需要 知道每个页面是否已经调入内存;如果还没调入,那么也需要知道该页面在外存 中存放的位置。

当内存空间不够时,要实现“页面置换”,操作系统需要通过某些指标来决定到 底换出哪个页面;有的页面没有被修改过,就不用再浪费时间写回外存。有的页面修改过,就需要将外存中的旧数据覆盖,因此,操作系统也需要记录各个页面是否被修改的信息。

  • 状态位:表示页面是否已在内存中
  • 访问字段:记录最近被访问过几次,或记录上次访问的时间,供置换算法选择换出页面时参考
  • 修改位:表示页面调入内存后是否被修改过,只有修改过的页面才需在置换时写回外存
  • 外存地址︰页面在外存中存放的位置
     

 缺页中断机构

在请求分页系统中,每当要访问的页面不在内存时,便产生一个缺页中断,然 后由操作系统的缺页中断处理程序处理中断。 此时缺页的进程阻塞,放入阻塞队列,调页完成后再将其唤醒,放回就绪队列。

如果内存中有空闲块,则为进程分配一个空闲块,将所缺页面装入该块,并修 改页表中相应的页表项。

如果内存中没有空闲块,则由页面置换算法选择一个页面淘汰,若该页面在内存期间被修改过,则要将其写回外存。未修改过的页面不用写回外存。

缺页中断是因为当前执行的指令想要访问的目标页面未调入内存而产生的,因此属于内中断 一条指令在执行期间,可能产生多次缺页中断。(如:copy A to B,即将逻辑地址A中的数据复制到 逻辑地址B,而A、B属于不同的页面,则有可能产生两次中断

 地址变换机构

  •  ①只有“写指令”才需要修改 “修改位”。并且,一般来说只需修改快表中的数据,只有要将快表项删除时才需要写回内存中的慢表。这样可以减少访存次数。
  • ②和普通的中断处理一样,缺页中断处理依然需要保留CPU现场。
  • ③需要用某种“页面置换算法” 来决定一个换出页面
  •  ④换入/换出页面都需要启动慢速的I/O操作,可见,如果换入/ 换出太频繁,会有很大的开销。
  • ⑤页面调入内存后,需要修改慢表,同时也需要将表项复制到快表中

在具有快表机构的请求分页系统中,访问一个逻辑地址 时,若发生缺页,则地址变换步骤是: 查快表(未命中)——查慢表(发现未调入内存)——调页(调入的页面对应的表项会直接加入快表)——查快表(命中)——访问目标内存单元


3.2.3 页面置换算法——决定应该换入哪页、换出哪页

  • 最佳置换算法(OPT)
  • 先进先出置换算法(FIFO)
  • 最近最久未使用置换算法(LRU)
  • 时钟置换算法(cLOCK)
  • 改进型的时钟置换算法

页面的换入、换出需要磁盘 I/O,会有较大的开销,因此好的页面置换算法应该追求更少的缺页率

最佳置换算法(OPT,Optimal)

每次选择淘汰的页面将是以后永不使用,或者在最长时间内不再被 访问的页面,这样可以保证最低的缺页率。,置换的时候,往后寻找,最后一个出现 的页号就是要淘汰的页面。

最佳置换算法可以保证最低的缺页率,但实际上,只有在进程执行的过程中才能知道接下来会访问到 的是哪个页面。操作系统无法提前预判页面访问序列。因此,最佳置换算法是无法实现的。

先进先出置换算法(FIFO)

先进先出置换算法(FIFO):每次选择淘汰的页面最早进入内存的页面

实现方法:把调入内存的页面根据调入的先后顺序排成一个队列,需要换出页面时选择队头页面即可。 队列的最大长度取决于系统为进程分配了多少个内存块。

Belady 异常——当为进程分配的物理块数增大时,缺页次数不减反增的异常现象。 只有 FIFO 算法会产生 Belady 异常。

另外,FIFO算法虽然实现简单,但是该算法与进程实际运行时的规律不适应,因为先进入的页面也有可能最经常被访问。因此,算法性能差

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

每次淘汰的页面最近最久未使用的页面

实现方法:赋予每个页面对应的页表项中,用访问字段记录该页面自上次被访问以来所经历的时间t。 当需要淘汰一个页面时,选择现有页面中 t 值最大的,即最近最久未使用的页面。

该算法的实现需要专门的硬件支持,虽然算法性能好, 但是实现困难,开销大

 时钟置换算法(CLOCK)

最佳置换算法性能最好,但无法实现;先进先出置换算法实现简单,但算法性能差;最近最久未使用 置换算法性能好,是最接近OPT算法性能的,但是实现起来需要专门的硬件支持,算法开销大。

时钟置换算法是一种性能和开销较均衡的算法,又称CLOCK算法,或最近未用算法(NRU,Not Recently Used)

简单的CLOCK 算法实现方法:为每个页面设置一个访问位,再将内存中的页面都通过链接指针链接成 一个循环队列。当某页被访问时,其访问位置为1。当需要淘汰一个页面时,只需检查页的访问位。 如果是0,就选择该页换出;如果是1,则将它置为0,暂不换出,继续检查下一个页面,若第一轮扫描中所有页面都是1,则将这些页面的访问位依次置为0后,再进行第二轮扫描(第二轮扫描中一定会有访问位为0的页面,因此简单的CLOCK 算法选择一个淘汰页面最多会经过两轮扫描)

页号内存块号状态位访问位修改位外存地址

改进型的时钟置换算法

简单的时钟置换算法仅考虑到一个页面最近是否被访问过。事实上,如果被淘汰的页面没有被修改过, 就不需要执行I/O操作写回外存。只有被淘汰的页面被修改过时,才需要写回外存。

因此,除了考虑一个页面最近有没有被访问过之外,操作系统还应考虑页面有没有被修改过。在其他条件都相同时,应优先淘汰没有修改过的页面,避免I/O操作。这就是改进型的时钟置换算法的思想。

修改位=0,表示页面没有被修改过;修改位=1,表示页面被修改过。

为方便讨论,用(访问位,修改位)的形式表示各页面状态。如(1,1)表示一个页面近期被访问过, 且被修改过。

算法规则:将所有可能被置换的页面排成一个循环队列

第一轮:从当前位置开始扫描到第一个(0, 0)的帧用于替换。本轮扫描不修改任何标志位 第二轮:若第一轮扫描失败,则重新扫描,查找第一个(0, 1)的帧用于替换。本轮将所有扫描过的帧访问位设为0

第三轮:若第二轮扫描失败,则重新扫描,查找第一个(0, 0)的帧用于 替换。本轮扫描不修改任何标志位

第四轮:若第三轮扫描失败,则重新扫描,查找第一个(0, 1)的帧用于 替换。 由于第二轮已将所有帧的访问位设为0,因此经过第三轮、第四轮扫描一 定会有一个帧被选中,因此改进型CLOCK置换算法选择一个淘汰页面最多 会进行四轮扫描

  • 第一优先级:最近没访问, 且没修改的页面
  • 第二优先级:最近没访问, 但修改过的页面
  • 第三优先级:最近访问过, 但没修改的页面
  • 第四优先级:最近访问过, 且修改过的页面
算法规则优缺点
OPT优先淘汰最长时间内不会被访问的页面缺页率最小,性能最好; 但无法实现
FIFO优先淘汰最先进入内存的页面实现简单;但性能很差, 可能出现Belady异常
LRU 优先淘汰最近最久没访问的页面性能很好;但需要硬件支持,算法开销大
CLOCK(NRU)循环扫描各页面 第一轮淘汰访问位=0的,并将扫描过的页面访问位改为1。若第一轮没选中,则进行第二轮扫描实现简单,算法开销小; 但未考虑页面是否被修 改过。
改进型CLOCK(改进型NRU)

若用(访问位, 修改位)的形式表述,则

第一轮:淘汰(0, 0)

第二轮:淘汰(0, 1),并将扫描过的页面访问位都置为0

第三轮:淘汰(0, 0)

第四轮:淘汰(0, 1)

算法开销较小,性能也不错

3.2.4 页面分配策略

页面分配、置换策略

驻留集指请求分页存储管理中给进程分配的物理块的集合。

  • 在采用了虚拟存储技术的系统中,驻留集大小一般小于进程的总大小。
  • 若驻留集太小,会导致缺页频繁,系统要花大量的时间来处理缺页,
  •  驻留集太大,又会导致多道程序并发度下降,资源利用率降低。

固定分配:操作系统为每个进程分配一组固定数目的物理块,在进程运行期间不再改变。驻留集大小不变

可变分配:先为每个进程分配一定数目的物理块,在进程运行期间,可根据情况做适当的增加或减少。 即,驻留集大小可变。

固定分配局部置换:为每个进程分配一定数目的物理块,在整个运行期间都不改变。若进程在运行中发生缺页,则只能从该进程在内存中的页面中选出一页换出,然后调入需要的页面。实现这种策略时,难以确定应为每个进程分配的物理块数目:太少会频繁出现缺页中断,太多又会使CPU和其他资源利用率下降。
可变分配全局置换。这是最易于实现的物理块分配和置换策略,它为系统中的每个进程分配一定数目的物理块,操作系统自身也保持一个空闲物理块队列。当某进程发生缺页时,系统从空闲物理块队列中取出一个物理块分配给该进程,并将欲调入的页装入其中。这种方法比固定分配局部置换更加灵活,可以动态增加进程的物理块,但也存在弊端,如它会盲目地给进程增加物理块,从而导致系统多道程序的并发能力下降。
可变分配局部置换。它为每个进程分配一定数目的物理块,当某个进程发生缺页时,只允许从该进程在内存的页面中选出一页换出,因此不会影响其他进程的运行。若进程在运行中频繁地缺页,则系统再为该进程分配若干物理块,直至该进程缺页率趋于适当程度;反之,若进程运行中的缺页率特别低,则可适当减少分配给该进程的物理块。比起可变分配全局置换,这种方法不仅可以动态增加进程物理块的数量,还能动态减少进程物理块的数量,在保证进程不会过多地调页的同时,也保持了系统的多道程序并发能力。当然它需要更复杂的实现,也需要更大的开销,但对比频繁地换入/换出所浪费的计算机资源,这种牺牲是值得的。

  • 可变分配全局置换:只要缺页就给分配新物理块
  • 可变分配局部置换:要根据发生缺页的频率来动态地增加或减少进程的物理块

何时调入页面

预调页策略——运行前调入:根据局部性原理【主要指空间局部性,即:如 果当前访问了某个内存单元, 在之后很有可能会接着访问 与其相邻的那些内存单元。】,一次调入若干个相邻的页面可能比一次调入一个页面更高效。但如 果提前调入的页面中大多数都没被访问过,则又是低效的。因此可以预测不久之后可能访问到的页 面,将它们预先调入内存,但目前预测成功率只有50%左右。故这种策略主要用于进程的首次调入, 由程序员指出应该先调入哪些部分。

请求调页策略——运行时调入:进程在运行期间发现缺页时才将所缺页面调入内存。由这种策略调入的页面一定会被访问到,但由于每次只能调入一页,而每次调页都要磁盘I/O操作,因此I/O开销较大。

从何处调入页面

系统拥有足够的对换区空间:页面的调入、调出都是在内存与对换区之间进行,这样可以保 证页面的调入、调出速度很快。在进程运行前, 需将进程相关的数据从文件区复制到对换区。

系统缺少足够的对换区空间:凡是不会被修改的数据都直接从文件区调入,由于这些页面不 会被修改,因此换出时不必写回磁盘,下次需要时再从文件区调入即可。对于可能被修改的 部分,换出时需写回磁盘对换区,下次需要时再从对换区调入。

 

 UNIX 方式:运行之前进程有关的数据全部放在 文件区,故未使用过的页面,都可从文件区调 入。若被使用过的页面需要换出,则写回对换 区,下次需要时从对换区调入。

 抖动(颠簸)现象

刚刚换出的页面马上又要换入内存,刚刚换入的页面马上又要换出外存,这种频繁的页面调度行为称 为抖动,或颠簸。产生抖动的主要原因是进程频繁访问的页面数目高于可用的物理块数(分配给进程 的物理块不够)

  • 为进程分配的物理块太少,会使进 程发生抖动现象。为进程分配的物理块太多,又会降低系统整体的并 发度,降低某些资源的利用率
  • 为了研究为应该为每个进程分配多少个物理块,Denning 提出了进程 “工作集”的概念

 工作集

驻留集:指请求分页存储管理中给进程分配的内存块的集合。

工作集:指在某段时间间隔里,进程实际访问页面的集合。

工作集大小可能小于窗口尺寸,实际应用中,操作系统可以统计进程的工作集大小,根据工作集大小 给进程分配若干内存块。如:窗口尺寸为5,经过一段时间的监测发现某进程的工作集最大为3,那么 说明该进程有很好的局部性,可以给这个进程分配3个以上的内存块即可满足进程的运行需要。 一般来说,驻留集大小不能小于工作集大小,否则进程运行过程中将频繁缺页。

拓展:基于局部性原理可知,进程在一段时间内访问的页面与不久之后会访问的页面是有相关性的。 因此,可以根据进程近期访问的页面集合(工作集)来设计一种页面置换算法——选择一个不在工作 集中的页面进行淘汰。


第三章 练习题


1、

1. [2011统考真题]在虚拟内存管理中,地址变换机构将逻辑地址变换为物理地址,形成该
逻辑地址的阶段是( )。
A.编辑
B.编译
C.链接
D.装载

C


2、

2.下面关于存储管理的叙述中,正确的是( )。
A.存储保护的目的是限制内存的分配
B. 在内存为M、有N个用户的分时系统中,每个用户占用MIN的内存空间
c.在虚拟内存系统中,只要磁盘空间无限大,作业就能拥有任意大的编址空间
D.实现虚拟内存管理必须有相应硬件的支持

存储保护:保证各道作业在各自的存储空间内运行,互不干扰

实现虚拟内存需要:一定容量的内存和外存、页表机制、中断机构、地址变换机构
D


3.在使用交换技术时,若一个进程正在( ), 则不能交换出主存。
A.创建
B. I/O 操作
C.处于临界段
D.死锁

进程正在进行IO操作时不能换出主存,否则其I/O数据区将被新换入的进程占用,导致错误。不过可以在操作系统中开辟I/O 缓冲区,将数据从外设输入或将数据输出到外设的IO活动在系统缓冲区中进行,这时系统缓冲区与外设I/O时,进程交换不受限制。

换入:把准备好竞争CPU运行的程序从辅存移到内存
换出:把处于等待状态的程序从内存移到辅存
B


4.在存储管理中,采用覆盖与交换技术的目的是( )。
A.节省主存空间
B.物理上扩充主存容量
C.提高CPU效率
D.实现主存共享

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

逻辑上扩充主存容量

A


5. [2009 统考真题]分区分配内存管理方式的主要保护措施是( )。
A.界地址保护
B.程序代码保护
C、数据保护
D.栈保护

A


6. [2010统考真题]某基于动态分区存储管理的计算机,其主存容量为55MB (初始为空),采用最佳适配(Best Fit) 算法,分配和释放的顺序为:分配1SMB, 分配30MB,释放15MB,分配8MB,分配6MB,此时主存中最大空闲分区的大小是( )。
A. 7MB .
B.9MB
C.10MB
D.15MB

B


7、

 7. 段页式存储管理中,地址映射表是( )。
A.每个进程一张段表,两张页表
B.每个进程的每个段一张段表,-张页表
C.每个进程一张段表,每个段一张页表
D.每个进程一张页表,每个段一张段表

段页式系统中,进程首先划分为段,每段再进-步划分为页。

C


8. 内存保护需要由( )完成,以保证进程空间不被非法访问。
A.操作系统
B.硬件机构
C.操作系统和硬件机构合作
D.操作系统或者硬件机构独立完成
内存保护是内存管理的一部分,是操作系统的任务,但是出于安全性和效率考虑,必须由硬件实现,所以需要操作系统和硬件机构的合作来完成。
C


9. 存储管理方案中,( )可采用覆盖技术。
A.单一连续存储管理
B.可变分区存储管理
C.段式存储管理
D.段页式存储管理
A

覆盖技术是早期在单一连续存储管理中使用的扩大存储容量的一种技术,它同样可用于固定分区分配的存储管理。


12.某段表的内容见右表,一逻辑地址为(2, 154), 它对应的
物理地址为( )。
A.120K+2
B.480K + 154
C.30K + 154
D.480K+2

段号为2,其对应的首地址为480K,段长度为20K,大于154,所以逻辑地址(2, 154)对应的物理地址为480K + 154。

B


13.动态重定位是在作业的( )中进行的。
A.编译过程
B.装入过程
C.链接过程
D.执行过程

D

静态装入是指在编程阶段就把物理地址计算好。
可重定位是指在装入时把逻辑地址转换成物理地址,但装入后不能改变
动态重定位是指在执行时再决定装入的地址并装入,装入后有可能会换出,所以同一个模块在内存中的物理地址是可能改变的。
动态重定位是指在作业运行过程中执行到一条访存指令时,再把逻辑地址转换为主存中的物理地址,实际中是通过硬件地址转换机制实现的。


14. 下面的存储管理方案中, ( )方式可以采用静态重定位。
A.固定分区.
B.可变分区
C.页式
D.段式

固定分区方式中,作业装入后位置不再改变,可以采用静态重定位。其余三种管埋方案均可能在运行过程中改变程序位置,静态重定位不能满足其要求。
A


15.在可变分区管理中,采用拼接技术的目的是( )。
A.合并空闲区
B.合并分配区
C.增加主存容量
D.便于地址转换
在可变分区管理中,回收空闲区时采用拼接技术对空闲区进行合并。

A


16. 在一页式存储管理系统中,页表内容见右表。若页的大小为4KB,则地址转换机构将逻辑地址0转换成的物理地址为(块号从0开始计算)( )。
A.8192
B. 4096
C.2048
D.1024

A


17. 不会产生内部碎片的存储管理是( )。
A.分页式存储管理
B。分段式存储管理
C.固定分区式存储管理
D.段页式存储管理
 

B


18. 多进程在主存中彼此互不干扰的环境下运行,操作系统是通过( )来实现的。
A.内存分配
B.内存保护
C.内存扩充
D.地址映射
多进程的执行通过内存保护实现互不干扰,如页式管理中有页地址越界保护,段式管理中有段地址越界保护
B


19.分区管理中采用最佳适应分配算法时,把空闲区按( ) 次序登记在空闲区
表中。
A.长度递增
B.长度递减
C.地址递增
D.地址递减
A


20.首次适应算法的空闲分区( )。
A.按大小递减顺序连在一起
B.按大小递增顺序连在一起
C.按地址由小到大排列
D.按地址由大到小排列
C


21.采用分页或分段管理后,提供给用户的物理地址空间( )。
A.分页支持更大的物理地址空间
B.分段支持更大的物理地址空间
C.不能确定
D.一样大

页表和段表同样存储在内存中,系统提供给用户的物理地址空间为总空间大小减去页表或段表的长度。由于页表和段表的长度不能确定,所以提供给用户的物理地址空间大小也不能确定。

C


22.分页系统中的页面是为( )。
A.用户所感知的
B.操作系统所感知的
C.编译系统所感知的
D.连接装配程序所感知的

内存分页管理是在硬件和操作系统层面实现的,对用户、编译系统、连接装配程序等上层是不可见的。
B


23.页式存储管理中,页表的始地址存放在( )中。
A.内存
B.存储页表
C.快表
D.寄存器

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


25.采用段式存储官理时,一个程序如何分段是在()时决定的。
A.分配主存
B.用户编程
C.装作业
D.程序执行
分段是指在用户编程时,将程序按照逻辑划分为几个逻辑段。


26.下面的( ) 方法有利于程序的动态链接。
A.分段存储管理
B.分页存储管理
C.可变式分区管理
D.固定式分区管理
程序的动态链接与程序的逻辑结构相关,分段存储管理将程序按照逻辑段进行划分,因此有利于其动态链接。其他的内存管理方式与程序的逻辑结构无关。


27.当前编程人员编写好的程序经过编译转换成目标文件后,各条指令的地址编号起始-般
定为(),称为()地址。
1)A.1B. 0C. IPD. CS
2) A.绝对B.名义C.逻辑D.实
编译后一个目标程序所限定的地址范围称为该作业的逻辑地址空间。换句话说,地址空间仅指程序用来访问信息所用的一系列地址单元的集合。这些单元的编号称为逻辑地址。通常,编译地址都是相对始址“0”的,因而也称逻辑地址为相对地址。
BC


28.可重入程序是通过( )方法来改善系统性能的。
A.改变时间片长度
B.改变用户数
C.提高对换速度
D.减少对换数量
可重入程序主要是通过共享来使用同一块存储空间的,或通过动态链接的方式将所需的程序段映射到相关进程中去,其最大的优点是减少了对程序段的调入/调出,因此减少了对换数量。
D


29.操作系统实现( )存储管理的代价最小。
A.分区
B.分页
C.分段
D.段页式

实现分页、分段和段页式存储管理需要特定的数据结构支持,如页表、段表等。为了提高性能,还需要硬件提供快存和地址加法器等,代价高。分区存储管理是满足多道程序设计的最简单的存储管理方案,特别适合嵌入式等微型设备。
A


30.动态分区又称可变式分区,它是系统运行过程中( ) 动态建立的。
A.在作业装入时
B.在作业创建时
C.在作业完成时
D.在作业未装入时

动态分区时,在系统启动后,除操作系统占据一部分内存外,其余所有内存空间是-一个大空闲区,称为自由空间。若作业申请内存,则从空闲区中划出一个与作业需求量相适应的分区分配给该作业,将作业创建为进程,在作业运行完毕后,再收回释放的分区。
A


31.对外存对换区的管理以( )为主要目标。
A.提高系统吞吐量
B.提高存储空间的利用率
C.降低存储费用
D.提高换入、换出速度
操作系统在内存管理中为了提高内存的利用率,引入了覆盖和交换技术,即在较小的内存空
间中采用重复使用的方法来节省存储空间,但它付出的代价是需要消耗更多的处理器时间,因此
实际上是一种以时间换空间的技术。为此,从节省处理器时间来讲,换入、换出速度越快,付出
的时间代价就越小,反之就越大,大到一定程度时,覆盖和交换技术就没有意义。
D


32. [2017 统考真题]某计算机按字节编址,其动态分区内存管理采用最佳适应算法,每次分配和回收内存后都对空闲分区链重新排序。当前空闲分区信息如下表所示。

回收始址为60K、大小为140KB 的分区后,系统中空闲分区的数量、空闲分区链第一个分区的始址和大小分别是( )。
A.3, 20K, 380KB 
B.3, 500K, 80KB
C.4, 20K, 180KB
D. 4, 500K, 80KB
回收始址为60K、 大小为140KB 的分区时,它与表中第一个分区和第四个分区合并,成为始址为20K、大小为380KB的分区,剩余3个空闲分区。在回收内存后,算法会对空闲分区链按分区大小由小到大进行排序,表中的第二个分区排第一,所以选择B.


 在非虚拟存储器中,作业必须全部装入内存且在运行过程中也一直驻留内存; 在虚拟存储器
中,作业不必全部装入内存且在运行过程中也不用- -直驻留内存,这是虚拟存储器和非虚拟存储
器的主要区别之一。


 34.在页式存储管理中选择页面的大小,需要考虑下列( )因素。
I. 页面大的好处是页表比较少
II.页面小的好处是可以减少由内碎片引起的内存浪费
II.影响磁盘访问时间的主要因素通常不是页面大小,所以使用时优先考虑较大的页面.
A. I和III
B.II和III
C. I和II
D. I、II和III

页面大,用于管理页面的页表就少,但是页内碎片会比较大;页面小,用于管理页面的页表
就大,但是页内碎片小。通过适当的计算可以获得较佳的页面大小和较小的系统开销。
C


35.某个操作系统对内存的管理采用页式存储管理方法,所划分的页面大小( )。
A.要根据内存大小确定
B.必须相同
C.要根据CPU的地址结构确定
D.要依据外存和内存的大小确定
页式管理中很重要的一一个问题是页面大小如何确定。确定页面大小有很多因素,如进程的平均
大小、页表占用的长度等。而一-旦确定,所有的页面就是等长的(- -般取2的整数幂倍),以便易
于系统管理。
B


36.引入段式存储管理方式,主要是为了更好地满足用户的一系列要求。下面选项中不属于这一系列要求的是( )。
A.方便操作
B.方便编程
C.共享和保护
D.动态链接和增长
引入段式存储管理方式,主要是为了满足用户的下列要求:方便编程、分段共享、分段保护、动态链接和动态增长。.
A


38.对主存储器的访问,( )。 
A.以块(即页)或段为单位
B.以字节或字为单位
C.随存储器的管理方案不同而异
D.以用户的逻辑记录为单位
这里是指主存的访问,不是主存的分配。对主存的访问是以字节或字为单位的。例如,在页式管理中,不仅要知道块号,而且要知道页内偏移。
B


42.在段式分配中,CPU每次从内存中取一次数据需要( ) 次访问内存。
A.1
B. 3
C.2
D.. 4
在段式分配中,取一次数据时先从内存查找段表,再拼成物理地址后访问内存,共需要2次内存访问。
C


43.在段页式分配中,CPU每次从内存中取一次数据需要( ) 次访问内存。
A.1
B.3
C. 2
D.4
在段页式分配中,取一次数据时先从内存查找段表,再访问内存查找相应的页表,最后拼成物理地址后访间内存,共需要3次内存访间。
B


44. ( )存储管理方式提供一维地址结构。
A.分段
B.分页
C.分段和段页式
D.以上答案都不正确
分页存储管理中,作业地址空间是- -维的, 即单一的线性地址空间,程序员只需要一 个记忆符来表示地址。在分段存储分配管理中,段之间是独立的,而且段长不定长,而页长是固定的,因此作业地址空间是二维的,程序员在标识- -个地址时,既需给出段名,又需给出段内地址。简言之,确定一个地址需要几个参数,作业地址空间就是几维的。
B


45.操作系统采用分页存储管理方式,要求( )。
A.每个进程拥有一张页表,且进程的页表驻留在内存中
B.每个进程拥有一张页表,但只有执行进程的页表驻留在内存中
C.所有进程共享一张页表,以节约有限的内存空间,但页表必须驻留在内存中.
D.所有进程共享一张页表,只有页表中当前使用的页面必须驻留在内存中,以最大限度地节省有限的内存空间

在多个进程并发执行时,所有进程的页表大多数驻留在内存中,在系统中只设置一个页表寄存器(PTR),它存放页表在内存中的始址和长度。平时,进程未执行时,页表的始址和页表长度存放在本进程的PCB中,当调度到某进程时,才将这两个数据装入页表寄存器中。每个进程都有一个单独的逻辑地址,有- -张属于自己的页表。
A


47.在分段存储管理方式中,( )。
A.以段为单位,每段是一个连续存储区
B.段与段之间必定不连续
C.段与段之间必定连续
D.每段是等长的
在分段存储管理方式中,以段为单位进行分配,每段是一一个连续存储区,每段不一定等长, 段与段之间可连续,也可不连续。
A


48.段页式存储管理汲取了页式管理和段式管理的长处,其实现原理结合了页式和段式管理的基本思想,即( )。
A.用分段方法来分配和管理物理存储空间,用分页方法来管理用户地址空间
B.用分段方法来分配和管理用户地址空间,用分页方法来管理物理存储空间
C.用分段方法来分配和管理主存空间,用分页方法来管理辅存空间
D.用分段方法来分配和管理辅存空间,用分页方法来管理主存空间
段页式存储管理兼有页式管理和段式管理的优点,采用分段方法来分配和官理用尸地址空间,采用分页方法来管理物理存储空间。但它的开销要比段式和页式管理的开销大。
B


50.下列关于 页式存储的论述中,正确的是( )。
I. 在页式存储管理中,若关闭TLB, 则每当访问一条指令或存取一个操作数时都要访问2次内存
II.页式存储管理不会产生内部碎片
II.页式存储管理中的页面是为用户所感知的
IV.页式存储方式可以采用静态重定位
A. I、II、IV
B. 1、IV
C.仅I
D.全都正确
I正确:关闭TLB后,每当访问一条指令或存取- -个操作数时都要先访问页表(内存中),得到物理地址后,再访问一次内存进行相应操作。II 错误:记住,凡是分区固定的都会产生内部碎片,而无外部碎片。II 错误:页式存储管理对于用户是透明的。IV 错误:静态重定位是在程序运行之前由装配程序完成的,必须分配其要求的全部连续内存空间。而页式存储管理方案是将程序离散地分成若干页(块),从而可以将程序装入不连续的内存空间,显然静态重定位不能满足其要求。
D


51. [2010 统考真题]某计算机采用二级页表的分页存储管理方式,按字节编址,页大小为
2^10B,页表项大小为2B,逻辑地址结构为

逻辑地址空间大小为2^16 页,则表示整个逻辑地址空间的页目录表中包含表项的个数至少是( )。
A.64
B.128 .
C. 256
D.512

页大小为2^10B,页表项大小为2B,因此一页可以存放2^9个页表项,逻辑地址空间大小为2^16
页,即共需2^16个页表项,因此需要2^16/2^9=2^7= 128个页面保存页表项,即页目录表中包含表项的个数至少是128.


52. [2014统考真题] 现有一个容量为10GB 的磁盘分区,磁盘空间以簇为单位进行分配,簇的大小为4KB,若采用位图法管理该分区的空闲空间,即用一位标识一一个簇是否被分配,则存放该位图所需的簇为( ) 个。
A. 80
B.320
C. 80K
D.320K
簇的总数为10GB/4KB=2.5M,用一位标识一簇是否被分配,整个磁盘共需要2.5Mb,即需
要2.5M/8 = 320KB,因此共需要320KB/4KB= 80簇,选A。


53. [2014统考真题] 下列选项中,属于多级页表优点的是( )。
A.加快地址变换速度
B.减少缺页中断次数
C.减少页表项所占字节数
D.减少页表所占的连续内存空间
多级页表不仅不会加快地址的变换速度,还会因为增加更多的查表过程,使地址变换速度减慢;也不会减少缺页中断的次数,反而如果访问过程中多级的页表都不在内存中,会大大增加缺页的次数,并不会减少页表项所占的字节数,而多级页表能够减少页表所占的连续内存空间,即当频表太大时,将页表再分级,把每张页表控制在一页之内, 减少页表所占的连续内存空间,因此选D.


55. [2019统考真题] 在分段存储管理系统中,用共享段表描述所有被共享的段。若进程P
和P2共享段S,则下列叙述中,错误的是( )。
A.在物理内存中仅保存一份段S的内容
B.段S在P1和P2中应该具有相同的段号
C. P1和P2共享段S在共享段表中的段表项
D. P1和P2都不再使用段S时才回收段S所占的内存空间
段的共享是通过两个作业的段表中相应表项指向被共享的段的同一个物理副本米实现的,因.此在内存中仅保存一份段 s的内容,A正确。段S对于进程P1, P2来说,使用位置可能不同,所以在不同进程中的逻辑段号可能不同,B错误。段表项存放的是段的物理地址(包括段始址和段长度),对于共享段S来说物理地址唯一, C正确。为了保证进程可以顺利使用段S,段s必须确保在没有任何进程使用它(可在段表项中设置共享进程计数)后才能被删除,D正确。


56. [2019 统考真题]某计算机主存按字节编址,采用二级分页存储管理,地址结构如下:

 虚拟地址2050 1225H对应的页目录号、页号分别是( ).
A.081H,101H
B.081H,401H
C.201H,101H
D. 201H, 401H
题中给出的是十六进制地址,首先将它转化为二进制地址,然后用二进制地址去匹配题中对
应的地址结构。转换为二进制地址和地址结构的对应关系如下图所示

前10位、11-20位、21-32位分别对应页目录号、页号、页内偏移。把页目录号、页号单独拿出,转换为十六进制时缺少的位数在高位补零,0000 1000 0001, 0001 0000 0001分别对应081H,101H, 选项A正确。


 57. [2019统考真题]在下列动态分区分配算法中,最容易产生内存碎片的是( )。
A.首次适应算法
B.最坏适应算法
C.最佳适应算法
D.循环首次适应算法
最佳适应算法总是匹配与当前大小要求最接近的空闲分区,但是大多数情况下空闲分区的大小不可能完全和当前要求的大小相等,几乎每次分配内存都会产生很小的难以利用的内存块,所以最佳适应算法最容易产生最多的内存碎片,C正确。


1. 动态分区与固定分区分配方式相比,是否解决了碎片问题?
动态分区和固定分区分配方式相比,内存空间的利用率要高一一些。 但是,总会存在一些分散的较小空闲分区,即外部碎片,它们存在于已分配的分区之间,不能充分利用。可以采用拼接技术加以解决。固定分区分配方式存在内部碎片,而无外部碎片;动态分区分配方式存在外部碎片,无内部碎片。
 


3.2 虚拟内存管理 练习题

最佳置换算法(OPT, Optimal) :每次选择淘汰的页面将是以后永不使用,或者在最长时间内不再被
访问的页面,这样可以保证最低的缺页率。
最佳置换算法可以保证最低的缺页率,但实际上,只有在进程执行的过程中才能知道接下来会访问到的是哪个页面。操作系统无法提前预判页面访问序列。因此,最佳置换算法是无法实现的。

 

​ 

 


 4. [2011 统考真题]在缺页处理过程中,操作系统执行的操作可能是( )。
I. 修改页表
II. 磁盘I/O .
II.分配页框
A.仅I、II
B.仅II
C.仅II
D.I、II和III
缺页中断调入新页面,肯定要修改页表项和分配页框,所以,I、II可能发生,同时内存没有页面,需要从外存读入,会发生磁盘I/O

D


12. 在请求分页存储管理中,若采用FIFO页面洶汰算法, 则当可供分配的页帧数增加时,缺页中断的次数( )。
A.减少
B.增加
C.无影响.
D.可能增加也可能减少

请求分页存储管理中,若采用FIFO页面淘汰算法,可能会产生当驻留集增大时页故障数不减反增的Belady异常。然而,还有另外一种情况。例如,页面序列为1,2,3, 1,2,3,当页帧数为2时产生6次缺页中断,当页帧数为3时产生3次缺页中断。所以在请求分页存储管理中,若采用FIFO页面淘汰算法,则当可供分配的页帧数增加时,缺页中断的次数可能增加,也可能减少。

D


13. 设主存容量为1MB,外存容量为400MB, 计算机系统的地址寄存器有32位,那么虚拟存储器的最大容量是( )。 .
A.1MB
B.401MB
C. 1MB + 2^32MB
D.2^32B

虚拟存储器的最大容量是由计算机的地址结构决定的,与主存容量和外存容量没有必然的联系,其虚拟地址空间为2^32B。

D


16.导致LRU算法实现起来耗费高的原因是( )。
A.需要硬件的特殊支持
B.需要特殊的中 断处理程序
C.需要在页表中标明特殊的页类型
D.需要对所有的页进行排序
LRU算法需要对所有页最近一次被访问的时间进行记录,查找时间最久的进行替换,这涉及排序,对置换算法而言,开销太大。为此需要在页表项中增加LRU位,选项A可看作是“耗费高”这一结果,选项D才是造成选项A的原因。


19.虛拟存储管理系统的基础是程序的( )理论
A.动态性
B.虚拟性
C.局部性.
D.全局性
基于局部性原理:在程序装入时,不必将其全部读入内存,而只需将当前需要执行的部分页或段读入内存,就可让程序开始执行。在程序执行过程中,若需执行的指令或访问的数据尚未在内存(称为缺页或缺段)中,则由处理器通知操作系统将相应的页或段调入内存,然后继续执行程序。由于程序具有局部性,虚拟存储管理在扩充逻辑地址空间的同时,对程序执行时内存调换的代价很小。


21.请求分页存储管理的主要特点是( )。
A.消除了页内零头
B.扩充了内存
C.便于动态链接
D.便于信息共享
请求分页存储管理就是为了解决内存容量不足而使用的方法,它基于局部性原理实现了以时间换取空间的目的。它的主要特点自然是间接扩充了内存。.
B


24.在页面置换算法中,存在Belady现象的算法是( )。
A.最佳页面置换算法(OPT)
B.先进先出置换算法(FIFO )
C.最近最久未使用算法(LRU) .
D.最近未使用算法(NRU)
FIFO是队列类算法,有Belady 现象;选项C、D均为堆栈类算法,理论上可以证明不会出现Belady现象。
B

Belady异常- -一当为进程分配的物理块数增大时,缺页次数不减反增的异常现象。
只有FIFO算法会产生Belady异常。另外,FIFO算法虽然实现简单,但是该算法与进程实际运行时的规律不适应,因为先进入的页面也有可能最经常被访问。因此,算法性能差


25.页式虚拟存储管理的主要特点是( )。
A.不要求将作业装入主存的连续区域
B.不要求将作业同时全部装入主存的连续区域
C.不要求进行缺页中断处理
D.不要求进行页面置换

页式虚拟存储管理的主要特点是,不要求将作业同时全部装入主存的连续区域,一般只装入
10%~30%。不要求将作业装入主存连续区域是所有离散式存储管理(包括页式存储管理)的特点;页式虚拟存储管理需要进行缺页中断处理和页面置换。
B


26.提供虚拟存储技术的存储管理方法有( )。
A.动态分区存储管理
B.页式存储管理
C.请求段式存储管理
D.存储覆盖技术
虚拟存储技术是基于页或段从内存的调入调出实现的,需要有请求机制的支持。
C


31.测得某个采用按需调页策略的计算机系统的部分状态数据为: CPU 利用率为20%,用于交换空间的磁盘利用率为97.7%,其他设备的利用率为5%。由此判断系统出现异常,这种情况下()能提高系统性能。
A.安装一个更快的硬盘.
B.通过扩大硬盘容量增加交换空间
C.增加运行进程数
D.加内存条来增加物理空间容量
用于交换空间的磁盘利用率已达97.7%,其他设备的利用率为5%,CPU的利用率为20%,说明在任务作业不多的情况下交换操作非常频繁,因此判断物理内存严重短缺。
D


33. [2011 统考真题]当系统发生抖动时,可以采取的有效措施是( )。
I.撤销部分进程
II.增加磁盘交换区的容量
II.提高用户进程的优先级
A.仅I
B.仅II
C.仅III
D.仅I、II
在具有对换功能的操作系统中,通常把外存分为文件区和对换区。前者用于存放文件,后者用于存放从内存换出的进程。抖动现象是指刚刚被换出的页很快又要被访问,为此又要换出其他页,而该页又很快被访问,如此频繁地置换页面,以致大部分时间都花在页面置换上,导致系统性能下降。撤销部分进程可以减少所要用到的页面数,防止抖动。对换区大小和进程优先级都与抖动关。
A


37. [2015 统考真题]在请求分页系统中,页面分配策略与页面置换策略不能组合使用的是( )。
A.可变分配,全局置换
B.可变分配,局部置换
C.固定分配,全局置换.
D.固定分配,局部置换.
对各进程进行固定分配时页面数不变,不可能出现全局置换。而A、B、D是现代操作系统中常见的3种策略。
C


38. [2015统考真题]系统为某进程分配了4个页框,该进程已访问的页号序列为2,0,2, 9,3,4,2, 8,2,4,8,4,5。若进程要访问的下一页的页号为7,依据LRU算法,应淘汰页的页号是( )。
A.2
B.3
C.4
D. 8
可以采用书中常规的解法思路,也可以采用便捷法。对页号序列从后往前计数,直到数到4(页框数)个不同的数字为止,这个停止的数字就是要淘汰的页号(最近最久未使用的页),题中为页号2。
A


40. [2019统考真题]某系统采用LRU页置换算法和局部置换策略,若系统为进程P预分配了4个页框,进程P访问页号的序列为0, 1,2,7,0,5,3,5,0,2,7,6, 则进程访问上述页的过程中,产生页置换的总次数是( )。
A.3
B. 4
C.5
D. 6
最近最久未使用(LRU) 算法每次执行页面置换时会换出最近最久未使用过的页面。第-次
访问5页面时,会把最久未被使用的1页面换出,第一次访问3页面时,会把最久未访问的2页
面换出。具体的页面置换情况如下图所示。

需要注意的是,题中问的是页置换次数,而不是缺页次数,所以前4次缺页未换页的情况不
考虑在内,答案为5次,因此选C。
 


 29.已知系统为 32位实地址,采用48位虛拟地址,页面大小为4KB,页表项大小为8B。假设
系统使用纯页式存储,则要采用( )级页表,页内偏移( )位。
A.3,12
B.3,14
C. 4,12
D.4,14.

页面大小为4KB,因此页内偏移为12位。系统采用48位虚拟地址,因此虚页号48- 12=36位。采用多级页表时,最高级页表项不能超出一页大小;每页能容纳的页表项数为4KB/8B=512=2^9,36/9=4, 因此应采用4级页表,最高级页表项正好占据一页空间, 所以本题选择C。
 


36. [2016统考真题]某系统采用改进型CLOCK置换算法,页表项中字段A为访问位,M
为修改位。A=0表示页最近没有被访问,A=1表示页最近被访问过。M=0表示页未
被修改过,M=1表示页被修改过。按(A, M)所有可能的取值,将页分为(0, ), (1, ), (0,
1)和(1, 1)四类,则该算法淘汰页的次序为( )。
A. (0,0),(0, 1),(1,0),(1, 1)
B. (0, 0),(1, 0), (0, 1),(1,1)
C. (0, 0), (0, 1),(1, 1),(1,0)
D. (0,0),(1,1),(0, 1),(1,0)
A

简单的时钟置换算法仅考虑到一个页面最近是否被访问过。事实上,如果被淘汰的页面没有被修改过,就不需要执行I/O操作写回外存。只有被淘汰的页面被修改过时,才需要写回外存。
因此,除了考虑一个页面最近有没有被访问过之外,操作系统还应考虑页面有没有被修改过。在其他条件都相同时,应优先淘汰没有修改过的页面,避免/0操作。这就是改进型的时钟置换算法的思想。修改位=0,表示页面没有被修改过;修改位=1,表示页面被修改过。
为方便讨论,用(访问位,修改位)的形式表示各页面状态。如(1, 1)表示一个页面近期被访问过,
且被修改过。
 


第四章 文件管理

4.1 文件系统基础


4.1.1文件的概念

操作系统作为系统资源的管理者提供的功能有处理机管理、存储器管理、文件管理、设备管理

操作系统向上提供的几个最基本的功能:

  • 创建文件(create系统调用)
  • 删除文件(delete系统调用)
  • 读文件(read系统调用)
  • 写文件(write系统调用)
  • 打开文件(open系统调用)
  • 关闭文件(close系统调用)

操作系统以“块”为单位为文件分配存储空 间,因此即使一个文件大小只有10B,但它依 然需要占用 1KB 的磁盘块。外存中的数据读 入内存时同样以块为单位。

  • 文件的定义:一组有意义的信息的集合
  • 文件的属性:文件名、标识符、类型、位置、大小、保护信息...
  • 文件共享:使多个用户可以共享使用一个文件
  • 文件保护:如何保证不同的用户对文件有不同的操作权限

文件的基本操作

  • 创建文件(create系统调用)
  • 删除文件(delete系统调用)
  • 读文件(read系统调用)
  • 写文件(write系统调用)
  • 打开文件(open系统调用)
  • 关闭文件(close系统调用)

创建文件;

操作系统在处理 Create 系统调用时,主要做了两件 事:

1. 在外存中找到文件所需的空间(结合上小节学 习的空闲链表法、位示图、成组链接法等管理 策略,找到空闲空间)

2. 根据文件存放路径的信息找到该目录对应的目 录文件(此处就是 D:/Demo 目录),在目录中 创建该文件对应的目录项。目录项中包含了文 件名、文件在外存中的存放位置等信息。

删除文件;

操作系统在处理 Delete 系统调用时,主要做了几件 事:

1. 根据文件存放路径找到相应的目录文件,从目录中找到文件名对应的目录项。

2. 根据该目录项记录的文件在外存的存放位置、 文件大小等信息,回收文件占用的磁盘块。 (回收磁盘块时,根据空闲表法、空闲链表法、 位图法等管理策略的不同,需要做不同的处理)

3. 从目录表中删除文件对应的目录项。

打开文件;

操作系统在处理 open 系统调用时,主 要做了几件事:

1. 根据文件存放路径找到相应的目录 文件,从目录中找到文件名对应的 的目录项,并检查该用户是否有指 定的操作权限。

2. 将目录项复制到内存中的“打开文 件表”中。并将对应表目的编号返 回给用户。之后用户使用打开文件表的编号来指明要操作的文件。

  • 将目录项中的信息复制到内存中的打开文件表中,并将打开文件表的索引号返回给用户【打开文件时并不会把文件数据直接读入内存。“索引号”也称“文件描述符”
  • 打开文件之后,对文件的操作不再需要每次都查询目录,可以根据内存中的打开文件表进行操作
  • 每个进程有自己的打开文件表,系统中也有一张总的打开文件表
  • 进程打开文件表中特有的属性:读写指针、访问权限(只读?读写?)
  • 系统打开文件表中特有的属性︰打开计数器(有多少个进程打开了该文件)

关闭文件

操作系统在处理 Close 系统调用时,主要做了几件事:

1. 将进程的打开文件表相应表项删除

2. 回收分配给该文件的内存空间等资源

3. 系统打开文件表的打开计数器count 减1,若 count = 0,则删除对应表项。

读文件

根据读指针、读入数据量、内存位置将文件数据从外存读入内存
读/写文件”用“文件 描述符”即可指明文件, 不再需要用到“文件名”

写文件

根据写指针、写出数据量、内存位置将文件数据从内存写出外存


4.1.2 文件的逻辑结构

无结构文件(流式文件)
有结构文件(记录式文件)

  • 顺序文件
  • 索引文件
  • 索引顺序文件

无结构文件:文件内部的数据就是一系列二进制流或字符流组成。又称“流式文件”。如: Windows 操作系统中的 .txt 文件。

文件内部的数据其实就是一系 列字符流,没有明显的结构特 性。

有结构文件:由一组相似的记录组成,又称“记录式文件”。每条记录又若干个数据项组成。如: 数据库表文件。一般来说,每条记录有一个数据项可作为关键字(作为识别不同记录的ID)根据各条记录的长度(占用的存储空间)是否相等,又可分为定长记录和可变长记录两种。

顺序文件:文件中的记录一个接一个地顺序排列(逻辑上),记录可以是定长的或可变长的。各个记录在物理上可以顺序存储链式存储。

链式存储:无论是定长/同变长记录,都无法实现随机存取,每次只能从第一个记录开始依次往后查找。

顺序存储——可变长记录:无法实现实现随机存取,每次只能从第一个记录开始依次往后查找

顺序存储——定长记录:可实现随机存取。记录长度为L,则第i个记录存放的相对位置是i*L

  • 若采用串结构,无法快速找到某关键字对应的记录【串结构:记录之间的顺序与关键字无关,通常按照记录存储的时间决定记录的顺序】
  • 若采用顺序结构,可以快速找到某关键字对应的记录 (如折半查找)【顺序结构:记录之间的顺序按关键字顺序排列】

一般来说,考试题目中所说的“顺序文件”指的是物理上顺序存储的顺序文件。之 后的讲解中提到的顺序文件也默认如此。 可见,顺序文件的缺点增加/删除一个记 录比较困难(如果是串结构则相对简单)

索引文件

索引表本身是定长记录的顺序文件。因此可以快 速找到第 i 个记录对应的索引项。 可将关键字作为索引号内容,若按关键字顺序排 列,则还可以支持按照关键字折半查找。 每当要增加/删除一个记录时,需要对索引表进行 修改。由于索引文件有很快的检索速度,因此主要用于对信息处理的及时性要求比较高的场合。

可以用不同的数据项建立多个索引表。

若一个顺序文件有10000个记录,则根据关键字检索文件,只能从头开始顺序查找(这里指的并不是定长记 录、顺序结构 的顺序文件),平均须查找 5000 个记录。

若采用索引顺序文件结构,可把 10000 个记录分为 √10000 = 100 组,每组 100 个记录。则需要先顺序查找 索引表找到分组(共100个分组,因此索引表长度为 100,平均需要查 50 次),找到分组后,再在分组中 顺序查找记录(每个分组100 个记录,因此平均需要查 50 次)。可见,采用索引顺序文件结构后,平均查 找次数减少为 50+50 = 100 次。

同理,若文件共有 10^6个记录,则可分为 1000 个分组,每个分组 1000 个记录。根据关键字检索一个记录 平均需要查找 500+500 = 1000 次。

为了进一步提高检索效率,可以为顺序文件建立多级索引表。


4.1.3 目录结构

  • 单级目录结构
  • 两级目录结构
  • 多级目录结构(树形目录结构)
  • 无环图目录结构

文件控制块(FCB):用来存放控制文件需要的各种信息的数据结构,以实现按名存取。【FCB实现了文件名和文件之间的映射】

一个FCB就是一个文件目录项。 FCB 中包含了文件的基本信息(文件名、物理地址、逻辑结构、物 理结构等),存取控制信息(是否可读/可写、禁止访问的用户名 单等),使用信息(如文件的建立时间、修改时间等)。

一个文件对应一个FCB,一个FCB就是一个目录项,多个FCB组成文件目录

  • 搜索:当用户要使用一个文件时,系统要根据文件名搜索目录,找到该文件对应的目录项
  • 创建文件:创建一个新文件时,需要在其所属的目录中增加一个目录项
  • 删除文件:当删除一个文件时,需要在目录中删除相应的目录项
  • 显示目录:用户可以请求显示目录的内容,如显示该目录中的所有文件及相应属性
  • 修改目录:某些文件属性保存在目录中,因此这些属性变化时需要修改相应的目录项(如:文件重命名)

索引结点(FCB的改进)

其实在查找各级目录的过程中 只需要用到“文件名”这个信 息,只有文件名匹配时,才需要读出文件的其他信息。因此 可以考虑让目录表“瘦身”来 提升效率。

索引结点 (包含除了文件名之 外的文件描述信息)

假设一个FCB是64B,磁盘块的大 小为1KB,则每个盘块中只能存放 16个FCB。若一个文件目录中共有 640个目录项,则共需要占用 640/16 = 40 个盘块。因此按照某 文件名检索该目录,平均需要查 询320 个目录项,平均需要启动磁 盘20次(每次磁盘I/O读入一块)。{320???哪来的疑惑,悲伤大(灬ꈍ ꈍ灬),今天冷的头疼。。。。。。}

若使用索引结点机制,文件名占14B,索引结点指针站2B,则每 个盘块可存放64个目录项,那么按文件名检索目录平均只需要 读入 320/64 = 5 个磁盘块。显然,这将大大提升文件检索速度。

当找到文件名对应的目录项时,才需要将索引结点调入内存,索引结点中记录了文件的各种信息,包括 文件在外存中的存放位置,根据“存放位置”即可找到文件。

存放在外存中的索引结点称为“磁盘索引结点”,当索引结点放入内存后称为“内存索引结点”。 相比之下内存索引结点中需要增加一些信息,比如:文件是否被修改、此时有几个进程正在访问该文件 等。

  • 除了文件名之外的所有信息都放到索引结点中,每个文件对应一个索引结点
  • 目录项中只包含文件名、索引结点指针,因此每个目录项的长度大幅减小
  • 由于目录项长度减小,因此每个磁盘块可以存放更多个目录项,因此检索文件时磁盘IO的次数就少了很多
     

目录结构——单级目录结构

早期操作系统并不支持多级目录,整个系统中只建立一张目录表,每个文件占一个目录项

单级目录实现了“按名存取”,但是不允许文件重名。

在创建一个文件时,需要先检查目录表中有没有重名文件,确定不重名后才能允许建立文件,并将新文件 对应的目录项插入目录表中。

显然,单级目录结构不适用于多用户操作系统

目录结构——两级目录结构

早期的多用户操作系统,采用两级目录结构。分为主文件目录(MFD,Master File Directory)和用户文件目录(UFD,User Flie Directory)。

不能对文件进行分类

目录结构——多级目录结构

 用户(或用户进程)要访问某个文件时要用文件路径名标识文件,文件路径名是个字符串。各级目录之间 用“/”隔开。从根目录出发的路径称为绝对路径。例如:自拍.jpg 的绝对路径是 “/照片/2015-08/自 拍.jpg”

每次都从根目录开始查找,是很低效的。因此可以设置一个“当前目录”。例如,此时已经打开了“照片” 的目录文件,也就是说,这张目录表已调入内存,那么可以把它设置为“当前目录”。当用户想要访问某 个文件时,可以使用从当前目录出发的“相对路径” 。 在 Linux 中,“.”表示当前目录,因此如果“照片”是当前目录,则”自拍.jpg”的相对路径为: “./2015-08/自拍.jpg”。

树形目录结构可以很方便地对文件进行分类,层次结构清晰,也能够更有效地进行文件的管理和保护。但 是,树形结构不便于实现文件的共享。为此,提出了“无环图目录结构”。

目录结构——无环图目录结构

 可以用不同的文件名指向同一个文件,甚至可以指向同一个目录(共享同一目录下的所有内容)。

需要为每个共享结点设置一个共享计数器,用于记录此时有多少个地方在共享该结点。用户提出删除结点的请求时,只是删除该用户的FCB、并使共享计数器减1,并不会直接删除共享结点。 只有共享计数器减为0时,才删除结点

注意:共享文件不同于复制文件。在共享文件中,由于各用户指向的是同一个文件,因此只要其中一个用户修改了文件数据,那么所有用户都可以看到文件数据的变化。


4.1.4 文件共享

  • 基于索引结点的共享方式(硬链接)
  • 基于符号链的共享方式(软链接)

基于索引结点的共享方式(硬链接)

索引结点,是一种文件目录瘦身策略。由于检索文件时只需用到文件名,因此可以将除 了文件名之外的其他信息放到索引结点中。这样目录项就只需要包含文件名、索引结点指针。

索引结点中设置一个链接计数变量 count,用于表示链接到本索引结点上的用户目录项数。 若 count = 2,说明此时有两个用户目录项链接到该索引结点上,或者说是有两个用户在共享此文件。 若某个用户决定“删除”该文件,则只是要把用户目录中与该文件对应的目录项删除,且索引结点的 count值减 1。

若 count>0,说明还有别的用户要使用该文件,暂时不能把文件数据删除,否则会导致指针悬空。

当 count = 0 时系统负责删除文件。

基于符号链的共享方式(软链接)

类似于Windows下文件的快捷方式

  • 在一个Link 型的文件中记录共享文件的存放路径【Link 类型的文件,记 录了文件1的存放路径 “C:/User1/aaa”。 类似于 Windows 操作 系统的“快捷方式”】
  • 操作系统根据路径一层层查找目录,最终找到共享文件
  • 即使软链接指向的共享文件已被删除,Link 型文件依然存在,只是通过Link型文件中的路径去查找共享文件会失败(找不到对应目录项)
  • 由于用软链接的方式访问共享文件时要查询多级目录,会有多次磁盘I/O,因此用软链接访问共享文件的速度要比硬链接更慢

4.1.5 文件保护

  • 口令保护
  • 加密保护
  • 访问控制

口令保护

为文件设置一个“口令”(如:abc112233),用户请求访问该文件时必须提供“口令”。

口令一般存放在文件对应的 FCB 或索 引结点中。用户访问文件前需要先输 入“口令”,操作系统会将用户提供 的口令与FCB中存储的口令进行对比, 如果正确,则允许该用户访问文件

优点:保存口令的空间开销不多,验证口令的时间开销也很小。

缺点:正确的“口令”存放在系统内部,不够安全。

加密保护

使用某个“密码”对文件进行加密,在访问文件时需要提供正确的“密码”才能对文件进行正确的解密。

优点:保密性强,不需要在系统中存储“密码”

缺点:编码/译码,或者说加密/解密要花费一定时间。

访问控制

在每个文件的FCB(或索引结点)中增加一个访问控制列表(Access-Control List, ACL),该表中记 录了各个用户可以对该文件执行哪些操作

  • 读:从文件中读数据
  • 写:向文件中写数据
  • 执行:将文件装入内存并执行
  • 添加:将新信息添加到文件结尾部分
  • 删除︰删除文件,释放空间
  • 列表清单:列出文件名和文件属性

 实现灵活,可以实现复杂的文件保护功能


4.2 文件系统实现


4.2.1 文件系统层次结构

用户接口:文件系统需要向上层的用户提供 一些简单易用的功能接口。这层 就是用于处理用户发出的系统调 用请求(Read、Write、Open、 Close 等系统调用)

文件目录系统:用户是通过文件路径来访问文件的, 因此这一层需要根据用户给出的文件 路径找到相应的FCB或索引结点。所有 和目录、目录项相关的管理工作都在 本层完成,如:管理活跃的文件目录 表、管理打开文件表等

存取控制模块:为了保证文件数据的安全,还需要验 证用户是否有访问权限。这一层主要 完成了文件保护相关功能。

逻辑文件系统与 文件信息缓冲区:用户指明想要访问文件记录号, 这一层需要将记录号转换为对应 的逻辑地址

物理文件系统:这一层需要把上一层提供的文件逻 辑地址转换为实际的物理地址

辅助分配模块:负责文件存储空间的管理, 即负责分配和回收存储空间

设备管理模块:直接与硬件交互,负责和硬件直接相关的一些管理工作。如:分配设备、分配设备缓冲区、磁盘调度、启动设备、释放设备等

用一个例子来辅助记忆文件系统的层次结构:
假设某用户请求删除文件“D:/工作目录/学生信息..xlsx”的最后100条记录。
1.用户需要通过操作系统提供的接口发出上述请求——用户接口
2. 由于用户提供的是文件的存放路径,因此需要操作系统一层一层地查找目录,找到对应的目录项――文件目录系统
3.不同的用户对文件有不同的操作权限,因此为了保证安全,需要检查用户是否有访问权限——存取控制模块(存取控制验证层)
4.验证了用户的访问权限之后,需要把用户提供的“记录号”转变为对应的逻辑地址――逻辑文件系统与文件信息缓冲区
5.知道了目标记录对应的逻辑地址后,还需要转换成实际的物理地址――物理文件系统

6.要删除这条记录,必定要对磁盘设备发出请求――设备管理程序模块
7.删除这些记录后,会有一些盘块空闲,因此要将这些空闲盘块回收――辅助分配模块
 


4.2.3 文件实现

文件的物理结构(文件分配方式)——文件数据应该怎么样存放在外存中

  • 连续分配
  • 链接分配【隐式链接、显式链接】
  • 索引分配
     

文件块【磁盘块】:

类似于内存分页,磁盘中的存储单元也会被分为一个个“块/磁盘块/物理 块”。很多操作系统中,磁盘块的大小与内存块、页面的大小相同

  • 内存与磁盘之间的数据交换(即 读/写操作、磁盘I/O)都是以 “块”为单位进行的。即每次读 入一块,或每次写出一块

于是文件的逻辑地址也可以表示为(逻辑块号,块内地址)的形式。

文件分配方式——连续分配

连续分配方式要求每个文件在磁盘上占有一组连续的块。

用户给出要访问的逻辑块号,操作系统 找到该文件对应的目录项(FCB)…

物理块号 = 起始块号 + 逻辑块号

当然,还需要检查用户提供的逻辑块号是否合法(逻辑块号 ≥ 长度 就不合法)

读取某个磁盘块时,需要移动磁头。访问的两个磁 盘块相隔越远,移动磁头所需时间就越长。所以,连续分配的文件在顺序读/写时速度最快

 若此时文件A要拓展,需要再增加一个磁盘块(总共 需要连续的4个磁盘块)。 由于采用连续结构,因此 文件A占用的磁盘块必须是 连续的。 因此只能将文件A全部“迁 移”到绿色区域。 结论:物理上采用连续分配的文件不方便拓展。

  • 优点:支持顺序访问和直接访问(即随机访问);连续分配的文件在顺序访问时速度最快
  • 缺点:不方便文件拓展;存储空间利用率低,会产生磁盘碎片

链接分配采取离散分配的方式,可以为文件分配离散的磁盘块。分为隐式链接显式链接两种。 考试题目中遇到未指明隐式/显式的“链接 分配”,默认指的是隐式链接的链接分配

 文件分配方式——链接分配——隐式链接

隐式链接——除文件的最后一个盘块之外,每个盘块中都存有指向下一个盘块的指针。文件目录包括文件第一块的指针和最后一块的指针。

  用户给出要访问的逻辑块号 i,操作系统找到该文件对应的目录项(FCB)…

从目录项中找到起始块号(即0号块),将0 号逻辑块读入内存,由此知道1号逻辑块存 放的物理块号,于是读入1号逻辑块,再找到2号逻辑块的存放位置……以此类推。 因此,读入i号逻辑块,总共需要 i+1 次磁盘 I/O。

采用链式分配(隐式链接)方式的文件,只支持顺序访问,不支持随机访问,查找效率低。另外,指向下一个盘块的指针也需要耗费少量的存储空间。

  • 优点:很方便文件拓展,所有的空闲磁盘块都可以被利用不会有碎片问题,外存利用率高。
  • 缺点:只支持顺序访问,不支持随机访问,查找效率低,指向下一个盘块的指针也需要耗费少量 的存储空间

文件分配方式——链接分配——显式链接

把用于链接文件各物理块的指针显式地存放在一张表中。即 文件分配 表(FAT,File Allocation Table)

 

假设某个新创建的文件“aaa”依次存放在磁盘块2>5>0>1
假设某个新创建的文件“bbb”依次存放在磁盘块4>23>3
注意:一个磁盘仅设置一张FAT开机时,将FAT读入内存,并常驻内存。FAT的各个表项在物理上连续存储,且每一个表项长度相同,因此“物理块号”字段可以是隐含的。

用户给出要访问的逻辑块号 i,操作系统找到该文件对应的目录项 (FCB)…

从目录项中找到起始块号,若i>0,则查询内存中的文件分配表FAT, 往后找到 i 号逻辑块对应的物理块号。逻辑块号转换成物理块号的过程不需要读磁盘操作。

结论:采用链式分配(显式链接)方式的文件,支持顺序访问,也支持随机访问(想访问 i 号逻辑块时,并不需要依次访问之前的 0 ~ i-1 号逻辑块),由于块号转换的过程不需要访问磁盘,因此相比于隐式链接来说,访问速度快很多。

显然,显式链接也不会产生外部碎片,也可以很方便地对文件进行拓展。

  • 优点:很方便文件拓展,不会有碎片问题,外存利用率高,并且支持随机访问。相比于隐式链接来说,地址转换时不需要访问磁盘,因此文件的访问效率更高。
  • 缺点:文件分配表的需要占用一定的存储空间。

文件分配方式——索引分配

索引分配允许文件离散地分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文 件的各个逻辑块对应的物理块(索引表的功能类似于内存管理中的页表——建立逻辑页面到物理页之间 的映射关系)。索引表存放的磁盘块称为索引块。文件数据存放的磁盘块称为数据块

假设某个新创建的文件“aaa”的数 据依次存放在磁盘块 2 ->5 ->13 ->9 。

7号磁盘块作为“aaa”的索引块, 索引块中保存了索引表的内容。

注:在显式链接的链式分配方式中,文件分配表FAT 是一个磁盘对应一张。而索引分配方式中,索引表是一个文件对应一张。

可以用固定的长度表示物理块号(如: 假设磁盘总容量为1TB=2^40B,磁盘块大小为1KB,则共有 2^30个磁盘块,则可用 4B表示磁盘块号【4B又咋来的?完犊子脑壳子又卡了,该吃饭了,好饿啊。。。】),因此,索引表中 的“逻辑块号”可以是隐含的。

用户给出要访问的逻辑块号 i,操作系统找 到该文件对应的目录项(FCB)…

从目录项中可知索引表存放位置,将索引表 从外存读入内存,并查找索引表即可只 i 号 逻辑块在外存中的存放位置。

可见,索引分配方式可以支持随机访问。 文件拓展也很容易实现(只需要给文件分配 一个空闲块,并增加一个索引表项即可) 但是索引表需要占用一定的存储空间

若每个磁盘块1KB,一个索 引表项4B,则一个磁盘块只 能存放 256 个索引项。如果一个文件的大小超过了256 块,那么一个磁盘块是装不下 文件的整张索引表的,如何解 决这个问题?

  • 链接方案:如果索引表太大,一个索引块装不下,那么可以将多个索引块链接起来存放。缺点:若文 件很大,索引表很长,就需要将很多个索引块链接起来。想要找到 i 号索引块,必须先依次读入 0~i-1 号索引块,这就导致磁盘I/O次数过多,查找效率低下。
  • 多层索引:建立多层索引(原理类似于多级页表)。使第一层索引块指向第二层的索引块。还可根据文件大小的要求再建立第三层、第四层索引块。采用 K 层索引结构,且顶级索引表未调入内存,则访问 一个数据块只需要 K + 1 次读磁盘操作。缺点:即使是小文件,访问一个数据块依然需要K+1次读磁盘。
  • 混合索引:多种索引分配方式的结合。例如,一个文件的顶级索引表中,既包含直接地址索引(直接 指向数据块),又包含一级间接索引(指向单层索引表)、还包含两级间接索引(指向两层索引表) 。 优点:对于小文件来说,访问一个数据块所需的读磁盘次数更少。

文件存储空间管理

安装 Windows 操作系统的时候,一个必经步骤是——为磁盘分区(C: 盘、D: 盘、E: 盘等)

  • 存储空间的划分:将物理磁盘划分 为一个个文件卷(逻辑卷、逻辑盘:C盘、D盘等)
  • 目录区主要存放文件目录信息(FCB)、用 于磁盘存储空 间管理的信息
  • 文件区用于存放 文件数据
  • 存储空间的初始化: 将各个文件卷划分 为目录区、文件区

存储空间管理——空闲表法

适用于 “连续分配方式”

如何分配磁盘块:与内存管理中的动态分区分配很类似,为一个文件 分配连续的存储空间。同样可采用首次适应、最佳适应、最坏适应等 算法来决定要为文件分配哪个区间。

 如何回收磁盘块:与内存管理中的动态分区分配很类似,当回收某个 存储区时需要有四种情况——①回收区的前后都没有相邻空闲区;② 回收区的前后都是空闲区;③回收区前面是空闲区;④回收区后面是 空闲区。总之,回收时需要注意表项的合并问题。

存储空间管理——空闲链表法

空闲盘块链:以盘块为单位组成一条空闲链
空闲盘区链:以盘区为单位组成—条空闲链

 

 空闲链表法:操作系统保存着链头、链尾指针。

如何分配:若某文件申请 K 个盘块,则从链头开始依次摘 下 K 个盘块分配,并修改空闲链的链头指针。

如何回收:回收的盘块依次挂到链尾,并修改空闲链的链 尾指针。

适用于离散分配的物理结构。为文件分配多个盘块时可能要重复多次操作


空闲链表法:操作系统保存着链头、链尾指针。

如何分配:若某文件申请 K 个盘块,则可以采用首次适应、最佳适应等算法,从链头开始检索, 按照算法规则找到一个大小符合要求的空闲盘区, 分配给文件。若没有合适的连续空闲块,也可以将不同盘区的盘块同时分配给一个文件,注意分配后可能要修改相应的链指针、盘区大小等数据。

如何回收:若回收区和某个空闲盘区相邻,则需要将回收区合并到空闲盘区中。若回收区没有和任何空闲区相邻,将回收区作为单独的一个空闲 盘区挂到链尾。

 离散分配、连续分配都适用。为一 个文件分配多个盘块时效率更高

存储空间管理——位示图法

位示图:每个二进制位对应一个盘块。在本例中,“0”代表盘块空闲, “1”代表盘块已分配。位示图一般用连续的“字”来表示。

如本例中一 个字的字长是16位,字中的每一位对应一个盘块。因此可以用(字号,位 号)对应一个盘块号。当然有的题目中也描述为(行号,列号)

注意题目条件:盘块号、字号、位号到底是从0开始还是从1开始 如本例中盘块号、字号、位号从0开始

(字号, 位号)=(i, j) 的二进制位对应的 盘块号 b = ni + j

b号盘块对应的字号 i = b/n,位号 j = b%n

如何分配:若文件需要K个块,①顺序扫描位示图,找到K个相邻或不相邻的“0”;②根据字号、位号算出对应的盘块号,将相应盘块分配给文件; ③将相应位设置为“1”。

如何回收:①根据回收的盘块号计算出对应的字号、位号;②将相应二进 制位设为“0”

存储空间管理——成组链接法

空闲表法、空闲链表法不适用于大型文件系统,因为空闲表或空闲链表可能过大。

UNIX系统中采用了成组链接法对磁盘空闲块进行管理。

文件卷的目录区中专门用一个磁盘块作为“超级块”,当系统启动时需要将超级块读入内存。并且要保证内存与外存中的“超级块”数据一致。

其大致思想是:把顺序的n个空闲扇区地址保存在第一个空闲扇区内,其后的一个空闲扇区内则保存另一顺序空闲扇区的地址,如此继续,直至所有空闲扇区均予以链接,系统只需要保存一个指向第一个空闲扇区的指针。通过这种方式可以迅速找到大批空闲块地址。

假设磁盘最初全为空闲扇区

4.3 磁盘组织管理


4.3.1 磁盘的结构

磁盘:磁盘的表面由一些磁性物质组成,可以用这些磁性物质来记录二进制数据

如何在磁盘中读/写数据

 
磁头移动到目标位置,盘片旋转,对应扇区划过磁道才能完成读/写

盘面、柱面的概念

 

磁盘有多个盘片“摞"起来,每个盘片有两个盘面

所有盘面中相对位置相同的磁道组成柱面

磁盘的物理地址
 
(柱面号,盘面号,扇区号)



磁盘的分类

 

根据磁头是否可移动

根据盘片是否可更换

固定头磁盘(每个磁道有一个磁头)

移动头磁盘(每个盘面只有一个磁头)

固定盘磁盘
可换盘磁盘


4.3.2 磁盘调度算法

寻找时间(寻道时间)Ts【启动磁臂,移动磁头所花的时间】:在读/写数据前,将磁头移动到指定磁道所花的时间——磁盘调度算法影响的指标
①启动磁头臂是需要时间的。假设耗时为s;
②移动磁头也是需要时间的。假设磁头匀速移动,每跨越一个磁道耗时为m,总共需要跨越n条磁道。则:
寻道时间Ts =s + m*n

延迟时间TR【将目标扇区转到磁头下面所花的时间】:通过旋转磁盘,使磁头定位到目标扇区所需要的时间。设磁盘转速为 r (单位:转/秒,或 转/分),则 平均所需的延迟时间 TR = (1/2)*(1/r) = 1/2r

  • 1/r 就是转一圈需要的时间。找到目标 扇区平均需要转半圈,因此再乘以 1/2
  • 硬盘的典型转速为 5400 转/分,或 7200 转/分

传输时间Tt【读/写数据花费的时间】:从磁盘读出或向磁盘写入数据所经历的时间,假设磁盘转速为 r,此次读/写的字节数为 b,每个磁道上的字节数为 N。则: 传输时间Tt = (1/r) * (b/N) = b/(rN)

  • 每个磁道要可存 N 字节的数据,因此 b 字节的数据需 要 b/N 个磁道才能存储。而读/写一个磁道所需的时间 刚好又是转一圈所需要的时间 1/r

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

总的平均存取时间 Ta = Ts + 1/2r + b/(rN)

减少延迟时间的方法


交替编号

假设要连续读取橙色区域的 2、3、4扇区:

 磁头读取一块的内容(也就是一个扇区的内容)后,需要一小段时间处理,而盘片又在不停地旋转

因此,如果2、3号扇区相邻着排列,则读完2号扇区后无法连续不断地读入3号扇区

必须等盘片继续旋转, 3号扇区再次划过磁头,才能完成扇区读入

结论:磁头读入一个扇区数据后需要一小段时间处理, 如果逻辑上相邻的扇区在物理上也相邻,则读入几个连 续的逻辑扇区,可能需要很长的“延迟时间”

若采用交替编号的策略,即让逻辑上相邻的扇区在物理上有一定 的间隔,可以使读取连续的逻辑扇区所需要的延迟时间更小。


磁盘地址结构的设计

假设某磁盘有8个柱面/磁道(假设最内侧柱面/磁道号为0 ), 4个盘面,8个扇区。则可用3个二进制位表示柱面,2个二进 制位表示盘面,3个二进制位表示扇区。

若物理地址结构是(盘面号,柱面号,扇区号),且需要连续读取物理地址 (00, 000, 000)~(00, 001, 111)的扇区: (00, 000, 000) ~( 00, 000, 111 ) 转两圈可读完之后再读取物理地址相邻的区域,即 (00, 001, 000) ~( 00, 001, 111 ),需要启动磁头臂,将磁头移动到下一个磁道

若物理地址结构是(柱面号,盘面号,扇区号),且需要连 续读取物理地址 (000, 00, 000)~(000, 01, 111)的扇区: (000, 00, 000) ~( 000, 00, 111 ) 由盘面0的磁头读入数据 之后再读取物理地址相邻的区域,即 (000, 01, 000) ~( 000, 01, 111 ),由于柱面号/磁道号相同, 只是盘面号不同,因此不需要移动磁头臂。只需要激活相邻 盘面的磁头即可。可以减少磁头移动消耗的时间。


错位命名

方案一: 若相邻的盘 面相对位置相同处扇 区编号相同【注意:所有盘面都 是一起连轴转的】

读取完磁盘块(000, 00, 111)之后,需要 短暂的时间处理,而 盘面又在不停地转动, 因此当(000, 01, 000) 第一次划过1号盘面的 磁头下方时,并不能 读取数据,只能再等 该扇区再次划过磁头。

 方案二:错位命名

 由于采用错位命名法, 因此读取完磁盘块 (000, 00, 111)之后, 还有一段时间处理, 当(000, 01, 000) 第一次划过1号盘面的 磁头下方时,就可以 直接读取数据。从而 减少了延迟时间


先来先服务算法(FCFS)

根据进程请求访问磁盘的先后顺序进行调度。

优点:公平;如果请求访问的磁道比较集中的话,算法性能还算过的去

缺点:如果有大量进程竞争使用磁盘,请求访问的磁道很分散,则FCFS在性能上很差,寻道时间长。

最短寻找时间优先(SSTF)

SSTF 算法会优先处理的磁道是与当前磁头最近的磁道。可以保证每次的寻道时间最短,但是并不能保证总的寻道时间最短。(其实就是贪心算法的思想,只是选择眼前最优,但是总体未必最优)

优点:性能较好,平均寻道时间短

缺点:可能产生“饥饿”现象

扫描算法(SCAN)

SSTF 算法会产生饥饿的原因在于:磁头有可能在一个小区域内来回来去地移动。为了防止这个问题, 可以规定,只有磁头移动到最外侧磁道的时候才能往内移动,移动到最内侧磁道的时候才能往外移 动。这就是扫描算法(SCAN)的思想。由于磁头移动的方式很像电梯,因此也叫电梯算法

优点:性能较好,平均寻道时间较短,不会产生饥饿现象

缺点:①只有到达最边上的磁道时才能改变磁头移动方向,事实上,处理了184号磁道的访问请 求之后就不需要再往右移动磁头了。

②SCAN算法对于各个位置磁道的响应频率不平均(如:假设此时磁头正在往右移动,且刚处理过 90号磁道,那么下次处理90号磁道的请求就需要等磁头移动很长一段距离;而响应了184号磁道 的请求之后,很快又可以再次响应 184 号磁道的请求了)

LOOK 调度算法——SCAN算法的改进

扫描算法(SCAN)中,只有到达最边上的磁道时才能改变磁头移动方向,事实上,处理了184号磁 道的访问请求之后就不需要再往右移动磁头了。LOOK 调度算法就是为了解决这个问题,如果在磁头移动方向上已经没有别的请求,就可以立即改变磁头移动方向。(边移动边观察,因此叫 LOOK)

优点:比起 SCAN 算法来,不需要每次都移动到最外侧或最内侧才改变磁头方向,使寻道时间进 一步缩短

循环扫描算法(C-SCAN)

SCAN算法对于各个位置磁道的响应频率不平均,而 C-SCAN 算法就是为了解决这个问题。规定只有 磁头朝某个特定方向移动时才处理磁道访问请求,而返回时直接快速移动至起始端而不处理任何请 求。

优点:比起SCAN 来,对于各个位置磁道的响应频率很平均。

缺点:只有到达最边上的磁道时才能改变磁头移动方向,事实上,处理了184号磁道的访问请求 之后就不需要再往右移动磁头了;并且,磁头返回时其实只需要返回到18号磁道即可,不需要返 回到最边缘的磁道。另外,比起SCAN算法来,平均寻道时间更长。

C-LOOK 调度算法——C-SCAN算法的改进

C-SCAN 算法的主要缺点是只有到达最边上的磁道时才能改变磁头移动方向,并且磁头返回时不一定 需要返回到最边缘的磁道上。C-LOOK 算法就是为了解决这个问题。如果磁头移动的方向上已经没有 磁道访问请求了,就可以立即让磁头返回,并且磁头只需要返回到有磁道访问请求的位置即可。

优点:比起 C-SCAN 算法来,不需要每次都移动到最外侧或最内侧才改变磁头方向,使寻道时间 进一步缩短


4.3.3 磁盘的管理

  • 磁盘初始化
  • 引导块
  • 坏块的管理

磁盘初始化

磁盘初始化:

Step 1:进行低级格式化(物理格式化),将磁盘的各个磁道 划分为扇区。一个扇区通常可分为 头、数据区域(如512B大 小)、尾 三个部分组成。管理扇区所需要的各种数据结构一般 存放在头、尾两个部分,包括扇区校验码(如奇偶校验、CRC 循环冗余校验码等,校验码用于校验扇区中的数据是否发生错 误)

Step 2:将磁盘分区,每个分区由若干柱面组成(即分为我们 熟悉的 C盘、D盘、E盘) Step 3:进行逻辑格式化,创建文件系统。包括创建文件系统 的根目录、初始化存储空间管理所用的数据结构(如 位示图、 空闲分区表)

引导块

计算机开机时需要进行一系列 初始化的工作,这些初始化工 作是通过执行初始化程序(自 举程序)完成的

完整的自举程序放在磁盘的启动块(即引导块 /启动分区)上,启动块位于磁盘的固定位置。

拥有启动分区的磁 盘称为启动磁盘或 系统磁盘(C:盘)

初始化程序可以放在ROM (只读存储 器)中。ROM中的数据在出厂时就写 入了,并且以后不能再修改。

ROM中只存放很小的“自举装入程序”

开机时计算机先运行“自举装入程序”,通过执行该程序就可 找到引导块,并将完整的“自举程序”读入内存,完成初始化

坏块的管理

坏了、无法正常使用的扇区就是 “坏块”。这属于硬件故障,操作 系统是无法修复的。应该将坏块标 记出来,以免错误地使用到它

对于简单的磁盘,可以在逻辑格式化时(建立文件系统 时)对整个磁盘进行坏块检查,标明哪些扇区是坏扇区, 比如:在 FAT 表上标明。(在这种方式中,坏块对操作系统不透明

对于复杂的磁盘,磁盘控制器(磁盘设备内部的一个硬件部件)会维护一个坏块链表。

在磁盘出厂前进行低级格式化(物理格式化)时就将坏块链进行初始化。

会保留一些“备用扇区”,用于替换坏块。这种方案称 为扇区备用。且这种处理方式中,坏块对操作系统透明。


第四章 练习题

4.1 文件系统基础 练习题

3.从用户的观点看,操作系统中引入文件系统的目的是( ).
A.保护用户数据
B.实现对文件的按名存取
C.实现虚拟存储
D.保存用户和系统文档及数据
从系统角度看,文件系统负责对文件的存储空间进行组织、分配,负责文件的存储并对存入文件进行保护、检索。从用户角度看,文件系统根据一定的格 式将用户的文件存放到文件存储器中适当的地方,当用户需要使用文件时,系统根据用户所给的文件名能够从文件存储器中找到所需要的文件。
B


5. 打开文件操作的主要工作是( ) .
A.把指定文件的目录复制到内存指定的区域
B.把指定文件复制到内存指定的区域
C.在指定文件所在的存储介质上找到指定文件的目录
D.在内存寻找指定的文件
打开文件操作是将该文件的FCB存入内存的活跃文件目录表,而不是将文件内容复制到主存,找到指定文件目录是打开文件之前的操作。
A


6. UNIX 操作系统中,输入/输出设备视为( ) 。
A.普通文件
B.目录文件
C.索引文件
D.特殊文件

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


7.下列说法中,()属于文件的逻辑结构的范畴。
A.连续文件
B系统文件
C.链接文件.
D.流式文件
逻辑文件有两种:无结构文件(流式文件)和有结构式文件。连续文件和链接文件都属于文件的物理结构,而系统文件是按文件用途分类的。
D


8. 文件的逻辑结构是为了方便( )而设计的。
A.存储介质特性
B.操作系统的管理方式
C.主存容量
D.用户
文件结构包括逻辑结构和物理结构。逻辑结构是用户组织数据的结构形式,数据组织形式来自需求,而物理结构是操作系统组织物理存储块的结构形式。
因此说,逻辑文件的组织形式取决于用户,物理结构的选择取决于文件系统设计者针对硬件结构(如磁带介质很难实现链接结构和索引结构)所采取的策略(即A和B选项)。
D


11. 有一个顺序文件含有10000 条记录,平均查找的记录数为5000个,采用索引顺序文件
结构,则最好情况下平均只需查找( ) 次记录。
A.1000
B.10000
C.100
D.500

最好的情况是有√10000= 100组,每组有100条记录,因此顺序查找时平均查找记录个数=50 + 50= 100。
C


12. [2012 统考真题]若一个用户进程通过read系统调用读取一个磁盘文件中的数据,则
下列关于此过程的叙述中,正确的是( ) 。
I若该文件的数据不在内存,则该进程进入睡眠等待状态
II. 请求read系统调用会导致CPU从用户态切换到核心态
II. read 系统调用的参数应包含文件的名称
A.仅I、II
B.仅I、II
C.仅II、II
D. I、II和III

对于I,当所读文件的数据不在内存时,产生中断(缺页中断),原进程进入阻塞态,直到所需数据从外存调入内存后,才将该进程唤醒。对于II, read 系统调用通过陷入将CPU从用户态切换到核心态,从而获取操作系统提供的服务。对于II,要读一一个文件,首先要用open系统调用打开该文件。open 中的参数包含文件的路径名与文件名,而read只需使用open返回的文件描述符,并不使用文件名作为参数。read 要求用户提供三个输入参数:①文件描述符fd; ②buf缓冲区首址;③传送的字节数n。read 的功能是试图从fd所指示的文件中读入n个字节的数据,并将它们送至由指针buf所指示的缓冲区中。
A


13. [2013统考真题]用户在删除某文件的过程中,操作系统不可能执行的操作是( )。
A.删除此文件所在的目录
B.删除与此文件关联的目录项
C.删除与此文件对应的文件控制块
D.释放与此文件关联的内存缓冲区
此文件所在目录下可能还存在其他文件,因此删除文件时不能(也不需要)删除文件所在的目录,而与此文件关联的目录项和文件控制块需要随着文件- -同删除, 同时释放文件关联的内存缓冲区。
A


17. 文件系统采用多级目录结构的目的是( )。
A.减少系统开销
B.节省存储空间
C.解决命名冲突
D.缩短传送时间
在文件系统中采用多级目录结构后,符合了多层次管理的需要,提高了文件查找的速度,还允许用户建立同名文件。因此,多级目录结构的采用解决了命名冲突。
C


19. UNIX 操作系统中,文件的索引结构放在( ) 。
A.超级块
B.索引结点
C.目录项
D.空闲块

UNIX采用树形目录结构,文件信息存放在索引结点中。超级块是用来描述文件系统的,具体可参见本章的4.4节。
B


20.操作系统为保证未经文件拥有者授权,任何其他用户不能使用该文件,所提供的解决方法是()。
A.文件保护.
B.文件保密.
C.文件转储
D.文件共享

文件保护是针对文件访问权限的保护

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

访问控制是可以使用复杂的访问方法,缺点是长度无法预计并且可能导致复杂的空间管理,使用精简的访问列表可以解决这个问题。

口令指用户在建立一个文件时提供一一个口令,系统为其建立FCB时附上相应口令,同时告诉允许共享该文件的其他用户。用户请求访问时必须提供相应的口令。这种方法时间和空间的开销不多,缺点是口令直接存在系统内部,不够安全。
密码指用户对文件进行加密,文件被访问时需要使用密钥。这种方法保密性强,节省了存储空间,不过编码和译码要花费一定 的时间。
口令和密码都是防止用户文件被他人存取或窃取,并没有控制用户对文件的访问类型。
注意两个问题:
1)现代操作系统常用的文件保护方法是,将访问控制列表与用户、组和其他成员访问控制方案一起组合使用。
2)对于多级目录结构而言,不仅需要保护单个文件,而且需要保护子目录内的文件,即需要提供目录保护机制。目录操作与文件操作并不相同,因此需要不同的保护机制。
A


21. [2009 统考真题]设文件F1的当前引用计数值为1,先建立文件F1的符号链接(软链接)文件F2,再建立文件F1的硬链接文件F3,然后删除文件F1.此时,文件F2和文件F3的引用计数值分别是( )。
A.0,1
B.1,1
C. 1,2
D. 2,1
建立符号链接时,引用计数值直接复制:建立硬链接时。引用计数值加1。删除文件时,删除操作对于符号链接是不可见的,这并不影响文件系统,当以后再通过符号链接访问时,发现文件不存在,直接删除符号链接;但对于硬链接则不可直接删除,引用计数值减1,若值不为0,则不能删除此文件,因为还有其他硬链接指向此文件。
当建立F2时,F1和F2的引用计数值都为1。当再建立F3时,F1和F3的引用计数值就都变成了2。当后来删除F1时,F3 的引用计数值为2-1=1, F2的引用计数值变。
B


26.为了对文件系统中的文件进行安全管理,任何一个用户在进入系统时都必须进行注册,这一级安全管理是( )。
A.系统级
B.目录级
C.用户级
D.文件級
系统级安全管理包括注册和登录。另外,通过“进入系统时”这个关键词也可推测出正确答案。
A


28. [2017 统考真题]某文件系统中,针对每个文件,用户类别分为4类:安全管理员、文
件主、文件主的伙伴、其他用户;访问权限分为5种:完全控制、执行、修改、读取、
写入。若文件控制块中用二进制位串表示文件权限,为表示不同类别用户对一个文件的
访问权限,则描述文件权限的位数至少应为( ) .
A.5
B. 9
C.12
D.20

可以把用户访问权限抽象为-一个矩阵,行代表用户,列代表访问权限。这个矩阵有4行5列,1代表true,0代表false,所以需要20位,选D。


29.下面的说法中,错误的是()。
I. 一个文件在同一系统中、不同的存储介质上的复制文件,应采用同一种物理结构
II.对一个文件的访问,常由用户访问权限和用户优先级共同限制
II.文件系统采用树形目录结构后,对于不同用户的文件,其文件名应该不同
IV.为防止系统故障造成系统内文件受损,常采用存取控制矩阵方法保护文件
A. II
B. I、III
C.I、I、IV
D.全选

I错误:一个文件存放在磁带中时,通常采用连续存放方法,文件在硬盘上一般不采用连续存放方法,不同的文件系统存放的方法是不一样的。
II错误:对一个文件的访问,常由用户访问权限和文件属性共同限制。用户优先级与用户是否有权限访问这个文件没有相关关系。
II错误:文件系统采用树形目录结构后,对于不同用户的文件,其文件名可以不同,也可以相同。
IV错误:防止受损常采用备份的方法保护文件,而存取控制矩阵的方法用于多用户之间的存取权限保护。
D


30. [2018统考真题] 下列优化方法中,可以提高文件访问速度的是( ) .
I. 提前读
II.为文件分配连续的簇
II.延迟写
IV.采用磁盘高速缓存
A.仅I、II
B.仅II、III
C.仅I、II、IV
D. I、II、II、IV
II和IV显然均能提高文件访问速度。对于I,提前读是指在读当前盘块时,将下一个可能要访问的盘块数据读入缓冲区,以便需要时直接从缓冲区中读取,提高了文件的访问速度。对于II,延迟写是指先将数据写入缓冲区,并置上“延迟写”标志,以备不久之后访问,当缓冲区需要再次被分配出去时,才将缓冲区数据写入磁盘,减少了访问磁盘的次数,提高了文件的访问速度,III也正确,答案选D。
D


24.对一个文件的访问,常由( )共同限制。
A.用户访问权限和文件属性
B.用户访问权限和用户优先级
C.优先级和文件属性
D.文件属性和口令
对于这道题,只要能区分用户的访问权限和用户优先级,就能得到正确的答案。用户访问权限是指用户有没有权限访问该文件,而用户优先级是指在多个用户同时请求该文件时应该先满足谁。比如,图书馆的用户排队借一本书,某用户可能有更高的优先级,即他排在队伍的前面,但有可能轮到他时被告知他没有借阅那本书的权限。
文件的属性包括保存在FCB中对文件访问的控制信息。
A


4.2 文件系统实现 练习题

2. 【2010统考真题】设文件索引结点中有7个地址项,其中4个地址项是直接地址索引,2个地址项是一级间接地址索引,1个地址项是二级间接地址索引,每个地址项大小为4B,若磁盘索引块和磁盘数据块大小均为256B,则可表示的单个文件最大长度是( ).

A.33KB
B. 519KB
c. 1057KB
D.16516KB

每个磁盘索引块和磁盘数据块大小均为256B,每个磁盘索引块有256/4=64个地址项。因此,4个直接地址索引指向的数据块大小为4×256B;2个一级间接索引包含的直接地址索引数为2×(256/4),即其指向的数据块大小为2×(256/4)×256B。1个二级间接索引所包含的直接地址索引数为(256/4)×(256/4),即其所指向的数据块大小为(256/4)×(256/4)×256B。因此,7个地址项所指向的数据块总大小为4×256+2×(256/4)×256+(256/4)×(256/4)×256 = 1082368B=1057KB。

C


3.以下不适合直接存取的外存分配方式是() 。
A.连续分配
B.链接分配
c.索引分配
D.以上答案都适合
直接存取即随机存取,采用连续分配和索引分配的文件都适合于直接存取方式,只有采用链接分配的文件不具有随机存取特性。
B


6.文件系统中若文件的物理结构采用连续结构,则FCB中有关文件的物理位置的信息应包括( )

I.首块地址
I.文件长度
1I.索引表地址
A.仅I
B. I、II
c. I、III
D. I、IMI
在连续分配方式中,为了使系统能找到文件存放的地址,应在目录项的“文件物理地址”字段中,记录该文件第一条记录所在的盘块号和文件长度(以盘块数进行计量)。
B


10.文件系统采用两级索引分配方式。若每个磁盘块的大小为1KB,每个盘块号占4B,则该系统中,单个文件的最大长度是( )。
A.64MB
B. 128MB
c. 32MB
D.以上答案都不对
每个磁盘块中最多有1KB/4B = 256个索引项,则两级索引分配方式下单个文件的最大长度为256×256×1KB=64MB。
A


11. 【2013统考真题】若某文件系统索引结点( inode)中有直接地址项和间接地址项,则
下列选项中,与单个文件长度无关的因素是()。
A.索引结点的总数
B.间接地址索引的级数
C.地址项的个数
D.文件块大小

A


12.一个文件系统中,其FCB占64B,一个盘块大小为1KB,采用一级目录。假定文件目
录中有3200个目录项。则查找一个文件平均需要()次访问磁盘。
A. 50
B. 54
c. 100
D. 200

3200个目录项占用的盘块数为3200×64B/1KB = 200个。因为一级目录平均访盘次数为1/2盘块数(顺序查找目录表中的所有目录项,每个目录项为一个FCB),所以平均的访问磁盘次数为200/2 = 100次。
C


13.下列关于目录检索的论述中,正确的是( )。
A.由于散列法具有较快的检索速度,因此现代操作系统中都用它来替代传统的顺序检索方法
B.在利用顺序检索法时,对树形目录应采用文件的路径名,且应从根目录开始逐级
检索
C.在利用顺序检索法时,只要路径名的一个分量名未找到,就应停止查找

D.利用顺序检索法查找完成后,即可得到文件的物理地址

选项A中的方法不利于对文件顺序检索,也不利于文件枚举,一般采用线性检索法;选项B中,为了加快文件查找速度,可以设立当前目录,于是文件路径可从当前目录进行查找;选项D中,在顺序检索法查找完成后,得到的是文件的逻辑地址。
C


14.文件的存储空间管理实质上是对()的组织和管理。
A.文件目录
B.外存已占用区域
c.外存空闲区
D.文件控制块

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


15.若用8个字(字长32位)组成的位示图管理内存,假定用户归还一个块号为100的内
存块时,它对应位示图的位置为()。
A.字号为3,位号为5
B.字号为4,位号为4
c.字号为3,位号为4
D.字号为4,位号为5
块号为100的内存块回收时,其对应的位示图行号row和列号col分别为
row = (100-1) DIV 32+1=4
col= (100-1) MOD 32+1= 4
即字号为4,位号也为4。
B

Div :
为整除,div 运算只取商的整数部分,它要求除数和被除数均为整型,其运算结果也为整型。

如:10 div 2 = 5,10 div 3 = 3,-15 div 4 = -3。

mod: 
为求余,只能用于整数运算,结果也为整数。

如:10 mod 4 = 2,-17 mod 4 = -1,4 mod (-3) = 1,即 a mod b = a - (a div b)
原文链接:https://blog.csdn.net/qq_30715329/article/details/79363849


16.设有一个记录文件,采用链接分配方式,逻辑记录的固定长度为100B,在磁盘上存储时采用记录成组分解技术。盘块长度为512B。若该文件的目录项已经读入内存,则对第22个逻辑记录完成修改后,共启动了磁盘()次。
A. 3
B.4
c. 5
D. 6
第22个逻辑记录对应4(22×100/512= 4,余152)个物理块,即读入第5个物理块,由于文件采用的物理结构是链接文件,因此需要从目录项所指的第一个物理块开始读取,依次读到第4块才得到第5块的物理地址,共启动磁盘5次。修改还需要写回操作,由于写回时已获得该块的物理地址,只需1次访问磁盘,因此共需要启动磁盘6次。
D


18.文件系统为每个文件创建一张( ),存放文件数据块的磁盘存放位置。
A.打开文件表
B.位图
c.索引表
D.空闲盘块链表

打开文件表仅存放已打开文件信息的表,将指名文件的属性从外存复制到内存,再使用该文件时直接返回索引,A错误。位图和空闲盘块链表是磁盘管理方法,B、D错误。只有索引表中记录每个文件所存放的盘块地址,C正确。
C


19.下面关于索引文件的论述中,正确的是( )。
A.索引文件中,索引表的每个表项中含有相应记录的关键字和存放该记录的物理地址

B,顺序文件进行检索时,首先从FCB中读出文件的第一个盘块号;而对索引文件进行检索时,应先从FCB中读出文件索引块的开始地址
c.对于-个具有三级宗引的文件,存取一条记录通常要访问三次磁盘

D.文件较大时,无论是进行顺序存取还是进行随机存取,通常索引文件方式都最快
索引表的表项中存放有该记录的逻辑地址;三级索引需要访问4次磁盘;随机存取时索引文件速度快,顺序存取时顺序存取文件速度快。
B


20. 【2015统考真题】在文件的索引结点中存放直接索引指针10个,一级和二级索引指针
各1个。磁盘块大小为 1KB,每个索引指针占4B。若某文件的索引结点已在内存中,则把该文件偏移量(按字节编址)为1234和307400处所在的磁盘块读入内存,需访问的磁盘块个数分别是( )。
A. 1,2
B. 1,3
c. 2,3
D. 2,4

10个直接索引指针指向的数据块大小为10×1KB= 10KB。每个索引指针占4B,则每个磁盘块可存放1KB/4B= 256个索引指针,一级索引指针指向的数据块大小为256×1KB = 256KB,二级索引指针指向的数据块大小为256×256×1KB=216KB=64MB。
按字节编址,偏移量为1234时,因1234B<10KB,由直接索引指针可得到其所在的磁盘块地址。文件的索引结点已在内存中,因此地址可直接得到,因此仅需1次访盘即可。
偏移量为307400时,因10KB +256KB<307400B<64MB,可知该偏移量的内容在二级索引指针所指向的某个磁盘块中,索引结点已在内存中,因此先访盘2次得到文件所在的磁盘块地址,再访盘1次即可读出内容,共需3次访盘。
B


21.【2015统考真题】文件系统用位图法表示磁盘空间的分配情况,位图存于磁盘的32~127号块中,每个盘块占1024B,盘块和块内字节均从О开始编号。假设要释放的盘块号为409612,则位图中要修改的位所在的盘块号和块内字节序号分别是()。
A. 81,1
B. 81,2
c. 82,1
D. 82,2

盘块号=起始块号+L盘块号/(1024×8)]= 32+L409612/(1024×8)]=32+50=82,这里问的是块内字节号而不是位号,因此还需除以8(1B=8位),块内字节号=L(盘块号%(1024×8))/8]=1。
C


22.【2019统考真题】下列选项中,可用于文件系统管理空闲磁盘块的数据结构是( ).
I、位图II.索引结点I1.空闲磁盘块链IV.文件分配表(FAT )
A.仅I、II
B.仅I、III、IV

c.仅I、II
D.仅II、III、IV

传统文件系统管理空闲磁盘的方法包括空闲表法、空闲链表法、位示图法和成组链接法,I、IⅢ正确。文件分配表(FAT)的表项与物理磁盘块一一对应,并且可以用一个特殊的数字-1表示文件的最后一块,用-2表示这个磁盘块是空闲的(当然,规定用-3, -4来表示也是可行的)。因此文件分配表(FAT)不仅记录了文件中各个块的先后链接关系,同时还标记了空闲的磁盘块,操作系统可以通过FAT对文件存储空间进行管理,TⅣ 正确。索引结点是操作系统为了实现文件名与文件信息分开而设计的数据结构,存储了文件描述信息,索引结点属于文件目录管理部分的内容,I错误。
B


4.3 磁盘组织与管理 练习题

3.既可以随机访问又可顺序访问的有()。
I光盘
II.磁带
III.U盘
IV.磁盘
A.II、M、IV
B. I、I、IV
C.III、IV
D.仅IV
顺序访问按从前到后的顺序对数据进行读写操作,如磁带。随机访问,即直接访问,可以按任意的次序对数据进行读写操作,如光盘、磁盘、U盘等。
B


8.下列算法中,用于磁盘调度的是( ) .
A.时间片轮转调度算法.
B. LRU算法
C.最短寻找时间优先算法
D.优先级高者优先算法
选项A是进程调度算法;选项B是页面淘汰算法;选项D可以用于进程调度和作业调度。只有选项C是磁盘调度算法。

C

(1)先来先服务(First Come First Served, FCFS)算法
(2)最短寻找时间优先( Shortest Seek Time First, SSTF)算法
(3)扫描(SCAN)算法(又称电梯调度算法)


(4)循环扫描( Circular SCAN, C-SCAN)算法


 11.已知某磁盘的平均转速为r秒1转,平均寻找时间为T秒,每个磁道可以存储的字节数为
N,现向该磁盘读写b字节的数据,采用随机寻道的方法,每道的所有扇区组成一个簇,
其平均访问时间是( ) .
A. (r+ T)b/N
B. b/NT
C. (b/N+ T)r
D. bT/N+r

将每道的所有扇区组成一个簇, 意味着可以将- - 个磁道的所有存储空间组织成一个数据块组,这样有利于提高存储速度。读写磁盘时,磁头首先找到磁道,称为寻道,然后才可以将信息从磁道里读出或写入。读写完- -个磁道后, 磁头会继续寻找下一个磁道,完成剩余的工作,所以在随机寻道的情况下,读写- -个磁道的时间要包括寻道时间和读写磁道时间,即T+ r秒。由于总的数据量是b字节,它要占用的磁道数为b/N个,所以总平均读写时间为(r+ T)/N秒。
A


12.设磁盘的转速为3000转/分,盘面划分为10 个扇区,则读取-一个扇区的时间为( )。
A.20ms
B.5ms
C.2ms .
D.1ms

访问每条磁道的时间为60/3000s=0.02s=20ms,即磁盘旋转--圈的时间为20ms,每个盘面10个扇区,因此读取- -个扇区的时间为20ms/10 = 2ms。
C


13. -一个磁盘的转速为7200转/分,每个磁道有160个扇区,每扇区有512B, 那么理想情况
下,其数据传输率为( )。
A.7200x 160KB/s
B.7200KB/s
C.9600KB/s
D.19200KB/s
磁盘的转速为7200转/分= 120 转/秒,转-圈经过160个扇区,每个扇区为512B,所以数据传输率= 120x 160x512/1024KB/s = 9600KB/s。
C


16.假定磁带的记录密度为400字符/英寸(1in = 0.0254m),每条逻辑记录为80字符,块间隙为0.4英寸,现有3000个逻辑记录需要存储,存储这些记录需要长度为( ) 的磁带,磁带利用率是()。
A.1500 英寸,33.3%
B. 1500英寸,43.5%
C.1800 英寸,33.3%
D. 1800英寸,43.5%
一个逻辑记录所占的磁带长度为80/400= 0.2英寸,因此存储3000条逻辑记录需要的磁带长度为(0.2 + 0.4)x3000= 1800英寸,利用率为0.2/(0.2+ 0.4)= 33.3%。
C


18. [2017 统考真题]下列选项中,磁盘逻辑格式化程序所做的工作是( )。
I. 对磁盘进行分区
II.建立文件系统的根目录
II.确定磁盘扇区校验码所占位数
IV.对保存空闲磁盘块信息的数据结构进行初始化
A.仅II
B.仅II、IV
C.仅II、IV
D.仅I、II、IV

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


19.[2018统考真题]系统总是访问磁盘的某个磁道而不响应对其他磁道的访问请求,这种
现象称为磁臂黏着。下列磁盘调度算法中,不会导致磁臂黏着的是( )。
A.先来先服务(FCFS)
B.最短寻道时间优先(SSTF )
C.扫描算法(SCAN) 
D.循环扫描算法(CSCAN )

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


20. [2017 统考真题]某文件系统的簇和磁盘扇区大小分别为1KB和512B.若一个文件的
大小为1026B, 则系统分配给该文件的磁盘空间大小是( )。
A.1026B
B. 1536B
C.1538B
D.2048B
绝大多数操作系统为改善磁盘访问时间,以簇为单位进行空间分配,因此答案选D。
 


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

5.1 I/O管理概述

 

​值得注意的小细节:①-个I/O控制器可能会对应多个设备;
②数据寄存器、控制寄存器、状态寄存器可能有多个(如:每个控制/状态寄存器对应-一个具体
的设备),且这些寄存器都要有相应的地址,才能方便CPU操作。有的计算机会让这些寄存器占
用内存地址的一部分,称为内存映像I/O;另一些计算机则采用1/0专用地址,即寄存器独立编址。
 

 

5.1.2 I/O控制方式

 

程序直接控制方式

中断驱动方式

引入中断机制。由于I/0设备速度很慢,因此在CPU发 出读/写命令后,可将等待I/O的进程阻塞,先切换到别的进程执行。当I/0完成后,控制器会向CPU发出一个中断信号,CPU检测到中断信号后,会保存当前进程的运行环境信息,转去执行中断处理程序处理该中断。处理中断的过程中,CPU从I/O控制器读一个字的数据传送到CPU寄存器,再写入主存。接着,CPU恢复等待I/O的进
程(或其他进程)的运行环境,然后继续执行。

注意:①CPU会在每个指令周期的末尾检查中断;.
②中断处理过程中需要保存、恢复进程的运行环境,这个过程是需要一定时间开销的。可见,如果中断发生的频率太高,也会降低系统性能。

DMA方式

与“中断驱动方式”相比,DMA方式( Direct Memory Access,直接存储器存取。主要用于块设备的
I/0控制)有这样几个改进:
数据的传送单位是“块”。不再是-一个字、一个字的传送;
②数据的流向是从设备直接放入内存,或者从内存直接到设备。不再需要CPU作为“快递小哥”。
③仅在传送一个或 多个数据块的开始和结束时,才需要CPU干预。

​DR (Data Register,数据寄存器) :暂存从设备到内存,或从内存到设备的数据。
MAR (Memory Address Register, 内存地址寄存器) :在输入时,MAR表示数据应放到内存中的什么位置;输出时MAR表示要输出的数据放在内存中的什么位置。
DC (Data Counter,数据计数器) :表示剩余要读/写的字节数。
CR ( Command Register,命令/状态寄存器) :用于存放CPU发来的I/0命令,或设备的状态信息。

 

通道控制方式

​ 

​ 5.1 I/O管理概述练习题


1.以下关于设备属性的叙述中,正确的是( )。
A.字符设备的基本特征是可寻址到字节,即能指定输入的源地址或输出的目标地址
B.共享设备必须是可寻址的和可随机访问的设备
C.共享设备是指同一时间内允许多个进程同时访问的设备
D.在分配共享设备和独占设备时都可能引起进程死锁

可寻址是块设备的基本特征,A选项不正确:共享设备是指一段时间内允许多个进程同时访问的设备,因此C选项不正确。分配共享设备是不会引起进程死锁的,D选项不正确。
B


2.虚拟设备是指( )。.
A.允许用户使用比系统中具有的物理设备更多的设备
B.允许用户以标准化方式来使用物理设备
C.把一个物理设备变换成多个对应的逻辑设备
D.允许用户程序不必全部装入主存便可使用系统中的设备

通过虚拟技术将一台独占设备虚拟成多台逻辑设备,供多个进程同时使用, 通常把这种经过虚拟的设备称为虚拟设备。虚拟存储的发展借鉴了计算机领域里很多成功的设计思想,从虚存、磁盘技术、RAID到IBM的大型机等的设计思想中都汲取了许多成功的经验。

C


3.磁盘设备的I/O控制主要采取( ) 方式。
A.位
B.字节
C.帧
D. DMA

DMA方式主要用于块设备,磁盘是典型的块设备。这道题也要求读者了解什么是I/O控制方式,A、B、C显然都不是I/O控制方式。.
D


4. 为了便于上层软件的编制,设备控制器通常需要提供( )。
A.控制寄存器、状态寄存器和控制命令
B.I/O地址寄存器、工作方式状态寄存器和控制命令
C.中断寄存器、控制寄存器和控制命令
D.控制寄存器、编程空间和控制逻辑寄存器

中断寄存器位于计算机主机;不存在IO地址寄存器;编程空间--般是由体系结构和操作系统共同决定的。控制寄存器和状态寄存器分别用于接收上层发来的命令并存放设备状态信号,是设备控制器与上层的接口;至于控制命令,每种设备对应的设备控制器都对应一-组相应的控制命令,CPU通过控制命令控制设备控制器。
A


5.在设备控制器中用于实现设备控制功能的是( )。
A. CPU
B.设备控制器与处理器的接口
C. I/O逻辑
D.设备控制器与设备的接口
接口用来传输信号,I/O 逻辑即设备控制器,用来实现对设备的控制。
C


 6.在设备管理中,设备映射表(DMT)的作用是( )。
A.管理物理设备
B.管理逻辑设备
C.实现输入/輸出
D.建立逻辑设备与物理设备的对应关系

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

D


7. DMA方式是在( )之间建立一条直接数据通路。
A. IO 设备和主存
B.两个I/O设备
C. IO 设备和CPU
D. CPU和主存

DMA是一种不经过CPU而直接从主存存取数据的数据交换模式,它在I/O设备和主存之间建立了一条直接数据通路,如磁盘。当然,这条数据通路只是逻辑上的,实际并未直接建立一条物理线路,而通常是通过总线进行的。
A


8.通道又称I/O处理机,它用于实现()之间的信息传输。
A.内存与外设
B. CPU与外设
C.内存与外存
D. CPU与外存

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


9.在操作系统中,( ) 指的是一种硬件机制。
A.通道技术
B.缓冲池
C. SPOOLing 技术
D.内存覆盖技术

通道是一种特殊的处理器 ,所以属于硬件技术。SPOOLing、 缓冲池、内存覆盖都是在内存的基础上通过软件实现的。
A


10. 若I/O设备与存储设备进行数据交换不经过CPU來完成,则这种数据交换方式是( )。
A.程序查询
B.中断方式
C. DMA方式
D.无条件存取方式.

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


11.计算机系统中,不属于DMA控制器的是( )。
A.命令/状态寄存器
B.内存地址寄存器
C.数据寄存器
D.堆栈指针寄存器

命令/状态寄存器控制DMA的工作模式并给CPU反映它当前的状态,地址寄存器存放DMA作业时的源地址和目标地址,数据寄存器存放要DMA转移的数据,只有堆栈指针寄存器不需要在DMA控制器中存放。
D


12. ( )用作连接大量的低速或中速I/O设备。
A.数据选择通道.
B.字节多路通道.
C.数据多路通道
D. I/O 处理机

字节多路通道,它通常含有许多非分配型子通道,其数量可达几十到几百个,每个通道连接
一台IO设备,并控制该设备的IO操作。这些子通道按时间片轮转方式共享主通道。各个通道
循环使用主通道,各个通道每次完成其IO设备的一个字节的交换,然后让出主通道的使用权。
这样,只要字节多路通道扫描每个子通道的速率足够快,而连接到子通道上的设备的速率不太高
时,便不至于丢失信息。
B


13. 在下列问题中,( )不是设备分配中应考虑的问题。
A.及时性
B.设备的固有属性
C.设备独立性
D.安全性
设备的固有属性决定了设备的使用方式;设备独立性可以提高设备分配的灵活性和设备的利用率;设备安全性可以保证分配设备时不会导致永久阻塞。设备分配时一般不需要考虑及时性。
A


14.将系统中的每台设备按某种原则统一进行编号,这些编号作为区分硬件和识别设备的代号,该编号称为设备的( )。
A.绝对号
B.相对号
C.类型号
D.符号

计算机系统为每台设备确定-一个编号以便区分和识别设备,这个确定的编号称为设备的绝对号。
A


15.关于通道、设备控制器和设备之间的关系,以下叙述中正确的是( )。
A.设备控制器和通道可以分别控制设备
B.对于同一组输入/输出命令,设备控制器、通道和设备可以并行工作
C.通道控制设备控制器、设备控制器控制设备工作
D.以上答案都不对
三者的控制关系是层层递进的,只有C选项正确。
C


17. [2010 统考真题]本地用户通过键盘登录系统时,首先获得键盘输入信息的程序是( )。
A.命令解释程序
B.中断处理程序
C.系统调用服务程序
D.用户登录程序
键盘是典型的通过中断I/O方式工作的外设,当用户输入信息时,计算机响应中断并通过中
断处理程序获得输入信息
B


19. 一个计算机系统配置了2台绘图机和3台打印机,为了正确驱动这些设备,系统应该提
供( )个设备驱动程序。
A. 5
B.3
C. 2
D.1

因为绘图机和打印机属于两种不同类型的设备,系统只要按设备类型配置设备驱动程序即可,即每类设备只需一个设备驱动程序
C


20.将系统调用参数翻译成设备操作命令的工作由( ) 完成。
A.用户层I/O
B.设备无关的操作系统软件
C.中断处理
D.设备驱动程序

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


21. [2017 统考真题]系统将数据从磁盘读到内存的过程包括以下操作:
①DMA控制器发出中断请求
②初始化DMA控制器并启动磁盘.
③从磁盘传输一块数据到内存缓冲区
④执行“DMA结束”中断服务程序
正确的执行顺序是( )。
A.③→①→②→④
B.②+③→①→④
C.②→①→③→④
D.①→②→④→③.

在开始DMA传输时,主机向内存写入DMA命令块,向DMA控制器写入该命令块的地址,启动I/O设备。然后,CPU继续其他工作,DMA控制器则继续直接操作内存总线,将地址放到总线上开始传输。整个传输完成后,DMA控制器中断CPU。因此执行顺序是2,3,1,4,选B。
B


22. [2011 统考真题]用户程序发出磁盘I/O请求后,系统的正确处理流程是( )。
A.用户程序→系统调用处理程序→中断处理程序→设备驱动程序
B.用户程序一系统调用处理程序一设备驱动程序→中断处理程序
C.用户程序一设备驱动程序- >系统调用处理程序→中断处理程序
D.用户程序一设备驱动程序一中断处理程序→系统调用处理程序

输入/输出软件一般从.上到下分为4个层次:用户层、与设备无关的软件层、设备驱动程序及中断处理程序。与设备无关的软件层也就是系统调用的处理程序。
当用户使用设备时,首先在用户程序中发起一次系统调用,操作系统的内核接到该调用请求后,请求调用处理程序进行处理,再转到相应的设备驱动程序,当设备准备好或所需数据到达后,.设备硬件发出中断,将数据按上述调用顺序逆向回传到用户程序中。
B


23. [2012 统考真题]操作系统的I/O子系统通常由4个层次组成,每层明确定义了与邻近
层次的接口,其合理的层次组织排列顺序是( )。
A.用户级I/O软件、设备无关软件、设备驱动程序、中断处理程序
B.用户级I/O软件、设备无关软件、中断处理程序、设备驱动程序
C.用户级IO软件、设备驱动程序、设备无关软件、中断处理程序
D.用户级I/O软件、中断处理程序、设备无关软件、设备驱动程序

A


24. [2013 统考真题]用户程序发出磁盘I0请求后,系统的处理流程是:用户程序→系统
调用处理程序一设备驱动程序一中断处理程序。其中,计算数据所在磁盘的柱面号、磁
头号、扇区号的程序是( )。
A.用户程序
B.系统调用处理程序
C.设备驱动程序.
D.中断处理程序
计算磁盘号、磁头号和扇区号的工作是由设备驱动程序完成的。题中的功能因设备硬件的不
同而不同,因此应由厂家提供的设备驱动程序实现。
C


25.一个典型的文本打印页面有50行,每行80个字符,假定一台标准的打印机每分钟能打印6页,向打印机的输出寄存器中写一个字符的时间很短,可忽略不计。若每打印一个字符都需要花费50us 的中断处理时间(包括所有服务),使用中断驱动IO方式运行这台打印机,中断的系统开销占CPU的百分比为( )。
A.2%
B.5%
C.20%
D.50%

这台打印机每分钟打印50x80x6 = 24000个字符,即每秒打印400个字符。每个字符打印中断需要占用CPU时间50us,所以每秒用于中断的系统开销为400x50us = 20ms。若使用中断驱动I/O,则CPU剩余的980ms可用于其他处理,中断的开销占CPU的2%。因此,使用中断驱动I/O方式运行这台打印机是有意义的。
A


5.2 核心子系统


5.2.3 高速缓存与缓冲区

缓冲区是一个存储区域,可以由专门的硬件寄存器组成,也可利用内存作为缓冲区。
使用硬件作为缓冲区的成本较高,容量也较小,一般仅用在对速度要求非常高的场合(如存储器管理中所用的联想寄存器,由于对页表的访问频率极高,因此使用速度很快的联想寄存器来存放页表项的副本)
一般情况下,更多的是利用内存作为缓冲区,“设备独立性软件”的缓冲区管理就是要组织管理好这些缓冲区。

缓冲区的作用:

  • 缓和CPU与I/O设备之间速度不匹配的矛盾
  • 减少对CPU的中断频率,放宽对CPU中断响应时间的限制【如果是字符型设备,则每输出完一个字符就要向CPU发送一次中断信号】
  • 解决数据粒度不匹配的问题【输出进程每次可以生成一块数据,但I/O设备每次只能输出一个字符】
  • 提高CPU与I/O设备之间的并行性

单缓冲

假设某用户进程请求某种块设备读入若干块的数据。若采用单缓冲的策略,操作系统会在主存中为
其分配一个缓冲区
(若题目中没有特别说明,一 个缓冲区的大小就是一个块)。
注意:当缓冲区数据非空时,不能往缓冲区冲入数据,只能从缓冲区把数据传出;当缓冲区为空时,可以往缓冲区冲入数据,但必须把缓冲区充满以后,才能从缓冲区把数据传出。

用户进程的内存空间中,会分出一片工作区来接受输入/输出数据(一般也默认:工作区大小与缓冲区相同)

设备——(T)——缓冲区-——(M)——工作区——(C)——处理.
[ 处理一块数据平均耗时Max(C, T)+M]


双缓冲

假设某用户进程请求某种块设备读入若干块的数据。若采用双缓冲的策略,操作系统会在主存中为
其分配两个缓冲区
(若题目中没有特别说明,一个缓冲区的大小就是一个块)
双缓冲题目中,假设初始状态为:工作区空,其中一个缓冲区满,另一个缓冲区空

设备一(T)- 缓冲区一- -(M)-- 工作区一- (C)-- 处理.
[处理一块数据平均耗时 Max(T, C+M)



使用单/双缓冲在通信时的区别

 两台机器之间通信时,可以配置缓冲区用于数据的发送和接受。

显然,若两个相互通信的机器只设置单缓冲区,在任一时刻只能实现数据的单向传输。

若两个相互通信的机器设置双缓冲区,则同--时刻可以实现双向的数据传输。
注:管道通信中的“管道”其实就是缓冲区。要实现数据的双向传输,必须设置两个管道


循环缓冲区

将多个大小相等的缓冲区链接成一个循环队列。
注:以下图示中,橙色表示已充满数据的缓冲区,绿色表示空缓冲区。


缓冲池

缓冲池由系统中共用的缓冲区组成。这些缓冲区按使用状况可以分为:空缓冲队列、装满输入数
据的缓冲队列(输入队列)、装满输出数据的缓冲队列(输出队列)。

另外,根据一个缓冲区在实际运算中扮演的功能不同,又设置了四种工作缓冲区:用于收容输入
数据的工作缓冲区(hin) 、用于提取输入数据的工作缓冲区(sin) 、用于收容输出数据的工作缓
冲区(hout) 、用于提取输出数据的工作缓冲区(sout)

从输出队列中取得块充满输出数据的缓冲区作为“提取输出数据的工作缓冲区(sout) ”。缓冲区读空后挂到空缓冲区队列


5.2.4 设备分配与回收

设备分配时应考虑的因素

  • 设备的固有属性
  • 设备分配算法
  • 设备分配中的安全性

设备的固有属性可分为三种:独占设备、共享设备、虚拟设备。
独占设备--一个时段只能分配给-一个进程(如打印机)
共享设备--可同时分配给多个进程使用(如磁盘),各进程往往是宏观上同时共享使用设备,
而微观上交替使用。
虚拟设备--采用SPOOLing技术将独占设备改造成虚拟的共享设备,可同时分配给多个进程使
用(如采用SPOOLing技术实现的共享打印机)

从进程运行的安全性上考虑,设备分配有两种方式:
安全分配方式:为进程分配一个设备后就将进程阻塞,本次I/O完成后才将进程唤醒。(eg: 考虑进程请求打印机打印输出的例子)

一个时段内每个进程只能使用一个设备
优点:破坏了“请求和保持”条件,不会死锁
缺点:对于一个进程来说,CPU和I/O设备 只能串行工作

不安全分配方式:进程发出I/0请求后,系统为其分配/O设备,进程可继续执行,之后还可以发出新的I/O请求。只有某个I/O请求得不到满足时才将进程阻塞。

一个进程可以同时使用多个设备
优点:进程的计算任务和/0任务可以并行处理,使进程迅速推进
缺点:有可能发生死锁(死锁避免、死锁的检测和解除)

静态分配:进程运行前为其分配全部所需资源,运行结束后归还资源
破坏了“请求和保持”条件,不会发生死锁

动态分配:进程运行过程中动态申请设备资源


设备、控制器、通道之间的关系

设备控制表(DCT):系统为每个设备配置一张DCT,用于记录设备情况
设备控制表(DCT)
设备类型:如:打印机/扫描仪/键盘
设备标识符:即物理设备名,系统中的每个设备的物理设备名唯一
设备状态:忙碌/空闲/故障.
指向控制器表的指针:每个设备由一个控制器控制,该指针可找到相应控制器的信息
重复执行次数或时间:当重复执行多次I/O操作后仍不成功,才认为此次I/O失败
设备队列的队首指针:指向正在等待该设备的进程队列(由进程PCB组成队列)

控制器控制表(COCT):每个设备控制器都会对应一张COCT。操作系统根据COCT的信息对控制器
进行操作和管理。
控制器控制表(COCT)

控制器标识符:各个控制器的唯一-ID
控制器状态:忙碌/空闲/故障..
指向通道表的指针:每个控制器由一个通道控制,该指针可找到相应通道的信息
控制器队列的队首指针:指向正在等待该控制器的进程队列( 由进程PCB组成队列)
控制器队列的队尾指针:指向正在等待该控制器的进程队列( 由进程PCB组成队列)

通道控制表(CHCT) :每个通道都会对应一张CHCT。操作系统根据CHCT的信息对通道进行操作和
管理。

通道控制表(CHCT)
通道标识符:各个通道的唯一ID
通道状态:忙碌/空闲/故障.. 
与通道连接的控制器表首址:可 通过该指针找到该通道管理的所有控制器相关信息(COCT)
通道队列的队首指针:指向正在等待该通道的进程队列(由进程PCB组成队列)
通道队列的队尾指针:指向正在等待该通道的进程队列(由进程PCB组成队列)

系统设备表(SDT) : 记录了系统中全部设备的情况,每个设备对应一个表目。


设备分配的步骤

①根据进程请求的物理设备名查找SDT【系统设备表】(注:物理设备名是进程请求分配设备时提供的参数)
②根据SDT找到DCT【设备控制表】,若设备忙碌则将进程PCB挂到设备等待队列中,不忙碌则将设备分配给进程。
③根据DCT找到COCT【控制器控制表】,若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配给进程。
④根据COCT找到CHCT【通道控制表】,若通道忙碌则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程。
注:只有设备、控制器、通道三者都分配成功时,这次设备分配才算成功,之后便可启动I/O设备
进行数据传送;

缺点:
①用户编程时必须使用“物理设备名”,底层细节对用户不透明,不方便编程
②若换了一个物理设备,则程序无法运行
③若进程请求的物理设备正在忙碌,则即使系统中还有同类型的设备,进程也必须阻塞等待
改进方法:建立逻辑设备名与物理设备名的映射机制,用户编程时只需提供逻辑设备名


设备分配改进的步骤

①根据进程请求的逻辑设备名查找SDT【系统设备表】 (注:用户编程时提供的逻辑设备名其实就是“设备类型”)
②查找SDT,找到用户进程指定类型的、并且空闲的设备,将其分配给该进程。操作系统在逻辑设
备表(LUT)中新增一个表项。

③根据DCT找到COCT,若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配给进程。
④根据COCT找到CHCT,若通道忙碌则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程。
逻辑设备表(LUT) 建立了逻辑设备名与物理设备名之间的映射关系。
某用户进程第一次使用设备时使用逻辑设备名向操作系统发出请求,操作系统根据用户进程指定的设备类型(逻辑设备名)查找系统设备表,找到一个空闲设备分配给进程,并在LUT中增加相应表项。
如果之后用户进程再次通过相同的逻辑设备名请求使用设备,则操作系统通过LUT表即可知道用户进程实际要使用的是哪个物理设备了,并且也能知道该设备的驱动程序入口地址。
逻辑设备表的设置问题:
整个系统只有一张LUT:各用户所用的逻辑设备名不允许重复,适用于单用户操作系统
每个用户一张LUT:不同用户的逻辑设备名可重复,适用于多用户操作系统


5.2.5 SPOOLing技术(假脱机技术)

为什么称为“脱机”---脱离主机的控制进行的输入/输出操作。
引入脱机技术后,缓解了CPU与慢速I/O设备的速度矛盾。另一方面,即使CPU在忙碌,也可以提前将数据输入到磁带:即使慢速的输出设备正在忙碌,也可以提前将数据输出到磁带。
“假脱机技术”,又称“SP0OLing技术”是用软件的方式模拟脱机技术。SP0OLing 系统的组成如下:

  •  “输入进程”模拟脱机输入时的外围控制机
  • 输出进程”模拟脱机输出时的外围控制机
  • 在输入进程的控制下,“输入缓冲区”用于暂存从输入设备输入的数据,之后再转存到输入井中
  • 在输出进程的控制下,“输出缓冲区”用于暂存从输出井送来的数据,之后再传送到输出设备上
  • 要实现SPOOLing技术,必须要有多道程序技术的支持。系统会建立、“输入进程”和“输出进程”。

独占式设备--只允许各个进程串行使用的设备。一段时间内只能满足一个进程的请求。
共享设备-- -允许多个进程“同时”使用的设备(宏观上同时使用,微观上可能是交替使
用)。可以同时满足多个进程的使用请求。

  • 打印机是种“ 独占式设备”,但是可以用SPOOLing技术改造成“共享设备”
  • 独占式设备的例子:若进程1正在使用打印机,则进程2请求使用打印机时必然阻塞等待

当多个用户进程提出输出打印的请求时,系统会答应它们的请求,但是并不是真正把打印机分配给他们,而是由假脱机管理进程为每个进程做两件事:
(1)在磁盘输出井中为进程申请一个空闲缓冲区(也就是说,这个缓冲区是在磁盘上的),并将要打
印的数据送入其中:
(2)为用户进程申请一张空白的打印请求表,并将用户的打印请求填入表中(其实就是用来说明用户
的打印数据存放位置等信息的),再将该表挂到假脱机文件队列上。
当打印机空闲时,输出进程会从文件队列的队头取出一张打印请求表,并根据表中的要求将要打印的数据从输出井传送到输出缓冲区,再输出到打印机进行打印。用这种方式可依次处理完全部的打印任务

虽然系统中只有一个台打印机,但每个进程提出打印请求时,系统都会为在输出井中为其分配一个存储区(相当于分配了一个逻辑设备),使每个用户进程都觉得自己在独占一台打印机,从而实现对打印机的共享。
SPOOLing技术可以把一台物理设备虚拟成逻辑上的多台设备,可将独占式设备改造成共享设备。


5.2. SPOOLing技术(假脱机技术)练习题

 4.下面设备中属于共享设备的是( )。
A.打印机.
B.磁带机
C.磁盘
D.磁带机和磁盘

共享设备是指在一一个时间间隔内可被多个进程同时访问的设备,只有磁盘满足。打印机在一
个时间间隔内被多个进程访问时打印出来的文档就会乱;磁带机旋转到所需的读写位置需要较长
时间,若一个时间间隔内被多个进程访问,磁带机就只能一直旋转,没时间读写。
C


5. [2009统考真题]程序员利用系统调用打开I/O设备时,通常使用的设备标识是()。
A.逻辑设备名
B.物理设备名
C.主设备号
D.从设备号
用户程序对IO设备的请求采用逻辑设备名,而程序实际执行时使用物理设备名,它们之间的转换是由设备无关软件层完成的。主设备和从设备是总线仲裁中的概念。
A


9.在采用SPOOLing技术的系统中,用户的打印结果首先被送到( )。
A.磁盘固定区域
B.内存固定区域
C.终端
D.打印机
输入井和输出井是在磁盘上开辟的两大存储空间。输入井模拟脱机输入时的磁盘设备,用于暂存IO设备输入的数据;输出井模拟脱机输出时的磁盘,用于暂存用户程序的输出数据。为了缓和CPU,打印结果首先送到位于磁盘固定区域的输出井。
A


13. 若I/O所花费的时间比CPU的处理时间短得多,则缓冲区( )。
A.最有效
B.几乎无效
C.均衡
D.以上答案都不对

缓冲区主要解决输入/输出速度比CPU处理的速度慢而造成数据积压的矛盾。所以当I/O花费的时间比CPU处理时间短很多时,缓冲区没有必要设置。
B


14. [2011 统考真题]某文件占10个磁盘块,现要把该文件的磁盘块逐个读入主存缓冲区,并送用户区进行分析,假设一一个缓冲区与一个磁盘块大小相同,把一一个磁盘块读入缓冲区的时间为100us, 将缓冲区的数据传送到用户区的时间是5Uμs,CPU对一块数据进行分析的时间为50us。在单缓冲区和双缓冲区结构下,读入并分析完该文件的时间分别是( )。
A.1500μs, 1000μs
B.1550μs, 1100μs
C.1550μs, 1550us

D. 2000us, 2000us
在单缓冲区中,当上一个磁盘块从缓冲区读入用户区完成时,下一磁盘块才能开始读入,也
就是当最后一块磁盘块读入用户区完毕时所用的时间为150x10= 1500us,加上处理最后一个磁盘
块的时间50μs,得1550us。 双缓冲区中,不存在等待磁盘块从缓冲区读入用户区的问题,10 个
磁盘块可以连续从外存读入主存缓冲区,加上将最后一个磁盘块从缓冲区送到用户区的传输时间.
50μs及处理时间50μs,也就是100x10 + 50 + 50= 1100us。 .
B


15. [2013 统考真题]设系统缓冲区和用户工作区均采用单缓冲,从外设读入一个数据块到系统缓冲区的时间为100, 从系统缓冲区读入一个数据块到用户工作区的时间为5,对用户工作区中的一个数据块进行分析的时间为90 (如下图所示)。进程从外设读入并分析2个数据块的最短时间是( )。

A.200 B.295 C.300 D.390

数据块1从外设到用户工作区的总时间为105,在这段时间中,数据块2未进行操作。在数据块1进行分析处理时,数据块2从外设到用户工作区的总时间为105,这段时间是并行的。再加上数据块2进行处理的时间90,总共是300,答案为C。
C


17. 考虑单用户计算机.上的下列I/O操作,需要使用缓冲技术的是( )。
I. 图形用户界面下使用鼠标
II. 多任务操作系统下的磁带驱动器(假设没有设备预分配)
II.包含用户文件的磁盘驱动器
IV.使用存储器映射IO,直接和总 线相连的图形卡
A. I、III
B. II、IV
C. II、II、IV
D.全选
在鼠标移动时,若有高优先级的操作产生,为了记录鼠标活动的情况,必须使用缓冲技术,I正确。由于磁盘驱动器和目标或源I/O设备间的吞吐量不同,必须采用缓冲技术,lIl 正确。为了能使数据从用户作业空间传送到磁盘或从磁盘传送到用户作业空间,必须采用缓冲技术,II正确。
为了便于多幅图形的存取及提高性能,缓冲技术是可以采用的,特别是在显示当前一幅图形又要得到下一幅图形时,应采用双缓冲技术,IV 正确。

综上所述,本题正确答案为D。
 


18.提高单机资源利用率的关键技术是( )。 
A. SPOOLing 技术
B.虚拟技术
C.交换技术
D.多道程序设计技术
在单机系统中,最关键的资源是处理器资源,最大化地提高处理器利用率,就是最大化地提高系统效率。多道程序设计技术是提高处理器利用率的关键技术,其他均为设备和内存的相关技术。
D


 20. SPOOLing技术的主要目 的是( )。
A.提高CPU和设备交换信息的速度
B.提高独占设备的利用率
C.减轻用户编程负担
D.提供主、辅存接口

SPOOLing技术是操作系统中采用的一种将独占设备改造为共享设备的技术。通过这种技术处理后的设备通常称为虚拟设备。
B


21.采用SPOOLing技术的计算机系统,外围计算机需要( )。
A.一台
B.多台
C.至少一台
D.0台
SPOOLing技术需要使用磁盘空间(输入井和输出井)和内存空间(输入/输出缓冲区),不需要外围计算机的支持。
D


22. SPOOLing 系统由( ) 组成。
A.预输入程序、井管理程序和缓输出程序
B.预输入程序、井管理程序和井管理输出程序
C.输入程序、井管理程序和输出程序
D.预输入程序、井管理程序和输出程序
SPOOLing系统主要包含三部分,即输入开和输出卅、输入缓冲区和输出缓冲区以及输入进程和输出进程。这三部分由预输入程序、井管理程序和缓输出程序管理,以保证系统正常运行。
A


24.下 面关于SPOOLing系统的说法中,正确的是( )。
A.构成SPOOLing系统的基本条件是有外围输入机与外围输出机
B.构成SPOOLing系统的基本条件是要有大容量、高速度的硬盘作为输入井和输出井
C.当输入设备忙时,SPOOLing 系统中的用户程序暂停执行,待IO空闲时再被唤醒执行输出操作
D.SPOOLing系统中的用户程序可以随时将输出数据送到输出井中,待输出设备空闲
构成SPOOLing系统的基本条件是要有大容量、高速度的外存作为输入并和输出开,因此A、B选项不对,同时利用SPOOLing技术提高了系统和I/O设备的利用率,进程不必等待I/O操作的完成,因此C选项也不正确。
D


25.下面关于SPOOLing的叙述中,不正确的是( )。
A. SPOOLing 系统中不需要独占设备
B. SPOOLing 系统加快了作业执行的速度
C. SPOOLing 系统使独占设备变成共享设备
D.SPOOLing系统提高了独占设备的利用率
因为SPOOLing技术是一种典型的虚拟设备技术,它通过将独占设备虚拟成共享设备,使得多个进程共享-一个独占设备,从而加快作业的执行速度,提高独占设备的利用率。既然是将独占设备虚拟成共享设备,所以必须先有独占设备才行。
A


——所有题集来源《王道2021年操作系统考研复习指导》,知识点参考《操作系统第六版》《王道2021考研复习指导》

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐