声明1 本文参考了计算机四级网络工程师1600道真题和其他网络教程写成,感谢这些作者提供的资料
声明2 如果存在错误和不足,欢迎提出评判建议;如果涉及侵权,请联系我进行删除
声明3 本文还提供了PDF版本以便下载,所有资料均完全免费,如果你觉得这份资料有帮助,点赞收藏就是对作者最大的支持
目录
一、操作系统概述
1.1 操作系统的概念
计算机系统
- 计算机系统包括:硬件系统、软件系统(代码和数据)
| 计算机系统 | 具体组成 |
| 硬件系统 | 中央处理器、存储设备、输入/输出设备 |
| 软件系统 | 系统软件、支撑软件、应用软件 |
- 中央处理器(Central Processing Unit, CPU)包括:运算器、控制器、寄存器、高速缓存(Cache)
- 存储设备包括:内存、硬盘(没有网盘)
- 输入/输出(Input/Output, I/O)设备包括:鼠标、键盘、显示器、打印机等
操作系统定义
- 操作系统(Operating System, OS)是计算机系统的一个系统软件,位于硬件之上、支撑软件之下
- 操作系统集中了资源管理功能、控制程序执行功能(不能编译高级语言编写的程序)
- 操作系统建立了用于记录各种软硬件资源信息的数据结构,能对资源进行有效地组织和管理,根据用户的不同要求配置操作系统,提高计算机系统资源的利用率
- 操作系统能够合理地组织计算机工作流程与控制程序的执行,公平对待不同用户程序,使应用程序具有更好的兼容性,保证系统不发生死锁和饥饿
操作系统名称
- 操作系统常见的包括:Windows、Android、macOS、UNIX、Linux、Ubuntu、CentOS、BSD、DOS
- Android操作系统在当前应用广泛,具有移动应用、支持网络等特性
操作系统作用
- 从计算机应用角度看,操作系统提供人机交互接口
- 从网络攻击者角度看,操作系统是首先要突破的防线
- 从计算机安全保护角度看,操作系统提供第一道安全防线
- 从计算机系统发展角度看,操作系统提供虚拟机和扩展机
- 从软件设计和开发角度看,操作系统提供软件开发的基础平台
- 操作系统功能
- 操作系统的主要功能包括:进程管理(处理器管理)、存储管理、文件管理、设备管理、接口管理(用户接口)
- 进程管理的范畴包括:为进程分派CPU、提供加锁和解锁原语、管理进程的数据结构、完成进程上下文切换、进程创建和撤销控制、进程间同步或互斥关系处理、进程间通信
- 存储管理的范畴包括:内存扩充、管理内存分配表、存储保护、完成虚拟地址到物理地址的转换、将磁盘上的代码调入内存、检查进程地址空间是否出现地址越界问题
- 文件管理的范畴包括:管理磁盘空间、磁盘碎片整理、建立文件目录、设置文件的存取权限
- 设备管理的范畴包括:提供缓冲技术、提供虚设备技术、管理通道和网卡等相关的数据结构
操作系统特征
- 操作系统的特征包括:并发性(最基本的特征)、共享性、虚拟性、异步性、随机性
并发性
- 并发性是指计算机系统中同时存在若干个运行着的程序:①从宏观上看,这些程序是在同时向前推进的;②从微观上看,在单处理器的环境下,这些程序是交替在中央处理器上运行的
- 并发程序在执行期间具有相互制约关系
- 并发程序与计算不再一一对应,执行结果不可再现
共享性
- 共享性是指操作系统程序与多个用户程序共用系统中的各种资源
- 共享并不是随时随地的,而是在一定的策略控制下进行的
- 互斥共享的资源包括:打印机、磁带机、扫描仪、中央处理器、存储器等
- 同时共享的资源包括:硬盘、可以重入的操作系统代码(如log()函数子程序)等
- 内存分配模块代码里包含了访问临界资源的代码,不可以同时共享
虚拟性
- 虚拟性是指操作系统通过某种技术将一个物理实体变为若干个逻辑上对应物的功能
- 虚拟技术常见的包括:时分复用技术、空分复用技术
异步性
- 异步性是指进程的执行不是连续一贯到底的,而是呈现出一种走走停停的断续状态,以不可预知的速度向前推进
随机性
- 随机性是指操作系统不能对于所运行的程序的行为以及硬件设备的情况做任何事先的假定
1.2 操作系统的分类
操作系统类型
- 操作系统常见的环境包括:批处理(Batch)操作系统、交互式(Interactive)操作系统、实时(Realtime)操作系统、分时(Time-sharing)操作系统、分布式(Distributed)操作系统、嵌入式(Embedded)操作系统、网络(Network)操作系统、个人计算机(Personal Computer, PC)操作系统(没有工业操作系统)
批处理系统特点
- 批处理系统成批处理用户提交的作业,资源利用率高,作业吞吐量大,但缺少人机交互性
- 批处理系统的工作指标包括:吞吐量、周转时间、CPU利用率
- 批处理系统可以适用的作业调度算法包括:先来先服务算法、最高响应比优先算法、最高优先级优先算法
- 对于运行批处理作业的大型计算中心,其调度算法的设计目标包括:较大的吞吐量、较短的周转时间、较高的CPU利用率
交互式系统特点
- 交互式系统的工作指标包括:最小响应时间(最重要的指标)、均衡性
- 交互式系统可以适用的作业调度算法包括:先来先服务算法、最高优先级优先算法、最短作业优先算法、最短剩余时间优先算法、最短进程优先算法、时间片轮转算法、多级反馈队列算法
- 对于采用交互式系统的服务器,其调度算法的设计目标包括:较快的响应时间、较均衡的性能
例题:在交互式系统中,若用户数为100,为保证响应时间<100 ms,忽略其他系统开销,则操作系统应将时间片设为<1 ms
实时系统特点
- 实时系统具有较高的可靠性,在严格的截止时间范围内实时响应用户的请求,具有较好的过载防护能力
- 对于采用实时系统的服务器,其调度算法的设计目标包括:满足截止时间要求、满足可靠性要求
分时系统特点
- 分时系统具有的特点包括:多路性、交互性、独占性、及时性等
- 多路性指多个用户能够同时在线使用计算机
- 交互性指用户根据系统响应的结果提出下一个请求,直接干预操作每一步的进行,便于调试程序
- 独占性指每个用户使用计算机时感觉不到计算机同时在为别人服务
- 及时性指系统能够对用户输入的信息及时给予响应
分布式系统特点
- 分布式系统内所有主机使用统一的操作系统,系统内资源深度共享,用户无需了解系统内本地主机和异地主机的差异(透明性),系统内各主机处于同等地位不分主次(自治性),一个计算机发生故障整个系统仍旧能够工作(可靠性)
嵌入式系统特点
- 嵌入式系统具有的特点包括:专用性、可靠性、实时性、可裁剪性、低功耗、低成本等
- 小到手机通信,大到机械导弹的控制,都可以使用嵌入式系统
网络系统特点
- 网络系统是为计算机网络配置的操作系统,目标包括:互相通信、资源共享
- 网络系统的工作模式分为:集中式模式和分布式模式
个人计算机系统特点
- 个人计算机系统主要供个人使用,能满足跟一般人操作、学习、游戏等方面的需求
- 个人计算机系统具有的特点包括:界面友好、功能强大、使用方便、价格便宜、在几乎任何地方都可安装使用等
1.3 操作系统的结构
操作系统结构
- 常见的操作系统结构包括:整体式结构、层次式结构、微内核结构
微内核结构
- 微内核结构又称客户机/服务器(Client/Server, C/S)结构
- 微内核模式具有的优点包括:可靠性、灵活性、可扩展性、可移植性、适合分布式处理、融入面向对象技术等
- 微内核模式具有的缺点包括:效率低、不适合频繁通信
- 微内核操作系统的结构包括:运行在核心态的(微)内核、运行在用户态的进程层
- 微内核提供所有操作系统基本都具有的操作(如线程调度、虚拟存储、消息传递、设备驱动、内核的原语操作集、中断处理)
- 进程层提供除内核部分外的服务进程,即以客户机/服务器方式活动的用户应用程序对应的进程
操作系统接口
- 操作系统提供的接口包括:命令接口(命令行界面)、程序接口、图形界面接口(图形用户界面)
- 命令接口(Command-Line Interface, CLI)由一组供用户直接或间接操作命令组成,根据作业方式的不同又可以分为:联机命令接口和脱机命令接口
- 程序接口(Application Programming Interface, API)由一组系统调用命令组成
- 图形界面接口(Graphic User Interface, GUI)是通过图标、窗口、菜单、对话框以及其他元素和文字组合,在桌面上形成的一个供用户交互的直观易懂使用方便的可视化计算机操作环境

二、操作系统运行机制
2.1 中央处理器
CPU寄存器
- 用户可见寄存器主要用于各种算术逻辑指令和访问指令,包括:数据寄存器、地址寄存器、条件码寄存器
- 控制和状态寄存器主要用于处理器的控制操作,包括:程序计数寄存器、指令寄存器、程序状态字寄存器
CPU状态
- CPU的状态包括:系统态(管态,内核态)、用户态(目态)
程序状态字PSW
- 程序状态字(Program Status Word, PSW)的状态码包括:CPU工作状态码(指明管态目态)、条件码(反映指令执行结果)、中断屏蔽码(指出是否允许中断)
- 程序状态字的标志位包括:进位标志位(CF)、结果为零标志位(ZF)、符号标志位(SF)、溢出标志位(OF)、陷阱标志位(TF)、中断使能或中断屏蔽标志位(IF)、虚拟中断标志位(VIF)、虚拟中断待决标志位(VIP)、I/O特权级别(IOPL)
- 若不希望被外部事件打扰,可设置PSW寄存器的IF为0,以屏蔽(关闭)中断
- 通过设置PSW指令修改程序状态字,可实现系统态向用户态的转换
特权指令
- 特权指令只能在内核态下运行,包括:开关中断响应指令、输入输出指令、写PSW寄存器指令、写时钟指令、置程序计数器、清指令寄存器、清溢出标志等
- 用户程序在用户态下执行特权指令会引起访管中断,属于异常事件
非特权指令
- 非特权指令(一般指令)既可以在内核态下运行又可以在用户态下运行,包括:算数运算指令、访管指令、置移位方向标志
- 发生异常意味着操作系统需要介入,可实现用户态向系统态的转换
- 用户程序在用户态下执行访管指令会引起访管中断,是程序主动请求的陷入,也属于异常事件(不属于中断事件)

2.2 中断与异常
中断
- 中断又称外中断,是由外设要求或人工干预等外部事件引发的硬件中断或软件中断
- 中断常见的包括:时钟中断(定时器计时结束,计时器归零)、控制台命令中断、控制台出现故障、设备出错和硬件故障中断(存储器校验错、系统掉电)、输入输出中断(用户敲击键盘、用户按鼠标左键)、完成写硬盘操作、数据传送完毕、网卡上数据缓冲区满等
- 中断服务程序是固定在某个地址的代码段(没有进程的概念)
- 中断服务程序与中断时CPU正在执行的进程是相互独立的
| 术语 | 释义 |
| 中断事件(中断源) | 引起中断的各个事件 |
| 中断请求 | 中断源向处理器发出的中断请求信号 |
| 中断响应 | 处理器暂停当前程序转而处理中断的过程 |
| 中断断点 | 发生中断时正在执行的程序的暂停点 |
| 中断处理程序(中断服务程序) | 处理中断事件的程序 |
| 中断向量表 | 中断处理程序入口地址映射表 |

