第一章 引论
1.1 操作系统的定义
-
通常把计算机硬件系统上配置的第一个大型软件称为计算机操作系统
-
是一种软件
-
是硬件的拓展,管理计算机的资源
-
层次
多道程序设计
-
并发执行 != 并行执行
并行执行:是同时执行多个程序
并发执行:其实是交替执行
-
多道并发执行:在内存中存放多道程序,让这些程序可以并发执行
作业的基本概念
-
作业:用户要求计算机处理的一项任务
-
作业步:一个作业包含的步骤
作业步的内容:在某个数据集上执行某个程序(数据集是?)具体内容由作业控制语言描述。
作业说明书:用作业控制语言描述作业的内容
-
四个状态:提交、后备、执行、完成
1.2 操作系统的基本类型
批操作处理系统
- 成批的接受并处理作业
- 特点:
- 程序员和操作员分离
- 批量处理、自动执行、资源利用率高
- 缺乏人机交互、不便于调试、人机界面不友好
分时系统
- 多个用户同时使用,互不干扰,交互及时
- 关键技术:时间片技术
- 是操作系统的核心之一
实时系统
- 能够保证在严格的时间范围内完成指定任务
- 用于控制领域
- 处理速度有两个影响因素,1:系统调度;2:硬件速度
操作系统的主要功能
- 用户接口以及作业管理
- 处理器管理
- 存储器管理
- 文件管理
- 设备管理
第二章 操作系统的接口
2.1 操作系统内核
处理器指令
- 特权指令➡️涉及系统安全、非特权指令
- 处理器:
- 核心态:处在核心态才能运行特权指令
- 用户态:
内核组成
- 与硬件密切相关的操作
- 关键的数据结构
- 基本中断处理程序
- 进程管理、内存管理、I/O管理模块
内核特点
- 常驻内存
- 运行在核心态
操作系统把系统内存分为两个空间:1:系统空间;2:用户空间
- 内存空间:内核运行的空间
- 用户空间:除内核外的其他软件
2.2 启动过程
硬盘的分区结构
大多数时候是从硬盘引导操作系统,所以固件会在硬盘上搜索操作系统。搜索的方法取决于硬盘的分区结构。
主要有两种
-
MBR
-
GUID
2.3 用户接口
接口类型
- 命令接口:让用户操作计算机(像 cd、mkdir 这种
- 编程接口:为系统调用(在 C 语言环境中,系统调用就是一个函数)
系统调用的含义
系统调用和普通函数调用的区别
- 系统调用不用自己写,传参给系统函数就行。普通函数要自己写
- 系统调用的子程序处在核心态上,普通函数调用的子程序处在用户态上
- 系统调用的子程序和调用代码是处在两个进程空间上的
- 系统调用包含中断指令
- 不用用户可以共享一个系统调用
第三章 处理器管理
补充
并发执行的工作方式及特征
3.1 进程的概念
进程:一个具有独立功能的程序在某个数据集上的执行过程是系统分配资源的基本单位。
特点:动态性、并发性、独立性与异步性、结构性
进程和程序的对比
程序是菜谱,进程是按菜谱炒菜的过程
- 进程➡️动态,程序➡️静态
- 同一进程在不同数据集上的执行过程是不同的进程
- 同一进程在同一数据集上的不同执行过程是不同进程
进程和作业的关系
- 作业是任务实体,进程是完成任务的实体
- 一个作业要一个或多个进程
- 一个作业需要多个进程的时间顺序由用户指定
3.2 进程的状态及其转换
三个基本状态:就绪态、运行态、阻塞态
3.3 对进程的描述
进程控制块 PCB(process control block)
PCB 是操作系统描述进程的数据结构
- PCB 在内存中,由操作系统创建并维护
- 一个进程对应一个 PCB
- PCB 不大,一般就几百或者几千 byte
- PCB 的基本信息
- 进程名
- 进程标识 PID
- 用户标识 UID
- 进程状态
- 管理信息:程序和数据的地址、1/0操作参数、进程通信信息。
- 控制信息:现场信息、调度参数、信号量。
PCB 队列
处在就绪状态➡️就绪队列
处在等待状态➡️等待队列或阻塞队列
3.4 对进程的控制
什么是原子性
即不可分割性,执行过程不能被中断
控制手段
- 使用原语实现控制
- 原语就是具有原子性的代码,不能被中断
- 为什么要用原语控制?
- 因为如果控制进程的过程发生了中断,系统会不太妙
- 但是还是有可能发生中断,只不过不会去响应这样的中断。因为原语执行很快,暂时不去响应中断也没事,原语执行完还可以去处理。
进程树
- 操作系统启动后就会创建一个 0 号进程,作为进程树的根节点
- 除了 0 号进程意外,其他的所有进程都由另一个进程创建,被创建的为子进程,创建者为父进程。这样就形成了一颗进程树
控制阶段
创建原语
- 建立 PCB,将进程状态置为就绪态。(对应上图中创建进程就到就绪态的部分)
- 生成 PID。
- 初始化 PCB 各项内容。
- 将 PCB 加入到合适的就绪队列和进程树中。
撤销原语
- 若该进程在进程树中非叶节点,先撤销其子孙进程。(有叶节点先动叶节点,处理完没有叶节点了自己就变成了别人的叶节点,就可以对自己动手了)
- 根据 PCB 释放其所占资源。
- 将 PCB 从进程树中摘下。
- 释放 PCB。
- 调用调度原语。
挂起原语
挂起就是从运行态转变为阻塞态
- 将 PCB 中的进程状态修改为阻塞状态。
- 将 CPU 寄存器的内容复制到 PCB 中保存。
- 将 PCB 插入到合适的等待队列中。
- 调用调度原语。
唤醒原语
- 从 PCB 等待队列中移出
- 将进程从阻塞态改为就绪态
- 将进程加入合适的就绪队列
调度原语(不太懂)
- 若有进程处于运行态,将其状态改为就绪态并将 PCB 插入到
合适就绪队列中。 - 从某个就绪队列中按一定的策略(具体的策略将在下一章介
绍)选取一个进程。 - 将选定进程的 PCB 从就绪队列中摘下。
- 把 PCB 中的状态改为运行态,实现进程切换。
fork 函数
-
创建子进程,子进程得到父进程地址空间的一个复制
-
fork 被成功调用一次会返回两次
-
成功时,对父进程返回子进程的 PID(非 0 值);对子进程返回 0
-
不成功调用就返回一次
对父进程返回 -1
没有子进程了
-
3.5 进程间协调
多个进程共享一个资源时,可能发生多次运行得到不同结果的情况
(此时可再见性得不到满足)
此时需要特定的约束关系,才能保证各个进程的正常运行
约束关系
- 互斥关系:并发执行的多个进程的程序代码中某一部分不能并发执行。 这一部分我们称为临界区,临界区代码的共享资源称为临界资源
- 同步关系:并发执行的多个进程的程序代码中某一部分必须保持一种有 规律的约束关系。
信号量机制(P、V原语)
信号量(sem):大于等于 0,表示可被进程使用的动态资源数;小于 0 时,表示等待运行的进程数量。(?
P 操作:让信号量减一,如果减一之后信号量小于 0,就让进程阻塞
V 操作:让信号量加一,如果加一之后大于等于 0,就唤醒进程
生产者消费者问题
共享变量中只能存放一个数据时
共享变量能存放 n 个数据时
同时还是只有有一方读或者写
但是可以同时执行多次写,以及同时执行多次读
3.6 进程通信
基本概念
指的是:进程之间交换数据
必须要处理进程间的协调问题才能进行通信
方式
- 共享内存
- 消息缓冲通信
- 信箱通信
- 管道通信
3.7 线程
基本概念
指的是:进程的执行体(?,也叫做轻量进程
早期的时候一个进程就只有一个执行体,有没有线程无所谓
后期发现一个进程可以包含多个执行体,这样就很棒,这时候线程就被引入了。
一个进程包含多个执行体(线程)的优势
- 在线程之间切换消耗也远远小于在进程之间切换
- 方便实现资源共享
进程与线程
- 线程是 CPU 进行调度的基本单位,进程是系统分配资源的基本单位
- 线程控制块➡️TCB,进程控制块➡️PCB
- 个人理解:线程是进程拆分出的更小的执行单位,现在的进程就由多个线程构成,可以在一个进程能执行多种同步或者互斥的操作。所以对进程的那些控制操作对线程也同样适用。之前进程是一个单独的实心块不能拆,现在进程虽然还是个实心块,但是可以被拆成很多小的实心块。
第四章 处理器调度
4.1 操作系统中的调度
调度类别
- 作业调度
- 进程、线程调度
- 交换调度
- 设备调度
调度的指标
作业为 Ji
- 周转时间:Ti = Ji 的完成时刻 - JI 的提交时刻
- 平均周转时间:T = Ti 求和 / n (n 个作业)
- 响应时间:R=请求处理过程第一次得到结果的时刻 - 请求提交的时刻。
4.2 作业调度
调度算法
- 先来先服务(FCFS)
- 短作业优先 (SJF)
- 高响应比优先 (响应比 = 作业等待时间 / 作业大小)就是说等待时间越长、作业大小越小的优先(HRN)
4.3 进程调度
方式
- 非抢占式(非剥夺式):简单、代价小、实现容易,批处理系统较多采用这种方式。
- 抢占式(剥夺式):灵活,分时系统和实时系统大多采用这种方式。
作业调度算法
- 先来先服务:非抢占式,用于批处理系统
- 时间片轮转:抢占式,用于分时系统
- 优先级:可分为抢占式和非抢占式;优先级可静态不变也可动态变化;优先级可以由用户指定也可以由某种算法计算
- 其他调度算法可视为前几种调度算法的组合
4.4 死锁问题
产生的根本原因:资源不足(不能通过增加资源方式来解决,因为资源多少才算充足是无法确定的)
死锁发生的条件
- 互斥
- 不剥夺
- 请求与保持
- 环路等待
死锁的预防
- 静态分配(不满足请求与保持,所以不会发生死锁)
- 在进程运行前把资源分配给进程。这样进程请求资源时不拥有任何资源;进程获得资源后也不再会请求资源。
- 不足之处
- 很难确定一个进程所需要的资源(要先预知才能分配
- 资源利用率太低
- 按需分配(不满足环路等待)
- 给资源编号,分配资源时按编号分配
- 哲学家进餐问题
- 不足之处:当分配的序和申请资源的序不一致时,资源利用率低
死锁的避免:银行家算法
(没有写具体算法实现过程)
在资源分配过程中预测死锁发生的可能性并加以避免
两个状态
- 安全状态:能用一种方法把所有进程都运行结束,不会发生死锁
- 不安全状态:不能把所有进程都运行结束,可能发生死锁
银行家算法在资源分配前会对状态进行检测,如果是分配后会导致系统进入不安全状态,则拒绝此次资源分配请求
死锁的检测与恢复
OS周期性地检测系统状态,一旦发现死锁,中止陷入死锁的若干进程,使得剩余进程能够运行下去,被中止的进程可以重新启动。
检测算法有:
- 资源分配图法
- 有限状态转移图法
- Petri 网技术36543
相关问题
-
发生死锁一定死机?
没有必然联系
-
当前操作系统如何处理思索问题
鸵鸟算法。就是基本上不处理(因为实际出现死锁的概率很低)
第五章 存储器管理
5.1 概述
存储器的类型
存储器管理的对象是主存储器
功能
-
实现虚拟存储器,支持进程空间
进程空间的大小和物理内存大小没有直接关联
虚拟存储器对物理内存进行逻辑扩充
-
虚拟地址与物理地址之间的地址变换
编译形成的可执行程序中的地址都是虚拟地址
只有在运行时,操作系统才必须把虚拟地址转换成逻辑地址
-
内存的分配与回收
-
内存信息的共享与保护
5.2 分区管理
固定分区
物理地址 = 虚拟地址 + 分区首地址
特点
- 支持多道程序设计
- 并发执行的进程数受分区个数限制
- 程序大小受分区长度限制
- 存在“碎片”
可变分区
分配方法
- 最先适应法:分区表按首地址升序
- 最优适应法:分区表按大小升序
- 最坏适应法:分区表按大小降序
特点
- 分区大小可变
- 分区数量可变
- 被分给进程的分区往往都等于进程的空间需求,没有资源浪费
- 仍然受到物理内存的直接限制
技术
交换技术
不需要开发人员直接参与,作用于进程
覆盖技术
需要开发人员直接参与,并且作用于进程内部
- B, C 最大是 B 50 K,所以覆盖区 0 有 50 K
- F D E,最大是 E 有 30 K,所有覆盖区 1 有 30 K
5.3 页式管理
基本原理
- 先规定一页的大小,按页的大小将进程分为多页
- 每一页对应内存空间的一帧(内存空间也按固定的帧大小划分为舵帧)
- 进程占用的内存空间并不要求是连续的,以此来解决分区管理中的碎片问题,从而提高内存的利用率(碎片问题的根本原因:在分区管理中进程要求使用连续的内存空间)
静态分页
概念
- 以分页方式管理内存
- 在进程的整个生命周期中,内容都放在内存中
静态分页的数据结构
分别是:页表、请求表、帧位图
页表是一个进程一张
请求表和帧位图都是整个系统一张
页表
- 一个页表对应一个进程
- 进程的大小决定页表的长度
- 每一个表项对应该页内容在物理内存上的帧号
请求表
请求页面数 == 页表长度
请求表:可以看做进程和进程页表的对应关系(map<进程,页表>请求表
)
帧位图
静态分页内存分配步骤
- 找帧位图,看看有没有足够数量的帧,有的话再进入下一步
- 从帧位图中选出一些帧,把对应的 0 置位 1,代表帧占用
- 通过请求表找进程对应的页表
- 更新页表
静态分页内存回收步骤
- 通过请求表找进程对应的页表
- 更新页表
- 将帧位图中占用的帧从 1 置位 0
- 看看有没有等待资源分配的进程,有的话去处理分配内存(调用分配过程)
实例
帧长度:1 K
逻辑地址 :2500
-
计算页号和页内地址
页号:2500 / 1024 = 2
页内地址:2500 % 1024 = 452
-
通过请求表找页表,通过页表得到帧号
-
计算物理地址
物理地址 = 页内地址 + 帧号 * 帧长
(帧号 * 帧长 = 该帧在物理内存中的起始地址)
ans = 452 + 8 * 1024 = 8644
地址变换
静态分页的地址变换太慢了,CPU 和内存的速度差距是数量级的
解决办法:
- 设置 cache
- 设置专门硬件保存请求表、页表的数据结构
综上:页式管理需要有专门的硬件支持
动态分页
概念
在进程的全部生命周期或者生命周期的某一阶段,在内存中保存进程的内容的一部分,并采用页式管理,称为动态分页(就是不要求进程的所有页都在内存当中)
动态分页可以对内存进行逻辑上的扩充,静态分页不具备这个功能
动态分页 - 请求页式
定义:在需要用到某页,而该页不在内存中时,将该页从外存装入内存
动态分页的页表
相对于静态分页的页表增加了 3 个表项:1️⃣中断位、2️⃣外存始址、3️⃣改变位
- 中断位:表示该页是否在内存中
- 外存始址:改页在外存中的起始地址
- 改变位:该页在内存中是否发生过变化(没有变化的话置换时就可以直接覆盖)
动态分页地址变换的步骤
也是 4 步,除了第 3 步发生变化外,其他都和静态分页一样
第 3 步变化:通过页表找到该页对应的帧号之后。先判断该页是否在内存中。
- 如果在内存中,则直接跳到第 4 步
- 如果不在内存中,则要从外存中装入内存,改变页表中该页的中断位状态以及改变位状态(改变位置为未改变状态)
当从外存中装入页到内存中,内存空间不够的方法
把内存中某个页移到外存,腾出内存空间
选择哪一页被移出去的算法有:
- 先进先出法:P166 图 5 - 26
- 最近最久未使用算法:P167 图 5-27
- 最近最不常用算法:P167 图 5-28
- 最近未使用算法
前 3 种算法容易出考题
抖动现象和 Belady 现象
- 抖动现象:动态分页可能导致内存和外存之间频繁的交换,导致 CPU 因等待数据而空转,性能降低
- Belady 现象:通常给一个进程分配的帧越大,产生的缺页次数就越少。这样的反例称为 Belady 现象
页式管理的特点
- 由于不要求进程在内存中连续存放,有效的解决了碎片化问题
- 必须要有硬件支持,不然太慢了
- 动态页式管理可以对内存进行逻辑扩充
- 太多数进程的最后一页存在空间浪费(?
5.4 段式管理
基本思想
-
进程空间被划分成若干段,段的内容是连续的
-
但是段和段之间没有顺序关系
-
段和动态分页一样,不要求进程空间的所有段都在内存中,因此段式管理可以实现逻辑扩充
-
操作系统为每个段分配内存空间,而不是给每个进程分配内存空间
-
段的长度是可以动态增长的
段的数据结构
段表
段表和页表类似,每个段表对应一个进程
- 段号:段的唯一表示
- 始址:在内存中的位置
- 长度:段长
- 存取方式:进程对该段的存取权限
- 内外:表示是否在内存中
- 改变位:在内存中是否被改变过
空闲区表
记录系统中空闲的物理块
置换处理
和动态分页中的置换方法类似
当内存空间不够时,通过特定的算法找到一个段,释放该段占用的内存
(释放内存参考下面置换内存的步骤)
分配内存
- 先找空闲区表,看看有没有大小 >= 段的空闲区;找到了进入第二步,找不到进入置换处理(置换处理后还是不行就挂起该进程)
- 判断找到的空闲区是不是等于段大小
- 等于:将空闲区表中的始址和长度填入段表,并且在空闲区表中删除这一项
- 不等于:将等于段大小的填入段表,空闲区表中留下剩下的大小
释放内存
- 若改变位表示该段在内存中已被改变,把该段内容暂存到外存中。(如果进程被撤销释放内存则不需要做此处理)
- 将释放内存的段在段表中对应表项的始址、长度、改变位等置空,内外标志置为外存标志。
- 将释放内存的段在段表中对应表项的始址、长度数据复制到空闲区表中。
- 检查是否存在相邻的空闲块,若有需要合并。
地址变换(也需要硬件支持)
逻辑地址 = 段号:段内地址
-
根据逻辑地址的段号查段表
-
判断该段在不在内存中
- 在:得到始址和长度
- 不在:调用缺段处理(指的是调用分配内存的过程为该段分配内存空间)
-
计算物理地址
物理地址:段始址 + 段内地址
特点
- 可以对内存进行逻辑扩充
- 每个段的长度受内存可用区大小的限制。段长受限有可能出现非常频繁的内外存交换(因为和动态分页类似,所以这两个特点都是一样的)
- 段长可根据需要动态增长
- 便于对具有完整逻辑功能的信息进行共享。
- 便于实现动态链接
5.5 段页式
基本思想
在段页式的基础上,把动态分区改成了分页
分配和回收内存
和页式管理类似,不同的是页式管理是为每个进程分配和回收内存
而段页式是为每个进程中的每个段进行分配和回收
地址变换
只比页式管理多了一步:先找段表➡️根据段表再到页表
特点
综合了段式也页式的优点,但是同时增加了复杂性
5.6 局部性原理
- 局部性原理指在一段时间内,CPU总是集中地访问程序中的某一部分而不是随机地对程序所有部分具有平均访问概率。
- 局部性原理是在实验的基础上对程序执行特性的理论总结
- 动态分页、段式和段页式实现内存逻辑扩充的基本思想是一致的,即不要求进程在其整个生命周期在内存中保存它的全部内容。该思想之所以行得通,局部性原理是其基础。
第六章 文件系统
6.1 概述
概念
- 文件:计算机系统中信息存储的基本单元,关于某个主题的信息集合
- 文件系统:操作系统中实现和管理文件的部分
主要功能
- 实现文件按名存取
- 实现目录结构
- 文件存储和空间管理
- 文件的共享与安全性
- 文件系统的接口
6.2 文件的逻辑结构
概念
指的是操作系统组织文件内容的方式
分类
- 流式
- 记录是
6.3 文件的物理结构
概念
指的是:操作系统组织文件所用物理块的方式
分类
- 顺序结构
- 链接结构
- 索引结构
顺序结构
操作系统将文件放在一个由物理块组成的一维空间上
优点:简单,只要记住文件在一维空间上的起始地址和终止地址就可以
缺点:连续的必然出现碎片化问题;文件的动态增长将会变得异常困难
适用于:磁带这样的物理设备
链接结构
用链表的方式,每个文件占用的物理块可以不是连续的
优点:有利于文件的动态增长;空间利用率高
缺点:不便于文件的随机存取,必须通过前一个物理块才能找到后一个物理块
改进的链接结构 - FAT
所有文件的链接指针集中在一起存放
索引结构
为每个文件建立一个索引表,记录文件所占用的物理块
外存空间:
索引表:
方便文件大小动态增加和随机存取
文件的存取方式
- 顺序存取
- 随机存取
6.4 目录管理
概念
- 文件目录:描述文件的数据结构,一般包括
- 文件名
- 文件的各种属性
- 文件的物理地址
- 按名存储:按文件名就能找到文件内容,依赖的正是文件名和物理地址之间的映射关系
- 物理地址的格式➡️起始物理块号:物理块数
- 串联结构的文件系统的物理地址:文件第一个物理块块号
- 索引结构的物理地址:存放物理块的索引表
- 文件目录本身的存放位置:在外存上
- FCB:每打开一个文件就有一个 FCB,FCB 的内容与打开文件的文件目录一致
目录文件与多级目录
目录文件:存放文件目录的文件
多及目录的实现:通过树结构,除根节点以外,所有的非叶节点都是一个目录文件;
6.5 文件存储空间管理
位示图
和帧位图有点像,每个 bit 对应外存空间中的一块物理块,其中 0 表示空闲,1 表示被占用。
其本身也存放在外存空间上。
空闲块表
- 每一个表项代表一个空闲区,包括起始物理块号,以及空闲块的个数
- 本身放在内存中
- 有连续的空闲块应该合并
空闲块成组链接法
6.6 文件的共享
共享的两层含义
- 在目录结构的不同位置,通过不同的文件名使用相同的文件
- 多个程序同时使用相同的文件
共享的方法
-
绕道法
当前的文件是指向另一个文件的指针,如 windows 的快捷方式
-
链接法
不同的文件名映射同一物理地址
-
基本文件目录表 BFD
6.7 文件的安全性
访问控制机制
操作系统➡️特权模式
应用程序➡️普通模式,无法使用特权指令,但是可以提出使用特权指令的请求
安全策略的保存形式
存取控制矩阵
行:文件名
列:用户名
对应的格:该用户对该文件的访问权限
内容加密
第七章 设备管理
7.1 概述
设备管理器任务
-
管理缓冲区
设备之间速度不匹配,需要一个缓冲区
如果没有缓冲区,高速设备就没有意义。因为高速设备和低速设备交互时,速度肯定是由低速设备决定
-
控制外围设备和主机之间交换数据
-
给用户提供一个接口
-
实现虚拟设备
7.2 硬件特性
控制器连接
控制器和主机之间通过总线相连
相当于是 设备 - 控制器 - 总线 - 主机
一个控制器可以连多个设备
控制器特性
-
主机通过控制器控制外围设备(控制器就相当于一个中介器)
-
控制器上设有接口寄存器
接口寄存器的分类:数据、地址、控制、状态
-
I/O 地址:CPU 可以通过这个地址指向控制器的寄存器,从而通过控制器操控外围设备
-
控制器需要占用 I/O 地址和中断号资源而外围设备不需要,因为外围设备不与主机直接相连
设备特性
- 为了通信,设备上要有接口和缓冲区
- 设备接口仅对控制器可见,对 CPU 是不可见的(所以设备上的接口不占用 I/O 地址)
硬件特性 - 数据传送方式
-
轮询方式
CPU 启动设备后,反复询问设备状态,当设备完成或出现异常时进行相应处理,但是大部分时间都处在等待状态,非常浪费系统资源。
-
中断
硬件通过发生中断信号告知 CPU 相关事件
当设备完成任务或出现异常时产生中断,CPU 响应该中断来进行相应的处理
-
DMA
作用:减少中断产生的次数(频繁的中断会导致系统效率下降)
可以累积一批 I/O 操作后再发生中断
-
通道
7.3 软件机制
无关层
- 设备命名和映射
- 管理 I/O 操作
- 管理缓冲区
- 分配或释放独占设备
相关层
指的是:设备驱动程序、中断处理程序
设备驱动程序通常要实现以下函数(设备驱动程序通常运行在核心态,是操作系统的一部分)
- Read:读设备
- Write:写设备
- Open:打开设备,即设备初始化。若是独占设备,打开设备包含请求配设备的功能
- Close:关闭设备
- Control:控制设备
- Int:中断处理程序
I/O 控制的实现方式
- 作为请求 I/O 进程的一部分实现
- 作为当前进程的一部分实现(主流操作系统采用的方式)
- I/O 控制由专门的系统进程来完成
7.4 设备分配
虚拟设备
避免独占设备对操作系统产生的不利影响,操作系统引入了虚拟设备技术。
虚拟设备没有数量限制,当某个进程需要使用独占设备时,操作系统可以分配它一个虚拟设备,进程就可以无需等待该独占设备。
典型例子:打印机
7.5 缓冲技术
实现的硬件基础:DMA技术、中断机制
缓冲区是内存的一部分,需要内存管理和设备管理相互配合
问题
-
一个缓冲区刚刚被使用过回到空闲状态,缓冲区内容是否应该直接被抹去
在安全保障下可以不同。如果后面有用的话可以直接读缓冲区避免 I/O 操作,提高内存效率
-
缓冲区数据可用时,是否可以直接读缓冲区不读盘
可以,缓冲区数据一般是新的。和盘中不一致时以缓冲区为准
-
操作系统是否必须要在把要写入的内容送到缓冲区后马上把缓冲区的数据写到硬盘的物理块?
不一定。可能多次更新落到一个缓冲区上,可以多等几次更新后再写入硬盘,同样可以减少 I/O 操作。但是会有一定的风险导致缓冲区数据丢失。
7.6 硬盘驱动程序中的调度问题
移臂调度
- 先来先服务
- 最短时间优先
- 电梯调度