操作系统课程建设的分析与实践探索

陈渝 向勇 李国良 任炬

2022年8月2日

人才培养与核心课程建设研讨会


报告内容

  • 背景介绍
    • 历史
    • 当前基本情况
  • 课程建设
    • 目标+策略
    • 基本思路
    • 具体实施

背景介绍

清华大学相关院系的操作系统课程

w:800


背景介绍 -- 历史

铁打的课程,流水的老师

时间任课老师教材实验
1997前史美林 张尧学 伍尚广计算机操作系统/
1998向勇无固定教材Nachos MIPS
2008~2017向勇 陈渝无固定教材uCore x86
2018~至今向勇 陈渝 李国良 任炬无固定教材uCore/rCore RISC-V

背景介绍 -- 历史

铁打的课程,流水的老师

  • 任课老师:李国良(2021)、任炬(2023)
  • 相关课程:
    • 大四本科:操作系统专题训练(2008年开始)
    • 研究生:高级操作系统(2009开始)
    • MOOC:学堂在线(2015年开始)

背景介绍 -- 当前基本情况

基本情况

  • 特征:计算机专业课 必修
  • 时间:春季/秋季(48学时)
  • 学分:3学分
  • 教师:向勇 陈渝 李国良 任炬 任炬
  • 学生:大三(部分大一/二/四)
  • 有实验内容(不算课时)
  • 无指定教材/有参考教材

课程目标

  • 掌握OS的基本原理和设计思路
  • 掌握OS机制的实现技术
  • 理解计算机软硬件系统

先修课

  • 程序设计+编程语言
  • 数据结构+算法
  • 计算机组成原理+编译原理

背景介绍 -- 当前基本情况

学生反馈

  • 太难,量太大,不会编程
  • 觉得时间投入太大
  • 部分同学为了学分而学
  • 趣味性不足,缺少及时反馈
  • 碰到问题难以及时获得帮助
  • 就业并不看好

bg right 60%


背景介绍 -- 当前基本情况

参考教材

  • Operating Systems: Three Easy Pieces, Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau
  • Operating system concepts,Abraham Silberschatz, Peter Baer Galvin,Greg Gagne
  • Operating Systems: Internals and Design Principles,William Stallings,
  • rCore-Tutorial-Book, 清华OS课程教学组

背景介绍 -- 当前基本情况 -- 教学大纲

特点:粗看:几十年基本不变

  • 操作系统结构
  • 中断及系统调用
  • 内存管理
  • 进程管理
  • 处理机调度
  • 同步互斥
  • 文件系统

bg right 100%


背景介绍 -- 当前基本情况 -- 教学内容

特点:基本抽象(骨)大致不变,内容与实验(肉)一直在变化

-- 基本抽象:进程、地址空间、文件 -- 方法技术:调度、页表、文件系统、同步互斥、指令集、配套实验设计...

bg right 100%


背景介绍 -- 当前基本情况 -- 教学内容

特点:基本(骨)不变,内容(肉)在变化 -- 骨架子大,没太多肉

  • 1995年前,缺少对实际操作系统的分析
    • 学生感觉像说教类课,把背诵记忆作为主要学习手段
    • 几乎没有实践:只能说

背景介绍 -- 当前基本情况 -- 教学内容

特点:基本(骨)不变,内容(肉)在变化 -- 骨头撑不起肉

  • 2000~2007年,增加了对实际操作系统(Windows、Linux、Solaris)的分析
    • 学生感觉是雾里看花,只可远观,不过细品
    • 远看很漂亮,近看太复杂
    • 有一些实践:侧重用户态编程或模拟抽象环节下的编程
    • Nachos实验展示的OS与实际操作系统有间距
    • 前期准备:C、Java

背景介绍 -- 当前基本情况 -- 教学内容

特点:基本(骨)不变,内容(肉)在变化 -- 肉太厚

  • 2008年,MIT教授Frans Kaashoek来清华访问,并引入xv6教学操作系统到本科实验;后简化实验,形成uCore教学操作系统。
  • 2008~2015,弱化了对实际操作系统的深入分析,增加了对教学操作系统的分析与实践
    • 能力强的学生可以比较深入地理解一个实际的小操作系统
    • 如果认真完成课程,投入的时间估计是上课时间的2倍以上
    • 前期准备:x86硬件架构、x86汇编、C语言

背景介绍 -- 当前基本情况 -- 教学内容