异常
- 异常又称内中断(程序性中断),是由正在执行的指令引发的陷入、故障、终止
- 异常常见的包括:被零除、算术溢出、虚拟存储中的缺页、程序执行时所访问的变量不在内存、内存保护出错、进程打开文件时出错、程序对只读内存执行写指令、用户态程序试图执行特权指令、执行访管指令等
- 被零除、对只读内存执行写操作、堆栈溢会导致进程终止
- 设备忙会导致进程阻塞,不会导致进程终止
多级中断
- 在同时有多个中断请求时,中断响应顺序为:CPU接收中断优先级为最高的那个中断,而忽略其他中断优先级较低的那些中断
- 若存在同一中断级,处理的方法包括:固定优先数法、轮转法
2.3 系统调用
系统调用
- 系统调用是操作系统提供给编程人员的唯一接口,提供了一系列具备预定功能的多组内核函数,为应用程序开发人员提供良好的环境
- 系统调用大致类别包括:进程控制类(fork())、文件管理类(create(),open(),read(),write(),close(),delete())、设备管理类、信息维护类、进程通信、保护类
- 系统调用参数传递的方法包括:通过陷入指令自带参数传递参数、通过寄存器传递参数、通过内存开辟专门的堆栈传递参数(不能通过变量传递参数)
- 调用程序多次嵌套与递归是系统调用无法实现的功能
- 查找数据库中的某个学生信息、将成绩填入学生成绩数据库、查找数组中的最大数等不属于系统调用
例题1:用户编程需要打印输出,使用系统调用write()
例题2:用户需要动态请求和释放系统资源,可以通过系统调用进行
例题3:用户在编写程序时,若要在屏幕上画出一个红色的圆,需要系统调用显示屏的驱动程序
fork()函数
- fork()函数被调用一次却返回两次,一次是在被调用的父进程中,一次是在新创建的子进程中
- 在父进程中fork()返回子进程的pid,在子进程中fork()返回0
例题1:以下程序正确运行的结果是I am the child process, my process ID is 3744, x=2 I am the parent process, my process ID is 3987, x=0

例题2:以下两个程序左右等价,正常运行时最多派生出8(=2×2×2)个进程,打印Hello World共15(=1+2+4+8)行

2.4 一般过程调用
一般过程调用
- 一般过程调用和系统调用均可以嵌套使用,即一个被调用过程执行期间还可以调用另一个,可以多次调用但不能无限制调用
- 一般过程调用的调用程序和被调用程序均位于用户态,而系统调用的调用程序运行在用户态,被调用程序则运行在核心态
- 一般过程调用不涉及系统状态的转换,可直接从被调用程序返回到调用程序,但系统调用在返回到调用程序前先运行调度程序
三、进程线程模型
3.1 多道程序设计
多道程序设计环境
- 多道程序设计的特点包括:独立性、随机性、资源共享性
- 多道程序设计相比于单道程序设计,在宏观上允许多个程序同时进入内存并运行,充分发挥了CPU与外部设备以及外部设备之间的并行工作能力,从而提高处理器和其他各种资源的利用率
- 多道并发运行的程序之间会产生相互制约关系,并发程序与计算不再一一对应,执行结果不再具有可再现性
- 支持多道程序设计的存储管理方案包括:固定分区、可变分区、段式、页式、段页式
- 不支持多道程序设计的存储管理方案包括:单一分区
程序局部性
- 程序局部性分为:空间局部性和时间局部性
- 空间局部性是指一旦程序访问了某个存储单元,其附近的存储单元也将被访问,也就是说程序代码执行具有顺序性
- 时间局部性是指如果程序中的某条指令一旦执行或某数据一旦被访问,则不久之后该指令可能再次被执行或该数据可能再次被访问,也就是说程序中存在大量的循环
可再入程序
- 可重入代码(Reentry Code)又称纯代码(Pure Code),是一种允许多个进程同时共享访问的代码,为了使各进程所执行的代码完全相同,不允许任何进程对其进行修改
- 可再入程序是由可重入代码组成的程序,故在执行过程中不可修改
3.2 进程
进程
- 进程的组成部分包括:进程控制块、程序代码指令、数据
- 进程与程序都有的部分包括:程序代码指令、数据
- 进程独有而程序没有的部分包括:进程控制块、动态链接库、堆栈
- 进程是动态的,动态产生动态消亡,在进程生命周期内其状态动态变化,而程序是静态的
- 进程是资源分配的基本单位,任何进程必须通过调度才能运行,每个进程在得到处理机运行前都必须首先部分装入内存
- 进程之间由于设计目标的不同而具有不同的进程行为,可以归纳并分为:计算密集型和I/O密集型
进程控制块PCB
- 进程控制块(Process Control Block, PCB)是进程存在的唯一标志,与进程一一对应,其内容可以分为:调度信息和现场信息(进程页表、进程用户栈、磁盘目录、动态链接库不保存在进程控制块中)
- 调度信息包括:进程名、进程号(进程标识符)、进程优先级、进程当前调度状态、进程相应的程序和数据地址(进程数据结构指针)、进程同步与通信机制、进程所在队列文件句柄、存储信息、CPU占用和使用信息、资源清单、家族关系、消息队列指针、进程队列指针、当前打开文件等
- 现场信息只记录那些可能会被其他进程改变的寄存器,包括:程序状态字、时钟、界地址寄存器等
- 进程控制块的组织方式包括:线性方式(线性表)、链接方式(链表)、索引方式(索引表)(没有B+树方式、哈希表方式)
- PCB必须常驻内存,但不是所有信息都必须常驻内存,需要快速访问的关键信息常驻内存,而其他信息可以根据需要动态加载
进程特性
- 进程的特性包括:并发性、动态性、独立性、交往性、异步性
- 并发性是指不同的进程可以在宏观上一起向前推进
- 动态性是指进程动态产生、动态变化、动态消亡
- 独立性是指一个进程是一个相对完整的资源分配单位
- 交往性是指一个进程在运行过程中可能会与其他进程发生直接的或间接的相互作用
- 异步性是指每个进程按照各自独立的、不可预知的速度向前推进
进程状态
- 进程的三状态模型包括:运行状态、就绪状态、等待状态(阻塞状态)

- 进程的七状态模型包括:创建态、就绪态、运行态、阻塞态、退出态(结束态,终止态)、就绪挂起态、阻塞挂起态

- Linux支持的进程状态包括:运行状态、可中断状态(浅度睡眠状态)、不可中断状态(深度睡眠状态,磁盘休眠状态)、僵尸状态(中止状态)、停止状态

【Linux】Linux进程简介及其五种状态_linux通常进程的状态被分为5种-优快云博客
| 进程状态 | 时机或事件 |
| 进程创建 | 用户登录时、系统初始化时、初始化批处理作业时、运行进程通过系统调用创建新进程时 |
| 进程运行状态转换为就绪状态 | 时间片用完、进程创建完成、被调度程序抢占处理机 |
| 进程运行状态转换为阻塞状态 | 请求系统服务、启动某种操作、新数据尚未到达、无新工作可做 |
例题:某4核处理器的计算机系统中共有50个进程,处于运行状态的进程最多有4个,最少为0个;处于就绪状态的进程最多有49个,最少为0个;处于阻塞状态的进程最多有50个,最少为0个
进程优先级
- 系统进程的优先级一般高于用户进程的优先级
- 若采用静态优先级,即使进程等待的时间增加,其优先级也不会改变
- 若采用动态优先级,如果某进程长时间得不到运行,系统会额外提升它的优先级
进程控制原语
- 原语是不可中断的过程,操作系统中进程状态的转换是通过一系列进程控制原语实现的,是操作系统对进程进行管理和调度的基础
- 若一个进程由于申请的内存资源长期不能得到满足,则处理该进程的最佳方法是挂起该进程
| 原语类型 | 步骤描述 |
| 创建原语create() | 创建态到就绪态(申请空白PCB→为新进程分配资源→填写初始化PCB→将其放入就绪队列末尾) |
| 撤销原语destroy() | 运行态、就绪态或阻塞态直接到终止态(找到对应进程的PCB→撤销其下的子孙进程→释放该进程资源→撤销该PC) |
| 阻塞原语block() | 运行态到阻塞态(中断CPU执行→保存现场信息→修改PCB中进程状态为阻塞→将其插入到阻塞队列) |
| 唤醒原语wakeup() | 阻塞态到就绪态(在等待队列中找到该进程 PCB→修改PCB中进程状态为就绪→将其插入到就绪队列) |
| 挂起原语suspend() | 就绪态或阻塞态到挂起态 |
| 激活原语active() | 挂起态到就绪态或阻塞态 |
| 优先级改变原语 | 改变进程优先级 |
进程调度
- 进程调度的主要功能是从进程的就绪队列中按照一定的算法选择一个进程并将CPU分配给它运行,同时将换下CPU的进程的现场信息保存到进程控制块中并将选中的进程的现场信息送入到相应寄存器中
- 进程调度是短程低级调度,作业调度是长程高级调度
- 进程调度的最主要的原因是有CPU资源让出
- 进程调度的具体时机引起因素包括:①正在执行的进程执行完毕;②执行中的进程调用阻塞原语将自己阻塞起来进入等待状态;③执行中的进程调用了P原语操作并且因为资源不足而被阻塞,或调用了V原语操作激活了等待资源的进程;④在分时系统中,时间片已经用完;⑤在抢占式调度系统中,就绪对列中的某个进程的优先级高于当前运行进程的优先级
例题1:若系统中有多个进程分别处于就绪状态、运行状态和阻塞状态,则一个进程从运行状态到阻塞状态的变化必然引起另一个进程的就绪状态发生变化
例题2:一个进程从就绪状态变成了运行状态一定不会引起进程调度
进程调度算法
- 操作系统可以根据不同情景分类应用多种进程调度算法
- 可抢占方式是指当优先级高的进程运行存在时,立即进行调度转让CPU资源,包括:高优先级优先PF调度算法、短作业优先SJF调度算法、短进程优先SPF调度算法、时间片轮转RR调度算法
- 不可抢占方式是指进程执行完毕才释放CPU,包括:先来先服务FCFS调度算法
- 最高响应比优先HRRF调度算法是对FCFS调度算法和SJF调度算法的一种综合平衡,响应比=作业周转时间/作业处理时间=(作业等待时间+作业处理时间)/作业处理时间
- 多级反馈队列MLFQ调度算法是为多个就绪队列赋予不同的优先级,对于同一个队列中的各个进程按照时间片轮转调度
- 先来先服务、短作业优先、最高响应比优先、时间片轮转与时间有关
- 先来先服务、时间片轮转的设计考虑了公平性
3.3 线程
线程
- 线程是进程中的一个实体,是CPU调度和分派的基本单位,不能独立于进程存在,每个线程必不可少地拥有一个标识符和一张线程描述表
- 线程描述表记录了线程执行和管理相关的内容信息,包括:线程ID、指令地址寄存器、处理器寄存器、硬件设备寄存器、用户栈系统栈现场状态资源等少量线程私有信息(没有线程内存空间)
- 线程引入的主要目的包括:提高并发度、减少通信开销、线程之间的切换时间短、每个线程可以拥有独立的栈
- 线程的实现方式机制途径包括:用户线程、内核线程、混合线程
例题:某个进程由多个用户线程和内核线程组成,其中的一个线程被调度进入运行,有的继续留在就绪队伍,有的被阻塞,则此时进程的状态是运行状态
线程函数包Pthread
- POSIX线程(POSIX thread, Pthread)标准为开发者提供了一套强大且规范的线程编程接口
| 线程操作 | 描述 |
| pthread_create() | 创建一个新的线程 |
| pthread_exit() | 结束一个调用的线程 |
| pthread_join() | 等待一个特定的线程退出 |
| pthread_yield() | 线程主动让出CPU |
| pthread_mutex_int() | 创建一个互斥量 |
例题1:以下程序运行中最多存在2个线程(主线程+成功创建的其他线程)

