声明:本文章选自哔哩哔哩王道考研计算机操作系统视频,学习笔记仅供参考
目录
5.2_2_假脱机技术 (SPOOLing技术)
1.1_1 _操作系统的概念、功能
操作系统:
- 系统资源管理者——控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配;
- 向上层提供方便易用的服务——提供给用户和其他软件方便的接口和环境;
- 给用户
- gui
- 联机命令接口/交互式命令接口
- 脱机命令接口/批处理命令接口 程序接口
- 给软件/程序员
- 程序接口——系统调用
- 给用户
- 最接近硬件的一层软件——计算机系统中最基本的系统软件;
1.1_2 _操作系统的四个特征
并发:两个或多个事件在同一时间间隔内发生。在宏观上可以看作是同时发生,微观上是交替发生— —并行同时发生
共享:系统中的资源可供内存中多个并发执行的进程共同使用
- 互斥共享
- 同时共享
虚拟:指把一个物理上的实体变为若干个逻辑上的对应物。
- 空分复用技术(虚拟存储器技术)
- 时分复用技术(虚拟处理器)
异步:多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底的,而是走走停停,顺序和速度都不可预知
1.2_操作系统的发展与分类
os发展历程
- 手工操作阶段
- 纸带机(用户独占全机,人慢机快)
- 批处理阶段
- 单道批处理(外围机+磁带)
- 多道批处理(操作系统正式诞生)
- 分时操作系统
- 轮流作业
- 不能处理紧急任务
- 实时操作系统
- 时间片
- 可以处理紧急任务
- 硬实时
- 严格在规定时间内完成处理
- 软实时
- 可以偶尔犯错
1.3_1_操作系统的运行机制
运行机制
- 两种指令
- 特权指令
- 非特权指令
- 两种处理机状态
- 内核态
- 用户态
- 切换可以通过中断(硬件实现)
- 两种程序
- 内核程序
- 应用程序
处在用户态只能执行非特权指令运行应用程序,处在内核态可以执行特权指令执行内核程序
1.3_2_中断和异常
中断的作用
- 让操作系统内核夺回CPU使用权的唯一途径
中断的类型
- 内中断
- 陷入(程序故意引发,系统调用)
- 故障(错误条件,缺页故障)
- 终止(故障,除数0)
- 外中断
- 来自CPU外部
- 时钟中断(实现并发)
- I/O中断请求
中断的基本原理
不同的中断信号,需要不同的中断处理程序来处理,查询“中断向量表”
1.3_3_系统调用
系统调用概念
- 是操作系统提供给应用程序(程序员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以通过系统调用来请求获得操作系统内核的服务
系统调用和库函数的区别
- 系统调用是操作系统向上层提供的接口
- 有的库函数是对操作系统进一步封装
- 当今编写的应用程序大多数是通过高级语言提供的库函数间接进行系统调用
系统调用应用场景
- 凡是与共享资源有关的操作都必须通过系统调用的方式向操作系统内核提出服务请求,这样可以保证系统的安全性和稳定性
- 设备/文件/内存管理或进程控制进程通信
系统调用过程
- 应用程序,传参
- t用户态,rap,陷入指令
- 内核态
- 检测参数,确定哪种调用类型
- 运行内核程序
- 处理结束,回到用户态
1.4_1_操作系统体系结构(上)
原语
- 是一种特殊的程序
- 处于操作系统最底层,是最接近硬件的部分
- 这种程序运行具有原子性——其运行不能被中断
- 运行时间短,调用频繁
大内核和微内核的状态会影响应用程序请求操作系统服务时CPU状态转换的次数
- 大内核
- 缺点
- 内核宏大功能复杂难以维护
- 大内核某个功能出现错误,就可能导致整个系统崩溃
- 性能高,内核各种功能都可以互相调用
- 缺点
- 微内核
- 进程管理调用存储管理应用到消息传递方式
- 缺点
- 性能低,需要频繁切换(用户态<-->内核态),用户态下的各功能模块不可以直接互相调用,只能通过内核的“消息传递”来简介通信
- 优点
- 内核小功能少、易于维护,内核可靠度高
- 内核外的某个功能模块出错不会导致整个系统崩溃
1.4_2_操作系统体系结构(下)
操作系统结构
- 分层结构
- 底层是硬件,最高层是用户接口
- 优点
- 便于调试和验证,自底层向上逐层调试验证
- 层与层间的调用接口固定,易于扩充和维护
- 缺点
- 但仅可调用相邻低层,难以合理定义各层边界
- 效率低,不可跨层使用,系统调用执行时间长
- 模块化
- 内核=主模块+可加载内核模块
- 主模块只负责核心功能
- 可加载内核模块可以动态加载新模块到内核而无需重新编译整个内核
- 优点
- 模块间逻辑清晰易于维护,确定模块间接口后即可多模块同时开发
- 支持动态加载的内核模块,增强OS的适应性
- 任何模块可以直接调用其它模块,无需采用消息传递,效率高
- 缺点
- 模块间的接口定义未必合理,实用
- 模块间相互依赖,更难调试和验证
- 内核=主模块+可加载内核模块
外核
- 优点
- 减少了虚拟硬件资源的“映射层”,提升效率
- 可以直接给用户分配一个未经抽象的硬件资源,使用户进程更灵活的使用硬件资源
- 缺点
- 降低系统一致性
-
使系统变得复杂
1.5_操作系统引导
操作系统的引导
- 开机时如何让操作系统运行起来
1.6_虚拟机
传统计算机一台物理机器上只能运行一个操作系统,导致安全性问题,解决方法,虚拟机
虚拟机
- 使用虚拟化技术,讲一台物理机器虚拟化为堕胎虚拟机器,每个虚拟机器都可以独立运行一个操作系统
- 第一类虚拟机管理程序
- 直接运行在硬件之上
- 类似于“外核”的分配方式
- 执行最高级别的指令
- 第二类虚拟机管理程序
- 运行在宿主操作系统上
- 分配的是虚拟内存
- 可迁移性更好
- 性能差,需要宿主操作系统
2.1_1_进程的概念、组成、特征
程序
- 静态的,是存放在磁盘里的可执行的文件,就是一系列指令集合
- .exe存放在硬盘里
进程
- 动态的,是程序的一次执行过程,同一程序执行多遍会对应多个进程
- 进程实体组成
- PCB
- 一个进程对应唯一PCB
- 进程存在的唯一标志
- 进程管理的所有信息都存储在PCB中
- 程序段、数据段
- PCB
- 特征
- 动态性
- 进程是程序的一次执行过程
- 并发性
- 独立性
- 进程是获得资源的基本单位
- 异步性
- 结构性
- 动态性
- 进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位
2.1_2_进程的状态和转换、进程的组织
状态
- 创建态
- 进程正在被创建,操作系统分配资,初始化PCB
- 就绪态
- 已经具备运行条件,但由于没有空闲CPU,暂时不能运行
- 运行态
- 占有CPU在CPU上运行
- 阻塞态
- 因等待某一资源暂时不能运行
- 终止态
- 正在从系统正撤销,操作系统会回收进程拥有的资源和PCB
- 挂起状态(补充)
- 就绪挂起
- 阻塞挂起
- 就绪挂起
状态间的转换
- 五状态
- 七状态
进程的组织方式
- 链式方式
- 索引方式
2.1_3_进程控制
基本概念
- 简单理解就是实现进程状态的转换
原语必要性
- 状态转换需要一气呵成
原语的实现
- CPU每执行一条指令都会检查有没有外部中断信号,有的话就会先处理中断指令
- 关中断之后就不会检查有没有中断指令,直到开中断之后才会恢复,当然这两条指令都是特权指令
进程控制相关原语
创建原语
- 申请空白PCB
- 为进程分配所需资源
- 初始化PCB
- 将PCB插入队列
撤销原语
- 将PCB集合中找到终止进程的PCB
- 若进程正在运行,立即剥夺CPU,将CPU分配给其他进程
- 终止所有子进程
- 将该进程拥有的所有资源归还给父进程或操作系统
- 删除PCB
引起进程终止的事件
- 正常结束(exit)
- 异常结束(错误指令,非法使用特权指令)
- 用户杀死进程
阻塞原语
- 找到阻塞的进程对应的PCB
- 保护进程运行现场,将PCB状态设置为阻塞态,暂停进程运行
- 将PCB插入相应事件的等待队列
引起阻塞
- 需要等待系统分配某种资源
- 需要等待互相合作的其他进程完成工作
唤醒原语
- 在事件等待队列中找到PCB
- 将PCB从等待队列中移除,设置进程为就绪态
- 将PCB插入就绪队列,等待被调度
引起唤醒
- 等待的事情发生
切换原语
- 将运行环境信息存入PCB
- PCB移入相应队列
- 选择另一个进程执行,并更新其PCB
- 根据PCB恢复新进程所需的运行环境
- 引起切换
- 当前进程的时间片到
- 有更高级的进程到达
- 当前进程主动阻塞
- 当前进程终止
2.1_4进程通信
进程是分配系统资源的单位,因此各进程拥有的内存地址空间相互独立,为了保证安全,一个进程不能直接访问另一个进程的地址空间
进程通信方式
- 共享存储
- 基于数据结构的
- 速度慢,限制多
- 低级通讯方式
- 共享存储区
- 对共享空间的访问是互斥的
- 速度快是一种高级通信的方式
- 基于数据结构的
- 消息传递
- 消息
- 消息头+消息体
- 消息
- 直接通信方式(要指明发给谁,谁接收)
- 间接通信方式(发送到信箱里,可以多个进程往同一个信箱里send消息,也可以多个进程从一个信箱里receive消息)
- 管道通信
- “管道”是开辟一个特殊的共享文件,是一个大小固定的内存缓冲区,先进先出
- 半双工通信,只能往一个方向传数据
- 可能阻塞
- 数据一旦被读出就彻底消失
- 解决方案1,多个写,一个读(应试统一)
- 2,多个读,多个写(实际应用)
2.1_5_线程的概念
- 概念
- 线程是一个基本的CPU执行单元,程序执行流的最小单位,提高了系统的并发度
- 引入线程后的变化
- 进程是资源分配的基本单位,线程是调度的基本单位
- 线程间也能并发,提高了并发度
- 同一进程间线程的切换系统开销小
线程的属性
- 线程是调度的基本单位
- 多个CPU计算机中,多个线程可占用不同的CPU
- 每个线程都有一个线程ID,线程控制块(TCB)
- 线程也有就绪、阻塞、运行三种基本状态
- 同一进程的不同线程共享进程的资源
- 线程几乎不拥有系统资源
- 由于共享内存地址空间,同一进程中的线程间通信甚至无需系统干预
- 同一进程中线程的切换不会引起进程的切换
- 不同进程中线程的切换会引起进程切换
- 切换同进程内的线程,系统开销小
2.1_6_线程的实现方式和多线程模型
线程的实现方式
- 用户级线程
- 背景
- 操作系统还不支持进程的时候使用
- 特性
- 由线程库实现,不是线程,类似于线程一样并发执行
- 操作系统不可见,由应用程序管理,只能从从用户视角看能看到的
- 优点
- 用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开消小,效率高
- 缺点
- 当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高,多个线程不可在多处理机上并行运行
- 背景
- 内核级线程
- 背景
- 实现了内核级线程
- 由操作系统管理
- 线程切换需要从用户态转变为内核态
- 优点
- 当一个线程被阻塞后,别的线程还可以继续执行,并发能力强,多线程可在多核处理机上并行执行
- 缺点
- 一个 进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大
- 背景
多线程模型
- 把用户级线程和内核级线程结合
- 一对一模型
- 一个用户级线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程
- 优点
- 当一个线程被阻塞后,别的线程还可以继续执行,并发能力强,多线程可在多核处理级上并行执行
- 缺点
- 一个用户进程会占多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理成本高,开销大
- 多对一模型
- 多个用户级线程映射到一个内核级线程,且一个进程只能被分配一个内核级线程
- 优缺点和用户级线程一样
- 操作系统只“看得见”内核级线程,因此只有内核级线程才是处理机分配的单位
- 多对多模型
- n用户线程映射到m个内核级线程(你>m)
- 优点
- 每个用户进程对应m个内核级线程克服的多对一模型并发度不高的缺点(一个阻塞全体阻塞),又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点
2.1_7_线程的状态与转换
- 状态图(都跟PCB类似并且比它简单)
- 线程的组织与控制
2.2_1_调度的概念、层次
基本概念
- 通常进程数量大于处理及数量,所以要按照一定的算法选择一个进程,并将处理及分配给它运行,以实现进程的并发执行
三个层次
- 高级调度(作业调度)
- 按照一定原则从外村的作业后备队列中挑选一个作业存入内存,并创建进程。
- 每个作业只调入一次,调出一次
- 调入是建立PCB,调出时才撤销PCB
- 外存->内存
- 中级调度(内存调度)
- 内存不够的时候把某些进程的数据调出外存,等待内存空闲或者进程需要运行时再重新调入内存
- 暂时被调到外存等待的进程状态成为挂起状态,被挂起的进程PCB 会被组织成挂起队列
- 频率比高级高
- 外存->内存
- 低级调度(进程调度/处理机调度)
- 操作系统最基本的一次调度,频率最高
- 内存->CPU
三层调度的联系、对比
2.2_2_进程调度的时机、切换与过程、方式
时机
- 进程主动放弃处理机
- 进程正常终止
- 运行时发生异常终止
- 进程主动请求阻塞
- 进程被动放弃处理机
- 时间片用完
- 有更紧急的事要处理
- 有更高优先级的进程进入就绪队列
- 不能切换的情况
- 处理中断
- 操作系统内核程序临界区,但是普通的临界区访问的临界资源不会直接影响操作系统内核的管理,因此再访问普通临界区时可以进行调度和切换
- 原子操作过程中
切换与过程
- 狭义的进程调度是指从就绪队列中选一个要运行的进程
- 广义包括选择+切换
- 切换过程
- 把对原来运行的进程各种数据的保存
- 对新的进程各种数据的恢复
- 不是切换越多并发越快
方式
- 非剥夺调度方式(非抢占式)
- 只能进程主动放弃处理机
- 剥夺调度方式(抢占式)
- 有更紧迫的进程需要使用处理机可以把处理机分配给它
2.2_3_调度器和闲逛进程
调度程序
- 确定谁来运行
- 运行时间有多长
调度器
- 什么时候会触发调度程序
- 创建新进程
- 进程退出
- 进行进程阻塞
- I/O中断发生(可能唤醒某些阻塞程序—)
闲逛进程
- 调度程序没有其他就绪进程时,运行闲逛进程
- 特性
- 优先级最低
- 可以时0地址指令,占一个完整的指令周期
- 能耗低
2.2_4_调度算法的评价指标
CPU利用率
- =忙碌的时间/总时间
系统吞吐量
- 单位时间内完成的作业量
- =总共完成了多少道作业/完成总时间
周转时间
- 作业从提交给系统开始到作业完成为止这段时间的间隔
- =作业完成时间-作业提交时间
- 平均周转时间=各作业周转时间之和/作业数
- 带权周转时间=作业周转时间/作业实际运行的时间>=1
- 平均带权周转时间=各作业带权周转时间之和/作业数
等待时间
- 指进程/作业处于等待处理机状态时间之和,等待时间越长,用户满意度越低
- 对于进程来说,等待时间是指进程建立后等待被服务的时间之和
- 对于作业来说,不仅要考虑建立进程后的等待时间,还要加上作业在外存后备队列中等待的时间
响应时间
- 提交请求到首次产生响应所需的时间
2.2_5_调度算法(1)
先来先服务(FCFS)
- 先到达先进行服务
- 从公平的角度考虑
- 用于作业调度
- 非抢占式
- 不会导致饥饿
- 优点
- 公平,实现简单
- 缺点
- 对长作业有利,对短作业不利
最短作业优先(SJF)/短进程优先(SPF)
- 服务时间最短的作业/进程优先得到服务
- 非抢占(SJF)
- 选择最短的已经到达的作业先进入运行态
- 抢占/最短剩余时间优先(SRNT)
- 每次到达新作业到达就绪队列的或有作业完成了,考察队列中的最少需要时间的作业
- 平均等待时间,平均周转时间最少
- 可能会饥饿
- 优点
- “最短的”平均等待时间、平均周转时间
- 缺点
- 对短作业有利,对长作业不利
最高相应比优先(HRRN)
- 综合考虑了作业/进程的等待时间又考虑了要求服务的时间
- 相应比=(等待时间+要求服务时间)/要求服务时间
- 非抢占
- 不会饥饿
- 优点
- 考虑全面
以上三种算法一般适用于早期的批处理系统
2.2_6_调度算法(2)
时间片轮转(RR)
- 公平、轮流地为各个进程服务,让每个进程在一定时间间隔内都可以得到响应
- 按照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片,若时间片结束之和会被剥夺处理机,将进程重新放到就绪队列队尾重新排队
- 用于进程调度
- 抢占式
- 时间片大小
- 时间片太大就退化为FCFS
- 时间片太小导致进程切换频繁
- 一般设计时间片时要让切换进程的开销占比不超过1%
- 优点
- 对各个进程公平,响应快,适用于分时操作系统
- 缺点
- 进程切换有开销
- 不区分任务紧急程度
- 不会饥饿
优先级调度
- 根据任务紧急程度处理决定处理顺序
- 优先处理优先级高的作业/进程
- 抢占式
- 非抢占式
- 补充:
- 就绪队列不是只有一个,可以根据优先级来排队
- 静态优先级
- 优先级设置
- 系统进程优先级高于用户用户进程
- 前台进程优先级高于后台进程
- 操作系统更偏好I/O进程(资源利用率,系统吞吐量提高)
- 优先级设置
- 动态优先级
- 公平、提高资源利用率等方面角度设置优先级
- 某进程在就绪队列中等待了很长时间,则可以适当提高优先级
- 某进程占用处理机运行了很长时间,可以适当降低优先级
- 公平、提高资源利用率等方面角度设置优先级
- 优点
- 可以区分紧急程度,重要程度,适用于实时操作系统,课堂灵活的调整对各种作业/进程的偏好程度
- 缺点
- 可能会到饥饿
多级反馈队列
- 对其他算法的折中
- 抢占式也可能是非抢占
- 设置多级就绪队列,各级队列优先级由高到低,时间片从小到大,新进程到达时先进入第一级队列,按照DCDS原则排队等待分配时间片。若用完时间片还未结束,则进程进入下一级队列队尾,如果此时已经在最下级的队列,则重新放回最下级队列队尾
- 优点
- 公平(FCFS优点)
- 每个新到达的进程都可以很快得到响应(RR优点)
- 短进程只用比较少的时间就可以完成(SPF)
- 不必实现估计进程的运行时间(避免用户作假)
- 可以灵活调整对各类进程的偏好程度
- 会导致饥饿
这三种算法适用于交互式系统,注重系统的响应时间,公平性,平衡性
2.3_1_进程同步、进程互斥
进程同步
- 指为了完成某种任务而建立的亮哥哥或多个进程,这些进程因为需要在某些位置上协调他们的工作次序而产生的制约关系。进程间的制约关系就是源于它们之间的相互合作
进程互斥
- 互斥共享方式
- 一个时间段内只允许一个进程访问该资源
- 同时共享方式
- 允许一个时间段内由多个进程“同时"对他们访问
- 临界资源
- 把一个时间段内只允许一个进程使用的资源称为临界资源
- 对于临界资源的访问必须互斥
- 进程互斥指一个程序访问某临界资源时,另一个想要访问该临界资源的进程必须等待,访问完才能访问
进程互斥的四个原则
- 空闲让进
- 忙则等待
- 有限等待
- 让权等待
2.3_2_进程互斥的软件实现方法
- 单标志法
- 两个进程在访问完临界区后会把使用临界区的权限交给另一个进程
缺点
- 违反了”空闲让进“原则
- 双标志先检查法
- 设置设置一个布尔型数组flag[],数组中各个元素用来标志各进程想要进入临界区的一员
缺点
- 违反了”忙则等待“原则
- 双标志后检查法
- 先”上锁“后”检查“
违背了”空闲让进“,”有限等待“
- Peterson
- 谦让对方
缺点
- 违背了”让权等待“
2.3_3_进程互斥的硬件实现方式
中断屏蔽方法
- “开/关中断”实现
- 优点
- 简单高效
- 缺点
- 不适合多处理机,关中断指令只对执行的处理机有效
- 内核态下使用
TestAndSet(TS指令/TSL指令)
- 用硬件实现,执行过程不允许被中断,只能一气呵成
- 优点
- 实现简单
- 适用于多处理机
- 缺点
- 不满足”让权等待“原则
Swap指令(SCHG指令)
- 硬件实现,执行不允许中断
优缺点和TSL一样
2.3_5信号量机制
信号量
- 是一个变量
- 可以用一个信号量表示系统中某种资源的数量
- wait(S),signal(S)简称P(S)V(S)
- 分类
- 整型信号量
- 用一个整数型的变量作为信号量,用来表示系统中某种资源的数量
- 有多少台打印机S就是多少
- 存在问题
- 不满足”让权等待“,会发生”忙等“
- 记录型信号量(非常重要!!!)
- 为了解决整型信号量的问题
- 遵循了“让权等待”
- 整型信号量
2.3_6_用信号量实现进程互斥、同步、前驱关系
实现进程互斥
- 步骤
- 分析并发进程的关键活动,划定临界区
- 设置互斥信号量,初值为1
- 在进入区P(mutex)--申请资源
- 在退出区V(mutex)--释放资源
- 注意:PV操作必须成对出现
实现进程同步
- 要让各并发进程按要求有序推进
- 设置同步信号量,初始为0
- 在”前操作“之后执行V(S)
- 在”后操作“之前执行P(S)
实现进程的前驱关系
2.3_7_生产者-消费者问题
- 生产者每次生生产一个产品进入缓冲区,消费者每次从缓冲区取走一个产品并使用
- 生产者、消费者共享一个初始为空、大小为n的缓冲区(是临界资源)
- 只有缓冲区没满的时候,生产者才能把产品放入缓冲区,否则必须等待
- 只有缓冲区不空的时候,消费者次啊能从中取出产品,否则必须等待
- 互斥P操作一定要放在同步P操作之后,不然可能导致死锁,但是V操作顺序可以互换
2.3_8_多生产者-多消费者问题
- 可以把四对进程同步关系抽象为一堆事件的前后关系
2.3_9_吸烟者问题
- 解决”可以生产多个产品的但生产者问题“
2.3_10_读者写者问题
- 问题描述
- 允许多个读者同时读文件
- 只允许一个写者往文件中写信息
- 任一写者在完成写操作之前不允许其他读者或写者工作
- 写者执行写操作之前应该让已有的读者和写者全部退出
2.3_11_哲学家进餐问题
问题
- 五个哲学家需要拿起两只筷子才能进餐
- 可能发生死锁问题
- 进程需要同时持有两个临界资源,就会有死锁的隐患
- 作用
- 可以避免死锁资源
2.3_12_管程
- 为什么要引入管程
- 因为信号量机制编写程序困难,易出错
- 管程是一种高级的进程同步机制
- 管程的定义和基本特征
- 管程的组成
- 局部于管程的共享数据结构说明
- 对该数据结构进行操作的一组过程(函数)
- 对局部于管程的共享数据设置初始值的语句
- 管程有一个名字
- 管程的基本特征
- 管程内定义的数据结构只能被管程里的函数修改
- 每次只允许一个进程在管程内执行某个内部过程
- 管程的组成
2.4_1死锁的概念
死锁
- 各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象
- 至少有两个或两个以上的进程
饥饿
- 进程长期得不到想要的资源而无法向前推进
- 可能是一个进程发生饥饿
死循环
- 某种执行过程跳不出来
- 是程序员有意无意造成的
死锁产生的必要条件
- 互斥条件
- 多个进程互相争夺资源
- 不剥夺条件
- 不可以由其他进程强行抢走
- 请求和保持条件
- 已经至少有了一个资源,但是还缺资源
- 循环等待条件
- 存在一种进程资源的循环等待链
什么时候会发生死锁
- 对系统资源的竞争
- 进程推进顺序非法
- 信号量的使用不当
死锁的处理策略
- 预防死锁
- 避免死锁
- 死锁的检测和解除
2.4_2_死锁的处理策略——预防死锁
- 破坏互斥条件
- 把互斥资源改造为共享资源(SPOOling技术)
- 适用范围小
- 破坏不剥夺条件
- 方案一:进程请求的资源得不到满足需要立刻释放所保持的所有资源,待以后需要时重新申请
- 缺点:如果一直发生这种情况就会导致进程饥饿
- 方案二:放某个进程需要的资源被其他进程占用的时候,可以由操作系统协调,将想要的资源强行剥夺。这种方式一般考虑优先级
- 缺点
- 实现起来比较复杂
- 释放已获得的资源可能造成前一阶段工作的失效。一般适用于易保存和恢复状态的资源
- 反复申请和释放资源增加系统开销,降低系统吞吐量
- 方案一:进程请求的资源得不到满足需要立刻释放所保持的所有资源,待以后需要时重新申请
- 破坏请求和保持条件
- 静态分配方法
- 进程在运行前一次申请完他所需要的全部资源,在他没满足前,不让它投入运行。一旦投入运行这些资源就一直归他所有,该进程就不会申请别的资源
- 缺点
- 导致资源利用率极低,也可能导致某些进程饥饿
- 静态分配方法
- 破坏循环等待条件
- 顺序资源分配法
- 规定进程按编号递增的顺序请求资源
- 缺点
- 不方便增加新的设备
- 进程实际使用资源的顺序和编号不一致会导致资源浪费
- 必须规定次序申请资源,用户编程麻烦
- 顺序资源分配法
2.4_3_死锁的处理策略——避免死锁
安全序列
- 如果系统按这种序列分配资源,则每个 进程都能顺利完成
- 不唯一
- 只要能有一个安全序列就是安全状态
- 如果进入不安全状态可能发生死锁
银行家算法
- 为了避免系统进入不安全状态
- 银行家算法步骤
- 检查此次申请是否满足之前声明的最大需求量
- 检查此时系统剩余的可用资源是否还能满足这次请求
- 试探着分配,更改各数据结构
- 用安全性算法检查此次分配是否会导致系统进入不安全状态
- 安全性算法步骤
- 检查当前可用资源是否能满足某个进程的最大需求,如果可以,就把该进程加入安全序列,并把该进程持有的资源全部回收
- 不断重复上述过程,看最终是否能让所有进程都加入安全序列
2.4_4_死锁的处理策略——检测和解除
死锁的检测
- 可以完全简化的情况(类似于安全序列)说明没有死锁
- 不能完全简化的情况,发生了死锁
算法:找到既不阻塞也不是孤点的进程,消掉所有与他相连的边,使之成为孤点
死锁的解除
- 用死锁检测算法化简资源分配图后,还连着边的那些进程就是死锁进程
- 检测方法
- 资源剥夺法
- 挂起某些死锁进程,并抢占它的资源,把这些资源分配给其他的死锁进程
- 撤销进程法(终止进程法)
- 代价大,功亏一篑
- 进程回退法
- 让一个或多个死锁进程回退到避免死锁的地步
- 让谁”牺牲“
- 进程优先级低
- 已执行时间短
- 优先把资源匹配给快要完成的
- 进程使用资源多
- 优先牺牲批处理的(一般处理的是计算,不需要及时反馈)
- 资源剥夺法
3.1_1_内存的基础知识
- 存储单元
- 存放数据的最小单元
- 内存被划分为一个个存储单元
- 每个地址对应一个存储单元
- 每个存储单元能存多少数据具体是看计算机具体设计
- 每个存储单元都对应一个地址
- 按字节编址
- 每个存储单元大小为1字节,1B,8个二进制位
- 按字编址
- 字长为16位,每个存储单元位1个字,每个字的大小位16个二进制位
- 按字节编址
- 2**10=1K 2**20=1M 2**30=1G(**代表平方)
- 逻辑地址(相对)
- 物理地址(绝对)
- 写程序到程序运行的流程
- 编辑
- 编译
- 链接(到装入模块)
- 装入(内存)
- 装入的三种方式(从逻辑地址到物理地址的转换)
- 绝对装入
- 编译的时候把逻辑地址转换为最终的物理地址
- 灵活性差,适用于单道程序
- 换一个电脑就不能执行
- 静态重定位(可重定位装入)
- 编译时地址都是从0开始的
- 装入的过程把所有关于地址的参数重新修改
- 装入时必须分配其要求的全部内存空间
- 动态重定位(动态运行时装入)
- 执行时才进行地址转换
- 把逻辑地址和起始地址相加
- 绝对装入
- 链接的三种方式
- 静态链接
- 在程序运行之前把目标末了和他们所需要的库函数连接成一个完成的可执行文件
- 动态链接
- 将目标模块装入内存呢时,边装入边链接
- 运行时动态链接
- 程序执行中需要该目标模块时,才对他链接
- 优点时便于修改和更新,便于实现对目标模块的共享
- 静态链接
3.1_2_内存管理的概念
1.内存空间的分配与回收
- 连续分配管理方式
- 非连续分配管理方式
- 基本分页存储管理
- 基本分段存储管理
- 段页式存储管理
2.内存空间的扩充
3.地址转换
4.存储保护
- 方法一:设置一对上下限寄存器
- 方法二:重定位寄存器和界地址寄存器
- 先判断是否超过界地址寄存器
- 超过抛出异常
- 没超过和重定位寄存器相加
3.1_3_覆盖与交换
内存空间的扩充
- 覆盖
- 解决”程序大小超过物理地址总和“的问题
- 将程序分为多个段
- 内存中分为一个“固定区”和若干个“覆盖区”
- 需要常驻的段放在“固定区”,调入后不再调出“
- 不常用的段放在”覆盖区“,需要用到时调入内存,用不到时调出内存
- 必须由程序员声明覆盖结构
- 缺点
- 对用户不透明
- 已经被淘汰
- 交换(对换技术)
- 中级调度就是实现交换技术
- 外存换入内存
- 调出内存的进程成为挂起状态
- 把磁盘空间分为”对换区“(很小)和”文件区“
- ”对换区“采用连续分配,要求换入换出速度快
- “文件区”采用离散分配
- 什么时候使用交换
- 内存吃紧的时候
- 经常缺页
- 内存吃紧的时候
- 优先换出什么进程
- 阻塞进程
- 优先级低
- 也会考虑进程再内存的驻留时间
- PCB会常驻内存
3.1_3_连续分配管理方式
连续分配管理方式
- 单一连续分配
- 分为系统区和用户区
- 内存中只能有一道用户程序
- 用户程序独占整个用户区
- 优点
- 实现简单
- 无外碎片
- 可以采用覆盖技术扩充
- 缺点
- 只能用单用户、单任务的操作系统中
- 有内部碎片
- 存储器利用率极低
- 固定分区分配
- 将整个用户区划分为若干个固定大小的分区
- 每个分区装入一道作业
- 分区大小相等
- 缺乏灵活性
- 有内部碎片
- 但是某些特定场合非常适合
- 分区大小不相等
- 灵活性好
- 利用率也不高
- 有内部碎片
- 无外部碎片
- 分区大小相等
- (补充)分区说明表
- 记录分区区号,大小,起始地址,分配状态等信息
- 动态分区分配
- 不会预先划分内存分区
- 根据进程大小动态地建立分区
- 空闲分区链/表来记录
- 有外部碎片没有内部,可以用紧凑技术解决
3.1_5_动态分区分配算法
首次适应算法
- 从地址开始查找找到第一个满足大小的空闲分区
- 实现
- 空闲分区以地址递增的次序排列,每次分配内存时顺序查找空闲分区链/表
- 效果最好
最佳适应算法
- 优先使用更小的空闲区
- 实现
- 按照容量递增次序链接,每次分配内存时查找空闲分区链/表找到大小蛮子要求的第一个空闲分区
- 缺点
- 每次都选最小的进行分配会留下越来越多很小的、难以利用的内存块,这种方法会产生很多的外部碎片
最坏适应算法
- 跟最佳适应算法相反,找容量最大的
- 缺点
- 大分区都被用了,有大进程来不能被满足
邻近适应算法
- 实现
- 以地址递增的顺序排列,每次分配内存时从上次查找结束的位置开始查找空闲分区链,
- 缺点
- 大分区更容易被消耗
3.1_6_基本分页存储管理的基本概念
分页存储
- 将内存空间分为一个大小相等的分区,每个分区就是一个“页框”(页帧/内存块/物理块/物理界面)
- 每个页框有一个编号,即“页框号”,页框号从0开始
- 将进程的逻辑地址空间也分为与页框大小相等的一个个部分,每个部分称为一个“页”或“页面”
- 每个页面也有一个编号称为页号
- 操作系统以页框为单位为各个进程分配内存空间。进程的每个页面分别放入一个页框中。也就是说,进程的页面与内存的页框一 一对应
- 页表
- 通常存放在PCB
- 计算题一已知物理内存4GB,页面大小4KB,求页表项占多少字节 ?
- 答:由于页框大小等于页面大小,所以内存会被分为4GB/4KB=2**20个内存块,内存块号范围是0~2**20-1,内存块号至少要用20bit来表示,至少要用3B来表示块号
- 页号是隐含的不占用存储空间
- 问题二:如何实现地址的转换
- 各个页面是离散存放的,但是页面内部是连续存放的
- 如果要访问逻辑地址A
- 确定逻辑地址A对应的“页号”P
- 找到P页面的内存中的起始地址(需要查页表)
- 确定逻辑地址A的“页内偏移量”W
- 逻辑地址A对应的物理地址=P号页面在内存中的起始地址+页内偏移量W
- 例题:某计算机系统中,页面大小是50B.某进程逻辑地址空间大小为200B,则逻辑地址110对应的页号、页内偏移量是多少?
- 页号=逻辑地址/页面场地(取整数部分)
- 页内偏移量=逻辑地址%页面长度(取除法的余数部分)
- 页号=110/50=2 业内偏移量=110%50=10
- 如果有K位表示“页内偏移量”,则说明该系统中一个页面的大小是2**K个内存单元
- 如果有M位表示“页号”,则说明在该系统中,一个进程最多允许有2**M个页面
3.1_7_基本地址变换机构
- 设页面大小为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
- 页式管理中地址是一维的(只需要告诉CPU逻辑地址的值,就可以知道物理地址)
- 两次访问内存
- 第一次查页表
- 第二次访问内存,访问目标内存单元
3.1_8_具有快表的地址变换机构
- 什么是快表
- 快表又称联想寄存器(TLB),是一种访问速度比内存快很多的高速缓存(不是内存),用来存放最近访问的页表项副本,可以加速地址的变换速度
- 与快表对应的是慢表,内存中的页表常称为慢表
- 引入快表后,地址的变换过程
- CPU给出逻辑地址,由某个硬件算得页号、页内偏移量,将页号与快表中的所有页号进行比较
- 如果找到匹配的页号,说明要访问的页表项在快表中有副本,则直接从中取出该页对应的内存块好,再将内存块号与页内偏移量拼接形成物理地址。最后访问该物理地址对应的内存单元。因此,若快表命中,则访问某个逻辑地址仅需一次访存即可
- 如果没有找到匹配的页号,则需要访问内存中的页表,找到对应页表项,得到页面存放的内存块号,再将内存块号与页内偏移量拼接形成物理地址,最后,访问该物理地址对应的内存单元。因此,若快表未命中,则访问某个逻辑地址需要两次访存
- 快表命中率达到90%
- 局部性原理
- 时间局部性
- 如果执行了程序中的某条指令,不久后这条指令很可能再次执行;如果某个数据被访问过,不久之后该数据很可能再次被访问(因为程序中存在大量的循环
- 空间局部性
- 一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问(因为很多数据在内存中都是连续存放的)
- 时间局部性
3.1_9_两级页表
- 单级页表存在什么问题?如何解决?
- 所有的页表项都连续存放,因此当页表很大时,需要占用很多个连续的页框
- 局部性原理可知,进程在一段时间内只需要访问几个页面就可以正常运行了。因此没有必要让整个页表都常驻内存
- 解决
- 为离散分配的页表再建立一张页表,称为页目录表(外层页表/顶层页表)
- 想访问的页面不在内存中,则产生缺页中断(内中断),然后将目标页面从外存调入内存
- 两级页表的原理、逻辑地址结构
- 把页表再继续分页
- 逻辑地址结构:一级页号,二级页号,业内偏移量
- 如何实现地址变换?
- 按照地址结构将逻辑地址拆分为三部分
- 从PCB中读出页目录表始址,再根据一级页号查页目录表,找到下一级页表再内存中存放的位置
- 根据二级二号查表,找到最终想访问的内存块号
- 结合页内偏移量得到物理地址
- 两级页表问题需要注意的细节
- 采用多级页表机制,则各级页表的大小不能超过一个页面
- 二级页表访问次数要比单级多1,n级页表访存次数=n+1
3.1_10_基本分段存储管理方式
- 什么是分段(类似于分页管理中的”分页“)
- 进程的地址空间,按照自身的逻辑关系划分为若干个段、每个段都有一个段名(再低级语言中,程序员使用段名来编程),每段从0开始编址
- 内存分配规则:
- 以段为单位进行分配,每个段再内存中占据连续空间,但各段之间可以不相邻
- 由于是按逻辑功能模块划分,用户编程更方便(编译程序会将段名转换为段号),程序的可读性更高
- 什么是段表(类似于分页管理中的”页表“)
- 就是一张段映射地址的转换
- 分段系统的逻辑地址由段号(段名)和段内地址(段内偏移量)所组成
- 段号的位数决定了每个进程最多可以分几个段(2**16个)
- 段内地址位数决定了每个段的最大长度是多少(2**16B)
- 如何实现地址变换
- 每个段对应一个段表项,记录了该段在内存中的起始位置(”基址“)和段的长度
- 各个段表项的长度是相同的。
- 段号是隐含的
- 分段、分页管理的对比
- 页是信息的物理单位。分页为了提高内存利用率。分页是系统管理上的需要,完全是系统行为,对用户是不可见的
- 段时信息的逻辑单位。分段的主要目的时更好地满足用户需求。一个段通常包含着一组属于一个逻辑模块的信息。分段对用户是可见的
- 页的大小由系统固定。段的长度却不固定,决定于用户编写的程序
- 分页的用户进程地址空间是一维的,程序员只需要给出一个记忆符即可表示一个地址
- 分段的用户进程地址空间是二维的,程序员在表示一个地址时,既要给出段名,也要给出段内地址
- 分段更容易实现信息的共享和保护(不可修改的纯代码/可重入代码)
- 分段和分页都是两次访存,当然都能引入快表
3.1_11_段页式管理方式
- 分页、分段管理中的最大优缺点
- 分段+分页的结合——段页式管理方式
- 如何实现地址变换
3.2_1_虚拟内存的基本概念
- 传统存储管理方式的特征、缺点
- 一次性:作业必须一次性全部装入内存才能开始运行。
- 导致:
- 1.作业很大时,不能全部装入内存,导致大作业无法运行
- 2.当大作业要求运行时,由于内存无法容纳所有作业,因此只有少量作业能运行,导致多道程序并发度下降
- 导致:
- 驻留性:
- 导致
- 一旦作业被装入内存,就会一直驻留在内存中,直至作业运行结束。浪费内存资源
- 导致
- 一次性:作业必须一次性全部装入内存才能开始运行。
- 局部性原理
- 时间局部性
- 空间局部性
- 高速缓存技术
- 虚拟内存的定义和特征
- 操作系统负责将内存中暂时用不到的信息换出外存
- 特征
- 多次性
- 无需作业运行时一次性直接装入内存,而是允许被分成多次调入内存
- 对换性
- 在作业运行时无需一直常驻内存,而是允许作业运行过程中,将作业换入、换出
- 虚拟性
- 从逻辑上扩充了内存的容量,使用户看到的内存容量,远大于实际的容量
- 多次性
- 如何实现虚拟内存技术
- 离散分配的内存管理方式基础上
- 请求调页功能:在程序执行过程中,所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序
- 页面置换功能:若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出外存
3.2_2_请求式分页管理方式
- 页表机制
- 多加了四个字段
- 缺页中断机制
- 请求分页系统中,每当访问的界面不在内存时,便产生一个缺页中断,然后由操作系统的缺页中断处理程序处理中断
- 此时缺页的进程阻塞,放入阻塞队列,调页完成后再将其唤醒,放回就绪队列
- 如果内存中有空闲块,则为进程分配一个空闲块,将所缺页面装入该块,并修改页表中相应的页表项
- 如果内存中没有空闲块,则由页面置换算法选择一个页面淘汰,若该页面内在内存期间被修改过,则要将其写回外存。未修改过的页面不用写回外存
- 地址变换机构
- 找到页表项需要检查页面是否在内存中
- 若页面不在内存中,需要请求调页
- 若内存不够还需换出页面
- 页面调入内存后需要修改相应的页表项
3.2_3_页面置换算法
- 将内存中暂时用不到的信息换出到外存,追求更少的缺页率
- 最佳置换算法(OPT)
- 选择淘汰的页面将是以后用不使用,或者在最长时间呢你不再被访问的页面
- 可以保证最低的缺页率,但是操作系统无法预判页面访问序列,因此最佳置换算法时是无法实现的,只能作为一个衡量标准
- 先进先出置换算法(FIFO)
- 每次选择淘汰的页面是最早进入内存的页面
- 实现:把调入内存的页面根据调入的先后顺序排成一个队列,需要换出页面时选择页面即可
- 实现简单,但是可能会导致Belady异常(当进程分配的物理块数增大时,缺页次数不减反增),算法性能差
- 最近最久未使用置换算法(LRU)
- 每次淘汰最近最久未使用的页面
- 手动做题就是逆向扫描过程中最后一个出现的页号就是要淘汰的页面
- 性能好,但是实现起来困难开销大
- 改进型的时钟置换算法(CLOCK)
- 简单的CLOCK算法
- 被访问时,访问位为1,淘汰访问位为0的。如果是1,将它置为0,暂不换出,继续检查下一个页面,若第一轮扫描中所有页面都是1,则将这些页面的访问位置为0后,再进行第二轮检查
- 最多会经历两轮扫描
- 最近未用算法(NRU)
- 用(访问位,修改位)形式表示各页面状态
- 简单的CLOCK算法
3.2_4_页面分配策略、抖动、工作集
- 驻留集
- 请求分页存储管理中给进程分配的物理块的集合
- 驻留集太小会缺页频繁
- 驻留集太大,导致多道程序并发度下降
- 固定分配
- 操作系统为每个进程分配一组固定数据的物理块,在程序运行期间不再改变,驻留集大小不变
- 可变分配
- 先为每个进程分配一定数目的物理块、再进程运行期间,可根据情况做适当的增加或减少。驻留集大小可变
- 局部置换
- 发生缺页时只能选进程自己的物理块进行置换
- 全局置换
- 可以将操作系统保留的空闲物理块分配给缺页进程,也可以将别的进程持有的物理块置换到外存,再分配给缺页进程
- 固定分配局部置换
- 系统为每个进程分配一定数量的物理块,在整个运行期间都不改变。若进程在运行过程中发生缺页,则只能从该进程在内存中的页面中选出一页换出,然后再调入需要的页面
- 缺点
- 很难分配到合理的物理块数
- 可变分配全局置换
- 刚开始为每个进程分配一定数量的物理块。操作系统会保持从一个空闲的物理块队列。当某进程发生缺页时,从空闲物理块中取出一块分配给该进程;若无空闲物理块,则可以选择一个未锁定的页面换入外存,再将该物理块分配给缺页的进程
- 优点
- 只要发生进程发生缺页,就可以获得新的物理块
- 缺点
- 被选中的进程拥有的物理块会减少,缺页率会增加
- 可变分配局部置换
- 刚开始为每个进程分配一定数量的物理块。当某进程发生缺页时,只允许从该进程自己的物理块中选中一个换出外存。如果进程在运行中缺页率高,系统会为进程多分配几个物理块,直到该进程缺页率趋势适当程度;反之,减少物理块
- 何时调入页面
- 预调页策略
- 根据局部性原理,一次调入若干个相邻的页面可能比一次调入一个页面更搞笑。但如果提前调入的页面中大多数都没被访问过,则又是低效的。
- 成功率只有一半,主要用于进程的首次调入,由程序员指出应调入哪些部分
- 请求调页策略
- 进程在运行期间发生缺页才将所缺页面调入内存
- 预调页策略
- 从何处调入页面
- 系统拥有足够的对换区空间:页面的调入、调出都是在内存于对换区之间进行。进程运行前需将进程相关的数据从文件区复制到对换区
- 系统缺少足够的对换空间:凡是不会被修改的数据都直接从文件区调入。对于可能被修改的部分,换出时需写回磁盘对换区,下次需要从对换区调入
- UNIX方式:运行之前进程有关的数据全部放在文件区,没使用过的页面,都可以从文件区调入。若被使用过的页面需要换出,则协会对换区,下次需要时从对换区调入
- 抖动(颠簸)现象
- 刚刚换出的页面马山又要换入内存
- 主要原因时进程频繁访问的页面数目高于可用的物理块数
- 工作集
- 某段时间间隔里,进程实际访问页面内的集合
- 根据”窗口尺寸“来算出工作集,窗口多大,往前数多少个
- 一般驻留集的大小不小于工作集的大小,否则频繁缺页
3.2_5_内存映射文件
- 是什么?有啥用?
- 向上层程序员提供的功能(系统调用)
- 方便程序员访问文件数据
- 方便多个进程共享一个文件
- 传统的文件访问方式
- 内存映射文件的原理和作用
4.1_1_初识文件管理
- 文件属性
- 文件名
- 标识符
- 类型
- 位置
- 大小
- 创建时间、上次修改时间、文件所有者信息
- 保护信息
- 文件内部数据怎么组织起来
- 无结构文件
- 有结构文件
- 操作系统向上提供
- 操作系统实现的文件管理功能
- 文件共享
- 文件保护
4.1_2_文件的逻辑结构
- 无结构文件
- 就是流式文件
- 有结构文件
- 又称”记录式文件“,每条记录由若干个数据项组成。每条记录中有一个数据项可作为关键字
- 可变长记录
- 数据项长度不固定,应用更广泛
- 定长记录
- 可变长记录
- 顺序文件
- 记录定长/可变长
- 文件中的记录以恶搞接一个地顺序排列(逻辑上)
- 各个记录在物理上可以顺序存储或链式存储
- 串结构
- 记录之间的顺序与关键字无关
- 顺序结构
- 记录之间的顺序按关键字顺序排列
- 可变长记录
- 无法实现随机存储,每次只能从第一个记录开始依次往后查找
- 定长记录
- 可实现随机存储。记录长度为L,则第I个记录存放的相对位置是i*L
- 若采用串结构,无法快速找到某关键字对应的记录
- 若采用顺序结构,可以快速找到某关键字对应的记录
- 链式存储
- 无论是定长/可变长记录,都无法实现随机存储,每次只能从第一个记录开始依次往后查找
- 串结构
- 索引文件
- 解决可变长记录查找速度慢的问题
- 若每条记录对应一个索引项,导致索引表很大,表比文件还大,对内存利用率低
- 若按照学生记录按照学生姓名的开头字母进行分组。每个分组就是一个顺序文件,分组内的记录不需要关键字排序,这种策略可以给索引表”瘦身“
- 索引顺序文件
- 给记录分组,先找到对应的组再在组里查找对应记录
- 建立多级索引
- 又称”记录式文件“,每条记录由若干个数据项组成。每条记录中有一个数据项可作为关键字
4.1_3_文件目录
- 文件控制块(FCB实现文件目录的关键数据结构)
- FCB的有序集合被称为“文件目录”,一个FCB就是一个文件目录项
- FCB包含了文件的基本信息(文件名、物理地址...)
- FCB实现了文件名和文件之间的映射,可以实现“按名存取”
- 目录结构
- 单级目录结构
- 不适合多用户操作系统
- 两级目录结构
- 多级目录结构(树形目录结构)
- 但是不方便实现对文件的共享
- 无环图目录结构
- 单级目录结构
- 索引结点(对文件控制块的优化)
4.1_4_文件的物理结构(上)
- 磁盘块
- 磁盘块的大小与内存块、页面的大小相同
- 操作系统对磁盘块进行哪些管理
- 对非空闲磁盘块的管理(存放了文件数据的磁盘块)
- 对空闲磁盘块的管理
- 文件的物理结构(文件分配方式)
- 连续分配
- 要求每个文件在磁盘上占有一组连续的块
- 读取磁盘块的时候,需要移动磁头。访问的两个磁盘块相隔越远,移动磁头所需的时间越长
- 优点
- 连续分配的文件在顺序读/写时速度最快
- 缺点
- 链接分配
- 可以采取离散分配的方式,可以为文件分配离散的磁盘块
- 隐式分配(默认)
- 显示分配
- 缺点
- 文件分配表需要占用一定的存储空间
- 索引分配
- 允许文件离散地分配在各个磁盘块,系统会为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块。
- 索引表存放的磁盘块称为索引块。文件数据存放的磁盘块称为数据块
- 连续分配
4.1_4_文件的物理结构(下)
- 混合索引
4.1_5_逻辑结构VS物理结构
4.1_6_文件存储空间管理
- 存储空间的划与初始化
- 文件卷(逻辑卷)的概念
- CDE盘
- 划分为目录区和文件区
- 由多个物理磁盘组成
- 目录区与文件区
- 文件卷(逻辑卷)的概念
- 几种管理方式
- 空闲表法
- 空闲链表法
- 空闲盘块链
- 空闲盘区链
- 空闲盘块链
- 位示图法
- 可以离散也可以连续分配
- 成组链接法
- UNIX系统中采用了成组链路法对磁盘空闲块进行管理
- 空闲表法
4.1_7_文件的基本操作
4.1_8_文件共享
- 基于索引结点的共享方式(硬链接)
- 基于符号链的共享方式(软连接)
- 程序快捷方式
4.1_9_文件保护
4.3_1_文件系统的层次结构
4.3_2_文件系统的全局结构(布局)
4.3_3_虚拟文件系统
5.1_1_I-O设备的概念和分类
5.1_2_I-O控制器
- 什么使I/O设备
- I代表输入;O代表输出。I/O设备=输入输出设备
- 按使用特性分类
- 人机交互类外部设备
- 键盘鼠标,打印机
- 数据传输速度慢
- 存储设备
- 移动硬盘,光盘
- 用于数据存储
- 速度比较快
- 网络通信设备
- 调职调节器,路由器
- 用于网络通信
- 速度介于人机交互和存储设备之间
- 人机交互类外部设备
- 按传输速率分类
- 低速
- 鼠标键盘
- 几个到几百个字节
- 中速
- 激光打印机
- 数千上万
- 高速
- 移动硬盘
- 数千至千兆字节
- 低速
- 按信息交换的单位分类
- 块设备
- 磁盘
- 数据的传输单位是“块”
- 传输速率比较高,可寻址,即对他可随机读写任意一块
- 字符设备
- 鼠标
- 数据传输基本单位是字符
- 速度比较慢,中断驱动
- 块设备
5.1_3_I-O控制方式
- 程序直接控制方式
- 优点
- 实现简单,在读写指令之后,加上实现循环检查的一系列指令即可
- 缺点
- CPU和I/O设备只能串行工作,CPU需要一直轮询检查,长期处于“忙等”状态,CPu利用率低
- 中断驱动方式
- 引入中断机制。由于I/O设备速度很慢,因此在CPU发出读/写命令后,可将等待I/O的进程阻塞,先切换到别的进程执行,CPU检测到中断信号后,会保存当前进程的运行环境信息,转去执行中断处理程序处理该中断。处理中断的程序,CPU从I/O控制器读一个字的数据传送到CPU寄存器,再写入主存。接着,CPU恢复等待I/O的进程运行环境
- 优点
- CPU和I/O可并行工作
- 缺点
- 每个字再I/O设备与内存之间的传输,都需要经过CPU。频繁的中断会消耗较多的CPU时间
- DMA方式(直接存储器存取)
- 数据的传输单位是“块”。不再是一个字、一个字的传送
- 数据的流向是从设备直接放入内存,或者从内存直接到设备。
- 仅在传送一个或多个数据块的开始和结束,才需要CPU干预
- 优点
- 数据传输以“块”为单位,CPU介入频率进一步降低。数据的传输不再需要先经过CPU再写入内存,数据传输效率进一步增加。
- 缺点
- CPU每发出一条I/O指令,只能读/写一个或连续多个数据块
- 通道控制方式
- 通道:一种硬件(可以理解为低配版CPU),可以识别一系列通道指令
5.1_4_I-O软件层次结构
5.1_5_输入输出应用程序接口和驱动程序接口
5.2_1_IO核心子系统
5.2_2_假脱机技术(SPOOLing技术)
- 什么是脱机技术,脱机技术可以解决什么问题
- “脱机”——脱离主机的控制进行输入/输出操作
- 在外围控制机的控制下,慢速输入设备的数据鲜卑输入到更快速的磁带上。之后主机可以从快速的磁带上读入数据
- 缓解了人机矛盾
- 假脱机技术的实现原理
- 用软件方式模拟脱机技术
- 输入井和输出井
- 输入进程和输出进程
- 输入缓冲区和输出缓冲区
- 共享打印机的原理分析
- 独占式设备
- 只允许各个进程串行使用的设备
- 一段时间内只能满足一个进程的请求
- 打印机
- 共享设备
- 允许多个进程“同时”使用设备
- 共享打印机
- 独占式设备
5.2_3_设备的分配与回收
5.2_4_缓冲区管理
- 什么是缓冲区?有什么作用
- 缓冲区是一个存储区域,可以由专门的硬件寄存器组成,也可以利用内存作为缓冲区
- 使用硬件作为缓冲区的成本较高,容量也较小
- 一般情况下,更多利用内存作为缓冲区,“设备独立性软件”的缓冲区管理就是要组织管理好这些缓冲区
- 作用
- 缓和CPU与I/O设备之间速度不匹配的矛盾
- 减少对CPU的中断频率,放宽对CPU中断相应时间的限制
- 解决数据粒度不匹配问题
- 提高CPU与I/O设备之间的并行性
- 单缓冲
- 假如某用户进程请求某种块设备读入若干块数据。若采用单缓冲策略,操作系统会在主存中为其分配一个缓冲区(若题目中没有说明,一个缓冲区的大小就是一个块)
- 当缓冲区数据非空时,不能往缓冲区冲入数据,只能从缓冲区把数据传出;当缓冲区为空时,可以往缓冲区冲入数据,但必须把缓冲区充满以后,才能从缓冲区把数据传出
- 双缓冲
- 在主存中分配两个缓冲区
- 循环缓冲
- 将多个大小相等的缓冲区链接成一个循环队列
- 缓冲池
5.3_1_磁盘的结构
5.3_2_磁盘的调度算法
- 一次磁盘读/写操作需要的时间
- 寻找(寻道)时间(Ts)
- 在读/写数据前,将磁头移动到指定磁道所花的时间
- 启动磁头臂的时间(s)
- 移动磁头(每跨越一个磁道耗时为m,总共需要跨越n)
- Ts=s+m*n
- 延迟时间
- 通过旋转磁盘,使磁头定位到目标扇区所需要的时间。设转速为r,则平均所需的延迟时间Tr=(1/2)*(1/r)
- 传输时间
- 磁盘读出或向磁盘写入数据所经历的时间,假设转盘速度为r,此次读/写的字节数为b,每个磁道上的字节数为N
- Tt=(1/r)/(b/N)
- 寻找(寻道)时间(Ts)
- 磁盘调度算法
- 先来先服务(FCFS)
- 公平,请求访问的磁道比较集中的话,算法性能过得去
- 如果大量进程竞争使用磁盘,请求的磁道很分散,则FCFS在性能上很差,寻道时间很长
- 最短寻找时间优先(SSTF)
- 优先处理与当前磁道最近的磁道。
- 优点
- 性能较好
- 缺点
- 可能产生“饥饿”
- 扫描/电梯算法(SCAN)
- 只有磁头移动到最外侧磁道才能往内移动,移动到最内侧磁道的时候才能往外移动
- 优点
- 性能好,不会饥饿
- 缺点
- 只有到达最边的磁道才能改变方向,事实上不需要移动这么长的距离
- SCAN算法对于各个位置磁道的相应频率不平均
- LOOK调度算法
- 如果在磁头移动方向上已经没有别的请求,就可以立即改变磁头的移动方向
- 更加优化了电梯算法要碰到最边上磁道才能改变方向的缺点
- 缺点
- SCAN第二个缺点没解决
- 缺点
- 循环扫描算法(C-SCAN)
- 解决SCAN第二个缺点,返回的时候直接快速移动至起始端而不处理任何请求
- 缺点
- SCAN一个缺点
- C-LOOK调度算法
- 如果边上没有磁道请求访问就让磁头立即返回,并且磁头只需返回到有磁道访问请求的位置即可
- 先来先服务(FCFS)