特点:基本(骨)不变,内容(肉)在变化 -- 合适的肌肉与脂肪

  • 2015年,探索代替x86的指令集: MIPS、ARM、OR1200、RISC-V
  • 2017年,选择RISC-V指令集,并逐步调整uCore实验和教学内容
  • 2018年,增加Rust编程语言,并逐步添加rCore实验和教学内容
  • 2021年,设计递增式的教学操作系统集,设计配套支撑的教学内容
  • 2022年,加强从app-->syscall-->kernel的全系统分析

课程建设的目标

基本观点:迭代实践与迭代认识是学好OS的基础

  • 硬件简单
  • 软件简洁
  • 循序渐进
  • 理技结合
  • 应用驱动
  • 生物进化

bg right:60% 100%


课程建设的策略

让学生通过OS实践来深入地理解OS原理

  • 支持应用 -- OS功能扩展全来自于应用的需求
  • 硬件简单 -- RISC-V 64 支持OS的最小硬件子集
  • 软件简洁 -- 选用Rust语言的抽象能力和高安全设计
  • 循序渐进 -- 随着知识点扩展来扩展OS实践
  • 理技结合 -- 原理的知识点与OS实践内容对应
  • 生物进化 -- 实践逐步形成的多个OS类似生命进化中形成的各种生物

课程建设的基本思路

  • 理解式学习:编写应用,并通过分析应用与OS的执行过程,掌握OS原理
    • 几行~几十行的应用程序,理解应用需求
    • 十几个系统调用,理解接口
    • OS的系统调用实现功能的流程图,理解OS的设计思路
    • 动态调试应用程序-->系统调用-->操作系统内核的全系统执行过程,从而理解操作系统的全局

课程建设的基本思路

  • 构造式学习:深入OS内部实现,参考/基于这些OS,扩展某些相对完整的OS功能
    • 几行~几十行的应用程序,理解应用需求
    • 十几个系统调用,理解接口
    • OS的系统调用实现功能的流程图,理解OS的设计思路
    • 动态调试应用程序-->系统调用-->操作系统内核的全系统执行过程,从而理解操作系统的全局
    • 参考已有实现,扩展/实现操作系统的新功能/性能优化,从而具备操作系统的设计实现能力,并掌握操作系统

课程建设的具体实施 -- OS设计

  • 原理与实践结合
    • 提供十几个由简单到相对复杂功能进化的OS实例
    • 提供OS的详细设计实现文档、多种测试用例、自动测试环境
    • 课程上讲的OS原理和概念在实践或实验中基本上有对应
    • 分析原理和实践有共同点和差异点
    • 通过原理和实践来深化对操作系统全局与细节的理解

课程建设的具体实施 -- OS设计

设计实现满足应用APP逐步递增需求的逐步进化的OS 操作系统 | 功能 | 系统调用个数 ---------|----------|---------- LibOS | 让APP与HW隔离,简化应用访问硬件的难度和复杂性 | 0 BatchOS | 让APP与OS隔离,加强系统安全,提高执行效率 | 2 multiprogOS | 让APP共享CPU资源 | 3


课程建设的具体实施 -- OS设计

设计实现满足应用APP逐步递增需求的逐步进化的OS 操作系统 | 功能 | 系统调用个数 ---------|----------|---------- TimeSharing OS | 让APP共享CPU资源 | 4 Address Space OS | 隔离APP访问的内存地址空间,加强APP间的安全 | 4 Process OS | 支持APP动态创建新进程,增强进程管理和资源管理能力 |9


课程建设的具体实施

设计实现满足应用APP逐步递增需求的逐步进化的OS 操作系统 | 功能 | 系统调用个数 ---------|----------|---------- Filesystem OS | 支持APP对数据的持久保存 | 11 IPC OS | 支持多个APP进程间数据交互与事件通知 | 17 TreadOS | 支持线程APP,简化切换与数据共享 | 18 SyncMutex OS | 在多线程APP中支持对共享资源的同步互斥访问 | 27


课程建设的具体实施 -- OS设计 -- 系统调用

30个系统调用

  • 进程相关: 13个
  • 文件相关:5个
  • 地址空间相关:2个
  • 同步互斥相关:9个

课程建设的具体实施 -- 课程资源建设

课程实践内容 -- rCore Tutorial Book v3

课程实验内容 -- rCore Tutorial Guide 2022 Spring

课程参考文档 --教材/课件


课程建设的具体实施 -- 在线学习建设

  • 当前还存在一些需要改进的地方
    • 学习内容的逐步递进
      • 进一步细化知识粒度和衔接
    • 学习效果的及时反馈
      • 在线IDE
      • 在线评测
    • 学习问题的及时解答
      • 在线答疑
      • 鼓励机制

bg right:25% 100%