例题2:进程P有两个线程T1和T2,其完成的功能如代码所示:

假设i的当前值是2,之后T1和T2并发地各执行了2次循环,输出结果可能的值是0、1、2、3、4(0、0+1、0+1+1、2、2+1、2+1+1)
3.4 同步与互斥
进程同步和互斥
- 进程同步指多个进程中发生的事件存在某种时序关系,必须协同动作,相互配合,以共同完成一个任务
- 进程互斥指由于共享资源所要求的排他性,进程间要相互竞争,以使用这些互斥资源
- 进程互斥的正确解决方式包括:竞争各方平等协商、设置进程管理者
- 进程互斥的错误解决方式包括:适者生存自然进化或淘汰、忽略不管出现问题再解决、设置严格的等级制高者优先
进程互斥方法
- 实现进程互斥的软件方法包括:Peterson算法(没有分派器程序)
- 实现进程互斥的硬件方法包括:测试与设置(Test-and-Set, Test&Set, TS)指令、Swap指令、关中断(中断屏蔽)指令
- 硬件方法的优点包括:操作简单、适用范围广、支持多个临界区
- 硬件方法的缺点包括:①进程在等待进入临界区时,要耗费处理机时间,不能实现让权等待;②由于进入临界区的进程是从等待进程中随机选择的,有的进程可能一直选不上,从而导致饥饿
- 测试与设置指令解决互斥访问临界区问题时,锁变量值的功能包括:①若lock=0,则置位lock=1并进入临界区;②若lock=1,则返回重新测试;③退出临界区时,复位lock=0
相互制约问题
| 关系 | 例子 |
| 仅存在同步关系 | ①汽车装配流水线上的各道工序; ②一个进程在等待另一个进程向它发送消息; ③两个并发进程包含同一共享变量; ④在打印数据时,读数据进程、处理数据进程和打印结果进程; ⑤不同的用户在各自的电脑上打同一盘网络麻将; ⑥四人一起在线玩斗地主的游戏; ⑦当前系统中有3个进程,分别是读取数据进程、处理数据进程和打印结果进程,某一数据需要用这3个进程进行处理并打印输出,那么这3个进程之间存在着同步关系; ⑧假设在足球比赛中,每个队员是一个进程,足球是资源,则同队队员之间的关系是同步关系 |
| 仅存在互斥关系 | ①在民航网络订票系统中,每个订票点在票务服务器上发起了请求订票进程/相同航班订票人发起的订票进程/不同的用户使用订票软件同时访问同一个订票数据库; ②购买同一天同一车次车票的用户; ③若干同学去图书馆借书; ④公共复印室复印机的使用; ⑤多个进程同时调用键盘输入命令; ⑥生产者进程P1, P2, …, Pn,向环形缓冲区中放入数据; ⑦消费者进程Q1, Q2, …, Qn,从环形缓冲区中提取数据; ⑧假设在篮球比赛中,每个队员是一个进程,篮球是资源,则双方队员之间的关系是互斥关系 |
| 既有同步又有互斥关系 | ①多个不同的用户在同一台游戏机上玩踢足球的电子游戏; ②多人一起在线玩魔兽电子游戏 |
| 既无同步又无互斥关系 | ①不同的用户在各自的电脑上同时编译程序; ②某网络监控系统中,多个被授权的用户对监控数据进行查看 |
| 与时间有关的相互制约关系 | ①民航飞机订票系统; ②网上银行存取款; ③汽车装配生产线; ④企业成品仓库的出入库系统 |
| 不相关关系(没有所谓平等关系) | ①公司考勤刷卡系统; ②没有共享公共变量的进程 |
3.5 信号量
信号量
- 信号量(Semaphore)是可用资源的总数目,初值一定大于等于零,变化范围可能是正整数、零、负整数
- 信号量可以进行的操作包括:P操作、V操作、初始化信号量操作(不能对信号量进行加减操作),信号量初始化后只能实施PV操作
PV原语:
- PV原语由P原语和V原语组成,可对信号量进行操作,主要为了实现进程的互斥与同步(不是解决死锁问题)
- PV原语的主要不足包括:程序不易读懂、程序不利于修改和维护、正确性难以保证
- P(S)将信号量S的值减1,即S=S-1;若S≥0,则该进程继续执行,若S<0,则线程进入阻塞队列
- V(S)将信号量S的值加1,即S=S+1;若S>0,则该进程继续执行,若S≤0,则唤醒阻塞队列的线程
| 信号量 | 描述 |
| sem/S | >0时,表示无阻塞线程,其大小为可用临界资源数 =0时,表示既没有可用的资源,也没有阻塞的线程 <0时,表示无可用资源,其大小为阻塞队列线程数 |
例题1:如果信号量S的值从原来的3变为5,那么进程对信号量S进行了k次P操作,k+2次V操作可以满足这一变化
例题2:用PV操作管理临界区时,把信号量mutex的初值设定为1,当有k (k>1)个进程在mutex的等待队列中时,信号量的值为-k(=信号量初值-1个临界-k个阻塞)
例题3:假设系统中有4台打印机,某些进程用信号量S实现对打印机的互斥使用,又假设系统中申请打印机的进程数量最多为20个,信号量S的正确数值范围为[4, -16]
例题4:学生小王在选课时编写了一个程序,为了保证有足够的学分,他先选了课程B,然后继续申请心仪的课程A,若能选到课程A,则退掉课程B。部分程序如下,则小王的程序有可能达到选到课程A又退掉课程B的目的

生产者消费者问题
- 生产者、消费者共享一个初始为空、大小为n的缓冲区
- 缓冲区是临界资源,各进程必须互斥地访问
| 信号量 | 描述 |
| empty | 表明空闲资源数目,初始值为n |
| full | 表明已满资源数目,初始值为0 |
| mutex | 用于实现互斥访问,初始值为1 |
- 生产者往缓冲区放产品前要先使用P(empty)操作确保缓冲区有空闲槽,只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待
- 消费者从缓冲区取产品前要先使用P(full)操作确保缓冲区非空,只有缓冲区不空时,消费者才能从中取出产品,否则必须等待
- 生产者中,P(empty)和P(mutex)两条语句不可以颠倒顺序,否则资源全满时可能死锁,而V(full)和V(mutex)两条语句可以颠倒顺序
- 消费者中,P(full)和P(mutex)两条语句不可以颠倒顺序,否则资源全空时可能死锁,而V(empty)和V(mutex)两条语句可以颠倒顺序

三、操作系统——生产者-消费者问题(两个同步一个互斥)_p(mutex)-优快云博客
读者写者问题
- 允许多个读者可以同时对文件执行读操作,但只允许最多一个写者往文件写信息
- 写者执行写操作前,应该让已有的读者或写者全部退出,且任一写者在完成写操作之前不允许其他读者或写者工作
| 信号量或变量 | 描述 |
| rmutex | 用于实现读操作的互斥访问,初始值为1 |
| wmutex | 用于实现写操作的互斥访问,初始值为1 |
| rc/ReadCount | 表示访问文件的读者进程数,初始值为0 |
- 语句①②使得多个读者能够同时访问文件,不可以取消

临界资源
- 临界资源的组成部分包括:进入区、临界区、退出区、剩余区
- 临界区是在采用PV操作对共享资源的使用进行保护时,对该共享资源读写的代码段
- 临界区访问应遵循的准则包括:空闲则入、忙则等待、有限等待、让权等待


