操作系统
相关代码: https:// github.com/zhuzhenxxx/o step-code
介绍
第一部分 虚拟化
1.抽象:进程
- 抽象:进程
- 进程API
- 进程创建:更多细节
- 进程状态
- 数据结构
- 小结
2.插叙:进程API
- fork()系统调用
- wait()系统调用
- exec()系统调用
- 小结
3. 机制:受限直接执行
- 基本技巧
- 问题1:受限制的操作
- 问题2:在进程间切换
- 小结
4.进程调度
- 调度指标
- 先进先出(FIFO)
- 最短任务优先(SJF)
- 最短完成时间优先(STCF)
- 新度量指标:响应时间
- 轮转
- 结合I/O
- 无法预知
- 小结
5.多级反馈队列
- MLFQ:基本规则
- 尝试1:如何改变优先级
- 尝试2:提升优先级
- 尝试3:更好的计时方式
- MLFQ调优及其他问题
- 小结
6.比例份额
- 基本概念:彩票数表示份额
- 彩票机制
- 实现
- 一个例子
- 如何分配彩票
- 为什么不是确定的
- 小结
7.多处理器调度(高度)
- 背景:多处理器架构
- 别忘了同步
- 最后一个问题:缓存亲和度
- 单队列调度
- 多队列调度
- Linux多处理器调度
- 小结
8.抽象:地址空间
- 早起系统
- 多道程序和时分共享
- 地址空间
- 目标
- 小结
9.插叙:内存操作API
- 内存类型
- malloc()调用
- free() 调用
- 常见错误
- 底层操作系统支持
- 调用其他
- 小结
10.机制:地址转换
- 假设
- 例子
- 动态(基于硬件)重定位
- 硬件支持:总结
- 操作系统的问题
- 小结
11.分段
- 分段:泛化的基址/接线
- 我们引用哪个段
- 栈怎么办
- 支持共享
- 细粒度与粗粒度的分段
- 操作系统支持
- 小结
12.空闲空间管理
- 假设
- 底层机制
- 基本策略
- 其他方式
- 小结
13.分页:介绍
- 例子
- 页表存在哪里
- 页表中有什么
- 分页也很慢
- 内存追踪
- 小结
14.分页:快速地址转换(TLB)
- TLB的基本算法
- 示例:访问数组
- 谁来处理TLB未命中
- TLB的内容
- 上下文切换时对TLB的处理
- TLB替换策略
- 实际系统的TLB表项
- 小结
15.分页:较小的表
- 简单的解决方案:更大的页
- 混合方法:分段和分页
- 多级页表
- 反向页表
- 将页表交换到磁盘
- 小结
16.超越物理内存:机制
- 交换空间
- 存在位
- 页错误
- 页存满了怎么办
- 页错误处理流程
- 交换何时真正发生
- 小结
17.超越物理内存:策略
- 缓存管理
- 最优替换策略
- 简单策略:FIFO
- 另一简单策略:随机
- 利用历史数据:LRU
- 工作负载示例
- 基于历史信息的算法
- 近似LRU
- 考虑脏页
- 其他虚拟内存策略
- 抖动
- 小结
18.VAX/VMS虚拟内存系统
- 背景
- 内存管理硬件
- 一个真实的地址空间
- 也替换
- 其他漂亮的虚拟内存技巧
- 小结
并发
1.并发:介绍
- 实例:线程创建
- 为什么更糟糕:共享数据
- 核心问题:不可控的调度
- 原子性愿望
- 等待另一个线程
- 小结:操作系统为什么要研究并发
- 小结
2.插叙:线程API
- 线程创建
- 线程完成
- 锁
- 条件变量
- 编译和运行
- 小结
3.锁
- 锁的基本思想
- Pthread锁
- 实现一个锁
- 评价锁
- 控制中断
- 测试并设置指令(原子交换)
- 实现可用的自旋锁
- 评价自旋锁
- 比较并交换
- 链接的加载和条件式存储指令
- 获取并增加
- 自旋过多怎么办
- 简单方法:让我出来吧,宝贝
- 使用队列:休眠替代自旋
- 不同操作系统,不同实现
- 两阶段锁
- 小结
4.基于锁的并发数据结构
- 并发计数器
- 并发链表
- 并发队列
- 并发散列表
- 小结
5.条件变量
- 定义和程序
- 生产者/消费者问题(有界缓冲区)
- 覆盖条件
- 小结
6.信号量
- 信号量的定义
- 二值信号量(锁)
- 信号量作为条件变量
- 生产者/消费者(有界缓冲区)
- 读者-写者锁
- 哲学家就餐问题
- 如何实现信号量
- 小结
7.常见并发问题
- 有哪些类型的缺陷
- 非死锁缺陷
- 死锁缺陷
- 小结
8.基于事件的并发(进阶)
- 基本想法:事件循环
- 重要API:select()、poll
- 使用select
- 为何更简单?无须锁
- 一个问题:阻塞系统调用
- 解决方案:异步I/O
- 另一个问题:状态管理
- 什么事情仍然很难
- 小结
持久性
1.I/O设备
- 系统架构
- 标准设备
- 标准协议
- 利用中断建设CPU开销
- 利用DMA进行更高效的数据传送
- 设备交互的方法
- 纳入操作系统:设备驱动程序
- 案例研究:简单的IDE磁盘驱动程序
- 历史记录
- 小结
2.磁盘驱动器
- 接口
- 基本几何形状
- 简单的磁盘驱动器
- I/O时间:用数学
- 磁盘调度
- 小结
3.廉价冗余磁盘阵列(RAID)
- 接口和RAID内部
- 故障模型
- 如何评估RAID
- RAID 0级:条带化
- RAID 1级:镜像
- RAID 4级:通过奇偶校验节省空间
- RAID 5级:旋转奇偶校验
- 其他有趣的RAID问题
- 小结
4.插叙:文件和目录
- 文件和目录
- 文件系统接口
- 创建文件
- 读写文件
- 读取和写入,但不按顺序
- 用fsync()立即写入
- 文件重命名
- 获取文件信息
- 删除文件
- 创建目录
- 删除目录
- 硬链接
- 符号链接
- 创建并挂载文件系统
- 小结
5.文件系统的实现
- 思考方式
- 整体组织
- 文件组织:inode
- 目录组织
- 空闲空间管理
- 访问路径:读取和写入
- 缓存和缓冲
- 小结
6.局部性和快速文件系统
- 问题:性能不佳
- FFS:磁盘意识是解决方案
- 组织结构:柱面组
- 策略:如何分配文件和目录
- 测量文件的局部性
- 大文件例外
- 关于FFS的其他几件事
- 小结
7.崩溃一致性:FSCK和日志
- 例子
- 解决方案1.文件系统检查程序
- 解决方案2.日志 或 预写日志
- 解决方案3.其他方法
- 小结
8.日志结构文件系统
- 按顺序写入磁盘
- 顺序而高效的写入
- 要缓冲多少
- 问题:查找inode
- 通过间接解决方案:inode映射
- 检查点区域
- 从磁盘读取文件:回顾
- 目录如何
- 一个新问题:垃圾收集
- 确定块的死活
- 策略问题:要清理哪些块,何时清理
- 崩溃恢复和日志
- 小结
9.数据完整性和保护
- 磁盘故障模式
- 处理潜在的扇区错误
- 检测讹误:校验和
- 使用校验和
- 一个新问题:错误的写入
- 最后一个问题:丢失的写入
- 擦净
- 检验和的开学
- 小结
10.分布式系统
- 通信基础
- 不可靠的通信层
- 可靠的通信层
- 通信抽象
- 远程过程调用RPC
- 小结
11.Sun的网络文件系统(NFS)
- 基本的分布式文件系统
- 交出NFS
- 关注点:简单快速的服务器崩溃恢复
- 快速崩溃恢复的关键:无状态
- NFSv2协议
- 从协议到分布式文件系统
- 利用幂等操作处理服务器故障
- 提高性能:客户端缓存
- 缓存一致性问题
- 评估NFS的缓存一致性
- 服务器端写缓存的隐含意义
- 小结
12.Andrew文件系统(AFS)
- AFS版本1
- 版本1的问题
- 改进协议
- AFS版本2
- 缓存一致性
- 崩溃恢复
- AFSv2的性能扩展性和性能
- 其他改进
- 小结