课程建设的具体实施 -- 课程设计

  • 课程内容
    • 48学时,16次课(13讲)
  • 实践内容
    • 16~32学时,5次实验
  • 扩展讲解和训练
    • 最新技术进展
    • 实验代替考试
    • 操作系统比赛

bg right:50% 100%


谢谢!

开源操作系统训练营

https://github.com/LearningOS/rust-based-os-comp2022

一年三期:春季学期、秋季学期、暑假


备份材料

  • 十三讲的课程内容设计+知识点设计
  • 十一个教学OS的实践设计
  • 五个实验设计

第一讲 操作系统概述

知识点

  • 操作系统定义、抽象、特征
  • 操作系统历史演化
  • 操作系统的架构
  • 硬件与操作系统的关系与接口
  • 应用与操作系统的关系与接口
  • 实践:Linux/rCore/uCore APP

第二讲 实践与实验介绍

知识点

  • 函数调用、栈帧与参数
  • 编译器/硬件与OS的共识
  • 加电后硬件/软件启动过程
  • 程序执行过程、Linux应用编程
  • RISC-V的SBI
  • 开发环境与执行环境、裸机编程
  • 实践:LibOS操作系统

第三讲 基于特权级的隔离与批处理

知识点

  • 特权级与特权级切换
  • 系统调用、外设中断、软件异常
  • 系统调用设计与实现、执行过程
  • 实践:批处理操作系统

第四讲 多道程序与分时多任务

知识点

  • 上下文、中断、任务、任务/中断上下文、任务/中断上下文切换、任务/中断上下文切换的时机
  • 任务生命周期、任务执行过程
  • 协作式调度、抢占式调度
  • 实践:多道程序操作系统
  • 实践:分时多任务操作系统

第五讲 地址空间-物理内存管理

知识点

  • 地址空间、内存管理、连续物理内存分配、非连续物理内存分配
  • 物理内存的管理
  • 多级页表的设计与实现
  • 访存异常及其软硬件协同处理过程
  • 实践:基于地址空间的分时多任务操作系统

第六讲 地址空间-虚拟存储管理

知识点

  • 局部性原理、虚拟存储基本概念、Page Fault异常、局部页面置换算法、全局页面置换算法、Belady异常
  • 按需分页、Copy On Write、基于页的内存换入换出机制
  • 实践:支持虚存的分时多任务操作系统

第七讲 进程管理与单处理器调度

知识点

  • 进程概念、进程运行状态、进程的管理、基本调度策略/算法
  • 实时任务、实时调度算法、优先级反置问题与解决方法
  • 进程控制块和fork, exec, waitpid, exit系统调用的设计与执行
  • 实践:支持进程的操作系统

第八讲 多处理器调度

知识点

  • 多核/SMP/NUMA架构的特征
  • 多处理器调度算法
  • 负载迁移技术

第九讲 文件系统

知识点

  • 文件系统基本概念:文件/目录/文件描述符/目录项, 软/硬链接
  • 文件/文件系统设计与实现
  • open/close/read/write系统调用的设计与执行
  • 链式/索引文件结构设计、空闲磁盘块空间管理、缓冲区管理
  • 实践:支持文件的FS操作系统

第十讲 进程间通信

知识点

  • 无名/有名管道、消息队列、共享内存、信号的应用编程与设计实现
  • 支持管道与信号的IPC操作系统

第十一讲 线程与协程

知识点

  • 线程、协程的起因与特征
  • 用户态管理的线程设计与实现
  • 内核态管理的线程设计与实现
  • 实践:支持线程的操作系统

第十二讲 同步互斥

知识点

  • 软件实现的互斥、基于中断的互斥、基于原子指令的互斥
  • 忙等方式与休眠方式的同步互斥
  • 信号量的设计与实现
  • 管程与条件变量的设计与实现
  • 死锁必要条件、死锁安全、银行家算法、死锁检测算法等
  • 实践:支持同步互斥的操作系统

第十三讲 设备管理

知识点

  • I/O设备分类、I/O传输方式、I/O设备抽象
  • I/O执行模型
  • 串口驱动、块设备驱动
  • 内核态响应中断
  • 实践:支持外设中断的操作系统

实践 1: UNIX/Linux APP

  • "系统调用"

  • 例子,用C语言,来自UNIX(例如Linux、macOS、FreeBSD)

        fd = open("out", 1);
        write(fd, "hello\n", 6);
        pid = fork()
    
  • 能理解和编写包含操作系统进程/文件等相关的简单命令行Linux程序