管程
- 管程是为解决进程同步关系,引入条件变量,在条件变量上实施的PV操作
- 管程中在任意时刻只有一个活跃进程,从而保障共享资源互斥执行,但是管程本身无法保证互斥
- 管程内使用的对象包括:共享数据结构、一组操作过程
3.6 通信
相互感知问题
| 关系 | 含义 | 潜在控制问题 |
| 相互直接感知关系 | 双方直接交互,如通信 | 两个进程通过通信方式协作,但可能造成死锁或饥饿 |
| 相互间接感知关系 | 双方都与第三方交互,如共享资源 | 两个进程共享协作,但可能造成互斥、死锁、饥饿 |
| 相互不感知关系 | 互相之间完全不了解其他进程的存在,一个进程的结果对另一个进程的结果无影响 | 两个进程相互竞争,可能造成互斥、死锁、饥饿 |
进程间的通信
- 进程间的通信方式分为:低级通信和高级通信
- 低级通信主要传递控制信息效率较低(如信号量),高级通信能高效传递大量数据(如共享内存、消息传递、管道、套接字等)
- 共享内存(Shared Memory)需要解决的问题包括:①怎样提供共享内存;②公共内存中的读写互斥问题,第一个问题由操作系统提供解决,第二个问题由程序员提供解决
- 消息传递(Message Passing)可细分为:消息队列(直接)和信箱通信(间接)
- 管道通信(Pipeline)的不足之处是通信速度较慢
- 套接字(Socket)是一种进程间的网络通信机制
| 通信方式 | 具体内容 |
| 共享内存 | 设置一个公共内存区,一组向其中写,一组从其中读,适合传输大量信息,不需要在系统中产生多份相同的拷贝 |
| 消息传递 | ①消息队列利用内存中若干缓存区组织成队列,依赖进程或基础框架来调用实际执行的代码,包含消息缓冲区、消息队列首地址指针、同步互斥信号量、发送消息原语send(receiver, message)、接收消息原语receive(message); ②信箱通信发送进程首先创建一个链接两个进程的通信机制,然后把向信息送入该机制,发送进程和接受进程不直接联系,没有处理时间上的限制,发送者可以在任何时间发信,接受者可以在任何时间收信,即异步收发方式 |
| 管道通信 | 两个进程通过打开一个共享文件,实现进程间的通信 |
| 套接字 | 将客户机和服务器区分开来,既可以实现网络间不同主机间的通信外,又可以实现同一主机的不同进程间的通信 |
- 不同进程之间进行通信时可以按需要采用同步或异步的方式,管道通信只为同步,共享内存、消息机制、套接字可同步或异步
- 不同进程之间进行通信时已满的邮件槽发送进程不能再申请互斥锁
例题:当采用信箱进行通信时,接收原语receive()操作中必须包含的信息包括:指定的信箱名、取出的信件将存放的内存地址
四、存储管理方案
4.1 存储管理方案
存储管理方案
- 存储管理方案包括:固定分区、可变分区、页式、段氏、段页式
固定分区
- 固定分区和可变分区方案以一个进程为单位分配一组连续的内存单元
- 固定分区和可变分区方案从地址结构来看,要求进程的逻辑地址与内存存储区域都连续
可变分区
- 可变分区方案支持多道程序技术且设计上又简单
- 可变分区方案的系统中,随着分配和回收次数的增加,必然导致碎片的出现
页式
- 页式方案使内存的利用率较高且管理简单
- 页式方案从地址结构来看,逻辑地址连续,物理页面可以不相邻
- 页式方案的分页守护进程在后台执行(不是在前台执行)
- 页式方案的系统中,为了提高内存利用率并减少内碎片,操作系统可以动态改变页面大小并根据需要采用多种不同大小的页面(用户不可以改变页面)
- 页式方案的系统中,页面的划分与页表数量相关,可以找到平衡点
段页式
- 段页式方案以段为单位管理虚拟内存空间,以页为单位管理物理内存空间
- 段页式方案的系统中,先分段再分页
外碎片和内碎片
- 可能产生外部碎片的存储管理方案包括:可变分区、段式
- 可能产生内部碎片的存储管理方案包括:固定分区、页式、段页式
4.2 存储管理技术
虚拟存储技术
- 虚拟存储技术允许用户使用比物理内存更大的存储空间,可以与页式、段式、段页式管理结合使用,虚拟段式和虚拟页式允许动态扩充内存容量
- 虚拟存储技术实现的硬件支持基础是缺页中断机制
- 虚拟存储空间的大小主要跟计算机地址位宽(如32位、64位)有关
- 在虚拟存储系统中,进程的部分程序装入后便可运行
- 在引入虚拟页式存储管理的系统中,会出现的问题包括:缺页中断(如页面抖动、Belady异常)、页面写错误
- 在引入虚拟页式存储管理的系统中,不会出现的现象包括:越界中断
移动技术
- 移动技术又称内存紧缩技术,可以实现碎片整合,即通过移动内存中的程序,把所有零碎的空闲区碎片合并成一个连续的大空闲区并且放在内存的一端,而把所有程序放在另一端
- 移动技术可以为进程执行过程中扩充内存提供方便,但会增加系统开销,采用移动技术时应尽可能减少移动的进程数量
- 可变分区需要采用移动技术来解决碎片问题
- 页式不能采用移动技术解决碎片问题
- 内存中进程的移动需要满足一定的条件和经过特定的处理过程(不是随时都能进行移动)
- 内存中可以将进程从低地址区域移到高地址区域,也可以将进程从高地址区域移到低地址区域
例题1:当一个程序在内存中移动时,需要做的工作有:进行内存重定位、读出该程序在内存中的所有代码和数据、将读出的代码和数据写入目标内存中、修改内存已分配区表、修改空闲区表
例题2:某计算机操作系统采用可变分区管理方案,当前的内存分配表如下所示,当系统运行一段时间后:
进程P1退出,那么操作系统应该将表中进程P1所在行的标志置为NULL,并将上下两个空闲区与其合并成一个空闲区,修改空闲区表
进程P2退出,那么操作系统应该将表中进程P2所在行的标志置为NULL,并将上邻空闲区与其合并成一个空闲区,修改空闲区表
进程P3退出,那么操作系统应该将表中进程P3所在行的标志置为NULL,无须修改空闲区表
进程P4退出,那么操作系统应该将表中进程P4所在行的标志置为NULL,并将下邻空闲区与其合并成一个空闲区,修改空闲区表
| 序号 | 起始地址 | 长度 | 标志 |
| 1 | 0 | 1000 | NULL |
| 2 | 1000 | 2000 | P1 |
| 3 | 3000 | 500 | NULL |
| 4 | 3500 | 1000 | P2 |
| 5 | 4500 | 1500 | P3 |
| 6 | 6000 | 2000 | P4 |
| 7 | 8000 | 1000 | NULL |
交换技术
- 交换技术将暂时不用的进程代码、数据和部分进程控制块交换至磁盘,在需要运行这些进程时再将它们装入内存
- 可以将整个进程交换的存储管理方案包括:固定分区、可变分区
- 可以进行进程部分交换的存储管理方案包括:页式、段式、段页式
覆盖技术
- 覆盖技术是指一个程序按照自身的逻辑分段时,若干程序段可共享同一个内存空间,未执行的程序段先保存在磁盘上,当有关程序段的前一部分执行结束后,把后续程序段调入内存,覆盖前面的程序段
存储保护
- 用户程序不能读写系统区地址空间的数据,也不能读写其他用户程序地址空间的数据
- 地址越界中断是进程在运行时所产生的地址超出其地址范围空间时产生的中断,由操作系统进行写保护处理
工作集模型
- 操作系统为每一个进程保持一个工作集,采用工作集算法可以预防内存换页时出现抖动现象
- 工作集是随时间而动态变化的,工作集大小与窗口尺寸密切相关,每一个进程提供与工作集大小相等的物理界面
动态分区分配方案
- 首次适应算法(First Fit, FF)是按空闲区地址从小到大排列,直到找到第一个能满足要求的空闲分区为止,倾向于使用低地址空闲区
- 下次适应算法(Next Fit, NF)是按空闲区地址从小到大排列,但从上次找到的空闲分区的下一个空闲分区开始,不用每次都从低地址的分区开始检索
- 最佳适应算法(Best Fit, BF)是按空闲区大小递增顺序排列,直到找到第一个能满足要求的空闲分区为止,优先使用更小的分区(最小空闲区)
- 最差适应算法(Worst Fit, WF)是按空闲区大小递减顺序排列,直到找到第一个能满足要求的空闲分区为止,优先使用更大的分区(最大空闲区)
例题:假设某计算机系统的内存大小为256K,在某一时刻内存的使用情况如下表所示,此时,若进程顺序请求5K、15K和30K的存储空间:
| 起始地址 | 0K | 10K | 25K | 45K | 95K | 100K | 130K | 155K | 190K | 200K |
| 状态 | 已用 | 未用 | 已用 | 已用 | 未用 | 已用 | 未用 | 已用 | 已用 | 未用 |
| 容量 | 10K | 15K | 20K | 50K | 5K | 30K | 25K | 35K | 10K | 56K |
若系统采用首次适配算法为进程分配内存,则分配后的内存情况如下表所示
| 起始地址 | 0K | 10K | 15K | 25K | 45K | 95K | 100K | 130K | 145K | 155K | 190K | 200K | 230K |
| 状态 | 已用 | 已用 | 未用 | 已用 | 已用 | 未用 | 已用 | 已用 | 未用 | 已用 | 已用 | 已用 | 未用 |
| 容量 | 10K | 5K | 10K | 20K | 50K | 5K | 30K | 15K | 10K | 35K | 10K | 30K | 26K |
若系统采用最佳适配算法为进程分配内存,则分配后的内存情况如下表所示
| 起始地址 | 0K | 10K | 25K | 45K | 95K | 100K | 130K | 155K | 190K | 200K | 230K |
| 状态 | 已用 | 已用 | 已用 | 已用 | 已用 | 已用 | 未用 | 已用 | 已用 | 已用 | 未用 |
| 容量 | 10K | 15K | 20K | 50K | 5K | 30K | 25K | 35K | 10K | 30K | 26K |
若系统采用最差算法为进程分配内存,则分配后的内存情况如下表所示
| 起始地址 | 0K | 10K | 25K | 45K | 95K | 100K | 130K | 155K | 190K | 200K | 205K | 220K | 250K |
| 状态 | 已用 | 未用 | 已用 | 已用 | 未用 | 已用 | 未用 | 已用 | 已用 | 已用 | 已用 | 已用 | 未用 |
| 容量 | 10K | 15K | 20K | 50K | 5K | 30K | 25K | 35K | 10K | 5K | 15K | 30K | 6K |
内存分配表
- 内存分配表用于对内存进行分配和回收
- 内存分配表的组织方式或文件存储空间中空闲磁盘块的分配管理方法包括:空闲区表(空闲块表,空闲页面表)、空闲链表(空闲块链表,空闲页面链表)、位示图、成组链接法
- 在采用虚拟页式存储管理的系统中,为实现地址变换所涉及到的数据结构包括:页表、空闲区表、位示图
- 在采用虚拟页式存储管理的系统中,管理空闲物理内存的方法包括:空闲区表、空闲链表、位示图
- 在UNIX操作系统的文件系统中,对空闲区的管理通常采用的方法包括:成组链接法
成组操作
例题:假设某文件由100个逻辑记录组成,每个逻辑记录长度为80个字符,磁盘空间被划分为若干块,块大小为1024个字符:
在没有采用成组操作时,磁盘空间的块利用率是8%(=80/1024,每个记录占用1个块)
若采纳块因子为12的成组操作,磁盘空间的块使用率是94%(=80×12/1024,每个块存储12个记录)
位视图
例题1:某文件系统采用下表所示的位示图来管理空闲磁盘块,当文件归还块号为30的磁盘块时,应该将表中1行14列对应的位置零(横向无折返地从0开始数至30,即行30|16=1,列30%16=14)
| 列 行 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
| 2 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
| 3 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
例题2:某文件系统采用下表所示的位示图来管理空闲磁盘块,若文件A申请8个磁盘块,之后文件B申请5磁盘块,则有:
若文件的物理结构是顺序结构,则A和B的磁盘块都必须是连续的,A的第1块放在2行A列,B的第1块放在4行1列
若文件的物理结构是链接结构或索引结构,则A和B的磁盘块可以是分散的,如A的第1块放在1行4列,B的第1块放在2行7列
| 列 行 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
| 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 |
| 2 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 4 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 |
| 5 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 |
| 6 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 7 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
4.3 页面
页表
- 页表项个数又称页表长度
- 虚拟页式方案的系统中,每个页表项中必须有的内容包括:页框号、有效位(存在位,驻留位,中断位)、修改位、访问位(引用位)(不一定包含磁盘起始地址)
- 虚拟页式方案相比于简单页式方案,页表项中通常需要增加的信息包括:有效位、修改位、访问位(不需要增加停止位、校验位)
例题:在虚拟页式存储管理方案的系统中,当判断一个页面是已调入内存还是在外存时需要用到页表项的有效位
物理块
- 物理块又称页框或页架,是将内存等分成大小为2的幂次方的内存块
例题:一个进程的内存分配页表如下,页的大小为500B,其中有效位为1表示已装入内存,W表示可写,R表示可读。指令WRITE[3,100]在执行时会产生写保护中断
| 页号 | 有效位 | 页框号 | 存取控制 |
| 0 | 0 | 5 | W |
| 1 | 1 | 10 | R |
| 2 | 1 | 30 | W |
| 3 | 1 | 80 | R |
| 4 | 0 | 50 | R |
页面调入策略
- 页面调入是指在虚拟页式存储管理方案程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序
- 在虚拟页式存储管理系统中,置换策略、调入策略、置页策略与页面调度有关
- 页面调入策略常用的包括:预调页、请求调页
- 预调页在发生缺页需要调入某页时,一次调入该页以及相邻的几个页
- 请求调页只调入发生缺页时所需的页面,实现简单,但容易产生较多的缺页中断,容易产生抖动现象
- 若采用请求调页方式,当用户需要装入一个新的页面时,其调入的页面来自磁盘交换区
页面置换策略
- 页面置换是指在虚拟页式存储管理方案程序执行过程中,内存空间不够时,操作系统需要把内存中暂时用不到的信息换出到外存
- “固定分配、局部置换”策略的含义是为每一个进程分配固定数目的内存页面,进程运行中出现缺页时只能在本进程的页面中进行置换
- “可变分配、全局置换”策略的含义是为每一个进程分配一定数量的内存页面,进程运行中其内存页面可以动态增长或减少,运行的进程当其页面不够时可以从系统中的任何进程处进行置换
- 虚拟页式存储管理方案的实现所必须具备的软硬件条件包括:页表、缺页中断处理程序、实现虚拟地址到物理地址映射的机制、系统有一定容量的内存、系统有容量足够大的磁盘外存(没有系统有高速处理器)
例题1:在某虚拟页式存储管理系统中,某一时刻CPU的利用率为50%,磁盘的繁忙率为3%。针对这一情况,合理的操作是适当增加进程数量以提高系统效率
例题2:在某虚拟页式存储管理系统中,某一时刻CPU的利用率为3%,磁盘的繁忙率为97%。针对这一情况,合理的操作是适当减少进程数量以提高系统效率
例题3:在某虚拟页式存储管理系统中,假设内存按字节编址(每个地址指向的存储单元可以保存1个字节的数据),若系统采用20个二进制位表示虚拟页号,页内地址部分占用12个二进制位,则允许一个进程最大有2^20个字节,每个页面的大小为多少字节2^12个字节,则允许一个进程最大有28(=2^(20-12))个页面。
例题4:在某虚拟页式存储管理系统中,系统采用二级页表进行地址转换,若不考虑高速缓存和快表,则进程每执行一条指令至少需要访问3次内存(一级页表1次,二级页表1次,物理内存1次)
页面置换算法
- 页面置换算法包括:最佳置换算法、先进先出置换算法、最近最久未用置换算法(也有个别翻译为最近最少使用置换算法)、最近最不常用置换算法、时钟算法
- 最佳置换算法(Optimal, OPT)置换时淘汰在未来以后永不再使用的页面,或离当前最长时间内将不再被访问的页面,可以保证最低的缺页率,但无法实现
- 先进先出置换算法(First In First Out, FIFO)置换时淘汰最先进入内存的页面,即驻留在内存时间最长的页面,会产生Belady异常现象
- 最近最久未用置换算法(Least Recently Used, LRU):置换时剔除最近一段时间最久没有使用的页面,即距现在最长时间内没有被访问过的页面,需要记录每个页面自上次被访问以来所经历的时间,算法的具体实现可表述为:①当数据被访问时,将数据移动到缓存结构的前端,表示它是最近使用的数据;②当缓存满时,移除缓存结构尾部的数据,这些数据是最久未使用的(典型例子如微信小程序列表)
- 最近最不常用置换算法(Least Frequently Used, LFU)置换时剔除最近一段时间使用次数最少的页面,需要记录每个页面被访问的次数
- 时钟算法(CLOCK)又称最近未使用置换算法(Not Recently Used, NRU),算法的具体实现可表述为:①访问位为0表示最近没访问过,就选择该页换出;②访问位为1表示最近访问过,则将它置为0但暂不换出;③淘汰页面最多会经过两轮扫描
- 改进的时钟算法在最近的一个时钟滴答(Tick)中按优先级置换:①第一优先级是最近没访问且没修改的页面;②第二优先级是最近没访问但修改过的页面;③第三优先级是最近访问过但没修改的页面;④第四优先级是最近访问过且修改过的页面
例题1:在虚拟页式存储方案中,当进行页面置换时需要用到页表项的访问位和修改位
例题2:页面置换算法中,最近最久未用算法(LRU)和最近未使用算法(NRU,即CLOCK)需要用到访问位
例题3:有一个虚拟页式存储管理系统,分配给某个进程3个页框,假设开始时页框为空,某进程执行时的页面访问序列是0、6、0、1、5、1、5、4、1、2、5、2、4、5、2、3、5、3,若分别采用FIFO和OPT算法,则该进程的缺页次数分别为8和7次
| 页面走向 | 0 | 6 | 0 | 1 | 5 | 1 | 5 | 4 | 1 | 2 | 5 | 2 | 4 | 5 | 2 | 3 | 5 | 3 |
| 物理块 | 0 | 0 | 0 | 0 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 3 | 3 | 3 |
| 6 | 6 | 6 | 6 | 6 | 6 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 5 | 5 | ||
| 1 | 1 | 1 | 1 | 1 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | ||||
| 缺页中断 | √ | √ | √ | √ | √ | √ | √ | √ |
| 页面走向 | 0 | 6 | 0 | 1 | 5 | 1 | 5 | 4 | 1 | 2 | 5 | 2 | 4 | 5 | 2 | 3 | 5 | 3 |
| 物理块 | 0 | 0 | 0 | 0 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 |
| 6 | 6 | 6 | 6 | 6 | 6 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 3 | 3 | 3 | ||
| 1 | 1 | 1 | 1 | 1 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | ||||
| 缺页中断 | √ | √ | √ | √ | √ | √ | √ |
例题4:在一个请求调页的虚拟存储管理系统中,页面的大小为1024B,某进程在运行过程中要访问的虚拟地址分别为2050、4121、89、1056、2100、144、4097、156、1121、2200、3996、288、2200、567、5109(除以1024的商即为页面访问序列),系统给该进程分配3个页框,若采用LRU页面置换算法,则该进程的缺页率为73%(=11/14)
| 页面走向 | 2 | 4 | 0 | 1 | 2 | 0 | 4 | 0 | 1 | 2 | 3 | 0 | 2 | 0 | 5 |
| 物理块 | 2 | 2 | 2 | 1 | 1 | 1 | 4 | 4 | 4 | 2 | 2 | 2 | 2 | 2 | 2 |
| 4 | 4 | 4 | 2 | 2 | 2 | 2 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | ||
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 3 | 3 | 3 | 5 | |||
| 缺页中断 | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ |
解析:
FIFO解题技巧:从上往下,依次替换
OPT解题技巧:向右看去,替换最远或不再出现的那个数,两个数都不再出现则优先替换靠上的数(例题2中0和6都不在未来出现,但0的位置靠上,因此将0替换掉)
LRU解题技巧:向左看去,替换最远的那个数(例题3中最近出现的是4和0,因此将2替换掉)
例题5:有一个虚拟页式存储系统采用最近最少使用(LRU)页面置换算法,系统分给每个进程3页内存,其中一页用来存放程序和变量i,j(不作他用),假设一个页面可以存放300个整数变量:
某进程程序如下,设变量i,j放在程序页面中,初始时,程序及变量i,j已在内存,其余两页为空。若矩阵A按行序存放(一个页面存储300/100=3行数据),那么当程序执行完后共产生50(=150/3)次缺页中断;若矩阵A按列序存放(一个页面存储300/150=2列数据),那么当程序执行完后共产生7500(=150×100/2)次缺页中断

