Content
40 Lessons • 0 Quizzes • 0 Challenges
简介
- 1
关于课程的一次对话
- 2
操作系统入门
- 3
虚拟化CPU
- 4
内存虚拟化
- 5
并发
- 6
持久化
- 7
设计目标
- 8
一些历史
- 9
总结
虚拟化:进程
- 1
关于虚拟化的对话
- 2
进程简介
- 3
抽象:进程
- 4
进程 API
- 5
进程创建:更详细的说明
- 6
进程状态
- 7
数据结构
- 8
总结
- 9
模拟器
- 10
练习
- 11
进程测验
虚拟化:进程 API
- 1
进程 API 简介
- 2
fork() 系统调用
- 3
wait() 系统调用
- 4
最后,exec() 系统调用
- 5
为什么?API 的设计动机
- 6
进程控制与用户
- 7
有用的工具
- 8
总结
- 9
练习
- 10
进程 API 测验
虚拟化:直接执行
- 1
直接执行简介
- 2
基础技巧:有限直接执行
- 3
问题1:受限操作
- 4
问题2:在进程之间切换
- 5
担心并发问题吗?
- 6
总结
- 7
练习
- 8
直接执行测验
虚拟化:CPU调度
- 1
CPU调度简介
- 2
工作负载假设与调度指标
- 3
先进先出(FIFO)
- 4
最短作业优先(SJF)
- 5
最短完成时间优先(STCF)
- 6
新指标:响应时间
- 7
轮转法
- 8
引入输入/输出
- 9
总结
- 10
模拟器
- 11
练习
- 12
CPU 调度测验
虚拟化:多级反馈
- 1
多级反馈队列简介
- 2
MLFQ:基本规则
- 3
尝试1:如何更改优先级
- 4
尝试二:优先级提升
- 5
尝试三:更完善的计账
- 6
调优多级反馈队列(MLFQ)及其他问题
- 7
总结
- 8
模拟器
- 9
练习
- 10
多级反馈队列测验
虚拟化:彩票调度
- 1
彩票调度简介
- 2
基本概念:票券代表你的份额
- 3
票务机制
- 4
实现
- 5
一个示例
- 6
为什么不是确定性的?
- 7
Linux 完全公平调度器(CFS)
- 8
权重(优先级)
- 9
CFS 的红黑树与睡眠进程处理
- 10
总结
- 11
模拟器
- 12
练习
- 13
关于彩票调度的测验
虚拟化:多CPU调度
- 1
多CPU调度简介
- 2
背景:多处理器架构
- 3
不要忘记同步
- 4
最后一个问题:缓存亲和性
- 5
单队列调度
- 6
多队列调度
- 7
Linux 多处理器调度器
- 8
总结
- 9
模拟器
- 10
练习
- 11
多CPU调度测验
- 12
CPU虚拟化概述对话
虚拟化:地址空间
- 1
关于内存虚拟化的对话
- 2
早期系统
- 3
多道程序设计与分时
- 4
地址空间
- 5
目标
- 6
总结
- 7
练习
- 8
地址空间测验
虚拟化:内存 API
- 1
内存 API 简介
- 2
内存的类型
- 3
malloc() 函数调用
- 4
free() 函数调用
- 5
常见错误
- 6
操作系统底层支持
- 7
其他调用
- 8
摘要
- 9
练习
- 10
内存 API 测验
虚拟化:地址转换
- 1
地址转换简介
- 2
假设
- 3
一个示例
- 4
动态(基于硬件的)重定位
- 5
硬件支持:概述
- 6
操作系统问题
- 7
总结
- 8
模拟器
- 9
练习
- 10
地址转换测验
虚拟化:分段
- 1
分段简介
- 2
分段:通用基址与界限
- 3
我们指的是哪个部分?
- 4
栈是什么?
- 5
共享支持
- 6
细粒度分割与粗粒度分割
- 7
操作系统支持
- 8
总结
- 9
模拟器
- 10
练习
- 11
分段测验
虚拟化:空闲空间管理
- 1
空闲空间管理简介
- 2
假设
- 3
底层机制
- 4
基础策略
- 5
其他方法
- 6
总结
- 7
模拟器
- 8
练习
- 9
关于空闲空间管理的测验
虚拟化:分页简介
- 1
分页简介
- 2
一个简单的示例与概述
- 3
页表存储在何处?
- 4
页表中实际包含什么?
- 5
分页:同样太慢
- 6
内存追踪
- 7
总结
- 8
模拟器
- 9
练习
- 10
分页入门测验
虚拟化:转换检测缓冲区
- 1
翻译后备缓冲器简介
- 2
TLB 基本算法
- 3
示例:访问数组
- 4
谁处理TLB缺失?
- 5
TLB 内容:里面有什么?
- 6
TLB 问题:上下文切换
- 7
问题:替换策略
- 8
一个真实的TLB条目
- 9
总结
- 10
练习
- 11
关于快表(Translation Lookaside Buffer)的测验
虚拟化:高级页表
- 1
高级页表简介
- 2
简单解决方案:更大的页面
- 3
混合方法:分页与分段
- 4
多级页表
- 5
反向页表
- 6
将页表交换到磁盘
- 7
总结
- 8
模拟器
- 9
练习
- 10
高级页表测验
虚拟化:交换:机制
- 1
交换机制简介
- 2
交换空间
- 3
存在位(concept)
- 4
缺页中断
- 5
如果内存已满怎么办?
- 6
页面错误控制流
- 7
替换真正发生的情况
- 8
总结
- 9
练习说明
- 10
练习
- 11
关于交换机制的测验
虚拟化:交换:策略
- 1
页面置换:策略
- 2
缓存管理
- 3
最佳置换策略
- 4
一种简单的策略:先进先出(FIFO)
- 5
另一种简单的策略:随机
- 6
使用历史:最近最少使用(LRU)
- 7
工作负载示例
- 8
实现历史算法
- 9
近似 LRU
- 10
考虑脏页
- 11
其他虚拟内存策略
- 12
颠簸
- 13
总结
- 14
模拟器
- 15
练习
- 16
关于交换策略的测验
虚拟化:完整的虚拟内存系统
- 1
完整虚拟内存系统简介
- 2
VAX/VMS 虚拟内存:内存管理硬件
- 3
VAX/VMS 虚拟内存:一个真实的地址空间
- 4
VAX/VMS 虚拟内存:页面替换
- 5
VAX/VMS 虚拟内存:其他巧妙技巧
- 6
Linux虚拟内存系统:Linux地址空间
- 7
Linux虚拟内存系统:页表结构
- 8
Linux虚拟内存系统:大页支持
- 9
Linux虚拟内存系统:页缓存
- 10
Linux虚拟内存系统:安全与缓冲区溢出
- 11
Linux虚拟内存系统:其他安全问题
- 12
总结
- 13
虚拟机系统完整测验
- 14
内存虚拟化概述对话
并发:并发与线程
- 1
并发对话
- 2
并发与线程简介
- 3
为什么要使用线程?
- 4
一个示例:线程创建
- 5
为什么情况会恶化:共享数据
- 6
问题的核心:不可控的调度
- 7
对原子性的渴望
- 8
还有一个问题:等待另一个
- 9
总结:为什么在操作系统课程中?
- 10
模拟器
- 11
练习
- 12
并发与线程测验
并发:线程API
- 1
线程 API 简介
- 2
线程创建
- 3
线程完成
- 4
锁
- 5
条件变量
- 6
编译和运行
- 7
总结
- 8
模拟器
- 9
练习
- 10
线程 API 测验
并发:锁
- 1
锁的简介
- 2
锁:基本概念
- 3
线程锁
- 4
构建一个锁
- 5
评估锁
- 6
控制中断
- 7
一次失败的尝试:仅使用加载/存储
- 8
使用测试并设置构建有效的自旋锁
- 9
评估自旋锁
- 10
比较并交换
- 11
加载-链接与条件存储
- 12
Fetch-And-Add
- 13
过度自旋:现在该怎么办?
- 14
一种简单的方法:只需使用 yield,宝贝
- 15
使用队列:睡眠而非忙等待
- 16
不同的操作系统,不同的支持
- 17
两阶段锁
- 18
总结
- 19
练习
- 20
锁的测验
并发:加锁的数据结构
- 1
锁数据结构简介
- 2
并发计数器
- 3
并发链表
- 4
并发队列
- 5
并发哈希表
- 6
总结
- 7
练习
- 8
关于锁定数据结构的测验
并发:条件变量
- 1
条件变量简介
- 2
定义与例程
- 3
生产者/消费者(有限缓冲区)问题
- 4
更好,但仍有问题:使用 While 而非 If
- 5
单缓冲区生产者/消费者解决方案
- 6
覆盖条件
- 7
总结
- 8
练习说明
- 9
练习
- 10
条件变量测验
并发:信号量
- 1
信号量简介
- 2
信号量:定义
- 3
二进制信号量(锁)
- 4
信号量用于控制顺序
- 5
生产者/消费者(有界缓冲区)问题
- 6
扩展解决方案以支持多个生产者和消费者
- 7
读写锁
- 8
哲学家就餐问题
- 9
线程限流
- 10
信号量的实现方法
- 11
总结
- 12
练习
- 13
信号量测验
并发:并发错误
- 1
并发缺陷简介
- 2
有哪些类型的错误存在?
- 3
非死锁类错误
- 4
死锁问题
- 5
预防
- 6
通过调度实现死锁避免
- 7
检测与恢复
- 8
总结
- 9
练习说明
- 10
练习
- 11
并发错误测验
并发:基于事件的并发
- 1
事件驱动并发简介
- 2
基本概念:事件循环
- 3
一个重要的 API:select() 或 poll()
- 4
使用 select()
- 5
一个问题:阻塞系统调用
- 6
解决方案:异步 I/O
- 7
另一个问题:状态管理
- 8
事件处理仍然存在哪些困难?
- 9
总结
- 10
练习
- 11
关于基于事件的并发性测验
- 12
并发总结
持久性:输入/输出设备
- 1
关于持久性的一次对话
- 2
输入/输出设备简介
- 3
系统架构
- 4
一个标准设备
- 5
标准协议
- 6
通过中断降低CPU开销
- 7
使用DMA实现更高效的数据传输
- 8
设备交互方法
- 9
融入操作系统:设备驱动程序
- 10
案例研究:一个简单的IDE磁盘驱动程序
- 11
历史笔记
- 12
总结
- 13
I/O 设备测验
持久性:硬盘驱动器
- 1
硬盘驱动器简介
- 2
接口
- 3
基础几何
- 4
一个简单的磁盘驱动器
- 5
具有多个磁道的磁盘驱动器:寻道时间
- 6
关于硬盘的更多详情
- 7
I/O 时间:进行计算
- 8
磁盘调度
- 9
一些其他的调度问题
- 10
总结
- 11
模拟器
- 12
练习
- 13
关于硬盘驱动器的测验
持久性:冗余磁盘阵列(RAID)
- 1
RAID(独立磁盘冗余阵列)是一种将多个物理磁盘组合成一个逻辑单元的技术,旨在提高数据存储的性能、可靠性和容量。通过数据条带化、镜像或奇偶校验等机制,RAID可以在不同级别实现不同的目标,例如提升读写速度、提供数据冗余以防止硬件故障导致的数据丢失,或同时兼顾性能与容错能力。 常见的RAID级别包括: - RAID 0:数据被分块并分布在多个磁盘上,显著提升读写性能,但无冗余,任何一块磁盘损坏都会导致全部数据丢失。 - RAID 1:通过磁盘镜像实现数据冗余,每块数据在两个磁盘上保存副本,具有高可靠性,但存储效率较低。 - RAID 5:使用分布式奇偶校验,允许单个磁盘故障而不丢失数据,兼顾性能和冗余,需要至少三块磁盘。 - RAID 6:在RAID 5基础上增加双重奇偶校验,可容忍两块磁盘同时故障,适合对数据安全性要求更高的场景。 - RAID 10:结合RAID 1和RAID 0的优点,先镜像再条带化,提供高性能和高可靠性,但成本较高。 选择合适的RAID级别需根据具体的应用需求,如对性能、数据安全性和成本的权衡。
- 2
接口与RAID内部原理
- 3
故障模型
- 4
如何评估RAID
- 5
RAID 0:条带化
- 6
RAID 1:镜像
- 7
RAID 4:通过奇偶校验节省空间
- 8
RAID 5:旋转奇偶校验
- 9
RAID 对比:简要总结
- 10
其他有趣的RAID问题
- 11
总结
- 12
模拟器
- 13
练习
- 14
RAID(冗余磁盘阵列)测验
持久化:文件与目录
- 1
文件与目录简介
- 2
文件和目录
- 3
文件系统接口
- 4
读取和写入文件
- 5
读取和写入,但不是按顺序
- 6
共享文件表项:fork() 和 dup()
- 7
使用 fsync() 立即写入
- 8
重命名文件
- 9
获取文件信息
- 10
删除文件
- 11
创建目录
- 12
读取和删除目录
- 13
硬链接
- 14
符号链接
- 15
权限位与访问控制列表
- 16
创建和挂载文件系统
- 17
总结
- 18
练习
- 19
文件与目录测验
持久性:文件系统实现
- 1
文件系统实现简介
- 2
思考的方式
- 3
整体结构
- 4
文件组织:索引节点(Inode)
- 5
目录结构
- 6
空闲空间管理
- 7
访问路径:读取与写入
- 8
缓存与缓冲
- 9
总结
- 10
模拟器
- 11
练习
- 12
文件系统实现测验
持久化:快速文件系统
- 1
快速文件系统简介
- 2
问题:性能不佳
- 3
FFS:磁盘感知是解决方案
- 4
策略:如何分配文件和目录
- 5
衡量文件局部性
- 6
大文件异常
- 7
关于FFS的其他几点事项
- 8
总结
- 9
模拟器
- 10
练习
- 11
文件系统快速测试
持久性:文件系统检查与日志记录
- 1
文件系统检查与日志功能简介
- 2
一个详细的示例
- 3
解决方案一:文件系统检查工具
- 4
解决方案二:日志记录(或预写日志)
- 5
元数据日志
- 6
解决方案三:其他方法
- 7
摘要
- 8
模拟器
- 9
练习
- 10
关于 fsck 和日志功能的测验
持久性:日志结构文件系统
- 1
日志结构文件系统简介
- 2
顺序写入磁盘
- 3
按顺序且高效地写入
- 4
缓冲区应该多大?
- 5
问题:查找索引节点
- 6
通过间接寻址实现的解决方案:inode映射
- 7
完成解决方案:检查点区域
- 8
从磁盘读取文件:回顾
- 9
目录又如何呢?
- 10
一个新的问题:垃圾回收
- 11
确定区块活跃性
- 12
策略问题:何时清理哪些块?
- 13
崩溃恢复与日志
- 14
总结
- 15
模拟器
- 16
练习
- 17
日志结构文件系统测验
持久性:基于闪存的固态硬盘
- 1
基于闪存的固态硬盘简介
- 2
存储一个比特
- 3
从比特到库/平面
- 4
基本的闪存操作
- 5
Flash性能与可靠性
- 6
从原始闪存到基于闪存的固态硬盘
- 7
FTL组织:一种糟糕的方法
- 8
日志结构的FTL
- 9
垃圾回收
- 10
映射表大小
- 11
磨损均衡
- 12
SSD性能与成本
- 13
总结
- 14
模拟器
- 15
练习
- 16
关于基于闪存的固态硬盘的测验
持久性:数据完整性和保护
- 1
数据完整性和保护简介
- 2
磁盘故障模式
- 3
处理隐性扇区错误
- 4
检测损坏:校验和
- 5
使用校验和
- 6
一个新的问题:错误的写入
- 7
最后一个难题:丢失写入
- 8
清理
- 9
校验和的开销
- 10
摘要
- 11
模拟器
- 12
练习
- 13
数据完整性和保护测验
- 14
持久化对话总结
分布:分布式系统
- 1
关于分发的对话
- 2
分布式系统入门
- 3
通信基础
- 4
不可靠的通信层
- 5
可靠的通信层
- 6
通信抽象
- 7
远程过程调用(RPC)
- 8
总结
- 9
练习
- 10
分布式系统测验
分布式:网络文件系统(NFS)
- 1
网络文件系统(NFS)简介
- 2
一个基本的分布式文件系统
- 3
接下来是NFS
- 4
快速崩溃恢复的关键:无状态性
- 5
NFSv2 协议
- 6
从协议到分布式文件系统
- 7
使用幂等操作处理服务器故障
- 8
提升性能:客户端缓存
- 9
缓存一致性问题
- 10
对服务器端写入缓冲的影响
- 11
总结
- 12
练习说明
- 13
练习
- 14
NFS(网络文件系统)测验
分布:Andrew 文件系统(AFS)
- 1
Andrew 文件系统(AFS)简介
- 2
AFS 版本 1
- 3
版本1的问题
- 4
AFS 版本 2
- 5
缓存一致性
- 6
崩溃恢复
- 7
AFSv2 的扩展性与性能
- 8
AFS:其他改进
- 9
总结
- 10
模拟器
- 11
练习
- 12
关于Andrew文件系统(AFS)的测验
- 13
分布式系统中的通信与协调机制总结对话
Certificate of Completion
Showcase your accomplishment by sharing your certificate of completion.
Course Author:Anonymous User