- 1-1 操作系统做了什么
- 讲了执行一个hello world程序计算机发生了什么事情
- 1-2 操作系统的定义和作用
- 定义就是一个很多个程序组成的软件
- 作用
- 资源的管理者
- 硬件资源
- 软件资源
- 怎样管理资源
- 用数据结构记录资源的使用状况
- 确定资源的分配策略——算法
- 实施资源的分配和回收
- 提高资源的利用率
- 保护资源的使用
- 协调多个进程对资源请求的申请
- 各种系统服务的提供者
- 对机器硬件的扩展
- 硬件基础上的第一层软件
- 资源的管理者
- 1-3 操作系统的主要特征
- 并发
- 能够处理多个同时性活动的能力
- 并发
- 轮流执行
- 共享
- 操作系统与多个用户的程序共同使用计算机的资源
- 互斥共享
- 同时共享
- 虚拟
- 一个物理实体隐射为若干个对应的逻辑实体——分时或者分空间
- 从而提高资源利用率
- 例子
- 每个进程都在自己的虚拟CPU上跑,其实CPU只有一个
- 存储,每个程序都有自己的存储空间,但其实内存只有一个
- 随机
- 能够对以不可预测的次序发生的时间进行相应处理
- 比如无法预知每个进程运行的快慢
- 并发
- 1-4 典型操作系统的构架
- windows
- unix
- linux
- android
- 1-5 操作系统的分类
- 传统操作系统分类(现在没了几乎)
- 批处理操作系统
- 很无脑,就是给他一堆作业让他自己去做,然后由操作员来读取,人不能与系统交互不能去干预
- spooling技术,现在计算机打印的过程也采用了spooling技术
- 批处理操作系统
- 分时操作系统(也没了)
- 就是很快的轮流执行多个任务
- 通用操作系统
- 上面两个结合
- 分时优先,批处理在后
- 实时操作系统
- 及时响应事件的请求
- 个人计算机操作系统
- 网络操作系统
- 能够网络管理、通信、安全、资源共享
- 分布式操作系统
- 一个操作系统允许很多台计算机一起完成一项任务
- 嵌入式操作系统
- 以上是按照时间年代分的
- 传统操作系统分类(现在没了几乎)
- 2 操作系统运行环境和运行机制
- 2-1 处理器状态
- 现代处理器通常将CPU状态设计划分为2-3-4种
- 用户态、内核态
- 2-2 中断与异常机制
- 对操作系统很重要
- CPU对系统发生的某个事件的反应
- 中断的引入:支持CPU与设备之间的并行操作
- 设备完成输入输出之后发送中断报告此次输入输出的结果,让CPU决定后续的事情
- 异常的引入:
- 发生了异常则让CPU来处理
- 例子
- 看书看着看着来了个电话,插入书签然后去接电话,这就是中断,接完了在书签的位置继续看
- 时间
- 中断
- I/O中断:打印结束、读盘结束、键盘按了ctrl+c
- 时钟中断:定时器到点了
- 硬件故障:电脑没电了
- 异常
- 系统调用
- 页故障
- 保护性异常:本来一个文件只读的,结果发了一个写操作,就异常了
- 断电指令:调试
- 其他程序性异常:算术溢出、除以0
- 中断
- 2-3 中断异常机制的工作原理
- 硬件的工作:相应
- 有一个中断寄存器
- 每次执行完一条指令就扫描一遍中断寄存器
- 中断向量表:通过中断的类型找到中断的处理程序
- 软件的工作:处理
- 将CPU的控制权转给中断处理程序
- 保存相关寄存器信息
- 分析中断、异常的具体原因
- 执行对应的处理功能
- 恢复现场
- 打印机的例子
- 打印机给CPU发中断信号
- CPU处理完当前指令后检测到中断,判断终端来源并发出确认信号
- CPU状态切换到内核态
- 在系统栈中保存被中断程序的PS和PSW
- CPU根据中断码查中断向量表,获得处理程序的入口地址,让CPU控制转移到中断处理程序
- 中断处理程序开始工作(软件)
- 在系统栈中保存现场信息
- 检查I/O设备的状态信息
- 中断处理结束,中断返回,恢复
- 硬件的工作:相应
- 2-4 中断、异常机制实例——X86
- 2-5 系统调用机制——操作系统与用户程序的接口
- 系统点用:用户在编程时可以调用的操作系统功能,使CPU从用户态陷入内核态
- 每个操作系统都有几百种系统调用
- 系统调用、库函数、API、内核函数
- 系统调用通过封装成API和C函数库给用户使用
- 系统调用的执行过程
- 硬件的中断、异常机制:保护现场、通过查中断向量表把CPU控制权转给系统调用的总入口程序
- 系统调用的总入口程序:保存现场。通过查找系统调用表把控制权交给相应的内核函数
- 执行系统调用例程
- 回复现场返回用户程序
- 2-6 linux系统调用的实现
- 3 进程、线程模型
- 3-1 进程的基本概念
- 多道程序设计
- 允许多个程序同时进入内存并运行。提高效率
- 其实还是轮流执行
- 并发环境:单CPU上有两个或两个以上的程序处于开始执行且并未结束的状态且次序不是事先确定的
- 进程的定义:
- 老师说是伟大的概念
- 是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的单位
- 是程序的一次执行过程
- 是正在运行程序的抽象
- 将一个CPU变换成多个虚拟的CPU
- 系统资源以晋成为单位分配的,如内存、文件等
- 每个进程有独立的地址空间
- 操作系统将CPU的调度给需要的进程
- linux下ps查看有多少进程在运行
- 进程控制块PCB
- 记录进程的各种属性
- 一个进程对应一个PCB
- 进程表:所有进程的PCB的集合
- 包括的内容
- 进程描述信息
- 进程控制信息
- 所拥有的资源使用情况
- CPU的现场信息
- 多道程序设计
- 3-2 进程状态及其转换
- 三种基本状态
- 运行态:正在执行
- 就绪态:万事俱备只欠CPU
- 等待态(阻塞态):因等待某一个时间暂时不能运行(比如在等读盘啊之类的)
- 三种状态的转换
- 进程的其他状态
- 创建态
- 已经完成了创建一个进程的必要的工作
- 但是还没同意执行这个进程(比如因为资源有限之类的)
- 终止态
- 终止执行后进程进入该状态
- 完成一些数据统计工作
- 资源回收
- 挂起态:
- 用于调节负载(进程太多,忙不过来了,先挂起两个稳一稳)
- 进程数据放在磁盘上,不占用内存
- 创建态
- 五状态进程模型(3个基本的加上创建和终止)
- 七状态进程模型(5个加入了就绪挂起和阻塞挂起)
- linux状态示意图:6种状态
- 进程队列
- 队列元素为PCB
- 伴随着进程状态的改变,其PCB从一个队列进入另一个队列
- 三种基本状态
- 3-3 进程控制
- 完成进程状态之间的转换,也是一段段程序,不过不允许被中断,所以也被称为原语,所以是原子操作
- 原语如下:
- 进程的创建
- unix:fork()
- 进程的撤销
- 结束进程
- unix:exit()
- 进程的阻塞
- 进程等待一些事情的发生,比如等待键盘输入啥的
- unit:wait()
- 进程的创建
- unix的几个重要的进程控制操作
- fork():复制调用的进程,复制出的紫禁城状态为就绪态,插入到就绪队列
- exex():
- wait()
- exit()
- 3-4 关于进程相关概念的讨论
- 进程的分类
- 系统进程
- 用户进程
- 或者
- 前台进程
- 后台进程
- 或者
- CPU密集型进程:玩游戏的时候画面的渲染
- I/O密集型进程
- 进程的层次结构
- unix有进程家族树
- windows中的进程地位是相同的
- 进程和程序的区别
- 进程更准确的刻画并发
- 进程是动态的
- 进程是由生命周期的
- 一个程序可以对应多个进程
- 进程能够创建其他进程
- 例子:
- 学习一门课是一个大进程
- 具体的需要看书啊考试啊一些子进程
- 学习一门课是一个大进程
- 进程地址空间
- 是虚拟的,不是物理内存的实际空间位置
- 进程印像
- 某一瞬间进程的快照
- 上下文切换
- 将CPU硬件状态从一个进程换到另一个进程的过程
- 进程的分类
- 3-5 线程的引入
- 引入线程的原因
- 应用的需要:
- 比如一个由三个线程的字处理软件
- web服务器
- 总结说起来就是即使是进程内部也是有很多可以并发完成的任务的,所以还需要像前面细分成进程一样继续把进程细分成线程
- 开销的考虑
- 线程的开销小
- 线程的通信不需要内核的介入
- 性能的考虑
- 应用的需要:
- 线程的基本概念
- 进程的两个属性
- 资源的拥有者
- CPU的调度单位
- 有了线程之后
- 线程是进程中的一个运行实体,是CPU的调度单位
- 线程的属性:
- ID
- 状态和状态转换
- 不运行时需要保存上下文
- 所以有程序计数器等寄存器
- 有自己的栈和指针
- 共享所在的进程的地址空间和其他资源
- 也可以创建撤销其他线程,程序一开始就只有一个线程
- 线程自己独立的内容
- 程序计数器
- 寄存器
- 堆栈
- 状态
- 进程的两个属性
- 引入线程的原因
- 3-6 线程的实现
- 用户级线程
- 核心级线程
- 混合方式
- 4 CPU调度
- 4-1 处理区调度的相关概念
- 什么事CPU调度
- 控制协调进程对CPU的竞争
- 按照一定的调度算法从就绪队列中选择一个进程,把CPU的控制权交给被选择的进程
- 需要决定给哪个进程分配哪一个CPU
- 要解决的三个问题
- WHAT
- 调度算法
- 衡量调度算法的指标
- 吞吐量
- 周转时间
- 响应时间
- CPU利用率
- 等待时间
- 衡量调度算法的指标
- 调度算法
- WHEN
- 调度时机
- 进程终止
- 新进程的创建 或 一个等待进程变成就绪
- 一个进程从运行太进入阻塞态
- 一个进程从运行太变为就绪态
- 调度时机
- HOW
- 调度过程
- 上下文切换开销
- 调度过程
- WHAT
- 什么事CPU调度
- 4-2 设计调度算法需要考虑的几个问题
- 进程的优先级(数)
- 进程就绪队列组织
- 抢占与非抢占
- 指占用CPU的方式
- I/O密集型与CPU密集型进程
- 调度算法更偏好I/O密集型的进程
- 时间片
- 进程能在CPU上运行的时间
- 4-3 批处理系统中采用的调度算法
- 先来先服务FCFS(先进先出FIFO)
- 按队列中的顺序来呗
- 非抢占
- 很蠢
- 短作业优先SJF
- 时间短的进程先执行
- 非抢占式
- 最短剩余时间优先SRTN
- SJF的抢占式版本
- 最高相应比优先HRRN
- 是一个综合算法
- 首先计算每个进程的响应比R
- R=周转时间/处理时间
- 先来先服务FCFS(先进先出FIFO)
- 4-4 交互式系统的调度算法
- 时间片轮转调度算法
- 周期性的给每个进程一个时间片的时间上CPU
- 时间片的选择50ms左右吧
- 虚拟轮转法
- 最高优先级调度算法
- 选择优先级最高的进行来运行
- 优先级反转问题
- 时间片轮转调度算法
- 多级反馈队列调度算法、各种调度算法的比较、多处理器调度算法
- 多级反馈队列调度算法
- 是一个综合调度算法
- 介绍了一下基本思想
- 来了个小结
- 多处理器时需要考虑到一些问题
- 多级反馈队列调度算法
- 4-5 典型系统所采用的调度算法
- UNIX 动态优先数法
- 发展历史
- 5.3BSD 多级反馈队列法
- Linux 抢占式调度
- Windows 基于优先级的抢占式多任务调度
- windows线程调度
- Solaris 综合调度算法
- UNIX 动态优先数法
- 5 同步互斥机制
- 5-1 进程的并发执行
- 并发
- 共享
- 进程、线程之间的制约性
- 不确定性
- 例子
- 5-2 进程互斥
- 竞争条件
- 两个或多个进程读写某个共享数据,而最后的结果取决于进程运行的精确时序
- 进程互斥
- 各个进程使用共享资源时,这些资源有排他性
- 各个进程之间要竞争用这些资源
- 共享资源也被称为临界资源,一次只能被一个进程使用
- 临界区的使用原则
- 临界区内一次性最多只能有一个进程
- 实现进程互斥的方案
- 软件方案
- 硬件方案
- 竞争条件
- 5-3 进程互斥的软件解决方案
- 解法1
- free作为标志
- 有问题
- lock() unlock()
- 解法2
- turn 谁进临界区的标志
- 解法3
- pturn
- after you问题
- DEKKER算法
- 第一个解决互斥的软件方案
- PETERSON算法(1981)
- 解决了互斥访问问题
- 克服了强制轮流法的缺点
- 解法1
- 5-4 程互斥的硬件解决方案
- 解法1——中断屏蔽方法
- 进程进临界区之前关中断
- 出临界区后开中断
- 多处理器不行
- 不适合用户进程
- 解法2——测试并加锁指令
- 解法3——交换指令
- 小结
- 软件方法
- 编程技巧比较高
- 硬件方法
- 指令
- 忙等待(bust waiting)
- 优先级反转
- 软件方法
- 解法1——中断屏蔽方法
- 5-5 进程同步——多个进程的协作关系
- 进程同步
- 指系统中多个进程中发生的事件存在某种时序关系,需要相互合作,共同完成一项任务
- 就是一个进程运行到某一点是时,要等另一个伙伴进程给他提供消息,在未得到消息之前就进入阻塞
- 例子
- 生产者、消费者问题
- 生产者进程
- 消费者进程
- spooling
- 生产者、消费者问题
- 进程同步
- 5-6 信号量及PV操作——一种经典的进程同步机制
- P、V操作定义
- 二元信号量解决互斥问题
- 多值信号量解决同步问题
- 用PV操作解决进程间互斥问题
- 5-7 信号量解决生产者消费者问题
- 分析了一波
- 5-8 用信号量解决读者、写者问题
- 读者进程:只读数据区中的数据
- 第一类读者写者问题:读者优先
- 写者进程:只往数据区里写数据
- 例子
- LINUX提供的读写锁
- 小结
- 5-1 进程的并发执行
- 6 同步互斥机制2
- 6-1 管程
- 为何会出现管程
- 信号量太麻烦
- 一种高级同步机制
- 是一个特殊的模块
- 进程与管程
- 进程智能通过调用管程中的过程来间接地访问管程中的数据结构
- 管程要保证什么?
- 互斥:管程是互斥进入的
- 管程的互斥性是由编译器负责保证的
- 同步
- 管程中设置条件变量及等待、唤醒操作以解决同步问题
- 互斥:管程是互斥进入的
- 应用管程时遇到的问题
- 为何会出现管程
- 6-2 HOARE管程
- 条件变量的实现
- 6-3 管程的应用
- 管程的实现
- 直接构造
- 间接构造
- 可以直接用信号量来构造
- 用管程解决生产者消费者问题
- JAVA中的类似机制
- 管程的实现
- 6-4 MESA管程
- 为何引入MESA
- HOARE管程的一个缺点
- 两次额外的进程切换
- HOARE管程的一个缺点
- 管程小结
- 管程是一个抽象的数据类型
- 为何引入MESA
- 6-5 PTHREAD中的同步机制
- 6-6 进程间通信机制
- 为何需要通信机制
- 信号量和管程不适合大量传数据
- 管程不适合多处理器情况
- 消息传递
- send/receive原语
- 基本通信方式
- 消息传递
- 就是操作系统来操作,把发送进程要发送的数据复制到消息缓冲区中,然后在从消息缓冲区复制到接收进程中
- 共享内存
- 就是两个要通信的进程间有个共享的物理内存
- 要解决两个问题
- 把这个共享的物理内存分别映射到两个进程的地址空间中
- 解决读者、写者问题。不能同时写,只能同时读
- 管道
- 利用一个缓冲传输介质——内存或文件连接两个进程(不太懂)
- 套接字
- 远程过程调用
- 消息传递
- 为何需要通信机制
- 6-7典型操作系统的IPC机制
- LINUX的进程通信机制
- 用户
- 管道
- 消息队列
- 共享内存
- 信号量
- 信号
- 套接字
- 内核同步机制
- 原子操作
- 不可分割
- 自旋锁
- 等等一堆
- 原子操作
- 用户
- 本讲重点
- 管程
- 进程间通信
- LINUX的进程通信机制
- 6-1 管程
- 7 存储管理
- 7-1 基本概念:地址重定位(地址转换、地址映射、地址翻译)
- 已经了解的
- 多道程序设计模型
- 程序要装载到内存中才能运行
- 每个进程有自己的地址空间
- 一个进程执行时不能访问另一个进程的地址空间
- 要解决的问题
- 把很多个进程地址空间变到物理内存中
- 复习:进程地址空间
- 讨论
- 进程中的地址不是最终的物理地址
- 在进程运行前无法计算出物理地址
- 所以需要地址重定位的支持
- 地址重定位
- 逻辑地址(相对地址、虚拟地址)
- 物理地址(绝对地址、实地址)
- 就是一波转换
- 静态重定位与动态重定位
- 动态重定位实现
- 内存管理单元(MMU)
- 动态重定位实现
- 已经了解的
- 7-2 物理内存管理
- 数据结构
- 位图
- 空闲区表、已分配区表
- 空闲块链表
- 内存分配算法
- 首次适配
- 下次适配
- 最佳适配
- 找到最小的一块
- 最差适配
- 找到最大的一块
- 回收问题
- 内存回收算法
- 合并
- 内存回收算法
- 数据结构
- 7-3 伙伴系统
- 伙伴系统
- 经典的内存分配算法
- 例子
- 只和伙伴合并
- 伙伴系统
- 7-4 基本内存管理方案1
- 基本内存管理方案
- 单一连续区
- 一段时间内只有一个进程在内存中,简单但是利用率低
- 固定分区
- 先分区
- 每个分区只能装一个进程
- 例子
- 可变分区
- 根据进程需要,把内存空闲空间分割出一个分区,分配给这个进程
- 洞
- 外碎片,内存利用率下降
- 碎片问题解决
- 紧缩技术(压缩技术、紧致技术、搬家技术)
- 紧缩时要考虑的问题
- 单一连续区
- 基本内存管理方案
- 7-5 基本内存管理方案2
- 页式存储管理方案
- 进程的地址空间被划分为大小相等的部分,成为页
- 内存空间页按照同样的大小划分为大小相等的区域,成为页框(页面、页帧、内存块)
- 内存分配规则
- 以页为单位进行分配
- 逻辑上相邻的物理上不一定相邻
- 内存分配
- 例子
- 页表
- 记录映射关系
- 相关数据结构和地址转换
- 页表
- 页表项
- 放在内存中
- 空闲内存管理
- 地址转换(硬件支持)
- 内碎片
- 最后一页可能填不满一页,所以有浪费
- 页表
- 段式存储管理方案
- 思想
- 就是按照程序的逻辑把程序划分为一段一段的,内存也是这样
- 逻辑地址
- 例子
- 段表
- 相关数据结构和地址转换
- 段表:该段的长度+该段的起始地址
- 物理内存管理
- 地址转换(硬件)
- 思想
- 段页式存储管理方案
- 先按段划分,每一段再按页面划分
- 存储管理
- 段表:记录每一段的页表起始地址和页表长度
- 页表:和以前一样记录了逻辑页号和页框号的对应关系
- 一个进程包括一个段表和多个页表
- 地址转换
- 小结
- 页式存储管理方案
- 7-6 交换技术
- 产生背景
- 内存不足时如何管理
- 内存“扩充”技术
- 内存紧缩技术
- 覆盖技术
- 就是让一段程序不会同时执行的程序段共享同一段内存区域
- 因为反正他们也不会同时执行
- 程序员生命覆盖结构
- 主要用于早起操作系统
- 缺点:很麻烦
- 交换技术(早期的虚拟存储技术)
- 就是内存不够的时候把内存中某些进程暂时移动到外存,把外存中要执行的换进内存
- 实现时遇到的问题
- 解决方法
- 进程空间增长的困难及解决
- 虚拟存储技术(下一章)
- 本讲重点
- 产生背景
- 7-1 基本概念:地址重定位(地址转换、地址映射、地址翻译)
- 8 存储模型2——虚拟存储技术
- 8-1 虚拟存储技术
- 概念:
- 进程运行时,现将其一部分装入内存,另一部分暂时留在磁盘,当要执行的指令或访问的数据不在内存时,再由操作系统自动的将它们从磁盘调入内存
- 虚拟地址空间
- 虚拟地址
- 存储器的层次结构
- 虚存与存储体系
- 虚存是对内存的抽象
- 虚存提供了一个比物理内存空间大得多的地址空间
- 虚存一部分在磁盘一部分在内存
- 地址保护
- 虚拟页式
- 虚拟存储技术+页式存储管理方案
- 基本思想
- 进程开始运行之前,不是装入全部页面,而是装入一个或0个页面
- 之后根据进程需要,动态的装入其他页面
- 当内存满了后,再要装入的话就要用算法来置换了
- 说白了就是一种用时间和磁盘空间换内存的技术
- 概念:
- 8-2 页表和页表项的设计
- 页表来记录虚拟页面和实际内存的对应关系
- 页表项设计(页表由页表项组成)
- 页框号:内存块号、物理页面号、页帧号
- 还有各种位
- 通常,页表项是由硬件设计的
- 一个计算的例子
- 页目录:页表页的地址索引表
- 因为页表也很大,所以页表也不是连续存放在内存的
- 每个进程一个页目录
- 页目录的起始地址也是推送在寄存器中的
- 二级页表结构及地址映射
- CORE I7页表结构
- 四级页表结构
- I386页目录项和页表项
- 引入反转页表
- 地址转换
- 虚拟地址-》查页表-》得到页框号-》形成物理地址
- 每个进程一张页表
- 解决思路
- 反转页表的设计
- 地址转换
- 8-3 地址转换的过程、TLB的引入
- 地址转换过程示意
- MMU:内存管理单元
- 快表TLB的引用
- 问题
- 慢
- 程序访问的局部性原理-》引入快表
- 问题
- 快表是什么
- CPU内引入的高速缓存
- 加入TLB后地址转换过程示意
- page fault异常:内存中还没有读入这个页面
- 8-4 页错误(页故障) PAGE FAULT
- 地址转换过程中硬件产生的异常
- 具体问题
- 要访问的虚拟页面还没有调入物理内存
- 缺页异常
- 页面访问违反权限
- 错误的访问地址
- 要访问的虚拟页面还没有调入物理内存
- 具体问题
- 缺页异常处理
- 是一种page fault
- 操作系统执行缺页异常处理程序:获得磁盘地址,启动磁盘,将该页调入内存
- 地址转换过程中硬件产生的异常
- 8-5 软件相关策略
- 驻留集
- 给每个进程分配多少个页框
- 固定分配策略
- 可变分配策略
- 根据缺页率来改变
- 给每个进程分配多少个页框
- 置换问题
- 没有空闲页框了就要置换
- 置换范围
- 局部置换策略
- 只在产生本次缺页的进程的驻留集中xuanz
- 全局置换策略
- 局部置换策略
- 置换策略
- 决定置换当前内存中的哪一个页框
- 就是置换最近最不可能访问的页
- 局部性原理
- 约束;不能置换被锁定的页框
- 页框锁定
- 为何要锁定页面
- 通过锁定一个页框,这样这个页框就不会被换出内存了,就可以避免这个进程运行过程中的不确定的延迟
- 需要锁定的例子
- 为何要锁定页面
- 页框锁定
- 决定置换当前内存中的哪一个页框
- 清除策略1
- 清除:从进程的驻留集收回页框
- 虚拟页式系统工作的最佳状态是:发生缺页异常时系统中还有大量的空闲页框
- 所以需要清除
- how
- 有一个分页守护进程
- 清除策略2
- 已经置换出去的页框又需要了,再回复
- -页缓冲技术
- 驻留集
- 8-6 置换算法
- 最佳页面置换算法(OPT)
- 思想:置换以后不再需要的或者最远才会需要的页面
- 所谓一种衡量标准
- 先进先出算法(FIFO)
- 实现:页面链表法
- 问题还是有的
- 第二次机会算法(SCR)
- 先按照先进先出选择某一个页面,看它的访问位,要是被访问过了就给它第二次机会让它留着但是访问位置0表示没被访问过,要是没被访问过,就置换出去
- 有问题的,有点开销
- 时钟算法(CLOCK)
- 可以认为是一个循环链表把,属于SCR的升级版,开销要小一些
- 最近未使用算法(NRU)
- 选择在最近一段时间内没被使用过的一页进行置换
- 实现:有两位、访问位R和修改为M
- R位被定期清零
- 然后分类
- 用时钟算法来实现
- 最近最少使用算法(LRU)
- 选择最后一次访问时间距离当前时间最长的置换掉
- 性能接近OPT
- 实现:每个页面设置一个时间戳或者访问栈
- 开销大
- 例子:一种硬件实现
- 最不经常实用算法(NFU)not frequently used
- 选择访问次数最少的页面进行置换
- 算是LRU的一种软件解决方案
- 每个页框有个计数器,每次时钟中断时,计数器+1
- 缺页中断时选择计数器值最小的进行置换
- 老化算法(AGING)
- 模拟LRU
- 页面置换算法的应用
- 一些例子
- BELADY现象
- 就是给的页框数越多反而缺页次数也更多了,这种反常的现象就是BELADY现象
- 最佳页面置换算法(OPT)
- 8-7 置换算法2
- 影响缺页次数的因素
- 页面置换算法
- 页面本身的大小
- 程序的编制方法
- 分配给进程的页框数量
- 颠簸(抖动)
- 页面尺寸问题
- 程序编制方法对缺页次数的影响
- 分配给进程的页框数量与缺页率的关系
- 工作集模型
- 工作集:一个进程当前正在使用的页框的集合
- 会随着时间变化的
- 工作集算法
- 找出一个不在工作集中的页面并置换它
- 看是不是在工作集中就是看访问时间
- 页面置换算法小结
- 影响缺页次数的因素
- 8-8 其他相关技术
- 内存映射文件
- 就是进程要读写文件的时候直接通过一个系统调用将一个文件或者其部分映射到其虚拟地址空间的一部分,这样访问这个文件就像访问内存中的一个大数组一样了,而不是对这个文件进行读写
- 支持写时复制技术
- fork()的技术
- 内存映射文件
- 8-1 虚拟存储技术
- 9 文件系统
- 9-1 文件与文件系统
- 文件是什么
- 文件是对磁盘的抽象
- 一组带标识的、在逻辑上有完整意义的信息项的系列
- 信息项:构成文件内容的基本单位(单个字节或多个字节),各信息项之间具有顺序关系
- 如何设计一个文件系统
- 文件系统
- 操作系统中同意管理信息资源的一种软件
- 任务
- 同意管理磁盘空间
- 实现文件的按名存取
- 实现文件信息的共享
- 向用户提供方便的接口和统计信息
- 提高文件系统的性能
- 提供与I/O系统的接口
- 文件分类(UNIX)
- 普通文件
- 目录文件
- 特殊文件
- 字符设备文件:比如终端、打印机、网卡等(和输入输出有关)
- 块设备文件:磁盘
- 文件的逻辑结构
- 从用户角度看文件,由用户的访问方式确定
- 典型的文件逻辑结构与文件存取
- 流式文件:基本单位是字符
- 记录式文件:文件由若干个记录组成,按记录进行读写查找操作
- 文件是什么
- 9-2 文件的存储介质
- 存储介质及物理块
- 典型的存储介质
- 物理块(blobk cluster)
- 信息存储、传输、分配的独立单位
- 存储设备划分为大小相等的物理块
- 典型的磁盘结构
- 任何时刻只有一个磁头处于活动状态
- 输入输出数据以位串形式出现
- 物理地址形式:磁头号(盘面号)、磁道号(柱面号)、扇区号
- 扇区:标题、数据、ECC纠错信息
- 磁盘访问
- 三个动作
- 寻道
- 旋转延迟
- 数据传输:数据在磁盘和内存之间的实际传输
- 三个动作
- 存储介质及物理块
- 9-3 磁盘空间管理
- 有关数据结构
- 位图
- 空闲块表
- 空闲块链表
- 磁盘地址与块号的转换
- 成组链接法设计思想
- 反正就是一种管理块的方法
- 有关数据结构
- 9-4 文件控制块和文件目录
- 文件属性
- 文件控制块
- 保存了管理一个文件所需的各种信息
- 常用属性
- 文件控制块
- 基本文件操作
- 用基本文件操作构建其他操作示例
- 打开文件
- 创建新文件
- 复制
- 关闭新文件
- 文件目录、目录项与目录文件
- 文件目录
- 统一管理每个文件的元数据,以支持文件名到文件物理地址的转换
- 目录文件
- 将文件目录以文件的形式存放在磁盘上
- 目录项
- 构成文件目录的基本单元
- 就是FCB
- 文件目录
- 文件目录结构演化
- 与目录相关的概念
- 路径名(文件名)
- 绝对路径名
- 相对路径名
- 当前目录、工作目录
- 目录操作
- 路径名(文件名)
- 目录文件之间的关联
- 通过目录项找目录文件
- 文件属性
- 9-5 文件的物理结构
- 文件在存储介质上的存放方式
- 连续(顺序)结构
- 文件的信息存放在连续的物理块中
- 优缺点
- 文件不能动态增长
- 不利于文件插入与删除
- 链接结构
- 不连续,各个块通过指针链接
- 优缺点
- 存取速度慢,不适合随机存取
- 指针可能会出错,有可靠性问题
- 更多的寻道次数和时间
- 指针也占用一定的空间
- 改进版:文件分配表(FAT)
- 就是单独搞了一个表记录所有块的位置指针
- 表项的值有三种:0,-1,下一块的块号
- 索引结构
- 同样不连续
- 但是有个索引表,把位置放在索引表这个数组里
- 优缺点
- 较多的寻道次数和寻道时间
- 本身的开销
- 索引表的组织方式
- UNIX的三级索引结构
- 采用的是多级索引结构
- 其最多一个文件有12+256+256^2+256^3个块
- 9-6 文件系统的实现
- 概述
- 相关术语
- 磁盘分区
- 文件卷
- 磁盘上的逻辑分区
- 同一个文件卷上使用同一份管理数据
- 块、簇:一个或多个连续的扇区
- 格式化
- 在一个文件卷上建立文件系统
- 磁盘上的内容
- 引导区
- 从该卷引导操作系统所需要的信息
- 卷信息
- 目录文件
- 用户文件
- 引导区
- 磁盘上文件系统的布局
- UNIX文件系统布局
- windows的FAT文件系统布局
- 内存中所需的数据结构——UNIX为例
- 系统打开文件表
- 整个系统一张
- 用来保存已打开文件的FCB
- 用户打开文件表
- 每个进程一个
- 进程的PCB中记录了这个表的位置
- 系统打开文件表
- 9-7 文件系统实例——UNIX
- 文件目录检索
- 目录检索
- 用户给出文件名-》按照文件名查找到目录项/FCB
- 文件寻址
- 根据目录项/FCB中文件物理地址等信息,计算出文件中任意记录或字符在存储介质上的地址
- 目录检索
- 目录文件实现时的改进
- 如何加快目录检索
- 目录项分解法
- 改进方案示意
- 改进后的好处
- 减少了访盘的次数
- UNIX文件系统
- FCB = 目录项 + i节点
- 目录项:文件名+i节点号
- 目录文件由目录项构成
- i节点:描述文件的相关信息
- 每个文件由一个目录项、一个i节点和若干磁盘块构成
- 示意
- 查找示意
- 如何加快目录检索
- 文件目录检索
- 9-1 文件与文件系统
- 10 文件系统2
- 10-1 文件系统实例——FAT
- 10-2 文件操作的实现
- 文件操作的实现:
- 创建文件
- 建立系统与文件的联系,实际上是建立文件的FCB
- 具体步骤
- 打开文件
- 根据文件名进行检索
- 将该文件的目录项读入内存,建立相应的数据结构
- 具体步骤
- 指针定位
- 系统为每个进程打开的每个文件维护一个读写指针
- 读文件
- 根绝打开文件时得到的文件描述符,找到对应的目录项FCB
- 将文件的逻辑块号转换为物理块号
- 申请缓冲区
- 启动磁盘I/O操作,把磁盘块中的信息读入缓冲区,再传入指定的内存
- 怎样实现rename
- 在FCB中改了就好了
- 创建文件
- 文件操作的实现:
- 10-3 文件系统的管理
- 可靠性
- 坏块问题
- 备份
- 物理转储
- 逻辑转储
- 文件系统一致性
- 就是文件系统在写的过程中,内存中改的数据还没写入到磁盘中系统崩溃了,就还有不一致问题
- 解决方案
- 磁盘块的一致性检查
- 两个表,一个存空闲的磁盘块,一个存使用中的块
- 目录系统的一致性检查
- 磁盘块的一致性检查
- 文件系统的写入策略
- 通写
- 内存中的修改立即写到磁盘中
- 速度性能差
- 延迟写
- 定期将缓存中的数据写入到磁盘
- 可恢复性查
- 可恢复写
- 加入了事务日志
- 内存中的修改立即写到磁盘中
- 通写
- 可靠性
- 10-4 文件系统的安全性
- 文件保护机制
- 用户身份验证
- 访问控制
- 访问控制表:每个文件一张表
- 能力表(权限表):每个用户一张表
- UNIX的文件访问控制
- 对访问者的识别
- 对用户分类
- 文件主
- 文件主的同组用户
- 其他用户
- 对用户分类
- 对操作权限的识别
- 对操作分类
- 读
- 写
- 执行
- 不能执行任何操作
- 对操作分类
- 对访问者的识别
- 文件保护机制
- 10-5 文件系统的性能1
- 磁盘服务
- 提高文件系统的方法
- 块高速缓存
- 就是把磁盘中某些块复制保存在内存中的缓冲区中
- 以后要读磁盘时就先在高速缓存中先找就行
- 关于实现
- 组织
- 置换(修改LRU)
- 写入策略
- 提前读取
- 每次访问磁盘时多读入一些磁盘块
- 依据:程序执行的空间局部性原理
- windows的文件访问方式
- 不使用文件缓存
- 使用文件缓存
- cache manager
- write-back机制
- 例子
- 异步模式
- CPU和I/O并发工作
- 合理分配磁盘空间
- 分配磁盘块时,把可能顺序存取的块放在一起(放在同一柱面上)
- 10-6 文件系统的性能2
- 磁盘调度
- 先来先服务(FCFS)
- 最短寻道时间优先
- 先服务最近的
- 缺点:会有饥饿现象
- 扫描算法SCAN(电梯算法)
- 单向扫描算法C-SCAN
- 从外往里扫描
- 优点:减少心情求的最大延迟
- N-step-SCAN策略
- 把请求队列分成长度为N的子队列,每一次用SCAN处理一个子队列
- FSCAN策略
- 使用两个子队列
- 旋转调度算法
- 根据延迟时间(就是磁盘旋转到那个扇区所需要的时间)来决定执行次序
- 磁盘调度
- 10-7 文件系统的性能3
- 信息的优化分布
- 记录在磁道上的排列方式
- 记录的成组与分解
- 成组
- 把若干逻辑记录合成一组存放在一块
- 从而提高了存储空间的利用率
- 分解
- 从一组逻辑记录中把一个记录分解出来
- 成组
- RAID技术
- RAID(独立磁盘冗余阵列)
- 多块磁盘按照一定要求构造成一个独立的存储设备
- RAID0
- 条带化
- RAID1
- 镜像
- RAID4
- 交错块奇偶校验
- RAID(独立磁盘冗余阵列)
- 信息的优化分布
- 10-8 两个练习
- 11 I/O系统
- 11-1 I/O管理概述
- 计算机I/O系统结构
- I/O管理示意
- I/O的特点
- 设备的分类——按数据组织分
- 块设备
- 以数据块为单位存储
- 传输速率较高、可寻址
- 字符设备
- 以字符为单位存储‘传输速率低、不可寻址
- 块设备
- ’设备分类——从资源分配角度
- 独占设备
- 打印机
- 磁带
- 共享设备
- 硬盘
- 虚设备
- 在一类设备上模拟另一类设备
- spooling
- 独占设备
- I/O管理的目标和任务
- 按照用户请求,控制完成数据交换
- 建立方便、同意的独立于设备的接口
- 充分利用各种技术,提高性能
- 保护
- 11-2 I/O设备组成
- 机械部分和电子部分
- 机械部分是设备本身
- 电子部分是设备控制器(适配器)
- 设备接口——控制器的作用
- 操作系统将命令写入控制器,实现输入输出,然后从控制器返回结果
- 控制器与设备之间的接口是一个低级接口
- 控制器的任务:
- I/O端口地址
- 接口电路的每个寄存器具有的、唯一的地址,是个整数
- 两种形式
- 内存映像编址
- 把I/O的读写等同于对内存的操作
- I/O独立编址
- 端口的之地空间完全独立,与内存地址空间无关
- 内存映像编址
- 机械部分和电子部分
- 11-3 I/O控制方式
- 可编程I/O(轮询、查询)
- CPU代表进程一直问I/O模块好了没,好了的话进程就继续
- 示意图
- 中断驱动I/O
- I/O完事了就主动通知设备驱动程序
- 示意图
- DMA
- I/O部件的演化
- 可编程I/O(轮询、查询)
- 11-4 I/O软件的组成
- I/O软件设计
- 分层设计思想
- I/O软件层次
- 用户级I/O软件
- 与设备无关的OS软件
- 设备驱动程序
- 中断处理程序
- 硬件
- 设备独立性
- I/O软件设计
- 11-5 I/O相关技术
- 缓冲技术
- 为何引入
- 解决CPU与外设速度不匹配的问题
- 实现
- 缓冲区分类
- 硬缓冲
- 软缓冲
- 缓冲区管理
- 单缓冲
- 双缓冲
- 缓冲池
- 例子
- 缓冲区分类
- UNIX 缓冲技术
- 采用缓冲池
- 缓冲区结合提前读和延时写
- 还一个懒得记了
- 为何引入
- 缓冲技术
- 11-6 I/O设备管理
- 设备管理有关的数据结构
- 独占设备的分配
- 分时式共享设备的分配
- 设备驱动程序
- 每个驱动程序管一类设备
- 设备驱动程序与外界的接口
- 设备驱动程序接口函数
- 一种典型的实现方案:I/O进程
- 11-7 I/O性能问题
- 减缓速度差异-》缓冲技术
- 使CPU不等待I/O-》异步I/O
- 让CPU摆脱I/O操作-》DMA 通道
- 异步传输
- 同步传输I/O流程
- 异步传输I/O的基本思想
- 11-1 I/O管理概述
- 12 死锁
- 12-1 死锁的基本概念
- 定义
- 一组进程中,每个进程都五点等待另一进程所占有的资源
- 参与死锁的所有进程都在等待资源
- 例子
- 十字路口例子
- 为什么会出现死锁
- 资源数量有限
- 资源的使用方式
- 可重用资源
- 可抢占资源
- 不可抢占资源
- 可消耗资源:只使用一次
- 信号、中断、消息
- 锁和信号量错误使用
- 资源数量有限
- 进程竞争可重用资源
- 磁带和磁盘的例子
- 内存分配相关的例子
- 进程竞争可消耗资源
- 发消息的一个例子
- 活锁和饥饿
- 活锁:进程得不到资源但是能运行
- 饥饿:资源分配策略问题
- 产生死锁的必要条件
- 互斥使用(资源独占)
- 占有且等待
- 不可抢占
- 循环等待
- 定义
- 12-2 资源分配图
- 资源分配图(RAG)
- 用有向图描述系统资源和进程状态
- 资源分配图画法说明
- 例子
- 死锁定理
- 如果资源分配中没环路,则没思索
- 有环路,则可能有死锁
- 但是如果每个资源类只包含一个资源实例,则环路是死锁的充要条件
- 资源分配图化简
- 资源分配图(RAG)
- 12-3 死锁预防
- 解决死锁的方法
- 不考虑此问题(鸵鸟算法)
- 不让死锁发生
- 死锁预防
- 静态策略
- 死锁避免
- 动态策略
- 死锁预防
- 让死锁发生
- 检测与解除
- 死锁预防
- 通过确定合适的资源分配算法,排除发生死锁的可能性
- 防止产生死锁的四个必要条件的任何一个发生
- 破坏“互斥使用”条件
- 就是把独占资源转化为共享资源
- 例子:spooling技术的引入
- 破坏“占有且等待”
- 要求每个进程在运行前申请所有要的资源,仅当所有资源都满足时才一次性全部赋予
- 会产生饥饿现象
- 或者新申请的资源得不到满足时把所有已占有的资源释放
- 要求每个进程在运行前申请所有要的资源,仅当所有资源都满足时才一次性全部赋予
- 破坏“不可抢占”
- 可以抢占就好了
- 局限性:适用于状态易于保存和回复的资源
- 例子:CPU、内存
- 破坏“循环等待”
- 实施方案:资源有序分配法
- 资源按次序进行
- 为什么这样就不会产生死锁了
- 比如有两个资源A和B,原来随便搞并发的话那就怕这种情况,一个进程拿着A要B,另一个进程拿着B要A,这就傻逼了形成了死锁。现在给资源编号,资源按照编号从小到大的顺序拿到比如一个进程同时需要A和B时必须要先拿A再拿B,这样就不会出现前面的那种死锁情况了
- 学到这个思路的博客在此
- 破坏“互斥使用”条件
- 解决死锁的方法
- 12-4 死锁避免
- 例子
- 定义:对进程发出的资源申请进行动态检查,根据检查结果决定是否分配资源
- 安全序列
- 一个安全的进程序列
- 处于安全状态自然没有死锁发生
- 不安全状态一定导致死锁
- 12-5 银行家算法
- 仿造银行发放贷款时采取的控制方式而设计的一种死锁避免算法
- 应用条件
- 在固定数量的进程中共享数量固定的资源
- 每个进程预先制定完成工作所需的最大资源数量
- 进程不能申请比系统中可用资源总数还多的资源数
- 进程等待资源的时间是有限的
- 如果系统满足了进程的需求,进程应该在有限的时间内完成并还回资源
- 银行家算法
- 具体步骤
- 安全性检查
- 应用
- 自己的理解
- 就是系统还剩这么多资源,然后很多未完成的嗷嗷待哺的进程还需要一些资源,该怎么分配资源给这些进程呢?简单啊,就决定一个个试,要是剩余的这些资源能让某一个进程完成(毕竟完成了这个进程就会把资源给返回了),那就让这个进程好好干,把任务完成。完成后系统剩余的资源就更多了因为这个完成的进程完成了嘛,于是继续找找到下一个可以运行的进程。就这么一直找就能找到一个进程资源的序列,如果就这么搞,所以嗷嗷待哺的进程都执行完了,就说明刚刚自己脑回路模拟的这个序列是一个安全序列,美滋滋,于是就按这个序列进行呗
- 讲得不错的一个博客https://blog.csdn.net/qq_33414271/article/details/80245715
- 12-6 死锁检测与解除
- 监测看看是否有死锁,找到了就解除
- 监测时机
- 一个简单的死锁检测算法
- 就是看有没有环
- 死锁的解除
- 撤销所有死锁进程
- 进程回退(roll back)再启动
- 按照某种原则逐一撤销死锁进程,直到
- 12-7 哲学家就餐问题
- 第一种解决方案
- 信号量
- 会产生死锁
- 第二种解决方案
- 最多允许四个哲学家坐桌上
- 加一个信号量
- 第三种解决方案
- 管程
- 通过管程同时拿到两只筷子
- 第四种解决方案
- 讨论
- 第一种解决方案
- 12-1 死锁的基本概念
操作系统学习笔记
最新推荐文章于 2022-05-16 21:48:19 发布