某进程程序如下,设变量i,j放在程序页面中,初始时,程序及变量i,j已在内存,其余两页为空。若矩阵A按行序存放(一个页面存储300/100=3行数据),那么当程序执行完后共产生5000(=100×150/3)次缺页中断;若矩阵A按列序存放(一个页面存储300/150=2列数据),那么当程序执行完后共产生50(=100/2)次缺页中断


页面抖动
- 页面抖动又称页面颠簸,抖动现象会导致系统效率急剧下降,系统用于调度页面所需要的时间比进程实际运行所占用的时间还多
- 在虚拟页式存储管理方案的系统中,引起抖动现象发生的原因包括:①页面置换算法不合理,页面可能在内存与外存之间频繁地调度,缺页率高,有可能出现抖动;②进程对内存有临界要求,当分配给进程的物理页面数小于该临界值时,缺页率上升,也可能出现抖动,此时增加物理页面数不可以显著减少缺页次数
页表项管理
- 在虚拟页式存储管理方案的系统中,页表项有多个管理用的参数和标志位,包括:有效位(驻留位、存在位、中断位)、读写位、访问位、修改位
- 当创建一个新的进程并调度运行时,该进程须装入一个页面,则该页面对应的页表项中必须修改内存块号、驻留位、访问位
- 某进程的一个页面内容被修改后,对应该页面的页表项中必须修改访问位、修改位
- 某进程运行时若将磁盘中的一个页面调入内存,该页面对应的页表项中必须修改内存块号、驻留位、访问位
- 当发生缺页中断且选中一个页面进行淘汰时,该页面对应的页表项中必须修改驻留位
- 以上的页表项中都不需要修改保护位
例题:某虚拟页式存储管理系统当前内存的分配情况如下表所示,假设当前时间为6500:
当采用先进先出(FIFO)页面置换算法时,要淘汰的页面页号为11(根据调入内存时间判断)
当采用最近最久未用(LRU)页面置换算法时,要淘汰的页面页号为15(根据访问位和调入内存时间判断,访问位为0时,调入时间越早越久未使用)
当采用最近最不常用(LFU)页面置换算法时,要淘汰的页面页号为22(根据访问次数判断)
当采用最近未使用(NRU)页面置换算法时,要淘汰的页面页号为34(根据访问位和修改位判断,访问位和修改位均为0,第一优先)
| 页号 | 调入内存时间 | 访问位 | 修改位 | 页框号 | T时间内访问次数 |
| 11 | 1024 | 1 | 0 | 34FB | 25 |
| 15 | 2086 | 0 | 1 | 78BC | 43 |
| 22 | 3945 | 1 | 1 | 5643 | 11 |
| 34 | 5440 | 0 | 0 | 7668 | 39 |
多级页表
例题1:在一个采用三级索引结构的UNIX文件系统中,假设物理块大小为1KB,用32位表示一个物理块号(一个物理块可以存放1KB/32b=1KB/4B=256份地址),一级、二级和三级索引表的大小均为一个磁盘块,主索引表含有13个块地址指针项,其中前10个直接指向盘块号,第11个指向一级索引表(存放了256份地址),第12个指向二级索引表(存放了256^2份地址),第13个指向三级索引表(存放了256^3份地址),那么一个文件最大可有10+256+256^2+256^3块,文件的最大尺寸不能超过(10+256+256^2+256^3)×1KB,要访问文件的第1000块需要启动2次磁盘(二级索引表需要2次间接寻址)