实践 2: 裸机程序:LibOS

  • 软硬件启动,栈的建立、函数调用,SBI调用 w:600
  • 理解RISC-V的特权模式,理解SBI访问,编写裸机程序

实践 3: Batch OS

  • 特权级: U-Mode, S-Mode
  • 特权级切换
  • 陷入上下文
  • 编译多应用+OS的镜像
  • 加载并执行应用

bg right 100%


实践 4-1: MultiProg OS

  • 任务的概念
  • 任务的设计实现
  • 协作/抢占式调度
  • 任务上下文
  • 陷入上下文
  • 切换任务
  • 切换特权级 bg right:60% 100%

实践 4-2: TimeSharing OS

  • 中断
  • 中断响应
  • 协作/抢占式调度
  • 陷入上下文
  • 任务上下文
  • 切换任务
  • 切换特权级 bg right:60% 100%

实践 5: AddrSpace OS

App/OS内存布局

  • .text: 数据段
  • .data:可修改的全局数据。
  • 未初始化数据段 .bss
  • 堆 (heap)向高地址增长
  • 栈 (stack)向低地址增长 bg right 120%

实践 5: AddrSpace OS

  • 地址空间
  • 物理地址
  • 页表
  • 陷入上下文
  • 任务上下文
  • 中断响应

bg right:60% 100%


实践 5: AddrSpace OS

  • 应用地址空间
  • 内核地址空间
  • 切换任务
  • 切换特权级
  • 切换页表

bg right:65% 100%


实践 6:Process OS

  • Process
    • Trap
    • Task
    • Address Space
    • state
    • relations
    • exit code bg right:65% 100%

实践 6:Process OS

  • fork
  • exec
  • exit
  • wait

bg right:70% 100%


实践 6:Process OS

  • PCB bg right:70% 100%

实践 7: Filesystem OS

  • 文件系统层次结构
  • 块设备驱动
  • 块缓冲区
  • EasyFS
  • Virtual FS
  • 进程的文件描述符表
  • 文件相关系统调用 bg right:60% 100%

实践 7: Filesystem OS

  • 文件系统在操作系统中的位置 bg right:70% 100%

实践 7: Filesystem OS

  • 进程的文件描述符表
  • 文件相关系统调用 bg right:70% 100%

实践 8: IPC OS

支持进程间通信和异步消息机制

  • 管道(PIPE)
  • 信号(Signal) bg right:70% 100%

实践 8: IPC OS

对进程控制块的扩展

  • 管道也是一种文件
  • 支持I/O重定向 bg right:60% 100%

实践 9: Thread OS

  • 用户态管理的用户态运行的线程
  • 内核态管理的用户态运行的线程 bg right:65% 100%

实践 9: Thread OS

  • 协程结构
  • 线程结构
  • 进程结构

bg right:60% 100%


实践 10: SyncMutex OS

对进程控制块扩展,支持线程同步互斥访问共享变量

  • Mutex
  • Semphore
  • Condvar bg right:70% 100%

实践 10: SyncMutex OS

对进程控制块扩展,支持线程同步互斥访问共享变量

  • Mutex
  • Semphore
  • Condvar

bg right:70% 100%


实践 11: Device OS

支持块设备/串口等外设

  • 内核态中断响应
  • DMA
  • 轮询
  • 设备<-->内存间数据传输
  • 同步互斥保护

bg right:60% 100%


实验 1 :获取任务信息

  • 预先学习完成 实践 1--4

内容

我们的系统已经能够支持多个任务分时轮流运行,我们希望引入一个新的系统调用 sys_task_info 以获取当前任务的信息


实验 2 :完成mmap和munmap系统调用功能

  • 预先学习完成 实践 1--5

内容

  • 引入虚存机制后,原来内核的 sys_get_time 和 sys_task_info 函数实现就无效了。请你重写这个函数,恢复其正常功能。
  • mmap 在 Linux 中主要用于在内存中映射文件, 本次实验简化它的功能,仅用于申请内存。请实现 mmap 和 munmap 系统调用

实验 3 :完成spawn系统调用功能

  • 预先学习完成 实践 1--6

内容

实现一个完全 DIY 的系统调用 spawn,用以创建一个新进程。


实验 4 :实现文件的硬链接功能

  • 预先学习完成 实践 1--7

内容

硬链接要求两个不同的目录项指向同一个文件,在我们的文件系统中也就是两个不同名称目录项指向同一个磁盘块。要求实现三个系统调用 sys_linkat、sys_unlinkat、sys_stat 。


实验 5 :实现文件的硬链接功能

  • 预先学习完成 实践 1--10

内容

完成对基于信号量/条件变量的同步互斥多线程程序的死锁检测