Logo
☆☆☆☆☆
0.0
Intermediate
40h

操作系统:虚拟化、并发与持久性

本课程围绕操作系统的三大核心主题展开:虚拟化、并发和持久性。你将学习 CPU 调度与进程、地址空间、分页、TLB、交换等虚拟化机制,线程、锁、条件变量、信号量与并发错误,以及 I/O 设备、磁盘、RAID、文件系统、日志、SSD 和数据完整性等持久性内容。课程最后还会介绍分布式系统、网络文件系统(NFS)与 Andrew 文件系统(AFS)。

40 Lessons
Included in Subscription Plan
Personalized Learning
Powered by AI
操作系统:虚拟化、并发与持久性
本课程围绕操作系统的三大核心主题展开:虚拟化、并发和持久性。你将学习 CPU 调度与进程、地址空间、分页、TLB、交换等虚拟化机制,线程、锁、条件变量、信号量与并发错误,以及 I/O 设备、磁盘、RAID、文件系统、日志、SSD 和数据完整性等持久性内容。课程最后还会介绍分布式系统、网络文件系统(N...

WHAT YOU'LL LEARN

理解操作系统虚拟化、并发与持久性三大核心概念及其相互关系。

Content

40 Lessons • 0 Quizzes • 0 Challenges

简介
  1. 1

    关于课程的一次对话

  2. 2

    操作系统入门

  3. 3

    虚拟化CPU

  4. 4

    内存虚拟化

  5. 5

    并发

  6. 6

    持久化

  7. 7

    设计目标

  8. 8

    一些历史

  9. 9

    总结

虚拟化:进程
  1. 1

    关于虚拟化的对话

  2. 2

    进程简介

  3. 3

    抽象:进程

  4. 4

    进程 API

  5. 5

    进程创建:更详细的说明

  6. 6

    进程状态

  7. 7

    数据结构

  8. 8

    总结

  9. 9

    模拟器

  10. 10

    练习

  11. 11

    进程测验

虚拟化:进程 API
  1. 1

    进程 API 简介

  2. 2

    fork() 系统调用

  3. 3

    wait() 系统调用

  4. 4

    最后,exec() 系统调用

  5. 5

    为什么?API 的设计动机

  6. 6

    进程控制与用户

  7. 7

    有用的工具

  8. 8

    总结

  9. 9

    练习

  10. 10

    进程 API 测验

虚拟化:直接执行
  1. 1

    直接执行简介

  2. 2

    基础技巧:有限直接执行

  3. 3

    问题1:受限操作

  4. 4

    问题2:在进程之间切换

  5. 5

    担心并发问题吗?

  6. 6

    总结

  7. 7

    练习

  8. 8

    直接执行测验

虚拟化:CPU调度
  1. 1

    CPU调度简介

  2. 2

    工作负载假设与调度指标

  3. 3

    先进先出(FIFO)

  4. 4

    最短作业优先(SJF)

  5. 5

    最短完成时间优先(STCF)

  6. 6

    新指标:响应时间

  7. 7

    轮转法

  8. 8

    引入输入/输出

  9. 9

    总结

  10. 10

    模拟器

  11. 11

    练习

  12. 12

    CPU 调度测验

虚拟化:多级反馈
  1. 1

    多级反馈队列简介

  2. 2

    MLFQ:基本规则

  3. 3

    尝试1:如何更改优先级

  4. 4

    尝试二:优先级提升

  5. 5

    尝试三:更完善的计账

  6. 6

    调优多级反馈队列(MLFQ)及其他问题

  7. 7

    总结

  8. 8

    模拟器

  9. 9

    练习

  10. 10

    多级反馈队列测验

虚拟化:彩票调度
  1. 1

    彩票调度简介

  2. 2

    基本概念:票券代表你的份额

  3. 3

    票务机制

  4. 4

    实现

  5. 5

    一个示例

  6. 6

    为什么不是确定性的?

  7. 7

    Linux 完全公平调度器(CFS)

  8. 8

    权重(优先级)

  9. 9

    CFS 的红黑树与睡眠进程处理

  10. 10

    总结

  11. 11

    模拟器

  12. 12

    练习

  13. 13

    关于彩票调度的测验

虚拟化:多CPU调度
  1. 1

    多CPU调度简介

  2. 2

    背景:多处理器架构

  3. 3

    不要忘记同步

  4. 4

    最后一个问题:缓存亲和性

  5. 5

    单队列调度

  6. 6

    多队列调度

  7. 7

    Linux 多处理器调度器

  8. 8

    总结

  9. 9

    模拟器

  10. 10

    练习

  11. 11

    多CPU调度测验

  12. 12

    CPU虚拟化概述对话

虚拟化:地址空间
  1. 1

    关于内存虚拟化的对话

  2. 2

    早期系统

  3. 3

    多道程序设计与分时

  4. 4

    地址空间

  5. 5

    目标

  6. 6

    总结

  7. 7

    练习

  8. 8

    地址空间测验

虚拟化:内存 API
  1. 1

    内存 API 简介

  2. 2

    内存的类型

  3. 3

    malloc() 函数调用

  4. 4

    free() 函数调用

  5. 5

    常见错误

  6. 6

    操作系统底层支持

  7. 7

    其他调用

  8. 8

    摘要

  9. 9

    练习

  10. 10

    内存 API 测验

虚拟化:地址转换
  1. 1

    地址转换简介

  2. 2

    假设

  3. 3

    一个示例

  4. 4

    动态(基于硬件的)重定位

  5. 5

    硬件支持:概述

  6. 6

    操作系统问题

  7. 7

    总结

  8. 8

    模拟器

  9. 9

    练习

  10. 10

    地址转换测验

虚拟化:分段
  1. 1

    分段简介

  2. 2

    分段:通用基址与界限

  3. 3

    我们指的是哪个部分?

  4. 4

    栈是什么?

  5. 5

    共享支持

  6. 6

    细粒度分割与粗粒度分割

  7. 7

    操作系统支持

  8. 8

    总结

  9. 9

    模拟器

  10. 10

    练习

  11. 11

    分段测验

虚拟化:空闲空间管理
  1. 1

    空闲空间管理简介

  2. 2

    假设

  3. 3

    底层机制

  4. 4

    基础策略

  5. 5

    其他方法

  6. 6

    总结

  7. 7

    模拟器

  8. 8

    练习

  9. 9

    关于空闲空间管理的测验

虚拟化:分页简介
  1. 1

    分页简介

  2. 2

    一个简单的示例与概述

  3. 3

    页表存储在何处?

  4. 4

    页表中实际包含什么?

  5. 5

    分页:同样太慢

  6. 6

    内存追踪

  7. 7

    总结

  8. 8

    模拟器

  9. 9

    练习

  10. 10

    分页入门测验

虚拟化:转换检测缓冲区
  1. 1

    翻译后备缓冲器简介

  2. 2

    TLB 基本算法

  3. 3

    示例:访问数组

  4. 4

    谁处理TLB缺失?

  5. 5

    TLB 内容:里面有什么?

  6. 6

    TLB 问题:上下文切换

  7. 7

    问题:替换策略

  8. 8

    一个真实的TLB条目

  9. 9

    总结

  10. 10

    练习

  11. 11

    关于快表(Translation Lookaside Buffer)的测验

虚拟化:高级页表
  1. 1

    高级页表简介

  2. 2

    简单解决方案:更大的页面

  3. 3

    混合方法:分页与分段

  4. 4

    多级页表

  5. 5

    反向页表

  6. 6

    将页表交换到磁盘

  7. 7

    总结

  8. 8

    模拟器

  9. 9

    练习

  10. 10

    高级页表测验

虚拟化:交换:机制
  1. 1

    交换机制简介

  2. 2

    交换空间

  3. 3

    存在位(concept)

  4. 4

    缺页中断

  5. 5

    如果内存已满怎么办?

  6. 6

    页面错误控制流

  7. 7

    替换真正发生的情况

  8. 8

    总结

  9. 9

    练习说明

  10. 10

    练习

  11. 11

    关于交换机制的测验

虚拟化:交换:策略
  1. 1

    页面置换:策略

  2. 2

    缓存管理

  3. 3

    最佳置换策略

  4. 4

    一种简单的策略:先进先出(FIFO)

  5. 5

    另一种简单的策略:随机

  6. 6

    使用历史:最近最少使用(LRU)

  7. 7

    工作负载示例

  8. 8

    实现历史算法

  9. 9

    近似 LRU

  10. 10

    考虑脏页

  11. 11

    其他虚拟内存策略

  12. 12

    颠簸

  13. 13

    总结

  14. 14

    模拟器

  15. 15

    练习

  16. 16

    关于交换策略的测验

虚拟化:完整的虚拟内存系统
  1. 1

    完整虚拟内存系统简介

  2. 2

    VAX/VMS 虚拟内存:内存管理硬件

  3. 3

    VAX/VMS 虚拟内存:一个真实的地址空间

  4. 4

    VAX/VMS 虚拟内存:页面替换

  5. 5

    VAX/VMS 虚拟内存:其他巧妙技巧

  6. 6

    Linux虚拟内存系统:Linux地址空间

  7. 7

    Linux虚拟内存系统:页表结构

  8. 8

    Linux虚拟内存系统:大页支持

  9. 9

    Linux虚拟内存系统:页缓存

  10. 10

    Linux虚拟内存系统:安全与缓冲区溢出

  11. 11

    Linux虚拟内存系统:其他安全问题

  12. 12

    总结

  13. 13

    虚拟机系统完整测验

  14. 14

    内存虚拟化概述对话

并发:并发与线程
  1. 1

    并发对话

  2. 2

    并发与线程简介

  3. 3

    为什么要使用线程?

  4. 4

    一个示例:线程创建

  5. 5

    为什么情况会恶化:共享数据

  6. 6

    问题的核心:不可控的调度

  7. 7

    对原子性的渴望

  8. 8

    还有一个问题:等待另一个

  9. 9

    总结:为什么在操作系统课程中?

  10. 10

    模拟器

  11. 11

    练习

  12. 12

    并发与线程测验

并发:线程API
  1. 1

    线程 API 简介

  2. 2

    线程创建

  3. 3

    线程完成

  4. 4

    锁

  5. 5

    条件变量

  6. 6

    编译和运行

  7. 7

    总结

  8. 8

    模拟器

  9. 9

    练习

  10. 10

    线程 API 测验

并发:锁
  1. 1

    锁的简介

  2. 2

    锁:基本概念

  3. 3

    线程锁

  4. 4

    构建一个锁

  5. 5

    评估锁

  6. 6

    控制中断

  7. 7

    一次失败的尝试:仅使用加载/存储

  8. 8

    使用测试并设置构建有效的自旋锁

  9. 9

    评估自旋锁

  10. 10

    比较并交换

  11. 11

    加载-链接与条件存储

  12. 12

    Fetch-And-Add

  13. 13

    过度自旋:现在该怎么办?

  14. 14

    一种简单的方法:只需使用 yield,宝贝

  15. 15

    使用队列:睡眠而非忙等待

  16. 16

    不同的操作系统,不同的支持

  17. 17

    两阶段锁

  18. 18

    总结

  19. 19

    练习

  20. 20

    锁的测验

并发:加锁的数据结构
  1. 1

    锁数据结构简介

  2. 2

    并发计数器

  3. 3

    并发链表

  4. 4

    并发队列

  5. 5

    并发哈希表

  6. 6

    总结

  7. 7

    练习

  8. 8

    关于锁定数据结构的测验

并发:条件变量
  1. 1

    条件变量简介

  2. 2

    定义与例程

  3. 3

    生产者/消费者(有限缓冲区)问题

  4. 4

    更好,但仍有问题:使用 While 而非 If

  5. 5

    单缓冲区生产者/消费者解决方案

  6. 6

    覆盖条件

  7. 7

    总结

  8. 8

    练习说明

  9. 9

    练习

  10. 10

    条件变量测验

并发:信号量
  1. 1

    信号量简介

  2. 2

    信号量:定义

  3. 3

    二进制信号量(锁)

  4. 4

    信号量用于控制顺序

  5. 5

    生产者/消费者(有界缓冲区)问题

  6. 6

    扩展解决方案以支持多个生产者和消费者

  7. 7

    读写锁

  8. 8

    哲学家就餐问题

  9. 9

    线程限流

  10. 10

    信号量的实现方法

  11. 11

    总结

  12. 12

    练习

  13. 13

    信号量测验

并发:并发错误
  1. 1

    并发缺陷简介

  2. 2

    有哪些类型的错误存在?

  3. 3

    非死锁类错误

  4. 4

    死锁问题

  5. 5

    预防

  6. 6

    通过调度实现死锁避免

  7. 7

    检测与恢复

  8. 8

    总结

  9. 9

    练习说明

  10. 10

    练习

  11. 11

    并发错误测验

并发:基于事件的并发
  1. 1

    事件驱动并发简介

  2. 2

    基本概念:事件循环

  3. 3

    一个重要的 API:select() 或 poll()

  4. 4

    使用 select()

  5. 5

    一个问题:阻塞系统调用

  6. 6

    解决方案:异步 I/O

  7. 7

    另一个问题:状态管理

  8. 8

    事件处理仍然存在哪些困难?

  9. 9

    总结

  10. 10

    练习

  11. 11

    关于基于事件的并发性测验

  12. 12

    并发总结

持久性:输入/输出设备
  1. 1

    关于持久性的一次对话

  2. 2

    输入/输出设备简介

  3. 3

    系统架构

  4. 4

    一个标准设备

  5. 5

    标准协议

  6. 6

    通过中断降低CPU开销

  7. 7

    使用DMA实现更高效的数据传输

  8. 8

    设备交互方法

  9. 9

    融入操作系统:设备驱动程序

  10. 10

    案例研究:一个简单的IDE磁盘驱动程序

  11. 11

    历史笔记

  12. 12

    总结

  13. 13

    I/O 设备测验

持久性:硬盘驱动器
  1. 1

    硬盘驱动器简介

  2. 2

    接口

  3. 3

    基础几何

  4. 4

    一个简单的磁盘驱动器

  5. 5

    具有多个磁道的磁盘驱动器:寻道时间

  6. 6

    关于硬盘的更多详情

  7. 7

    I/O 时间:进行计算

  8. 8

    磁盘调度

  9. 9

    一些其他的调度问题

  10. 10

    总结

  11. 11

    模拟器

  12. 12

    练习

  13. 13

    关于硬盘驱动器的测验

持久性:冗余磁盘阵列(RAID)
  1. 1

    RAID(独立磁盘冗余阵列)是一种将多个物理磁盘组合成一个逻辑单元的技术,旨在提高数据存储的性能、可靠性和容量。通过数据条带化、镜像或奇偶校验等机制,RAID可以在不同级别实现不同的目标,例如提升读写速度、提供数据冗余以防止硬件故障导致的数据丢失,或同时兼顾性能与容错能力。 常见的RAID级别包括: - RAID 0:数据被分块并分布在多个磁盘上,显著提升读写性能,但无冗余,任何一块磁盘损坏都会导致全部数据丢失。 - RAID 1:通过磁盘镜像实现数据冗余,每块数据在两个磁盘上保存副本,具有高可靠性,但存储效率较低。 - RAID 5:使用分布式奇偶校验,允许单个磁盘故障而不丢失数据,兼顾性能和冗余,需要至少三块磁盘。 - RAID 6:在RAID 5基础上增加双重奇偶校验,可容忍两块磁盘同时故障,适合对数据安全性要求更高的场景。 - RAID 10:结合RAID 1和RAID 0的优点,先镜像再条带化,提供高性能和高可靠性,但成本较高。 选择合适的RAID级别需根据具体的应用需求,如对性能、数据安全性和成本的权衡。

  2. 2

    接口与RAID内部原理

  3. 3

    故障模型

  4. 4

    如何评估RAID

  5. 5

    RAID 0:条带化

  6. 6

    RAID 1:镜像

  7. 7

    RAID 4:通过奇偶校验节省空间

  8. 8

    RAID 5:旋转奇偶校验

  9. 9

    RAID 对比:简要总结

  10. 10

    其他有趣的RAID问题

  11. 11

    总结

  12. 12

    模拟器

  13. 13

    练习

  14. 14

    RAID(冗余磁盘阵列)测验

持久化:文件与目录
  1. 1

    文件与目录简介

  2. 2

    文件和目录

  3. 3

    文件系统接口

  4. 4

    读取和写入文件

  5. 5

    读取和写入,但不是按顺序

  6. 6

    共享文件表项:fork() 和 dup()

  7. 7

    使用 fsync() 立即写入

  8. 8

    重命名文件

  9. 9

    获取文件信息

  10. 10

    删除文件

  11. 11

    创建目录

  12. 12

    读取和删除目录

  13. 13

    硬链接

  14. 14

    符号链接

  15. 15

    权限位与访问控制列表

  16. 16

    创建和挂载文件系统

  17. 17

    总结

  18. 18

    练习

  19. 19

    文件与目录测验

持久性:文件系统实现
  1. 1

    文件系统实现简介

  2. 2

    思考的方式

  3. 3

    整体结构

  4. 4

    文件组织:索引节点(Inode)

  5. 5

    目录结构

  6. 6

    空闲空间管理

  7. 7

    访问路径:读取与写入

  8. 8

    缓存与缓冲

  9. 9

    总结

  10. 10

    模拟器

  11. 11

    练习

  12. 12

    文件系统实现测验

持久化:快速文件系统
  1. 1

    快速文件系统简介

  2. 2

    问题:性能不佳

  3. 3

    FFS:磁盘感知是解决方案

  4. 4

    策略:如何分配文件和目录

  5. 5

    衡量文件局部性

  6. 6

    大文件异常

  7. 7

    关于FFS的其他几点事项

  8. 8

    总结

  9. 9

    模拟器

  10. 10

    练习

  11. 11

    文件系统快速测试

持久性:文件系统检查与日志记录
  1. 1

    文件系统检查与日志功能简介

  2. 2

    一个详细的示例

  3. 3

    解决方案一:文件系统检查工具

  4. 4

    解决方案二:日志记录(或预写日志)

  5. 5

    元数据日志

  6. 6

    解决方案三:其他方法

  7. 7

    摘要

  8. 8

    模拟器

  9. 9

    练习

  10. 10

    关于 fsck 和日志功能的测验

持久性:日志结构文件系统
  1. 1

    日志结构文件系统简介

  2. 2

    顺序写入磁盘

  3. 3

    按顺序且高效地写入

  4. 4

    缓冲区应该多大?

  5. 5

    问题:查找索引节点

  6. 6

    通过间接寻址实现的解决方案:inode映射

  7. 7

    完成解决方案:检查点区域

  8. 8

    从磁盘读取文件:回顾

  9. 9

    目录又如何呢?

  10. 10

    一个新的问题:垃圾回收

  11. 11

    确定区块活跃性

  12. 12

    策略问题:何时清理哪些块?

  13. 13

    崩溃恢复与日志

  14. 14

    总结

  15. 15

    模拟器

  16. 16

    练习

  17. 17

    日志结构文件系统测验

持久性:基于闪存的固态硬盘
  1. 1

    基于闪存的固态硬盘简介

  2. 2

    存储一个比特

  3. 3

    从比特到库/平面

  4. 4

    基本的闪存操作

  5. 5

    Flash性能与可靠性

  6. 6

    从原始闪存到基于闪存的固态硬盘

  7. 7

    FTL组织:一种糟糕的方法

  8. 8

    日志结构的FTL

  9. 9

    垃圾回收

  10. 10

    映射表大小

  11. 11

    磨损均衡

  12. 12

    SSD性能与成本

  13. 13

    总结

  14. 14

    模拟器

  15. 15

    练习

  16. 16

    关于基于闪存的固态硬盘的测验

持久性:数据完整性和保护
  1. 1

    数据完整性和保护简介

  2. 2

    磁盘故障模式

  3. 3

    处理隐性扇区错误

  4. 4

    检测损坏:校验和

  5. 5

    使用校验和

  6. 6

    一个新的问题:错误的写入

  7. 7

    最后一个难题:丢失写入

  8. 8

    清理

  9. 9

    校验和的开销

  10. 10

    摘要

  11. 11

    模拟器

  12. 12

    练习

  13. 13

    数据完整性和保护测验

  14. 14

    持久化对话总结

分布:分布式系统
  1. 1

    关于分发的对话

  2. 2

    分布式系统入门

  3. 3

    通信基础

  4. 4

    不可靠的通信层

  5. 5

    可靠的通信层

  6. 6

    通信抽象

  7. 7

    远程过程调用(RPC)

  8. 8

    总结

  9. 9

    练习

  10. 10

    分布式系统测验

分布式:网络文件系统(NFS)
  1. 1

    网络文件系统(NFS)简介

  2. 2

    一个基本的分布式文件系统

  3. 3

    接下来是NFS

  4. 4

    快速崩溃恢复的关键:无状态性

  5. 5

    NFSv2 协议

  6. 6

    从协议到分布式文件系统

  7. 7

    使用幂等操作处理服务器故障

  8. 8

    提升性能:客户端缓存

  9. 9

    缓存一致性问题

  10. 10

    对服务器端写入缓冲的影响

  11. 11

    总结

  12. 12

    练习说明

  13. 13

    练习

  14. 14

    NFS(网络文件系统)测验

分布:Andrew 文件系统(AFS)
  1. 1

    Andrew 文件系统(AFS)简介

  2. 2

    AFS 版本 1

  3. 3

    版本1的问题

  4. 4

    AFS 版本 2

  5. 5

    缓存一致性

  6. 6

    崩溃恢复

  7. 7

    AFSv2 的扩展性与性能

  8. 8

    AFS:其他改进

  9. 9

    总结

  10. 10

    模拟器

  11. 11

    练习

  12. 12

    关于Andrew文件系统(AFS)的测验

  13. 13

    分布式系统中的通信与协调机制总结对话

Certificate of Completion

Showcase your accomplishment by sharing your certificate of completion.

Course Author:Anonymous User

Reviews

Read reviews from students who have taken this course and share your own experience.

Reviews & Comments (0)