例题2:某虚拟页式存储管理系统采用三级页表,分配如下表所示,某进程运行时执行的一条指令的地址是EF882155(十六进制转二进制1110-1111-1000-1000-0010-0001-0101-0101),则该地址中页目录偏移量为11,二级页表偏移量为10-1111-100,三级页表偏移量为0-1000-0010,页内地址偏移量为0001-0101-0101
| 页目录 | 二级页表 | 三级页表 | 页内地址 |
| 2位 | 9位 | 9位 | 12位 |
快表
- 快表(Translation Lookaside Buffer, TLB)存放在高速缓存中(不是寄存器组中)
- 快表的内容是页表的一部分(不是页表的全集)
- 切换进程时需要刷新(更新)快表
- 对快表的查找是按内容并行进行的
例题:某页式存储管理系统采用一级页表。如果访问内存的时间为0.4 μs,快表的命中率为90%,假设访问快表耗时为0 μs,那么有效访问时间是0.44 μs
解析:
快表到物理内存的时间:0 μs+0.4 μs=0.4 μs
一级页表到物理内存的时间:0.4 μs+0.4 μs=0.8 μs
加权平均:0.4 μs×90%+0.8 μs×10%=0.44 μs
4.4 地址
页内地址和页面大小
- 页内地址占12位时,页面大小为2^12即4KB,注意是字节B不是比特b(每一个页内地址代表一个字节的存储空间)
- 系统将虚拟地址空间等分为若干页面,大小与页框相同
- 虚拟页面在物理空间上不要求连续存放,不要求所有页必须常驻内存
例题1:简单页式存储管理方案中,若一个进程的虚拟地址空间为2GB,页面大小为4KB,当用4字节表示物理页号时,则有524288(=2GB/4KB)个页表项,页表大小2MB(=2GB/4KB×4B),页表需要占用512(=2MB/4KB)个页面
例题2:简单页式存储管理方案中,若地址用2个字节表示,页内地址部分占12个二进制位,则页面大小或内存分块大小为2^12,最大允许进程有16(=2^(2×8-12))个页面
例题3:下表是某页式内存分配的情况,页面大小为0x1000B(即4096B,0x为十六进制的前缀,十六进制1000转十进制为4096),有效位为1表示该页在内存。系统将逻辑地址0x088B、0x01F3C、0x2220、0x0356F、0x441C(对应页号分别为0、1、2、3、4,参考逻辑地址和物理地址的例题)转换为物理地址时,会产生2次缺页中断
| 页号 | 页框号 | 有效位 |
| 0 | 08000000 | 1 |
| 1 | -------- | 0 |
| 2 | 08005000 | 1 |
| 3 | -------- | 0 |
| 4 | FF003000 | 1 |
逻辑地址和物理地址
| 情况一 | 情况二 |
| ①逻辑地址=页号∪页内地址,注意此处的“∪”表示“合并”而非“相加”; ②物理地址=块号∪页内地址,注意此处的“∪”表示“合并”而非“相加” | ①逻辑地址=页号×页面大小(等于块长)+页内偏移量,注意此处的“+”表示“相加”而非“合并”; ②物理地址=块号×块长(等于页面大小)+页内偏移量,注意此处的“+”表示“相加”而非“合并”; ③页号=逻辑地址|页面大小,注意此处的“|”表示整数商; ④页内偏移量=逻辑地址%页面大小,注意此处的“%”表示余数 |
例题1:某一页式存储管理系统中,逻辑地址长度为16位,页面大小为4KB,对一个3页大的作业,其0、1、2页依次装入内存的第3、12、7块,虚拟地址2F6AH转换成内存地址为7F6AH,其中H表示十六进制
解析:①页面大小4KB即2^12,对应页内地址12位;②虚拟地址2F6AH十六进制转二进制0010-1111-0110-1010,其中页号为0010(十进制2);③页号2转块号为7;④内存地址0111-1111-0110-1010二进制转十六进制7F6AH,其中块号为0111(十进制7)
例题2:已知有一系统采用分页存储管理,页面大小为1KB,对一个4页大的作业,其0、1、2、3页分别被分配到内存的2、4、6、7块中,逻辑地址2500D变换为物理地址为6596D,其中D表示十进制
解析:①页面大小1KB即2^10=1024,块长也为1024;②页号=2500|1024=2,转块号为6;③页内偏移量=2500%1024=452;④物理地址=6×1024+452=6596
链接和重定位
- 链接是将多个目标程序装配成可运行的程序的过程
- 重定位又称地址映射,是把程序的逻辑地址转换成内存中的实际物理地址的过程,分为:静态重定位(静态地址映射)和动态重定位(动态地址映射)
- 静态重定位是指在用户程序执行前,把程序中的指令地址和数据地址经过计算,全部转换成绝对物理地址后再装入物理内存
- 动态重定位是指在装入一个程序时,先直接把程序装入到所分配的内存区域中,然后在程序执行过程中要访问指令或数据时,当每一条指令执行时刻再由硬件地址转换机构将指令中的逻辑地址转换成绝对物理地址,可以保证一个程序在主存中被改变了存放位置后仍能正确执行
- 地址转换通常是由硬件完成的(不是操作系统完成的),硬件机制实现逻辑地址到物理地址的动态转换
- 在采用分页管理的系统中,页表项的一些内容是由硬件确定的,根据页表项的有效位确定所需访问的页面是否已经在内存
- 在不采用分页管理的系统中,地址映射过程中不一定要访问页目录和页表
五、文件系统设计与实现技术
5.1 文件和目录
文件分类
- 文件按用途分为:系统文件、用户文件、库函数文件
- 文件按组织形式分为:普通文件、目录文件、特殊文件
- 文件按保护方式分为:只读文件、读写文件、可执行文件、无保护文件
- 文件按信息流向分为:输入文件、输出文件、输入输出文件
- 文件按存放时限分为:时文件、永久文件、档案文件
- 文件按使用介质类型分为:磁盘文件、磁带文件、卡片文件、打印文件
文件内容
- 构成文件内容的基本单位称为信息项
文件控制块FCB
- 文件控制块(File Control Block, FCB)是在创建文件操作时由操作系统为文件设置的用于描述和控制文件的数据结构,包括:文件存取控制信息、文件结构信息、文件管理信息(没有文件路径信息)
- 文件控制块具体包括:文件名、文件号、文件拥有者用户名、文件存储地址(文件物理位置)、文件磁盘块起始地址、文件长度(文件大小)、文件类型、文件属性、文件访问权限、共享计数、文件的建立日期(文件创建时间)、文件保存期限、最后修改日期、最后访问日期、口令、文件逻辑结构、文件物理结构等(没有文件访问控制列表)
- 从用户角度看,文件控制块中最重要的字段是文件名,用户在创建和使用文件时必须要给出文件名
文件访问权限
| 权限 | 对文件而言 | 对目录而言 |
| 读 | 可以查看文件内容 | 可以浏览目录中的内容 |
| 写 | 可以编辑文件内容 | 可以在目录中创建和删除文件 |
| 执行 | 可以执行文件 | 可以进入目录 |
文件描述符
- 文件描述符是在成功执行打开或创建文件操作时由操作系统返回的(不是设置的)
- 在多级目录的文件系统中,用户对文件的首次访问通常都给出文件的完整路径名,之后对文件的访问通常使用文件描述符
打开文件表
- 整个系统只有一张系统打开文件表,但每个进程设置自己的用户打开文件表
- 系统打开文件表表格专门用来保存已打开文件的文件控制块,还保存有已打开文件的文件号、共享计数(用来标记是否有多个进程打开同一个文件)、修改标志等,可以被修改
- 用户打开文件表表格中包含指向系统打开文件表的指针,记录了本次文件被打开的方式,记录了打开文件时系统返回的文件描述符
文件目录
- 多个文件的文件控制块集中在一起组成了文件目录,文件目录以文件的形式保存起来称为目录文件,在目录文件中每个文件的文件控制块又称为目录文件中的目录项
树形目录
- 树形目录又称多级目录
- 从用户角度看,建立多级树形目录的主要目标是解决文件重名问题
- 树形目录的优点包括:层次清晰、便于实现子树中文件保护保密共享、加快了目录检索速度等
- 树形目录的缺点包括:结构比较复杂、不利于简化目录管理
- 用户不可以创建根目录
例题1:在下图所示的UNIX树形文件目录结构中,方框代表目录,椭圆代表文件,根目录root常驻内存,其他文件和目录均在磁盘中存放,其中用户Li和Sun是同组用户,他们的目录分别为Li和Sun,其目录及其他的子目录和文件的属性如下表所示,那么:

