第一章
1. OS 地位、作用和定义
- 地位:操作系统在硬件之上,应用程序之下
- 作用:操作系统是控制应用程序执行的程序,并充当应用程序和硬件间的接口
- 定义:操作系统(Operating System)是最基本的系统软件。它控制计算机的所有(包括硬件、软件、数据)资源(系统的观点)并提供应用程序开发的基础(用户的观点)
2. OS 分类和发展历史
- 无操作系统
- 特点:用户独占全机,CPU等待人工操作
- 单道批处理系统
- 产生动机:提高资源利用率
- 特点:自动作业序列,脱机输入输出
- 操作:监控程序+用户程序(两者循环)
- 特征:自动性、顺序性、单道性
- 硬件支持:存储保护、定时器、I/O保护、中断
- 系统开销(overhead):内存,机器时间
- 缺点:I/O 操作太慢
- 多道批处理系统
- 产生动机:提高资源利用率和系统吞吐量(系统单位时间内完成的总工作量)
- 特点:两个或以上作业同时进入主存,切换运行
- 操作:jobA+jobB+…+wait+…
- 特征:多道性、无序性(输出顺序)、调度性(作业调度、进程调度)
- 硬件支持:同单道、I/O中断、DMA(直接存储器存取)
- 缺点:周转时间长,无交互能力(脱机)
- 分时系统
- 产生动机:通过解决及时接收和及时响应的问题,满足用户需求(人机交互、多用户共享、便于使用)
- 特征:多路性(宏观并行微观时间片)、独立性(虚拟)、及时性、交互性
- 多处理器系统(/并行系统/紧耦合系统)
- 有多个紧密通信的CPU,他们共享计算机总线,有时还有时钟、内设和外设等
- 优点:增加吞吐量;规模经济;增加可靠性
- 非对称处理器:主从式,只有核心处理器加载操作系统并为其他处理器分配任务
- 对称处理器(更普遍)
- 实时嵌入式系统
- 功能:系统能及时(或即时)响应外部事件的请求,在规定时间内完成对该事件的处理,控制所有实时任务协调一致地运行,明确和固定的时间约束
- 应用领域:实时控制, 实时信息处理
- 硬实时系统:保证关键任务按时完成,否则可能出现灾难性后果
- 软实时系统:限制相比硬实时较弱,关键实时任务的优先级高于其他任务
- 分布式系统
- 分布式系统通过网络提供功能
- 网络: 两个或多个系统之间的通信路径
- 松耦合系统(硬件角度)
- 分布式系统通过网络提供功能
3. OS的组成部分
- 内核:一直运行在计算机上的程序
- 系统程序:与系统运行相关的程序
- 应用程序:其他程序
4. OS 特征
- 并发:2个或多个事件在同一时间间隔发生
- 共享:互斥共享方式,同时访问方式
- 虚拟:通过某种技术把一个物理实体变成若干个逻辑上的对应物
- 异步性:进程的运行方式——走走停停
5. OS 功能
- 进程管理、内存管理、文件管理、设备管理、与用户之间的接口
6. 其他概念
1) 什么是中断
- 硬中断
- 内部中断(不可屏蔽):内部中断是指因硬件出错(如突然掉电、奇偶校验错等)或运算出错(除数为零、运算溢出、单步中断等)所引起的中断。
- 外部中断(可屏蔽):外部中断一般是指由计算机外设发出的中断请求,如:键盘中断、打印机中断、定时器中断等。利用中断控制器可以屏蔽这些外部设备的中断请求。
- 软中断(不可屏蔽):用户通过系统调用来执行特权指令
- 中断在OS的地位
- CPU和外设并行工作的基础
- 多道程序并发执行的推动力
- 现代操作系统是由中断驱动的
- 特权指令
- 可能引起损害的指令
- 只允许在内核模式下执行
- 若在用户模式下试图执行特权指令,则硬件不执行该命令,并且将其以陷阱形式通知操作系统
- 监控程序:监控程序包括服务器端和客户端在一台机器运行服务器程序客户端运行客户端程序可以动态监视服务器的屏幕能将鼠标和键盘事件传过去,能进行一般的操作
- 切换运行:当一个作业需要等待I/O 时,切换到另一个不在等待I/O 的作业——让CPU保持忙碌
2) 引入多道程序设计的目的
通过把各种不同用户提出的CPU 和IO 设备请求相互交替的执行,更高效的使用CPU,通过不断让CPU 工作来提高CPU 的利用率。
3) 研究操作系统的几种观点
- 系统观点:用于资源管理器的操作系统
- 用户观点:用于扩展机的操作系统
4) 什么是双重操作模式?为什么要引进双重操作模式
- CPU 有两种执行任务的模式(通过模式位表示当前模式)
- 系统模式:用于执行操作系统任务
- 用户模式:用于执行用户任务
- 为何引入:通过只能在系统模式下运行特权指令,可以保证操作系统时刻控制整个计算机系统,并保证关键数据的安全。
5) 系统态、用户态以及转换的条件
- 用户态
- 也称作算态、目标程序态(目态)、常态
- 当系统在用户态时,只能使用非特权指令
- 系统态
- 也称作管态、核心态、管理态、特权态
- 当系统处于系统态时,可以使用所有指令、资源,并具备改变CPU状态的能力
- 用户态切换到内核态的3种方式
- 系统调用(主动)
如果CPU执行用户程序时要申请使用操作系统提供的服务程序,系统将自行转到中断处理程序,CPU就由用户态转换到核心态,称之为软中断。 - 异常
当CPU在执行用户程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。 - 外围设备的中断
如果CPU在执行用户程序时需要调用外围设备信息如键盘输入,或外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,称为硬中断。
- 系统调用(主动)
6) 硬件保护机制
- 双重模式操作
- CPU保护
- I/O保护
- 所有I/O 指令都是特权指令,用户只能通过系统调用进行I/O操作
- 目的:确保用户程序不能获得管理模式
- 内存保护
- 保护OS的存储区(如中断向量表、中断服务程序、OS的代码和数据等)
- 内存中用户程序之间的保护
- 一种实现方法(基址寄存器、界限寄存器)
第二章
1. 用户与OS 的两种接口
- 命令接口:由一组键盘操作命令和命令解释程序组成
- 脱机(off-line):批处理系统——作业控制语言JCL
- 联机(on-line):交互式系统——命令行
- 程序接口:为了用户访问系统资源而设,用户程序获取操作系统服务的唯一途径是系统调用
2. 系统调用
- 系统调用提供了操作系统提供的有效服务界面,提供了进程与操作系统之间的接口
- 功能:允许用户级进程请求操作系统服务
- 分类:进程控制,文件管理,信息管理,设备管理,通信
3. 操作系统的结构有几种?各自的特点?
- 结构:
- 简单结构/整体式系统
- 一系列过程的集合,只要需要,就可以相互调用
- 内存容量限制,没有划分模块
- 层次式结构
- 每层只能利用低一层的功能(操作)和服务
- 实现模块化,相对效率差
- 微内核(/C/S 结构)
- 只有最基本OS功能放在内核中,运行在内核模式;不是最基本服务和应用在内核之外,运行在用户模式
- 易于维护,易于扩充,适用于分布式系统
- 虚拟机(/扩展机)结构
- 提供与基本硬件相同的接口,虚拟多台硬件裸机
- 提供了安全层,完全保护硬件资源,系统开发不影响正常系统操作;完全复制底层机器
- 模块
- 可加载的内核模块:内核提供核心服务,无论在启动或运行时,内核都可以通过模块链入额外服务
- 简单结构/整体式系统
4. 其他概念
- 虚拟机:是硬件的完全拷贝
- Shell:解释程序
- 实现命令两种方法
- 命令解释程序本身包含代码以执行这些命令
- 通过系统程序实现大多数的命令
- 中断:是异步的,因为从逻辑上来说,中断的产生与当前正在执行的进程无关
- 陷入:是异常之一,异常是由当前正在执行的进程产生。陷入的最主要的应用是在调试中,被调试的进程遇到你设置的断点,会停下来等待你的处理,等到你让其重新执行了,它当然不会再去执行已经执行过的断点指令。
第三章
1. 进程
- 定义:进程指一个正在执行的程序,包括程序计数器、寄存器和变量当前值
- 程序是被动的实体,进程是活动的实体
- 进程可中断
- 同一程序处理不同数据级时,可以构成不同的进程
- 特征
- 动态性:有一定的生命期: 创建, 执行, 暂停, 消亡
- 并发性:多个进程实体,同存于内存中,能在一段时间内同时运行
- 独立性:进程实体是一个能独立运行的基本单位,同时也是系统中独立获得资源和独立调度的基本单位
- 异步性:进程按各自独立的、不可预知的速度向前推进, 即进程按异步方式运行
- 结构特征:进程映像(正文段/程序段、数据段、堆、栈以及进程控制块)
2. 程序顺序执行
严格按先后次序逐个执行语句/程序段
- 顺序执行的特征
- 顺序性:只有前一个操作结束, 才能执行后续操作
- 封闭性:程序运行时独占全机资源
- 可再现性:与执行速度无关
3. 程序的并发执行
- 多道程序系统:多道程序的并发执行
- 某道程序可以包含若干个能够并发执行的程序段
- 好处:充分利用系统资源,提高系统处理能力
- 并发执行的特征
- 间断性:共享资源,相互合作
- 相互制约
- 执行 - 暂停 - 执行
- 失去封闭性:一个程序的执行受到其他程序的影响
- 不可再现性
- 间断性:共享资源,相互合作
4. 进程与程序的区别与联系
- 进程是一个正在执行的程序
- 进程是一个活动的实体,程序是一个被动的实体
- 进程不只是程序代码,还包括当前的活动(用CPU 各种寄存器的内容表示)以及堆栈段和数据段
- 非对称性:一个进程可以调用多个程序,一个程序可以被多个进程共用
5. 进程状态及其转换
- 三状态(运行、就绪、等待)
- 五状态
- 新建:新进程正在被创建
- 就绪:只要有机会获得CPU 就开始执行
- 运行:进程正在被执行
- 等待:等待某个事发生
- 终止:进程已经完成或者被迫终止
- 其他状态
- 交换(Swapping):把主存中某个进程的全部或部分移到磁盘,交换是I/O操作
- 挂起(Suspend):当内存中所有进程阻塞时,OS可将一进程置为挂起态并交换到外存,再调入另一个进程执行。
6. 进程管理块PCB
- 进程各种属性的集合
- PCB是进程存在的唯一标志
- 是OS中最重要的数据结构
- OS通过PCB控制和管理并发执行的进程
- 涉及调度、资源分配、中断处理
- 主要内容
- 进程标识
- 进程状态信息
- 进程控制信息
7. 调度程序
- 长期调度程序 / 作业调度程序:长期调度程序在后备队列中选择作业,控制主存中进程的数量
- 短期调度程序 / CPU调度程序:就绪队列中选择进程,分配CPU;执行频率很高
- 中期调度程序:交换;进程的挂起状态
8. 上下文切换
- CPU从一个进程切换到另一进程,保存原来进程的状态,装入新进程上次保存的状态
- 上下文切换时间:系统开销
9. 进程控制
- 主要功能:创建、撤销、挂起、唤醒、阻塞、激活等原语所需完成的功能
- 原语和系统调用:执行过程的区别
- 进程在执行过程中通过系统调用创建
- Fork():由于代码相同,父子共享存储空间
- Execve():必须重新分配空间(windows CreateProcess())
- 进程通信的几种方法
- 共享内存
共享内存模型会建立一块协作进程共享的内存区域,进程通过向此共享区域读或写数据来交换信息 - 消息队列
- 相互合作的并发进程交换信息的一种高级通信方式
- 进程间的数据交换以消息(message)为单位
- 适用场合:单处理器系统、共享主存的多处理器系统、分布式系统
- 使用消息传递原语(发送消息原语、接收消息原语)实现通信,系统隐蔽了实现细节
- 类型
- 直接通信
-> 明确指明发送进程和接收进程的标识
特点- 自动建立
- 一个通信线路只与一对进程相关联
- 每对进程只有一个通信线路
- 间接通信
-> 邮箱(mailbox) / 端口(port):有唯一标识,共享同一个邮箱的进程才可以通信
-> 发送和接收消息的原语
特点- 建立:多个进程共享一个邮箱
- 一个线路可以与多个进程关联
- 两个进程可以共享多个邮箱(有多个线路)
- 共享内存
第四章
1. 什么是线程?为什么要引进线程?
- 线程:又称为轻量级进程,是使用CPU 的基本单元,由线程ID、程序计数器、寄存器集合和堆栈组成。属于同一进程的线程共享进程的代码段、数据段和其他操作系统资源。
- 引入进程的目的
- 使多个进程并发执行
- 改善资源利用率
- 提高系统吞吐量
- 引入线程的原因
- 程序并发执行时所付出的时空开销
- 使OS 具有更好的并发性
- 线程是调度和分派的基本单位
- 与同进程内其他线程共享进程所拥有的资源
- 基本状态:运行、就绪、阻塞
2. 线程和进程的区别?
- 进程是资源的拥有者,而线程是进程中的一个实体,只拥有运行所必须的资源
- 线程的优点
- 提高并发性
- 响应度高
- 资源资源共享
- 经济——降低时空开销
- 多处理器体系结构的利用
3. 线程的实现方式
- 用户级线程(管理无需内核支持)和内核级线程(由操作系统来直接支持与管理)
- 多线程模型
- 多对一模型
-> 映射多个用户线程到一个内核线程
-> 效率高,但若一个线程执行阻塞系统调用则整个进程将会阻塞,并且同一时间只能一个线程访问内核,即不能并行运行 - 一对一模型
-> 每个用户线程映射一个内核线程
-> 比多对一更好的并发性,但创建内核线程的开销会影响应用程序的性能 - 多对多模型
-> 多路复用多个用户级线程到同样数量或更少的内核线程,没有以上两个缺点
- 多对一模型
- 双层模型
- 多对多(普通线程)+ 一对一(重要线程)
第五章
1. 调度类型
- 长期调度——确定把哪个作业放到内存中执行
- 中期调度——主要在分时系统中使用。将内存中的作业换出到外存中等到内存允许的情况下再换入到内存中执行
- 短期调度——从就绪队列中选择进程执行并把CPU分配给它
- 分派程序:一个模块,负责把CPU控制权交给被CPU调度程序选中的进程(切换上下文)
2. 调度队列
- 调度的四种时机
- 运行的进程 --> 终止
- 运行态 --> 等待态:e.g. 因请求I/O 而阻塞;调用wait 等待子进程终止
- 运行态 --> 就绪态:e.g. 分时系统中,时间片用完
- 等待态 --> 就绪态:e.g. 如I/O完成;优先级高于当前运行进程
- 非抢占调度
- 仅在第1、2 种情况下才进行调度
- 一旦把处理器分配给某进程,就让他一直执行,直到它完成或因等待某事件而阻塞
- 特点:实现简单,系统开销小,无需特别硬件支持
- 适用大多数批处理系统
- 可抢占调度
- 发生在调度时机的各种情况
- 特点:避免一个进程独占处理器时间过长–>可能对所有进程提供较好服务,系统开销增加,对协作进程并发执行有影响
3. 调度算法的性能评价准则
- 准则
- CPU使用率(CPU utilization)
- 吞吐量(throughput):单位时间内完成的作业数
- 周转时间(turnaround time):作业/进程从提交到完成的时间间隔,T(执行完)- T(进入系统)
- 等待进入主存,在就绪队列中等待CPU,在CPU上运行,执行I/O操作等
- 平均周转时间
- 带权周转时间 = 周转时间 / 实际服务时间
- 平均带权周转时间
- 等待时间(waiting time):在就绪队列中等待所花时间的总和,受到调度算法的影响
- 响应时间(response time):对于一个交互式进程,从用户提出请求,到系统开始输出响应
- 最优化准则:CPU使用率— 最大化、吞吐量— 最大化、周转时间— 最小化、等待时间— 最小化、响应时间— 最小化
- 评价
- 批处理系统周转时间很重要
- 分时系统响应时间短很重要
4. 调度算法
- 先来先服务调度FCFS
- 先到先服务按到达持续先后调度
- 对长进程有优势,利于多处理器处理的进程,不利于多I/O 处理的进程
- 最短作业优先调度SJF
- 在就绪队列中选择下一个CPU区间最短的进程
- 非抢占和可抢占
- 需要知道或者估计进程会执行多长时间,可能会是长进程产生饥饿,不适合在实时系统中使用
- 优先级调度
- 每个进程和一个优先权关联,把CPU分配给就绪队列中优先权最高的进程,具有相同优先权则顺序
- 非抢占:主要用于批处理
- 可抢占:实时、分时、批处理
- 优先权与优先数 / 优先权的值没有绝对固定关系
- 可以通过老化(等待时间越长,优先权增加)解决饥饿问题
- 轮转法调度RR
- 每个进程每次只能运行一个很小的时间单位
- 问题:若时间片短则响应快,但开销大太长;若时间片长则退化成变成FCFS
- 在通用分时系统和事务系统中有效
- 高响应比优先调度算法HRRN
- 响应比 = (A + B) / B
- A:等待处理器的时间
- B:期望服务的时间
- 多级队列调度
- 把就绪队列划分为2个或多个独立的队列
- 划分依据:进程的性质或类型
- 一进程固定属于某个队列
- 每个队列有各自的调度算法
- 多级反馈队列调度
- 进程可以在多个队列之间移动
- 进程CPU区间特点->处于哪个队列
- 使用CPU多->进入优先权较低的队列
- I/O约束、交互式:高优队列
- 老化(aging):在低优队列等待过久 -> 进入优先权较高的队列
第六章
1. 基本概念
- 竞争条件:两个或两个以上的进程共享数据,而最终的执行结果则是根据执行次序而决定的,这种情况成为竞争条件(解决方法:控制对共享资源的访问)
- 临界资源:多个进程可同时读写共享的数据,一段时间内只允许一个进程访问的资源
- 临界区:每个进程中访问临界资源的那段代码,当一个进程在临界区内执行时,不允许其他进程在临界区执行
- 信号量:两个或者多个进程可以用信号的方法进行协作。进程可以在任何地方停下来以等待收到特定的信号,这种信号的实现叫做信号量
- 忙等待:持续检测一个变量知道它具有某一特定值
- 互斥:如果有程序在临界区中执行,那么其他进程都不能在临界区中执行。这样可以避免竞争条件的发生
2. 同步机制应当遵循准则
- 互斥(mutual exclusion) / 忙则等待
- 前进(progress) / 有空让进
- 有限等待(bounded waiting):从一个进程提出进入临界段的请求到被满足,其他进程进入临界段的次数有限
- 让权等待:不在就绪队列而在等待队列
3. 进程间的制约关系
- 间接制约(如:都等一个信号量)
- 共享某一公有资源的并发进程,在临界区内不允许交叉执行
- 由于访问共享公有资源,造成了对并发进程执行速度的间接制约
- 受到间接制约的各并发进程执行临界区的顺序是任意的
- 直接制约(如:P2必须得等P1释放信号量才可执行)
- 一组在异步环境下的并发进程,各自的执行结果互为对方的执行条件,从而限制了各进程的执行速度,这称作并发进程间的直接制约
4. 互斥问题
- 死锁:两个或者多个进程无限期等待一个事件的发生,而这个事件只能由这些等待的进程之一来实现。
- 饥饿:无限期阻塞
5. 准则
- 实现方法:硬件、信号量(软件方法不要求)
- 硬件互斥:系统提供了特殊硬件指令允许原子地检查和修改字的内容或者交换两个字
- 信号量:两个或者多个进程可以用信号的方法进行协作,进程可以在任何时候停下来等待收到特定的信号
6. 信号量
- 记录型信号量:用于发信号的特殊变量,是一个整数值;通过信号量接收信号和发送信号
- 公用信号量与私有信号量(非全部并发进程)
- 强信号量(等待队列按FIFO顺序出队)与弱信号量(没有规定出队顺序)
- 计数信号量:值不受限制
- 二进制信号量 / 二值信号量:值只能为0或1
7. 生产者与消费者
- 保持同步,消费者不能取空消息,生产者不能放入有消息的地方
sem n = 0; // 用于表示缓冲区不为空=1
sem s = 1; //用于缓冲区无人操作
sem e = N; //缓冲区当前剩余长度
void producer()
{
While(1)
{
Produce();
Wait(e);
Wait(s);
Append();
Signal(s);
Signal(n);
}
}
void consumer()
{
While(1)
{
Wait(n);
Wait(s);
Take();
Signal(s);
Signal(e);
Consume();
}
}
8. 管程
- 一个软件模块,高级语言提供的同步机制
- 特性
- 对局部变量的访问只能通过该管程的过程,不能通过其他过程
- 一进程只能通过调用管程的过程进入管程
- 每次只能有一个进程在管程中执行——互斥
- 条件变量(condition variables)
- 管程内部的一种特殊数据类型
- 管程通过使用条件变量支持同步
- 只能在管程内部访问
- 对条件变量的操作
- wait( ):调用wait操作的进程暂停(在管程内),直到有其他进程对该条件变量执行signal()
- signal( ):如果有暂停的进程, 则重新启动一个暂停的进程;否则,signal操作不产生任何效果
- 与信号量的PV操作区别:管程中的wait一定会停止,而信号量中wait需要根据信号量值进行判断
第七章
1. 死锁
- 定义:指多个进程因竞争资源而造成的一种僵局, 若无外力作用, 这些进程将永远不能再向前推进
- 产生原因:资源不足导致的资源竞争,进程推进顺序不合理
- 4 个必要条件
- 互斥条件:一次只能有一个进程使用
- 占有并等待条件 / 请求和保持:一个进程在申请其他进程占据的资源,同时保持着自己已经获得的资源
- 非抢占(非剥夺)条件:资源不可被抢占,仅当使用资源的进程完成任务后,才自愿释放
- 循环等待(环路等待)条件:在发生死锁时,必然存在一个进程-资源的环形链
- 注意:如果没有环,那么一定没有死锁;有环不一定死锁
2. 资源分配图(有向图)
- 进程用圆形表示,资源用方形表示
- 申请边:进程指向资源
- 分配边:资源指向进程
- 需求边:将来要申请的资源,用虚线表示
3. 资源的分类
- 可重用资源:只有一个,不会由于使用而耗尽
- 可消费资源:数量不限,可以创建/生产并且可以销毁/消费的资源,使用后则不存在
- 可剥夺性资源:如处理器、主存
- 非可剥夺性资源:如磁带机、打印机、刻录机
4. 死锁处理方法
- 通过破坏死锁的四个必要条件中的一个或多个条件,保证不会发生死锁
- 确保系统不进入死锁
- 预防死锁
- 预防第二个产生死锁的条件
- 直接预防:预防第四个产生死锁的条件(适用条件:资源的状态可很容易地保存和恢复)
- 间接预防:预防前三个产生死锁的条件
- 预防互斥——不可取!
- 避免死锁
- 不需要事先采取限制措施破坏死锁的必要条件
- 在资源的动态分配过程中,采用某种策略防止系统进入不安全状态,从而避免发生死锁
- 如果满足一个进程新提出的一项资源请求有可能导致死锁,那么拒绝分配资源给这个进程
- 死锁的避免是允许前三个条件的发生,但不允许后用一种机制来防止到达死锁的状态
- 银行家算法
- 允许系统进入死锁
- 进行检测
- 恢复
- 进程终止
- 资源剥夺
- 假定系统不会进入死锁(不理会)
- 鸵鸟算法
- 预防死锁
第八章
1. 基本概念
- 符号地址:在源程序中,程序员使用符号名作为地址
- 名空间:由符号地址形成的空间
- 逻辑地址 / 虚地址:CPU 生成的地址;通常,一个应用程序(源程序)经过编译、链接后形成可装入程序,地址从0开始,程序中的其他地址都是相对于起始地址计算的
- 逻辑地址空间:由逻辑地址所形成的地址范围
- 物理地址空间:由内存中的一系列单元所限定的地址范围
- 物理地址 / 绝对地址:内存单元的地址
- 地址重定位 / 地址绑定:逻辑地址向物理地址转换的过程就是重定位
- 编译时刻
- 编译时刻已知道进程将驻留在内存的具体位置
- 绝对代码
- 加载时刻
- 编译时刻不知道进程将驻留在内存的具体位置,编译程序生成可重定位代码
- 加载时进行地址绑定
- 运行时刻
- 运行时刻动态绑定,进程可以在内存移动
- 需要硬件支持——内存管理部件(MMU)
- 编译时刻
2. 存储器管理程序的功能
- 内存的分配与回收
- 地址映射:逻辑地址 -> 物理地址
- 存储保护
- 存储共享
- “扩充”内存容量:借助虚拟存储技术,逻辑上增加进程运行空间的大小
3. 连续内存分配
- 每个活动进程在内存中占有一段连续区域
- 分配方式
- 单一连续分配(仅适合单道)
- 分区式分配
- 固定分区:把存储器分为若干大小相等的区(因调入数据小于分区而产生的分区空间浪费,叫做内部碎片)
- 可变分区:当一个进程装入时, 按它的实际需要分配空间(一开始运行的很好,但是经过一段时间后,会出现外部碎片)
- BUDDY 是两者的结合
- 紧缩(亦称作“ 紧凑” 、“ 移动”)
- 要求系统支持运行时刻动态重定位
- 碎片(内碎片,外碎片),怎么产生,如何解决?
- 因为调入数据小于分区而产生分区空间的浪费,成为内部碎片
- 在分区之外的碎片,成为外部碎片
- 内存紧缩解决
- 分配算法
- 首次适配(First-fit):从头扫描内存并选择第一个足够大的可用块
- 最佳适配(Best-fit):选择最小的足够大的可用块(空间小到大排)
- 最差适配(Worst-fit):选择最大的可用块(空间大到小排)
- 邻近适配(Next-fit):从上一次放置的地方开始扫描,并选择最近的足够大的可用块
4. 离散式分配
- 将一个进程直接分配到许多不相邻的分区,不必再进行压缩
- 页式管理
-> 物理上,把主存分为定长的块,称为页框/块/帧
-> 逻辑上,把用户进程也分为与主存大小相等的块,称为页/页面(页的大小等于块的大小,一般为512/1K/2K/4K/8K)
-> 逻辑地址是连续的,但物理地址不一定
-> 逻辑地址(m位)由页号(m - n位)和页内地址偏移(n位)组成
-> 内部碎片只在进程的最后一页产生,没有外部碎片(产生的碎片小,共享和保护不容易实现)
-> MMU 内存管理单元根据页表将虚拟地址转化为物理地址(动态重定位)
-> 页表用于显示进程中每个页在主存的哪个页框中
-> 页表寄存器PTR 用于存放页表在内存中的起始地址和长度
-> TLB:是一种硬件缓冲器,用于保存一部分页表项,便于快速寻址
----> 有效访问时间:tEAT = (e + t) a + (e + 2 * t)(1 – a)
----> 其中,t: 访问内存的时间,e: 访问TLB的时间,a: TLB命中率(hit ratio)
-> 多级页表——两级页表
----> 页表本身也分页,离散地分布在内存中
----> 内层页表 / 页表:每个表项指向进程的一页
----> 外层页表:每个表项指向内层页表的一页
-> 优势
----> 页的大小固定, 分页对程序员透明->实现简单
----> 没有外碎片, 主存利用充分 - 段式管理
-> 产生原因:提高内存利用率,满足程序员/用户在编程和使用上的要求
-> 逻辑地址:<段名 / 段号,段内偏移量>
-> 段表
----> 为进程的每个段分配一个连续空间
----> 各段之间不可连续
----> 为每个进程建立一张段表
-> 不同段的长度不同,段的长度可以在运行中进行改变
-> 产生的碎片浪费存储空间,共享和保护容易实现
-> 优势
----> 分段对程序员是可见->逻辑意义明确
----> 方便共享和保护
----> 能处理动态增长的数据结构 - 段页式管理
-> 将用户的地址空间分段,段内按内存页框的大小分页
-> 虚拟地址按段号,段内页号,和页内位移三部分组成
-> 优势
----> 程序员把逻辑地址空间划分为若干段
----> 系统再把每段划分为若干大小固定的页
----> 每个进程一个段表
----> 每个段有一个页表
-> 段表项:段的页表的起始地址
5. 覆盖与交换
- 覆盖:在任何时候,都只能在内存中保留所需要的指令,新的指令可以覆盖不要的指令和数据。不需要操作系统的特别支持。
- 交换:在内存不足的情况下,需要把一个进程整个换入和换出(进程分配固定的交换空间)
第九章
1. 虚拟存储器
- 概念
- 在一个新进程那个投入运行之前,OS 只把开始时需要的几页/段装入内存,进程启动运行,其余部分留在磁盘上
- 进程运行时,如果欲取的指令或要访问的数据已在内存,则继续执行
- 如果不在内存(缺页/段)OS 负责把所需的页/段调入内存,然后进程继续执行——请求调入
- 如果内存已满,OS 选择内存中暂时不用的页/段,调出到磁盘上;腾出内存空间后,再调入需要的页 / 段——置换功能。
- 原理
- 允许仅把进程的一部分装入内存就可运行进程
- 具有请求调入和置换功能
- 从逻辑上扩充内存容量(用户看到的):容量巨大的存储器——虚拟
- 使用户逻辑存储器与物理存储器分离
- 虚拟存储技术与交换技术的区别
- 交换:以进程为单位
- 虚拟存储:以段 / 页为单位
- 实现方式
- 页式虚拟存储系统:分页 + 请求调页 + 页面置换
- 段式虚拟存储系统:分段 + 请求调段 + 分段置换
- 段页式虚拟存储系统:段页式 + 请求调页 + 页面置换
- 理论基础——局部性原理
- 在一段时间内,程序的执行仅限于某个部分,所访问的存储空间也局限于某个区域
- 虚拟存储器的特征
- 离散性:内存的分配方式
- 多次性:进程执行时不必全部装入内存–>进程被分成多次调入内存
- 对换性
- 在进程执行过程中,暂时不需要的代码和数据被换出,换入需要的部分
- 进程的换入换出
- 虚拟性:从逻辑上扩充内存容量–>用户看到的
- 请求页式管理
- 基本原理
- 仅当需要一页时,才把该页调入内存
- 调页程序 / 页面调度程序
- 只调入需要的页,进程装入需要I/O 量减少,进程需要的内存空间减少,存可以容纳更多用户进程
- 页表
- 每个进程都有自己的页表
- 包括存在位 / 有效-无效位、页框号、修改位/脏位、该页在辅存的地址、存取权限位等
- 缺页 / 页故障 / 页错误:进程执行时,要访问页不在内存
- 缺页中断
- OS 响应缺页中断,把所需页面调入内存
- 与普通中断的区别:普通中断是指在CPU执行一条指令时检查是否有中断请求,一条指令执行期间可能产生多次缺页中断,且引起缺页中断的指令会被重新执行
- 发生时机:在指令执行期间产生中断信号,并被处理
- 处理过程:引起缺页中断的指令被重新执行
- 页面置换的缺页处理基本流程
- 查找所需页面在磁盘上的位置
- 找到一个空闲页框
如果没有- 应用页面置换算法选择一个“牺牲”页框
- 如果“牺牲”页框中的页被修改过,把它写回磁盘
- 更新页表和页框表
- 将所需页面读入空闲页框,更新页表和页框表
- 重启进程(导致缺页的指令)
- 置换策略(OPT 、FIFO、LRU):计算缺页次数、缺页中断率、判别是否有Belady 异常
- FIFO:先进先出算法,按顺序轮转淘汰
- OPT:理论最佳算法,置换将来最长时间不使用的页面
- LRU:最近最少使用,置换已经很久不使用的页面
- Belady异常
-> 随着分配帧数的增加,缺页错误率可能会增加
-> FIFO会出现,OPT和LRU不会
- 页面大小要求
- 对于单进程,越多越好(快)
- 对于系统,越少越好(并发)
- 页框分配算法
- 平均分配
- 按比例分配(根据进程大小按比例分配)
- 考虑优先级的分配算法
- 置换方法
- 局部置换:进程发生缺页,仅在分配给自己的页框范围内选择并置换
- 全局置换
- 进程发生缺页,在全部页框范围内选择并置换
- 剥夺其他进程的页框
- 存储的共享与保护方法:存储区域保护和存储方式保护
- TLB(快表)
- 传输后备缓冲器是一个内存管理单元
- 作用:用于改进虚拟地址到物理地址转换速度的缓存
- 页式地址 = 页面其实地址 + 页内偏移地址
- 基本原理
2. 请求段式管理
- 原理:请求分段系统是在分段系统的基础上,增加了请求调段及分段置换功能后形成的,以分段作为换入、换出的单位
3. 什么是颠簸(抖动)?为什么会出现?
- 进程不断的缺页、调页,几乎不能完成有效工作:分配给进程的页框数 < 进程当前运行需要的页面数
- 产生原因:CPU 利用率低 --> 增加多道程序度 --> 每个进程的页框数更少 --> 缺页次数更多 --> CPU 利用率更低
- 防止颠簸
- 采用局部置换策略
- 挂起某些进程
- 应用工作集理论防止颠簸
- 控制缺页率
第十章
1. 基本概念
- 文件:OS对存储设备的物理属性加以抽象,从而定义逻辑存储单位;一组相关的记录的集合
- 文件属性:名字、标识符(文件系统内部唯一的标识,通常为数字)、类型、位置、大小、保护、时间和日期、用户标识等
- 目录
- 文件属性的集合,本身也是文件
- 目录结构
- 单级目录
-> 最简单的目录结构形式
-> 整个目录是一个FCB,以文件名为关键字的顺序文件
-> 不允许重名
-> 在早期单用户系统中使用,无法满足用户系统的需求
- 两级目录
-> 系统——主文件目录(MFD, master file directory)
-> 每个用户——用户文件目录(UFD, user file directory)
-> MFD包含各UFD的表项(地址和访问控制信息)
-> 每个用户的UFD包含该用户所有文件的FCB
-> 提高了目录搜索效率
-> 属于一个用户的文件不能重名
- 树形目录(层次目录)
-> 解决了重名问题
-> 有利于文件分类
-> 提高了检索文件速度
-> 能够进行存取权限控制
- 无环图目录
-> 实现文件和目录的共享
-> 实现方法
----> 符号链接:一个目录项 -> 另一个目录项
----> 硬链接:不同的目录项指向同一个文件属性结构 (如i-node)
-> 新的目录项类型——链接(link)
- 记录:一组相关的域的集合,用于描述一个对象某方面的属性
- 域/字段:
- 基本数据元素
- 一个域包含一个值
- 描述一个域:数据类型、长度
- 域的长度:固定的,可变的
- 文件系统/文件管理系统
- 操作系统的一部分;最可见的部分
- 目的
- OS 中负责操纵和管理文件的一整套设施
- 方便用户“按名存取”
- 实现文件的共享和保护
- 为用户提供管理各种文件的方法
- 存取方便、格式统一、安全可靠
- 功能
- 文件管理——创建、删除、打开、关闭、读、写、执行
- 目录管理
- 文件存储空间管理
- 文件的共享和保护
- 提供方便的接口
- 文件分类
- 按用途
系统文件, 用户文件, 库文件 - 按保护方式(存取控制属性)
只读文件, 读写文件, 只执行文件 - 按信息流向
输入文件, 输出文件, 输出输入文件 - 按存放时限
临时文件, 永久文件, 档案文件 - 按介质类型
磁盘文件, 磁带文件, 软盘文件, 卡片文件, 打印文件 - 按文件的逻辑结构
有结构文件/记录式文件, 无结构文件/流式文件 - UNIX类OS的文件分类
普通文件、目录文件、特殊文件等
- 按用途
- 文件控制块(FCB)
- 用于描述和控制文件的数据结构,包括了文件名和文件的各种属性
- 文件控制块与文件一一对应
- 文件目录 / 目录
- 文件控制块的有序集合
- 一个文件控制块就是一个文件目录项
- 一个文件目录也被看作是一个文件,称为目录文件
- UNIX的索引结点 / i-node
- 引入索引节点的原因:在进行目录检索时,需要把目录信息全部读入主存,但只用文件名进行匹配,其他信息并未使用
- UNIX的做法:把目录中的文件名和其他管理信息分开,将其他管理信息单独组织成一个定长的数据结构,称为索引节点(i-node)
- 索引节点存放在文件存储器的索引节点表中
- UNIX的文件目录项:文件名,i-no
- 把文件目录和索引节点分开的好处
- 加快目录检索速度,便于实现文件共享
- 有利于系统的控制和管理
2. 文件的组织结构
- 文件的逻辑结构 / 文件组织
- 文件中记录的组织结构
- 由用户访问记录的方式决定
- 从用户观点出发观察到的文件组织形式,用户可以直接处理的数据和结构,独立于物理特性
- 文件的物理结构 / 存储结构
- 文件在辅存上的存储组织方式
- 与存储介质的存储性能有关
- 依赖于组块策略、文件分配策略
- 文件逻辑结构设计原则:易于操作、查找快捷、修改方便、空间紧凑
- 有结构文件/记录文件
-> 用户对文件内的信息按逻辑上独立的含义再划分信息单位——记录
-> 由一个以上的记录构成
----> 定长记录
----> 变长记录:域的数目不同,域的长度不定
-> 组织方式
----> 顺序文件
----> 索引文件
----> 索引顺序文件
----> 散列文件 - 无结构文件 / 流式文件
-> 用户对文件内的信息不再划分可独立的单位
-> 整个文件由一串顺序的字符流组成
-> 在UNIX系统,所有的文件都被看作流式文件;即使是有结构文件, 也被视为流式文件;系统不对文件进行格式处理
3. 文件的存取方法
- 访问文件中信息的方式
- 典型的存取方式
- 顺序存取:一个记录接着一个记录
- 直接存取 / 随机存取
-> 文件由定长的逻辑记录组成
-> 程序可以按任意次序访问记录
-> 基于随机存取设备 - 索引存取
-> 文件存取控制矩阵与文件存取控制表
4. 加快目录检索方法
- 目录项分解
-> 把文件名与文件属性信息分离
-> 目录只保存文件的名字和文件的内部标识 - 设置当前目录 / 工作目录
- 使用相对路径名
- 打开文件(文件的属性信息- > 内存)
第十一章
1. 文件系统的层次结构
- I/O 控制
- 组成
- 设备驱动程序
- 中断处理程序
- 任务
- 内存<–>磁盘
- 组成
- 基本文件系统
- 向设备驱动程序发命令
- 文件组织模块
- 掌握关于文件及其逻辑记录和物理块的信息
- 文件的分配和位置
- 逻辑记录<–>物理块
- 磁盘空闲空间管理
- 逻辑文件系统
- 管理关于文件系统结构的信息——元数据
- 目录
- 文件控制块(FCB)
- 负责文件的保护和安全
- 管理关于文件系统结构的信息——元数据
2. 文件系统实现
- 在磁盘上的结构
- 引导控制块
- 引导块(UFS —UNIX文件系统)
- 分区引导扇区(NTFS)
- 分区控制块
- 超级块(UFS) / 主控文件表(NTFS)
- 目录
- FCB , i节点(UFS)
- 引导控制块
- 实现文件系统需要的结构——在内存的结构
- 内存分区表
- 内存目录结构
- 系统范围的打开文件表
- 单个进程的打开文件表
- 目的:通过缓冲提高速度
3. 文件分配方法
- 连续分配
-> 原理:每个文件占据磁盘上一组连续的物理块
-> 优点
----> 实现简单,只需记录起始位置(块号)和长度(块数)
----> 支持顺序访问和随机访问
-> 缺点
----> 难以预知文件的大小
----> 文件扩展困难
----> 空间浪费(碎片) - 链接分配
-> 文件——磁盘物理块的链表
-> 原理
----> 一个文件的物理块可以分布在整个磁盘
----> 目录项记录起始块号和终止块号
----> 每个物理块中包含指向下一块的指针——块号
----> 仅供系统使用
-> 优点
----> 解决了连续分配的全部问题
----> 没有空间浪费
----> 不需要事先知道文件大小
----> 文件大小可以增长
----> 适合顺序访问
-> 缺点
----> 不能有效支持随机访问
----> 下一块指针占用物理块空间
----> 可靠性不高 - 索引分配
-> 原理
----> 把所有块指针一起放到一个位置——索引块
----> 每个文件有自己的索引块- 索引块——磁盘块地址的数组
- 索引块第i个条目——文件第i 个物理块的块号
- 文件目录项包括索引块的地址(块号)
-> 优点
----> 支持随机访问
----> 没有外碎片
----> 充分利用磁盘空间
-> 缺点:索引块中空间的浪费
- 索引块大小
- 链接索引
- 一个索引块——一个磁盘块
- 大文件——多个索引块链接起来
- 多层索引
- 目录项 -> 一级索引 -> 二级索引 -> 数据块
- 目录项 -> 一级索引 -> 二级索引 -> 数据块
- 组合方案—UNIX文件系统的多重索引分配
- 链接索引
4. 磁盘存储空间管理方法
- 位向量 / 位图
- 使用一个向量表示磁盘的分配情况
- 向量的每一位对应一块
- 0-已分配
- 1-可用
- 向量的长度取决于辅存的容量
- 空闲盘块链
- 实际的空闲块——内容是空的
- 特殊的空闲块——保存n个自由块的地址
- 前n-1个块是实际的空闲块,最后一个又是特殊的空闲块
- 空闲盘区链(/ 链式自由区 / 计数)
- 号栈/专用块
- 连续的n个空闲块——空闲区
- 把所有空闲区链接在一起
- 系统只保持开始空闲区的指针和长度
- 成组块链接法
第十二章
1. 磁盘组织结构
- 磁道t:磁盘片的表面被逻辑地划分成圆形磁道
- 扇区s:磁道再进一步划分为扇区
- 柱面c:位于同一磁臂位置的磁道集合形成了柱面
2. 一次磁盘存取操作的时间组成
- 访问时间:Ta = Tseek(寻道时间)+ Trd(旋转延迟时间)+ Ttransfer(传输时间)
- 寻道时间:移动磁臂使磁头从当前位置到达指定磁道上所经历的时间
- 旋转延迟时间:指定扇区移动到磁头下面所经历的时间;Trd = 1 / (2r),r为磁盘转速(转/s)
- 传输时间:把数据从磁盘读出,或向磁盘写入所经历的时间;Transfer = b / (rN),b为欲读写的字节数,N为一条磁道上的字节数
3. 扇区的交叉(交错)布局
- 交叉因子 / 交错系数
4. 磁盘调度算法
- 先进先出FIFO/先进先出(FCFS)
- 按请求顺序处理请求队列中的项目
- 公平、简单,性能不佳
- 最短寻道时间有限(SSTF)
- 总是选择与当前磁道距离最近的请求
- 不能保证多个请求的平均寻道时间最短
- SCAN算法
- 沿磁臂的移动方向扫描,选择离当前磁道最近的请求
- 磁头到达此方向最后一个磁道后,倒转方向反向扫描
- C-SCAN 算法
- 只进行一个方向的扫描
- 当到达最后一个磁道后,磁头迅速返回另一端,重新开始扫描
- 电梯算法 / LOOK
- 与SCAN算法的区别:不一定扫到尾;在满足一个方向上的最后一个请求以后,不再继续前进,而是立即改变方向
- C-LOOK
- 与C-SCAN算法的区别:在满足一个方向上的最后一个请求以后,不再继续前进,而是立即改变方向,直接到达另一端的第一个请求
第十三章
1. 什么是缓冲?为什么要引入缓冲?
- 缓冲是用来保存两个设备之间或在设备和应用程序之间所传输数据的内存区域
- 理由
- 处理数据流的生产者与消费者之间的速度差异
- 协调传输数据大小不一致的设备
- 支持应用程序I/O的复制语义
- 缓冲方案
- 单缓冲
- 双缓冲
- 循环缓冲
2. I/O系统的控制方式
- 轮询(poll) / 程序控制I/O(相当于每天去问来信)
- 忙等待
- 中断驱动I/O(相当于来信后有人送来)
- 发出I/O命令
- 处理器继续执行指令
- I/O完成时,I/O模块向处理器发出中断->CPU响应异步事件
- 直接存储器存取(DMA)
- DMA模块控制主存与I/O设备之间的数据交换
- 整块数据传输结束后中断处理器
- I/O通道(I/O channel)
- 独立于CPU、专门管理I/O的处理器
- 完成主存与外设之间的信息传输,以及与CPU并行地执行操作
3. 设备的分类
- 按传输速度
- 低速设备
- 中速设备
- 高速设备
- 按信息交换的单位
- 块设备
- 字符设备
- 按设备的共享性分类
- 独占设备:在一段时间内只允许一个进程或线程访问
- 共享设备
- 在一段时间内允许多个进程或线程同时访问
- 对于每一时刻仍只允许一个进程或线程访问
- 通常是可寻址、可随机访问的设备
- 虚拟设备:通过虚拟技术把一台独占设备变换为若干台逻辑设备,供若干个用户(进程)同时使用,经过虚拟技术处理的设备,称为虚拟设备。
4. 阻塞和非阻塞I/O
- 阻塞I/O
- 进程发出阻塞的I/O系统调用后,被阻塞,直到I/O完成
- 易于理解
- 无法满足某些需要
- 非阻塞I/O
- 例:一边计算/显示,一边检查严查是否有输入;视频文件的播放:读,解压,显示
- 方法
- 多线程
- 非阻塞的I/O系统调
- 异步系统调用
5. Spooling系统
- 采用Spooling 技术后,每个作业都感到各自拥有独占使用的设备
- Spooling 技术(假脱机操作)
- 将一台独占设备改造成若干台逻辑设备,供若干个用户同时使用(像共享设备一样)
- 经过这种技术处理后的设备成为虚拟设备
- 输入井与输出井
- 系统在辅存开辟的用作缓冲的存储区域,存放从输入设备输入的信息和作业的执行结果(输出)
- 输入缓冲区和输出缓冲区
- 位于主存
- 输入设备 -> 输入缓冲区 -> 输入井
- 输出井 -> 输出缓冲区 -> 输出设备
- 输入进程和输出进程
6. 设备独立性(无关性)的含义
- 应用程序独立于具体使用的物理设备
- 逻辑设备:在应用程序中,用逻辑设备名称来请求使用某类设备
- 物理设备:系统实际执行时,用物理设备名称
- 系统完成逻辑设备名 --> 物理设备名
- 独占设备分配方法
- 设备的绝对号
- 用户申请设备不用绝对号,应当指明设备类
- 用户申请多个同类设备
- “设备类,相对号”