本人复习时总结的重点和李旭东老师上课提及的重点
比较乱,且每年情况不一样,仅供参考
课堂上画的重点
-
类 unix 系统、类 linux 系统(5个)、类 windows
debian、gentoo、ubuntu、redhat、centos
-
死锁四个必要条件
-
哲学家就餐
-
银行家算法
-
局部性原理举例(时间、空间)
-
optimal replacement algorithm
-
某种算法的页面置换
-
抖动 的概念
抖动怎么解决
-
原语
-
程序控制的 IO
忙等待 中断式 DMA channel
-
精确中断
-
磁盘寻道算法
FCFS 、 SSF 、 Elevator 三种题目
-
RAID
-
操作系统架构分类
-
操作系统趋势
开源、小型、网络、安全、专业
-
并发、系统调用、临界区、系统调用、死锁概念
-
计算:置换 inode 调度
-
编程题:IPC
-
操作系统分类
批处理、分时、实时、分布式
-
操作系统调度
-
现代操作系统特点:并发、共享、虚拟化、异步
-
进程、线程 调度算法 进程状态 进程控制块是唯一 线程的一些问题?
-
用户级线程和内核级线程 线程调度 抢占式、非抢占式
-
IPC 竞态 概念
-
进程间互斥方法
-
银行家算法 安全状态 非安全状态
-
段 是两位地址 页是 1位地址
-
虚拟存储
-
抖动原因以及如何破解
进程内存不足,分配页面太少。置换算法不当
-
fat inode
-
空闲块管理
-
io 几种
同步IO
异步IO
阻塞IO
非阻塞IO
-
buffer 几种
-
进程间通信
管道 消息传递 共享内存 远程过程调用
-
进程间同步
mutex、semaphore、semaphore set、condition variable、event counter、monitor、message passing、barrier
-
进程间互斥
mutex、信号量、peterson解法、TSL、忙等待、管程
1. 操作系统概述
-
操作系统定义
操作系统是管理计算机硬件资源、软件资源并为计算机程序提供公共服务的系统软件
-
ENIAC 第一个可编程的 二进制
-
真空管和穿孔卡片
晶体管和批处理系统
集成电路和多道程序设计
个人计算机
移动计算机
-
系统调用
用户程序和操作系统间的接口
2. 进程和线程
-
在进程模型中,计算机上所有可运行的软件,通常也包括操作系统,被组织成若干顺序进程,简称进程。一个进程就是一个正在执行程序的实例。
-
进程的状态
新建 运行态 就绪态 阻塞态 死亡
有四种转换关系 + new -> ready run -> die
-
进程的实现
进程表 包含一系列进程表项或进程控制块 PCB 包含进程状态的重要信息(程序计数器、堆栈地址、内存分配情况、打开文件状态等)
-
CPU 利用率 1-p^n
-
线程:进程中的一个执行路径。是处理器调度的基本单位。线程是进程的组成部分,每个进程包含一个或多个并发执行的线程,同一个进程中的线程共享进程的内存地址和资源,但是不共享寄存器以及栈空间。
-
需要线程的理由
需要并行实体拥有共享同一个地址空间和所有可用数据的能力
线程比进程更轻量级,更容易创建和撤销
加快应用程序执行速度
调度和通信代价小
-
code file data 共用,但寄存器和栈不共用
-
竞争条件(竞态):即两个或多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时序,称为竞争条件
-
临界区:对共享变量进行访问的程序片段。
如果使两个进程不可能同时处于临界区中,就能避免竞争条件
- 任何两个进程不能同时处于临界区
- 不应对 CPU 的速度和数量做任何假设
- 临界区外运行的进程不得阻塞其他进程
- 不得使进程无限期等待进入临界区
-
互斥的实现
屏蔽中断 ×
锁变量 ×
严格轮换法 忙等待 问题:浪费资源 有先后顺序,类似于同步,不能谁先到谁执行,只能交替进入临界区
Peterson 解法 有忙等待的缺点
TSL 指令 硬件级别 有忙等待的缺点
-
信号量 可以用于同步
-
生产者-消费者问题 交换顺序出现的问题 代码要会
-
互斥量 如果不需要计数功能,可以选择简化版的信号量
-
管程
-
条件变量 wait signal
-
IPC 问题
哲学家就餐
代码要会
读者-写者问题
代码要会
理发师问题
代码要会
-
调度
抢占式(运行某个固定时段的最大值)、非抢占式(运行至阻塞或释放 CPU )
批处理、交互式、实时
吞吐量是系统每小时完成的作业数量
周转时间是指从一个批处理作业提交时刻开始直到该作业完成时刻为止的统计平均时间
-
CPU 利用率常常用于对批处理系统的度量
批处理中的调度算法(ppt上的计算题目)
先来先服务最短作业优先
最短剩余时间优先
-
交互式中的调度算法
轮转调度
优先级调度
多级队列
最短进程优先
保证调度
彩票调度
公平分享调度
-
实时系统中的调度算法
-
用户级线程和内核级线程的调度
3. 死锁
-
死锁:一种两种或两种以上的相互竞争的行动都在等待对方完成的情况
如果一个进程集合中的每个进程都在等待只能由该进程集合中的其他进程才能引发的事件,那么该进程集合就是死锁的
-
死锁原因:
竞争资源
调度顺序
-
死锁的四个必要条件
互斥条件。每个资源要么分配给一个进程,要么就是可用的
占有和等待条件。已经得到了某个资源的进程可以再请求新的资源
不可抢占条件。已经分配给一个进程的资源不能强制性地被抢占,它只能被占有它的进程显式释放
环路等待条件。死锁发生时,系统中一定有由两个或两个以上的进程组成的一条环路,该环路中的每个进程都在等待着下一个进程所占有的资源
-
四种处理死锁的方式:
- 鸵鸟,即假装不知道
- 检测死锁并恢复。让死锁发生,,一旦发生死锁,采取行动解决问题
- 仔细对资源进行分配,动态避免死锁
- 通过破坏死锁的四个必要条件来预防死锁
-
死锁检测与恢复
- 检测
- 每种类型一个资源的死锁检测 判断是否存在环
- 每种类型多个资源的死锁检测 基于矩阵
- 恢复
- 利用抢占恢复
- 利用回滚恢复
- 通过杀死进程恢复
-
死锁避免
- 资源轨迹图
- 安全状态:存在某种调度使得每个进程都完成
- 不安全状态:不安全状态不是死锁
- 单个资源的银行家算法:对每一个请求进行检查,检查该请求是否会到达安全状态
- 多个资源的银行家算法:基于矩阵
-
死锁预防
- 破坏互斥条件。假脱机
- 破坏占有并等待条件。如果资源全部可用,则分配。否则,等待
- 破坏不可抢占条件。虚拟化
- 破坏环路等待条件。顺序
-
两阶段加锁(数据库领域)
第一阶段,进程试图对所有所需的记录进行加锁,一次锁一个记录。如果第一阶段加锁成功,就开始第二阶段,完成更新并释放锁。
-
通信死锁
-
活锁
-
饥饿
4. 内存管理
1. 为什么需要内存抽象
因为我们想要在内存中同时运行多个程序且保证不发生地址空间不发生冲突。所以,我们要对程序屏蔽掉绝对物理地址,而给他一个虚拟物理地址,让它以为自己拥有了整个物理地址。
2. 简单可变划分
3. 可变划分空闲内存管理法
-
位图
浪费空间,找合适的空闲块比较耗费时间
-
链表法
链表每一个结点都包含 空闲(H)/进程(P)、起始地址、长度、下一节点指针
4. 可变划分算法
- 首次适配(First Fit)
- 下次适配(Next Fit)不从头开始找
- 最佳适配(Best Fit)令人惊奇的是,它会浪费更多内存,因为它生成了许多小内存块
- 最差适配(Worst Fit)
- 快速适配(Quick Fit)为常用大小的空闲块维护单独的链表 4-8-12 占用时快速,合并时费时
- 伙伴式内存管理
5. 消除内存碎片
动态迁移、压缩
6. 交换与覆盖(swap overlay)
当不常用时,由主存写进磁盘。当再次使用时,再写进主存。由于块很大,所以消耗的时间比较多。把程序分割成许多小块。交给程序去做,容易出错。
所以需要一种新的离散化并交给计算机去做的方式存储,虚拟内存,分页与分段
7. 虚拟内存
每个程序拥有自己的地址空间,这个空间被分割成多个块,每一块称为一页
8. 分段(使程序和数据被划分为独立的地址空间并且有助于共享和保护)
- 段号、段内偏移量
- 段表
- 缺点:
- 内存碎片(外部内存碎片、内部内存碎片)
- 内存交换的效率低
9. 分页(能得到更大的线性地址空间而不必购买更大的存储器)
-
地址 -> 页号、页内偏移量
-
陷阱 -> 缺页中断、缺页错误
-
页表:页号 -> 页框号
-
问题:
- 虚拟内存映射到物理内存的速度(时间)
- 页表的大小(每个进程都有自己的页表)(空间)
-
TLB 转换检测缓冲区 快表 相联存储器
相当于 cache,利用了访问局部性原理
-
多级页表
原理就是在单级页表中虽然页表项很多,但很多是空着的。我们可以把一些空着的页表项整合成一项。
对于 64 位的系统,两级分⻚肯定不够了,就变成了四级⽬录
-
倒排页表
页框对应一个表项
节省空间,但从虚拟地址到物理地址转换变得困难
散列
在 64 位机器中很常见
-
如今采用段页式
10. 真正的虚拟内存
-
程序执行时必须要全部加载进内存吗
当然不是
-
局部性原理 时间局部性 空间局部性
-
请求分页
11. 页面置换算法
- 最优页面置换算法
- NRU 最近未使用
- 先进先出页面置换算法
- 第二次机会页面置换算法
- 时钟页面置换算法
- LRU 最近最久未使用 矩阵实现 栈实现
- NFU 最不常用 不会忘记任何事
- 老化算法 移位,然后再加到最左边
- LFU 最少使用置换算法
- page-buffering
- work set
- 工作集时钟算法
12. 概念
⭐
抖动/颠簸:若每执行几条指令程序就发生一次缺页中断,这种现象为程序发生抖动
解决方法:
- 局部替换算法
- 使用工作集模型
- L = S
- 挂起一些进程
13. 负载控制
由于颠簸,把不常用页交换进磁盘,把需要使用的交换进主存
14. 页面大小
5. 文件系统
1. 举例
9p adfs affs afs autofs ntfs
6. I/O
1. 程序控制I/O
忙等待
占用 CPU 的全部时间
嵌入式里可以接受,因为 CPU 也没有事情做
2. 中断驱动I/O
CPU 在等待 I/O 设备就绪时,可以做其他的事。在 I/O 设备就绪后,向 CPU 发送一个中断信号。之后,CPU 把数据从用户缓冲区搬运到内核缓冲区
3. DMA的I/O
DMA 控制器来实现数据的搬运,而不必打扰 CPU。CPU在这期间可以做其他工作。
4. channel I/O
通道,独立于 CPU 的专门负责输入输出控制的处理机,它控制设备与内存直接进行数据交换。有自己的通道指令,这些指令由 CPU 启动,并在操作结束时向 CPU 发出中断信号。
直接程序控制方式和中断程序控制方式适合于低速设备的数据传送,而 DMA 方式虽然适合于高速设备的数据传送,但一个 DMA 控制器只能控制少量的同类设备,这远远不能满足大型计算机系统的需要。通常,一个大型计算机需要连接大量的高速和低速设备,通道控制方式可以满足这个要求。(DMA和通道控制方式的主要区别——能否满足大型计算机系统的既能处理高速设备又能处理低速设备的需要)
5. buffering
-
无缓冲
-
用户空间缓冲
-
单缓冲
-
双缓冲
-
循环缓冲区
6. 磁盘
磁盘 -> 柱面 -> 磁道 -> 扇区
7. 磁盘臂调度算法
- FCFS
- SSF
- 电梯法