第一章 操作系统引论
1.1 操作系统的基本概念
概念
基础,没啥说的
特征
基本特征: 并发、共享、虚拟、异步
1.并发concurrence
-
区别并行和并发
-
并行性是指两个或多个事件在同一时刻发生→宏观并行,微观并行
-
并发性是指两个或多个事件在同一时间间隔内发生→宏观并行,微观串行
- 并发是进程宏观一起运行,微观上交替运行,而并行是指同时运行
-
引入进程
-
进程是指在系统中能独立运行并作为资源分配的基本单位,它是由一组机器指令,数据和堆栈等组成的,是一个能独立运行的活动实体
2.共享sharing
- 1.互斥共享方式
- 2.同时访问方式
- 并发和共享是多用户(多任务)OS的两个最基本的特征。它们又是互为存在的条件
3.虚拟virtual
- 时分复用技术
- 空分复用技术
4.异步asynchronism
目标
- 方便性
- 有效性
- 提高系统资源利用率
- 提高系统吞吐量
- 可扩充性
- 开放性
功能
-
管理功能
-
1.处理机管理功能
进程控制、进程同步、进程通信、调度(作业调度、进程调度)
2.存储器管理功能
- 内存分配:静态分配、动态分配
- 内存保护
- 地址映射
- 内存扩充
3.设备管理功能
- 缓冲管理
- 设备分配
- 设备处理:设备处理程序又称设备驱动程序
4.文件管理功能
- 文件存储空间的管理
- 目录管理
- 文件的读写管理和保护
-
-
接口功能
- 命令接口
- 程序接口
-
操作系统用作扩充机器
-
封装思想
1.2 操作系统的发展与分类
手工操作阶段
-
人工操作方式
-
用户独占全机 CPU等待人工操作 严重降低了计算机资源的利用率
-
脱机输入/输出(Off–Line I/O)方式
-
减少了CPU的空闲时间 提高了I/O速度 效率仍然不理想
单道批处理系统
多道批处理系统
- 特点
1.资源利用率高
2.系统吞吐量大
3.平均周转时间长
4.无交互能力
-
(宏观并行,微观串行)
分时系统
- 特征:
1.多路性
2.独立性
3.及时性
4.交互性
实时系统
有优先权的概念。
集群系统–超算~云计算
微机操作系统的发展
1.3 操作系统运行环境
操作系统运行机制
主要注意操作系统至少包括:原语、时钟、中断
中断与异常
这部分注意:
- 中断与异常的区别
- 异常处理完成之后的步骤:终止(除0)、返回当前指令(缺页)、返回之后指令(陷入指令)
- 异常为不可屏蔽中断
用户态和内核态
psw:state字段,为1表示内核态,为0表示用户态
特权指令和非特权指令
- 特权指令:开关中断,i/o,写时钟,写psw
- 非特权指令:其他
1.4 大内核和微内核
1.5 虚拟机
主要是计算机启动过程,这部分在后面文件那里也有的
-
计算机通电
-
读取ROM中固定地址,跳转到bios
-
bios进行硬件自检
-
根据在bios中设定的启动顺序,找到第一个硬盘
-
计算机读取该设备的第一个扇区,也就是读取最前面的512个字节(MBR)
主引导记录由三个部分组成:
(1) 第1-446字节:调用操作系统的机器码。
(2) 第447-510字节:分区表(Partition table)。
(3) 第511-512字节:主引导记录签名(0x55和0xAA)。 -
根据MBR找到活动分区(安装有操作系统的分区,我们常用的C盘)中的VBR(卷引导记录)
-
对应分区VBR中的操作系统引导程序调入内存执行
参考文档
第二章 进程管理
2.1 进程的描述与控制
进程概念与特征
进程的定义
- 进程是程序的一次执行
- 进程是一个程序及其数据在处理机上顺序执行时所发生的活动
- 进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位
进程的特征
- 动态性
- 并发性
- 独立性
- 异步性
从操作系统角度分类
- 系统进程
- 用户进程
进程和程序的区别
- 进程是动态概念,而程序则是静态概念
- 程序是指令的有序集合,永远存在;进程强调是程序在数据集上的一次执行,有创建有撤销,存在是暂时的;
- 进程具有并发性,而程序没有
- 进程可创建其他进程,而程序并不能形成新的程序
- 进程是竞争计算机资源的基本单位,程序不是
进程和程序的联系
- 进程是程序在数据集上的一次执行
- 程序是构成进程的组成部分,一个程序可对应多个进程,一个进程可包括多个程序
- 进程的运行目标是执行所对应的程序
- 从静态看,进程由程序、数据和进程控制块(PCB)组成
进程的基本状态及转换
- 进程的三种基本状态
- 就绪状态ready
- 执行状态running
- 阻塞状态block
- 三种基本状态的转换
- 创建状态和终止状态
- 五状态进程模型
- 注意
- 阻塞态->运行态和就绪态->阻塞态这二种状态转换不可能发生
挂起操作和进程状态的转换
- 挂起和阻塞的区别
- 挂起操作的目的
- 终端用户的需要: 修改、检查进程
- 父进程的需要:修改、协调子进程
- 对换的需要:缓和内存
- 负荷调节的需要:保证实时任务的执行
- 关键图
进程管理中的数据结构
- 进程控制块PCB的作用
- 作为独立运行基本单位的标志
- 能实现间断性运行方式
- 提供进程管理所需要的信息
- 提供进程调度所需要的信息
- 实现与其他进程的同步与通信
- 进程控制块的信息
- 进程标识符
- 外部标识符PID
- 内部标识符(端口)
- 处理机状态
- 通用寄存器
- 指令计数器
- 程序状态字PSW
- 用户栈指针
- 进程调度信息
- 进程状态
- 进程优先级
- 进程调度所需的其他信息
- 事件
- 进程控制信息
- 程序和数据的地址
- 进程同步和通信机制
- 资源清单
- 链接指针
- 进程控制块的组织方式
- 线性方式
- 链接方式
- 索引方式
- 进程标识符
进程控制
操作系统内核
- 两大功能
- 支撑功能
- 中断管理
- 时钟管理
- 原语操作
- 进程的管理,由若干原语(primitive)来执行
- 资源管理功能
- 进程管理
- 存储器管理
- 设备管理
- 支撑功能
- 状态
- 系统态,管态,内核态
- 用户态,目态
进程的创建
- 进程的层次结构
- 父进程
- 子进程
- 引起创建进程的事件
- 用户登录
- 作业调度
- 提供服务
- 应用请求
- 进程的创建过程
- 1.申请空白PCB
- 2.为新进程分配其运行所需的资源
- 3.初始化进程块PCB
- 4.如果进程就绪队列能够接纳新进程,便将新进程插入就绪队列
- 进程的终止
- 引起进程终止的事件
- 1.正常结束
- 2.异常结束
- 3.外界干预
- 进程的终止过程
- 1.根据被终止进程的标识符
- 引起进程终止的事件
- 进程的阻塞与唤醒
- 引起进程阻塞和唤醒的事件
- 请求系统服务而未满足
- 启动某种操作而阻塞当前进程
- 新数据尚未到达
- 无新工作可做:系统进程
- 进程阻塞过程(自己阻塞自己)
- 进程唤醒过程(系统或其他进程唤醒自己)
- 引起进程阻塞和唤醒的事件
- 进程的挂起与激活
- suspend
- active
进程组织
进程同步
- 基本概念
- 两种形式的制约关系
- 间接相互制约关系
- 互斥——竞争
- 直接相互制约关系
- 同步——协作
- 间接相互制约关系
- 临界资源
- 分区
- 进入区enter section
- 临界区critical section
- 退出区exit section
- 剩余区remainder section
- 同步机制应遵循的规则
- 1.空闲让进
- 2.忙则等待
- 3.有限等待
- 4.让权等待
- 两种形式的制约关系
- 进程同步机制
- 软件同步机制:都没有解决让权等待,而且部分方法还会产生死锁的情况
- 硬件同步机制
- 关中断
- 利用Test-and-Set指令实现互斥
- 利用swap指令实现进程互斥
- 信号量机制
- 整型信号量
- 记录型信号量
- 由于整型信号量没有遵循让权等待原则,记录型允许负数,即阻塞链表
- AND型信号量
- 信号量集
- 理解:AND型号量的wait和signal仅能对信号施以加1或减1操作,意味着每次只能对某类临界资源进行一个单位的申请或释放。当一次需要N个单位时,便要进行N次wait操作,这显然是低效的,甚至会增加死锁的概率。此外,在有些情况下,为确保系统的安全性,当所申请的资源数量低于某一下限值时,还必须进行管制,不予以分配。因此,当进程申请某类临界资源时,在每次分配前,都必须测试资源数量,判断是否大于可分配的下限值,决定是否予以分配
- 操作
- Swait(S1,t1,d1…Sn,tn,dn)
- Ssignal(S1,d1…Sn,dn)
- 特殊情况
- 经典进程的同步问题
- 生产者–消费者问题
- 哲学家进餐问题
- 读者–写者问题
进程通信
进程通信是指进程之间的信息交换,又称低级进程通信
进程通信的类型
- 共享存储器系统
- 基于共享数据结构的通信方式
- 生产者和消费者
- 基于共享存储区的通信方式
- 高级通信
- 基于共享数据结构的通信方式
- 管道通信系统(pipe)
- 高级通信
- 消息传递系统
- 高级通信
- 方式分类
- 直接通信
- 间接通信
- 客服机–服务器系统
消息传递通信的实现方式
- 直接消息传递系统
- 信箱通信
线程的基本概念
线程的引入
- 线程的引入正是为了简化线程间的通信,以小的开销来提高进程内的并发程度
- 多线程并发的不足
- 进程的两个基本属性
- 一个拥有资源的独立单位,可独立分配系统资源
- 一个可独立调度和分派的基本单位,PCB
- 程序并发执行所需付出的时空开销
- 创建进程
- 撤销进程
- 进程切换
- 进程间通信效率低
- 将分配资源和调度两个属性分开
- 进程的两个基本属性
- 线程——作为调度和分派的基本单位
- 进程是系统资源分配的单位,线程是处理器调度的单位
- 线程表示进程的一个控制点,可以执行一系列的指令。通常,和应用程序的一个函数相对应
- 进程分解为线程还可以有效利用多处理器和多核计算机
线程与进程的比较
- 不同点
- 调度的基本单位
- 并发性
- 相似点
- 状态:运行、阻塞、就绪
- 线程具有一定的生命期
- 进程可创建线程,一个线程可创建另一个子线程
- 多个线程并发执行时仍然存在互斥与同步
线程的实现
- 线程的实现方式
- 内核支持线程KST
- 用户级线程ULT
- 组合方式
- 多线程OS中的进程属性
- 进程是一个可拥有资源的基本单位
- 多个线程可并发执行
- 进程已不是可执行的实体
- 线程的状态和线程控制块
- 线程运行的三个状态
- 执行状态
- 就绪状态
- 阻塞状态
- 线程控制块TCB
- 线程运行的三个状态
2.2 处理机调度与死锁
调度的概念
- 调度的基本概念
- 处理机调度是对处理机进行分配,即从就绪队列按照一定的算法(公平、高效)选择一个进程并将处理机分配给他运行,以实现进程并发地执行
- 调度层次
- 作业调度/高级调度
- 内存与辅存之间的调度
- 多道批处理系统大多配有作业调度,而其他系统中通常不需要配置作业调度
- 中继调度/内存调度
- 作用:提高内存利用率和系统吞吐量
- 为此将哪些暂时不能运行的进程调至外存等待,把此时的进程状态称为** 挂起态** ,当它们已具备运行条件且内存稍有空闲时,则重新调入内存,并修改其状态为就绪态,挂在就绪队列上等待
- 进程调度/低级调度
- 是操作系统中最基本的一种调度,进程调度的频率很高,一般十几毫秒一次
- 作业调度/高级调度
- 三级调度的联系
- 作业调度为进程活动做准备,进程调度使进程正常活动起来,中级调度将暂时不能运行的进程挂起,中级调度处于作业调度和进程调度之间
- 作业调度次数少,中级调度次数略多,进程调度频率最高
- 进程调度是最基本的,不可或缺
调度的时机、切换与过程
- 不能进行进程的调度与切换的情况
- 在处理中断的过程中
- 进程在操作系统内核程序临界区中
- 其他需要完全屏蔽中断的原子操作过程中。如加锁、解锁、中断保护现场、恢复等原子操作
- 应该进行进程调度与切换的情况
- 发生引起调度条件且当前进程无法继续运行下去时,可以马上进行调度与切换
- 中断处理结束或自陷处理解除后,返回被中断进程的用户态程序执行现场前,若置上请求调度标志,即可马上进行进程调度与切换
进程调度方式
- 非剥夺调度方式,又称非抢占方式
- 剥夺调度方式
调度的基本准则
- CPU利用率
- 系统吞吐量
- 周转时间
- 周转时间 = 作业完成时间 - 作业提交时间
- 平均周转时间 = (作业1周转时间 + … + 作业n周转时间)/ n
- 带权周转时间 = 作业周转时间 / 作业实际运行时间
- 平均带权周转时间 = (作业1带权周转时间 + … + 作业n带权周转时间)/ n
- 等待时间
- 响应时间
典型的调度算法
- 先来先服务调度算法 FCFS
- 属于不可剥夺算法
- 优缺点
- 算法简单,效率低
- 对长作业有利,对短作业不利
- 有利于CPU繁忙型作业,不利于I/O繁忙型作业
- 短作业优先算法 SJF
- 缺点
- SJF调度算法的平均等待时间、平均周转时间最少
- 长作业周转时间增加
- 不能保证紧迫性作业被即使处理
- 长作业「饥饿」现象
- 缺点
- 优先级调度算法
- 非剥夺式优先级调度算法
- 剥夺式优先级调度算法
- 静态优先级
- 动态优先级
- 进程优先级设置
- 系统进程 > 用户进程
- 交互型进程 > 非交互型进程(或者前台进程 > 后台进程)
- I/O型进程 > 计算性进程
- 高响应比优先调度算法
- ^^响应比 = (等待时间 + 要求服务时间)/ 要求服务时间^^^^ ^^
- 时间片轮转调度算法
- 适用于分时系统
- 时间片的长短通常由下列因素确定:系统响应时间、就绪队列中的进程数目和系统的处理能力
- 多级反馈队列调度算法
- 是时间片轮转调度算法和优先级调度算法的综合和发展
- 优点
- 终端型作业用户:短作业优先
- 短批处理作业用户:周转时间较短
- 长批处理作业用户:经过前面几个队列得到部分执行,不会长期得不到处理
2.3进程同步
进程同步的基本概念
- 临界区 critical section
- 概念:访问临界资源的代码称为临界区
- 临界资源―一次仅允许一个进程使用的资源称为临界资源
- 临界资源的访问过程 ↓
- 进入区
- 临界区
- 退出区
- 剩余区
- 临界资源的访问过程 ↓
do{
entry section; // 进入区
critical section; // 临界区
exit section; // 退出区
remainder section; // 剩余区
} while(true)
- 同步―直接制约关系
- 互斥―间接制约关系
- 为了防止两个进程同时进入临界区,同步机制应该遵循以下原则
- 空闲让进
- 忙则等待
- 有限等待―对请求访问的进程,应保证能在有限时间内进入临界区
- 让权等待―当进程不能进入临界区时,应立即释放处理器,防止进程忙等待
一空闲三等待
实现临界区互斥的基本方法
-
软件实现方法
- 单标志法
- 双标志法先检查
- 双标志法后检查
- Peterson’s Algorithm
-
硬件实现方法(低级方法,元方法)
- 中断屏蔽方法(屏蔽中断,关中断)
- 硬件指令方法
- TestAndSet指令
- Swap指令
- 优点: 适用于任意数目的进程,而不管是单处理机还是多处理机;简单容易检验正确性
- 缺点:进程等待进入临界区时要耗费处理机时间,不能实现让权等待
- 信号量
- 概念:只能被两个标准的原语 wait(S) 和 signal(S) 访问,也可以记作 P操作和V操作
- 整型信号量
- 一个用于表示资源数目的整型量S
wait(S){
while(S <= 0);
S--;0
}
signal(S){
S++;
}
- 记录型信号量
typedef struct{
int value;
struct process *L;
}semaphore;
- 相应的wait(S) 和 signal(S)的操作如下
- wait(S)
void wait(semaphore S){ // 相当于申请资源
S.value--;
if(S.value < 0){
add this process to S.L;
block(S.L);
}
}
- signal(S)
void signal(semaphore S){ // 相当于释放资源
S.value++;
if(S.value <= 0){
remove a process P from S.L;
wakeup(P);
}
}
- 利用信号量实现同步
semaphore S = 0; // 初始化信号量
P1(){
x; // x语句
V(S); // 告诉进程2,语句x已经完成
}
P2(){
P(S); // 检查语句x是否运行完成
y; // 检查无误,运行y语句
}
- 利用信号量实现进程互斥
...
P(S);
critical section
V(S);
...
- 利用信号量实现前驱关系
管程 monitor
- 概念
- 统一管理共享资源的所有访问,实现进程互斥,这个代表共享资源的数据结构,以及由对该共享数据结构实施操作的一组过程所组成的资源管理程序,称为管程
- 组成
- 管程的名称
- 局部于管程内部的共享结构数据说明
- 对该数据结构进行操作的一组过程(或函数)
- 对局部于管程内部的共享数据设置初始值的语句
- 条件变量 condition
- x.wait
- x.signal
注意
管程的互斥由编译器实现
经典同步问题
- 生产者消费者问题:有点像管道通信中的read 和 write
- 读者写者问题
- 哲学者进餐问题
- 吸烟者问题
2.4死锁 Deadlocked
死锁的概念
- 死锁的定义
- 死锁产生的原因
- 系统资源的竞争
- 进程推进顺序非法
- 死锁产生的必要条件
- 互斥条件
- 不剥夺条件
- 请求并保持条件
- 循环等待条件
- ~与「饥饿」的区别
- 进入「饥饿」状态的进程可以只有一个,而因循环等待条件而进入死锁状态的进程却必须大于等于两个
- 处于「饥饿」状态的进程可以是一个就绪进程,如静态优先权调度算法时的低优先权进程,而处于死锁状态的进程必定是阻塞进程
死锁的处理策略
- 死锁约访
- 避免死锁
- 死锁的检测及解除
死锁预防
- 破坏互斥条件
- 破坏不剥夺条件
- 破坏请求并保持条件―预先静态分配方法,一次申请所有资源
- 破坏循环等待条件―顺序资源分配法
死锁避免
- 系统安全状态:并非所有的不安全状态都是死锁状态
- 银行家算法
- 数据结构描述
- 最大需求矩阵Max
- 分配矩阵Alocation
- 需求矩阵Need
- Need = Max - Allocation
- 银行家算法描述
- 数据结构描述
- 安全性算法
- 工作向量Work
- 安全性算法举例(王道书126)
- 银行家算法举例
死锁检测和解除
- 资源分配图
- 死锁定理
- 死锁解除
- 资源剥夺法
- 撤销进程法
- 进程回退法
第三章 内存管理
3.1 内存管理概念
- 内存管理的功能
- 内存空间的分配与回收
- 地址转换
- 内存空间的扩充
- 存储保护
3.1.1内存管理的基本原理和要求
- 程序装入和链接
- 步骤
- 编译
- 链接
- 装入
- 程序的链接方式
- 静态链接
- 装入时动态链接
- 运行时动态链接
- 内存的装入
- 绝对装入
- 可重定位装入
- 动态运行时装入 或 动态重定位
- 步骤
- 逻辑地址空间与物理地址空间
- 相对地址(逻辑地址)
- 地址重定位
- 内存保护
- 设置一对上、下限寄存器
3.1.2 覆盖与交换
3.1.3连续分配管理方式
- 单一连续分配
- 有内部碎片
- 固定分区分配
- 分区大小相等
- 分区大小不等
- 存在两个问题
- 程序过大放不进任何一个分区中
- 主存利用率低,称为内部碎片
- 动态分区分配(可变区分配)
- 外部碎片
- 紧凑(compaction)技术来解决外部碎片问题
- 首次适应算法 First Fit
- 最佳适应算法 Best Fit
- 最坏适应算法 Worst Fit
- 邻近适应算法 Next Fit
3.1.4非连续分配管理方式
基本分页存储管理方式
- 分页存储的几个基本概念
- 页面和页面大小
- 进程中的块称为页(Page)
- 内存中的块称为页框(Page Frame,或页帧)
- 外存直接称为块(Block)
- 地址结构
- 页表
- 实现从页号到物理块号的地址映射
- 页面和页面大小
- 基本地址变换机构
- 页表寄存器(PTR)
- 过程
- 设页面大小为L,逻辑地址为A,物理地址为E
- 页号P = A/L;页内偏移量W = A%L
- 比较页号P与页面长度M,若P≥M则产生越界中断
- 页表中页号P对应的页表项地址 = 页表始址F + 页号P × 页表项长度,取出该页表项内容b,即物理块号
- 计算 物理地址E = b × L + W
- - 具有快表的地址变换机构
- 高速缓冲存储器——快表(相联存储器TLB),主存中的页表常称为慢表
- 基于局部性原理
- 两级页表
- 顶级页表最多只能有一个页面
- 10位一级页号 + 10位二级页号 + 12位页内偏移
基本分段存储管理方式
- 分段
- 段表
- 地址变换机构
- 逻辑地址A = 前面部分的段号S + 后面部分的段内偏移W
- 段表中段号S对应的段表项地址 = 段表始址F + 段号S × 段表项长度
- 去除段表项中该段的始址b,物理地址E = b + W
- 段的共享和保护
段页式管理方式
- 段号
- 页号
- 页内偏移量
- 在一个进程中,段表只有一个,而页表可能有多个
- 段页式管理的地址空间是二维的
3.2 虚拟内存
虚拟内存的基本概念
- 传统存储管理方式的特征
- 一次性
- 驻留性
- 局部性原理
- 时间局部性
- 空间局部性
- 虚拟存储器的定义和特征
- 定义
- 特征
- 多次性
- 对换性
- 虚拟性
- 虚拟内存技术的实现:建立在离散分配的内存管理方式的基础上
- 三种方式
- 请求分页存储管理
- 请求分段存储管理
- 请求段页式存储管理
- 三种方式
- 虚拟内存的容量要满足两个条件
- 虚存的实际容量 ≤ 内存容量和外存容量之和
- 虚存的最大容量 ≤ 计算机的地址位数能容纳的最大容量
请求分页管理方式
- 页表机制
- 字段
- 状态位P
- 访问字段A
- 修改位M
- 外存地址
- 字段
- 缺页中断机构
- 在指令执行期间而非一条指令执行完后产生和处理中断信号,属于内部中断
- 一条指令在执行期间,可能产生多次缺页中断
- 地址变换机构
页面置换算法
- 最佳(OPT)置换算法―最长时间内不再被访问的页面
- 先进先出(FIFO)算法
- Belady异常
- 最近最久未使用(LRU,Least recently used)算法
- 时钟(CLOCK)置换算法 或 最近未使用(Not Recently Used,NRU)算法
- 改进型CLOCK置换算法
页面分配策略
- 驻留集大小
- 固定分配局部置换
- 可变分配全局置换
- 可变分配局部置换
- 调入页面的时机
- 预调页策略(运行前调入)
- 请求调页策略
- 从何处调入页面
- 外存分为两部分
- 用于存放文件的文件区:通常采用离散分配方式
- 用于存放对换页面的对换区:通常采用连续分配方式
- 三种情况
- 系统拥有足够的对换区空间
- 系统缺少足够的对换区空间
- UNIX方式
- 外存分为两部分
抖动(颠簸)
- 发生的原因:某个进程频繁访问的页面数目高于可用的物理页帧数目