| 目录或文件名 | 文件主权限 | 同组用户权限 | 其他用户权限 |
| Li | 读、写、执行 | 读、写 | 读 |
| Linux.pdf | 读、写 | 读 | 读 |
| Sun | 读、写、执行 | 读、写 | 读 |
| Doc | 读、写 | 读 | 读 |
| Course | 读、写 | 读 | 读 |
| Unix.pdf | 读、写 | 读 | 读 |
| root | 读、写、执行 | 读 | 读 |
可以正确运行的操作有:用户Li删除Linux.pdf、用户Sun在Doc目录下删除文件、超级用户在根目录下创名为Wang的目录
不能正确运行的操作有:用户Li删除Unix.pdf、用户Li在Doc目录下创建文件、用户Li在根目录下删除名为Wang的目录
例题2:在UNIX系统中,若文件File的权限是736,则表示文件属主可读、可写、可执行该文件,同组用户可写、可执行该文件,其他用户可读、可写该文件
解析:
权限7=可读4+可写2+可执行1
权限3=可写2+可执行1
权限6=可读4+可写2
目录项分解
- 目录项分解法把目录项分为:符号目录项(次部)和基本目录项(主部),可以加快目录检索
- 限制子目录个数不能提高文件目录检索效率
例题:在实现文件系统时可采用“目录项分解法”加快文件目录检索速度,假设目录文件存放在磁盘上,每个盘块512字节,文件控制块有64字节(分解前每个盘块有512/64=8个文件控制块),其中文件名占8字节,文件控制块分解后,第一部分包括文件名和文件内部号,占有10字节(分解后每个盘块有512|10=51个文件控制块),第二部分包括文件内部号和文件其他信息,占有56字节。假设某一个目录文件共有128个文件控制块(分解前128个文件控制块占128/8=16个盘块,分解后128个文件控制块占⌈128/51⌉=3个盘块),访问每个文件控制块的概率相等,则:
采用目录项分解法前,查找该目录文件的某一个文件控制块的平均访盘次数是8.5次
采用目录项分解法后,查找该目录文件的某一个文件控制块的平均访盘次数是3次
解析:
采用目录项分解法前,最好的情况访盘1次,最差的情况访盘16次,访盘1~16次的概率相等,求数学期望为(1+2+3+…+16)/16次,根据求和公式即16×(1+16)/2/16=(1+16)/2=8.5次
采用目录项分解法后,读取第一部分的内容平均访盘(1+3)/2=2次,读取第二部分的内容访盘1次,总计2+1=3次
5.2 文件的结构
逻辑结构和物理结构
- 文件的逻辑结构是指操作系统提供给用户使用的文件组织结构,文件的物理结构是指操作系统管理的文件在存储介质上的组织结构
文件逻辑结构
- 文件逻辑结构是在用户面前呈现的结构,常用的包括:无结构流式(二进制流或字符流)文件、定长记录文件、不定长(变长)记录文件
文件物理结构
- 文件物理结构是在存储介质面前呈现的结构,常用的包括:顺序结构(连续结构)、链接结构、索引结构
| 物理结构 | 结构特点 | 适用介质 |
| 顺序结构 | 文件的逻辑块与存储介质上物理块存放顺序一致的文件物理结构 | 磁带、磁盘 |
| 链接结构 | 若将逻辑上连续的文件信息分散存放在若干不连续的磁盘块中,每个磁盘块中设置一个指向下一个磁盘块的指针的文件物理结构 | 磁盘 |
| 索引结构 | 若将逻辑上连续的文件信息分散存放在若干不连续的磁盘块中,并将所有磁盘块的地址集中存放在一张表中的文件物理结构 | 磁盘 |
- 在操作系统中,文件的逻辑块号到磁盘块号的转换由物理结构决定
- 在文件系统中,文件的存取方式依赖于文件的物理结构和存放文件的设备的物理特性,文件存储空间的分配单位通常是数据块
- 在文件系统中,设置当前工作目录的主要目的是加快文件的检索速度,由用户决定如何设置当前工作目录(不是由操作系统决定)
文件存取方式
- 顺序存取的优点包括:最适合连续存取、也支持随机存取、文件的逻辑块号到物理块号的变换简单、文件存取和查找的速度快
- 顺序存取的缺点包括:文件内容不易动态增加、随着不断创建和删除文件可能产生磁盘碎片
- 链接存取的优点包括:适合顺序存取、文件内容可以很容易动态增加、磁盘空间出现的碎片较少
- 链接存取的缺点包括:不适于随机存取文件、检索速度慢
- 索引存取的优点包括:既适合随机访问、也适合顺序存取、文件内容可以很容易动态增加易于文件扩展、文件的逻辑块号到物理块号的变换简单、文件查找速度较快
- 索引存取的缺点包括:存储空间利用率较低
5.3 文件系统
文件系统
- 文件系统建立从用户角度看,主要目标是实现文件的按名存取,文件系统实现文件的按名存取是通过文件目录查找工作完成的
- 文件系统设计时应尽量减少访问磁盘的次数,以提高文件系统的性能
- 提高文件系统性能和减少访问磁盘的次数的措施包括:块高速缓存、磁盘空间合理分配、磁盘驱动调度优化、目录项分解
- 使用文件系统时,通常要显式地进行open()操作,这样做的目的是将文件控制块读入内存
- 使用文件系统时,通常要显式地进行close()操作,这样做的目的是将文件控制块写入磁盘或缓存
例题:在一个文件系统中磁盘块大小为4096B,若某文件的大小为2555900B,则该文件需要占用624(=⌈2555900/4096⌉)个磁盘块
文件系统类型
- 文件分配表(File Allocation Table, FAT)文件系统中文件采用的物理结构是链接结构
- FAT16指系统中用16位表示簇号,只能支持8个字符文件名
- FAT32指系统中用32位表示簇号
- 新技术文件系统(New Technology File System, NTFS)支持可达到255个字符的长文件名
- 区分文件名的大小写文件系统包括:Linux的EXT2、EXT3、EXT4
- 不区分文件名的大小写文件系统包括:Windows的FAT、NTFS
5.4 文件的操作
文件操作
- 文件的创建日期和时间属性一经创建后就不能修改
- 文件一旦创建,除非被删除或超过保存期限,否则一直存在
- 文件的保存期限是可以设置的,也是可以是缺省的
- 实现创建文件操作时,需要检查文件名的合法性(不需要检查文件的存取权限是否合法)
- 实现读写文件操作时,需要检查文件的存取权限是否合法
- 完成打开文件操作时,必须指定打开方式
| 操作 | 过程顺序 |
| 创建文件 | 检查参数合法性→检查重名→查找FCB空闲位置→填写FCB |
| 打开文件 | 查找FCB主部→检查打开方式→检查用户身份→填写进程打开文件表 |
| 修改后关闭文件 | 查找文件→修改FCB相关内容→置FCB为“非活跃”→写回磁盘 |
| 删除文件 | 查找文件→检查删除合法性→收回FCB资源→收回文件存储空间 |
文件安全
- 文件安全的保证方法包括:建立文件副本、定时转储备份文件、设置文件访问控制列表(规定文件的存取权限)(没有采用RAID阵列、加装不间断电源、使用固态硬盘)
- 文件存取的控制和保护方法包括:存取控制矩阵、用户权限表、口令或密码
- 在存取控制矩阵方式中,系统以一个二维矩阵来实施文件的存取控制,其中一维代表所有的用户,另一维代表所有的文件
- 外存储设备的存取过程顺序:读状态→置数据→置地址→置控制→读状态…,如此重复
转储
- 转储可以分为:全量转储和增量转储
- 全量转储指每次转储全部数据库
- 增量转储指每次只转储上一次转储后更新过的数据
六、I/O设备管理
6.1 I/O设备分类
I/O系统硬件结构
- I/O系统的硬件结构主要包括:适配器和接口部件、设备控制器、设备硬件(没有中央处理器及主存)
- 外存设备控制器可以连接的设备包括:光盘驱动器、磁带驱动器、磁盘驱动器
I/O系统软件部分
- I/O系统的软件部分主要包括:中断处理程序(中断处理层)、设备驱动程序(设备驱动层)、与设备无关的系统软件(设备独立层)、用户空间I/O软件(用户应用层)(没有设备执行层、硬件描述层)
- 当用户使用外部设备时,控制设备命令的依次传递途径:用户应用层→设备独立层→设备驱动层→设备硬件
- 设备独立层的设立目的是屏蔽I/O设备驱动的多样性,以便于用户使用
- 设备独立层的功能包括:提供用户程序与设备驱动器之间的的统一接口、提供与设备无关的大小统一逻辑块、对设备采用了与文件统一命名的方法、对不同速度的设备使用缓冲区来匹配、向用户报告出错处理情况、对设备的分配与回收、对设备进行保护以禁止用户直接访问设备
- 统一命名采用文件系统路径名的方法来命名I/O设备,实现逻辑设备命名与物理设备名的转换
例题:某程序员编写了一段通过串口发送数据的程序,使用了设备名COM1,那么将COM1映射到实际物理设备的工作在I/O管理的设备独立层完成
I/O设备
- I/O设备不同的设备可以并行工作
- I/O设备按照信息交换单位的不同可分为:块设备、字符设备
- 块设备是以数据块为单位组织和处理信息的读写设备(如磁盘、磁带机等)
- 字符设备是以字符为单位组织和处理信息的读写设备(如键盘、显示器终端、打印机等)
- I/O设备按照设备共享属性的不同可分为:共享设备、独占设备、虚拟设备
- 独占设备又称独享设备,每次只能分配给一个进程的设备(如磁带机、打印机、投影仪、扫描仪、时钟发生器)
- 共享设备是可由若干个进程同时共享的设备(如CPU、硬盘、串行通信端口)
6.2 I/O技术
I/O控制方式
- I/O设备与CPU之间数据传送和控制的方式包括:程序直接控制方式、中断控制方式、DMA方式、通道控制方式(没有设备控制方式)
程序直接控制方式
- 程序直接控制方式是用户进程在等待键盘敲击或鼠标点击输入命令时,不断检测状态寄存器的完成位是否为1
- 程序直接控制方式实现需要的关键的软硬件部件包括:设备状态寄存器、地址总线和数据总线、设备控制寄存器、设备数据缓冲区、地址译码器
- 程序控制技术的计算机系统中,若输出设备向处理机返回“准备就绪”信号,则表示输出缓冲区已空,CPU可以向输出缓冲区写数据
中断控制方式
- 中断控制方式是CPU先配置外设,当CPU启动外设后,继续执行主程序,不去查询外设工作状态,直到外设准备好并向CPU发出请求服务的信号,CPU与外设在大部分时间内并行工作
- 中断控制方式实现需要的关键的软硬件部件包括:中断控制器、地址总线和数据总线、设备控制器
- 键盘的I/O控制主要采用中断控制方式
- 利用中断技术进行设备管理的主要目的是提高设备效率
DMA控制方式
- DMA(Direct Memory Access)控制方式是DMA控制器从CPU完全接管对总线的控制,数据交换直接在内存和硬盘之间进行(不经过CPU干预)
- DMA控制方式实现需要的关键的软硬件部件包括:DMA控制器、地址总线、数据总线
- 磁盘的I/O控制主要采用的是DMA控制方式
通道控制方式
- 通道控制方式是系统引入一个不同于CPU的特殊功能处理单元,该处理单元有自己的指令集和程序,可以实现对外围设备的统一管理和外围设备与内存之间的数据传送
- 通道控制方式实现需要的关键的软硬件部件包括:通道控制器、地址总线和数据总线、设备控制器、通道程序代码
- 通道设置按照信息交换方式的不同可分为:字节多路通道、数据选择通道、数组多路通道(没有顺序通道、菊花链通道、令牌通道)
- 通道技术的计算机系统中,通道的功能包括:接受CPU的指令并按指令要求与指定的外部设备进行通信、从内存读取该通道指令并执行以向设备发送各种命令、组织外部设备和内存之间进行数据传送、从外部设备得到设备的状态信息供CPU使用、将外部设备的中断请求和通道本身的中断请求并按序及时报告CPU
I/O管理技术
- 为了提高设备和CPU的利用率,操作系统在I/O管理中采用了多种技术,典型的包括:缓冲技术、SPOOLing技术、设备分配技术、DMA与通道技术(没有级联及堆叠技术)
- 处理缺页中断工作不需要设备管理模块完成
缓冲技术
- 设备缓冲技术在一个低速的I/O设备连接到高速的计算机系统中时,可提高低速设备的使用效率
- 设备缓冲技术引入应用的主要原因包括:匹配不同外部设备的传输速度、减少和缓解不同设备之间传输速度差距以提高I/O性能
- 缓冲池管理中着重考虑实现进程访问缓冲区的同步
- 高速缓存是存储层次中的硬件缓存,用于加速CPU与主存的数据访问(与外设缓冲技术无关)
SPOOLing系统
- 同时联机外围操作(Simultaneous Peripheral Operations On-Line, SPOOLing)技术又称假脱机技术,是一种非常重要的虚拟设备技术,使多个进程同时使用一台独享设备,而对每一进程而言,都认为自己独占这一设备,只是该设备是逻辑上的设备
- SPOOLing系统的主要组成部分包括:输入井和输出井、输入进程和输出进程、输入缓冲区和输出缓存区(没有输入控制器和输出控制器、输入分配器和互斥分配器)

操作系统:SPOOLing技术(假脱机技术)_解释一下spooling技术-优快云博客
设备管理
- 设备管理的主要目的是方便用户使用
- 设备管理的主要任务包括:通过缓冲技术匹配高速和低速设备(缓冲区管理)、通过虚拟技术提高设备并发度(虚拟设备)、通过协调技术避免设备冲突(设备分配)、通过接口技术为用户提供一致的系统调用(设备处理)(没有加快输入输出设备的数据传输、提高外部设备的运行效率、提供输入输出设备的并行性)
设备分配
- 设备分配进行时应该考虑的因素包括:设备固有属性、设备分配算法、设备分配的安全性、设备独立性(没有设备分配的及时性)
- 设备分配与进程调度相似,需要考虑公平性、共享性等多种因素,也需要一定的策略,通常采用的策略包括先来先服务、高优先级优先
设备表
- 设备表是操作系统在进行设备分配时根据算法需要查找的相应数据结构,建立了逻辑设备与物理设备之间的对应关系,用于管理和分配设备,主要内容包括:系统设备表(SDT)、设备控制表(DCT)、控制器控制表(COCT)、通道控制表(CHCT)(没有设备分配表)
- 设备表的分配顺序:系统设备表→设备控制表→控制器控制表
6.3 磁盘
磁盘访问时间
- 磁盘访问时间可以分为:寻道时间(最长)、旋转延迟时间、传输时间(最短)(没有调度时间)
- 寻道时间优化可以显著改善操作系统访问磁盘读写的性能(优化设备分配方案与改善磁盘读写速度无关)
磁盘调度算法
- 磁盘调度算法主要包括:先来先服务调度算法(FCFS)、最短寻道时间优先调度算法(SSTF)、扫描算法(SCAN)、循环查看算法(C-LOOK)等
- 先来先服务调度算法按照请求到达的顺序依次处理(不改变请求序列)
- 最短寻道时间优先调度算法与谁距离最近就优先响应谁,平均寻道时间较短,但容易引起饥饿现象
- 扫描算法又称电梯算法,顾名思义从一端移动至另一端循环往复扫描
- 循环查看算法与扫描算法类似,但在到达一端后不反向,而是直接返回起始端再开始新一轮扫描
例题1:假设磁头当前位于第105道,正在向磁道序号增加的方向移动,现有一个磁道访问请求序列为35、45、12、68、110、180、170、195:
采用FCFS调度算法得到的磁道访问序列是35、45、12、68、110、180、170、195
采用SSTF调度算法得到的磁道访问序列是110、68、45、35、12、170、180、195
采用SCAN调度算法得到的磁道访问序列是110、170、180、195、68、45、35、12
例题2:某文件系统的磁盘块大小为212B,磁盘容量为239B,当文件系统进行格式化以后,可用的存储块数量是2^27(=2^39B/2^12B)
七、死锁
7.1 死锁的概念
操作系统资源
| 资源 | 特点 | 实例 |
| 可重用资源 | 可被多个进程多次使用的资源 | 内存 |
| 不可重用资源 | 可创建和销毁且只可使用一次的资源 | 时钟中断、进程之间的通信 |
| 可抢占资源 | 进程在获得这类资源后,仍可以在被其它进程抢占 | 内存、CPU |
| 不可抢占资源 | 一旦系统将某资源分配给进程后,就不能将该资源强行收回,只能在进程用完后自行释放 | 磁带、打印机 |
操作系统状态
- 安全状态的系统是安全的,即操作系统能保证所有的进程在有限时间内得到所需的全部资源
- 不安全状态的系统是不安全的
- 饥饿状态是相关进程没有阻塞,但是进程的优先级较低,长时间得不到调度或调度被无限推后
- 活锁状态是相关进程没有阻塞,可被调度,但是没有进展
- 死锁状态是相关进程进入阻塞状态,且无法唤醒
死锁特点
- 死锁状态一定是不安全状态,系统处于安全状态则不会产生死锁
- 可抢占资源的竞争不会产生死锁
- 当系统中只有一个进程时不会产生死锁
死锁产生原因
- 死锁的产生原因包括:资源分配不当、进程推进顺序不当(没有进程调度不当)
例题1:某系统中,进程A正在使用打印机同时又要申请绘图机,而进程B正在使用绘图机同时又要申请打印机,在这种情况下进程A和进程B可能会死锁
例题2:4个进程共享9台打印机,若要系统不产生死锁,每个进程最多可以申请3台打印机(平均每个进程可以获取2台打印机,此外剩余1台打印机)
例题3:由于进程P1、P2因:
申请不同类资源而产生死锁的现象:P1拥有设备A,请求设备B;P2拥有设备B,请求设备A
申请同类资源而产生死锁的现象:P1申请一页内存,P2申请一页内存;P1释放一页内存,P2释放一页内存
使用临时性资源而产生死锁的现象:P1等待接收P2发来的信件Q后向P2发送信件R,P2等待接收P1发来的信件R后向P1发送信件Q
同步互斥机制使用不当而产生死锁的现象:P1和P2先进行互斥信号量P操作,再进行同步信号量P操作
死锁必要条件
- 死锁的必要条件包括:互斥条件(资源互斥使用)、不可剥夺条件(已分配资源不可剥夺)、请求和保持条件(申请占有一部分资源,继续占用已分配的资源,部分分配资源)、循环等待条件(前一个进程拥有后一个进程所请求的资源,资源申请形成环路)(没有系统资源不足)
例题1:下列进程事件:
对应互斥条件的现象包括:没有采用SPOOLing技术的系统中,进程P1和P2同时申请使用同一台打印机
对应不可剥夺条件的现象包括:进程P1额外申请内存不成功,则持有原有的内存进入阻塞状态
对应请求和保持条件的现象包括:进程P1拥有打印机并申请扫描仪
对应循环等待条件的现象包括:进程P1等待P2完成视频解压缩的信号,P2正等待P1发来的解压数据
例题2:下图所示为交叉路口发生死锁的情况,为了预防死锁:
可以在交叉路口建设立交桥,那么该方法使得死锁的互斥条件不成立
可以在路口设置了黄色网格缓冲区,车辆可以倒车退出路口,那么该方法使得死锁的不可剥夺条件不成立
可以在路口使用交通红绿灯,那么该方法使得死锁的请求和保持条件不成立
可以将路口某一方向(南北或东西方向)道路实行单向行驶,那么该方法使得死锁的循环等待条件不成立

[操作系统] pthread同步互斥:十字路口小车的死锁_操作系统死锁实验十字路口-优快云博客
7.2 解决死锁的方法
死锁预防策略
- 死锁的预防策略包括:资源有序分配法、一次分配所有资源(静态分配)、剥夺其他进程的资源、建立SPOOLing系统、分配时加锁
- 对于系统中的独占设备,为预防出现死锁应采用的最佳分配策略是静态分配,必要时可以剥夺
例题1:下列图所示的经典的哲学家进餐场景有可能出现死锁,能够预防死锁的方法有:最多允许4个哲学家同时进餐、仅当一个哲学家左右两边筷子都可用时才允许他拿筷子、奇数号哲学家先拿左边的筷子,偶数号哲学家先拿右边的筷子、给其中某一个哲学家增配1只筷子

例题2:下列图所示的进程资源分配图表示出现了死锁,采用方法进程p1先申请打印机,再申请磁带机;p2暂停可以预防死锁的发生

死锁避免策略
- 死锁的避免策略包括:银行家算法(不是鸵鸟算法)
例题:设系统中有三种类型的资源(A, B, C)和五个进程(P1, P2, P3, P4, P5),A资源的数量是17,B资源的数量是6,C资源的数量为19,在某一时刻系统的状态如下表,系统采用银行家算法实施死锁避免策略,若当前系统剩余资源(A, B, C)分别为(2, 3, 3),则P3→P1→P4→P2→P5序列是安全序列
解析:①系统剩余资源量(17, 6, 19)-(4, 0, 5)-(4, 0, 2)-(2, 1, 4)-(2, 1, 2)-(3, 1, 3)=(2, 3, 3)>(2, 1, 1),P3满足所需分配资源要求;②P3已分配资源释放(2, 3, 3)+(2, 1, 4)=(4, 4, 7)>(0, 0, 6),P1满足所需分配资源要求;③P1已分配资源释放(4, 4, 7)+(4, 0, 5)=(8, 4, 12)>(3, 4, 7),P4满足所需分配资源要求;④P4已分配资源释放(8, 4, 12)+(2, 1, 2)=(10, 5, 14)>(1, 3, 4),P2满足所需分配资源要求;⑤P2已分配资源释放(10, 5, 14)+(4, 0, 2)=(14, 5, 16)>(1, 1, 1),P5满足所需分配资源要求
注意:选项中安全序列可能不止一个,需要逐一验算,系统剩余资源量不小于还需分配资源量则为安全序列,否则为不安全序列
| 资源申请 进程 | 最大资源需求量(Max) | 已分配资源量(Allocation) | 所需分配资源量(Request) | ||||||
| A | B | C | A | B | C | A | B | C | |
| P1 | 4 | 0 | 11 | 4 | 0 | 5 | 0 | 0 | 6 |
| P2 | 5 | 3 | 6 | 4 | 0 | 2 | 1 | 3 | 4 |
| P3 | 4 | 2 | 5 | 2 | 1 | 4 | 2 | 1 | 1 |
| P4 | 5 | 5 | 9 | 2 | 1 | 2 | 3 | 4 | 7 |
| P5 | 4 | 2 | 4 | 3 | 1 | 3 | 1 | 1 | 1 |
死锁检测策略
- 死锁的检测策略包括:系统允许部分进程发生死锁,但需要通过定时运行资源分析程序并报告是否已有死锁
死锁恢复策略
- 死锁的恢复策略包括:定时为进程设置还原点,若运行受阻则退回还原点
死锁解除策略
- 死锁的解除策略包括:剥夺死锁进程的资源、撤销(杀死)死锁进程、重启系统(修改环境变量、修改注册表、进入安全模式不能解除死锁)
7.3 资源分配图
死锁定理
- 死锁定理描述为死锁的充分必要条件是当且仅当当前状态的资源分配图是不可完全化简的
例题1:某计算机系统中共有3个进程P1、P2、P3,4类资源r1、r2、r3、r4,其中r1、r3每类资源只有1个,r2资源有2个,r4资源有3个,当前的资源分配状态如下:E={<rl,P1>,<P1,r2>,<P2,rl>,<r3,P2>,<r2,P3>,<P3,r3>},若进程P3申请一个r1类资源<P3,r1>,则系统可能会发生无死锁现象

解析:

例题2:某计算机系统中共有3个进程P1、P2、P3,4类资源r1、r2、r3、r4,其中r1、r2、r3每类资源只有1个,r4资源有2个,当前的资源分配状态如下:E={<r1,P1>,<P2,r4>,<r3,P2>,<r2,P2>,<r4,P3>,<P1,r2>},若进程P2申请一个r1类资源,则系统可能会发生死锁现象

解析:

参考资料
[2] 计算机四级网络工程师知识点-完整

3836

被折叠的 条评论
为什么被折叠?



