- v1
- v2:2020年10月21日提交给系里的版本;
- v3: 21 Oct 2020
- v4: cooperate with 2021-spring labs
- v5: 2021年秋季学期结束时更新教学内容部分
- v6: 2022 spring
- v7: 2022 autumn
- v8: 2023 spring
- v9: 2024 spring
- v10: 2024 autumn
操作系统是计算机系统中负责管理各种软硬件资源的核心系统软件,掌握操作系统的基本原理及其设计实现技术是研究型大学计算机专业本科毕业生的基本要求。本课程是计算机专业核心课,从系统程序员的视角进行内容组织,强调实践教学以及对计算机软硬件系统的深入理解,教学操作系统以基于C语言的uCore Tutorial kernel、基于Rust语言的rCore Tutorial kernel和RISC-V处理器为实验环境,讲授操作系统的核心概念、基本原理、关键技术和设计实现方法,并介绍当前操作系统领域的研究热点、相关论文和开源项目,帮助学生了解和掌握大型复杂系统软件的分析方法和核心设计思路,并为学生充分利用操作系统功能进行应用软件研究和开发打下扎实的基础。
让同学重视实践和原理的结合,围绕OS的视角,结合编译/组原等,深入地理解计算机软硬件系统。
- 完善 第六讲:增加第四节 实践:虚存管理优化机制
- 完善 第七讲和第八讲:增加内容:实践:调度算法的设计实现,COW
- 完善 第九讲:增加内容:按需加载文件(Demand Paging)
- 完善 第十三讲:改进第一/三节, 第二节选讲
- 第十讲 线程与协程 <--> 第十一讲 进程间通信
- 表明哪些是必讲内容,其它的就是选讲内容(即考试不涉及)
- 提供rCore Tutorial Book v3中的一般问题的答案
- 改进实验代码注释和文档
- 改进基本实验:第4章(lab2),直接提供sbrk系统调用的实现,这样简化了mmap/munmap的实现
- 增加OS实验陷阱系列的文档/视频
- 在实验中添加基于rCore Tutorial v3 ch9的应用程序编写题目
- 添加实验中的可选题目
- 期中: 15%, 期末: 50%,实验必做题目:35%
- 加分项:做实验中可选题目(只选做一道题即可,多做不算):加0~7分,总分能不超过100
- 实验必做题目(5周完成):35%, 大实验:65% (代替期中/期末考试)
下面的每一讲大约是三个课时左右
- 课程概述&教学安排
- 什么是操作系统 定义/分类/抽象/特征
- 操作系统历史演化
- 操作系统结构
- 实践:UNIX/Linux/rCore类应用
- 掌握操作系统的定义:能从软件角度、资源管理角度定义操作系统及其所属范围
- 掌握操作系统的抽象:理解进程、文件、地址空间的抽象对象以及与硬件关系
- 掌握操作系统的特征:理解并发/并行、共享、虚拟化、异步的含义
- 掌握操作系统的历史:理解单用户系统、批处理系统、多道程序系统、分时系统、个人计算机、SMP系统、VMM系统、分布式系统中的操作系统特征
- 掌握操作系统的架构:理解简单单体/分层单体/复杂单体/微/外/VMM kernel的特点
- 掌握 计算机硬件与操作系统的关系:理解硬件与操作系统之间的interface和各自的主要工作
- 掌握 应用与操作系统的关系:理解应用与操作系统之间的interface和各自的主要工作
- 能分析硬件的哪些功能能够给操作系统提供哪些支持
- 能对一个计算机系统中的软硬件的特征、区别、关系、运行状态进行清晰判断
- 对操作系统有一个完整的总体分析
- 能编写/运行基本的UNIX类程序
- 能在Linux环境下进行操作和编程
- 能够完成 rt-v3::ch0的相关练习
- 实践与实验简要分析(站在应用/OS的角度理解rt-v3)
- 库级支持
- 批处理支持
- 多道程序与分时多任务
- 支持地址空间
- 支持文件系统
- 支持进程间通信
- 并发支持
- 管理I/O设备
- Compiler与OS
- 通用的编译
- 硬件启动与软件启动
- 实践:裸机程序 -- LibOS
- 基本环境搭建
- RV基本组成
- QEMU模拟器
- QEMU启动
- 程序内存布局
- 编译流程
- 理解操作系统实验设计的基本思路
- 理解操作系统提供的实验要达到的基本目标
- 理解函数调用的设计与执行细节
- 理解编译器与操作系统的共识
- 理解硬件与操作系统的共识
- 理解计算机加电后硬件和软件的启动过程
- 理解程序的执行过程
- 了解RV的SBI
- 了解当前的OS各部分的联系与交互
- 能够搭建实验环境
- 能够Debug OS实例
- 能编写裸机程序
- 灵活应用目前掌握的操作系统知识解决裸机编程相关问题(功能、性能、安全性、便捷性等)
- 能够描述/分析 rt-v3::ch1的LibOS设计思路和实现的成效
- 能够完成 rt-v3::ch1的相关练习
- 从 OS 角度看计算机系统
- 从 OS 角度看RISC-V
- 实践:批处理操作系统
- 应用程序设计
- 加载应用程序
- 特权级切换
- 理解特权级
- 理解软件如何面向特权级进行编程
- 理解系统调用的概念、设计与实现、执行过程
- 理解批处理操作系统的设计与实现
- 理解程序/批处理操作系统的执行过程
- 了解当前的OS各部分的联系与交互
- 描述基于RV硬件/和软件协调实现系统调用
- 分析RV中的异常与系统调用之间的关系
- 分析并编程举例如果不遵守特权级约束会产生的后果:异常
- 灵活应用目前掌握的操作系统知识解决批处理/特权级相关问题(功能、性能、安全性、便捷性等)
- 能够描述/分析 rt-v3::ch2的Batch OS设计思路和实现的成效
- 能够完成 rt-v3::ch2的相关练习
- 相关背景与基本概念
- 多道程序概念
- 分时多任务概念
- 协作式调度
- 抢占式调度
- 中断处理
- 实践:多道程序与分时多任务操作系统
- 上下文切换
- 协作式调度
- 中断机制
- 抢占式调度
- 从开发者/应用/操作系统的角度来理解:什么是任务(进程的初级阶段)
- 理解任务生命周期的状态转换关系和时机
- 理解任务切换的概念与任务切换的设计实现之间的关系和差异
- 理解中断和异常的区别和关系
- 了解当前的OS各部分的联系与交互
- 灵活应用目前掌握的操作系统知识解决多道程序/分时多任务/任务切换相关问题(功能、性能、安全性、便捷性等)
- 能够描述/分析 rt-v3::ch3的Multiprog OS和TimeSharing OS设计思路和实现的成效
- 能够完成 rt-v3::ch3的相关练习
- 能够完成实验一
- 地址空间
- 计算机体系结构和内存层次
- 内存分配
- 静态内存分配
- 动态内存分配
- 连续内存分配
- 非连续内存分配
- 段式存储管理
- 页式存储管理
- 段页式存储管理
- 实践:建立地址空间的操作系统
- 管理sv39多级页表
- 内核与应用的地址空间
- 基于地址空间的分时多任务
- 页表自映射(option)
- 理解地址空间的概念
- 理解静态内存分配与动态内存分配的区别与关系
- 理解连续内存分配与不连续内存分配的区别与关系
- 理解段式存储管理的基本设计管理
- 理解页式存储管理的基本设计、多级页表、反置页表
- 基于RV,理解软硬件协同实现页式存储
- 了解当前的OS各部分的联系与交互
- 能描述虚拟内存、地址空间在概念和设计实现上的联系和差异
- 能从不同角度(应用、内核、CPU)理解地址空间
- 掌握不同的内存分配策略,并灵活应用
- 能灵活掌握基于某种硬件页机制,设计页表,并掌握虚拟地址到物理地址的转换过程
- 能够描述/分析 rt-v3::ch4的Address OS设计思路和实现的成效
- 能够完成 rt-v3::ch4的页表/物理内存管理相关练习
- 能够完成实验二
- 虚拟存储的基本概念
- 局部性原理
- 覆盖和交换
- 虚拟页式存储
- RISC-V 缺页异常
- 页面置换算法的概念
- 局部页面置换算法
- 最优算法、先进先出算法和最近最久未使用算法
- 时钟置换算法和最不常用算法
- Belady现象和局部置换算法比较
- 全局页面置换算法
- 工作集置换算法
- 缺页率置换算法
- 实践:基于虚存的优化
- 再理解Page Fault异常
- 惰性页面分配(Lazy page allocation)
- 相同页面共享(Same page sharing)
- 页面置换算法在OS中的具体实现
- 理解虚拟存储的基本概念和目标
- 掌握如何结合Page Fault异常来设计实现虚拟存储
- 掌握各种局部页面置换算法和全局页面置换算法
- 理解Belady异常,以及Belady异常与页面置换算法的关系
- 掌握局部性原理
- 采用覆盖技术管理应用在有限内存上的内存配置
- 采用交互技术管理应用换入换出
- 理解虚拟存储在RV上如何实现,以及虚拟存储部分涉及到的OS基本运行过程
- 能够使用局部页面置换算法和全局页面置换算法来分析缺页次数等
- 掌握Page Fault异常出现后的软硬件协同处理过程
- 了解基于虚存优化的各种机制
- 灵活应用目前掌握的操作系统知识解决虚拟存储相关问题(功能、性能、安全性、便捷性等)
- 能够完成 rt-v3::ch4的Page Fault/虚拟内存管理相关练习
- 进程管理
- 单处理机调度
- 处理机调度概念
- 调度准则
- 调度算法
- 实时调度
- 实时任务
- 实时调度算法
- 优先级反置问题与解决方法
- 实践:进程管理
- 应用示例
- 进程的数据结构
- 进程管理机制的实现
- 介绍Copy-on-Write技术
- 理解进程管理的核心系统调用 fork, exec, exit, waitpid
- 理解进程管理的核心数据结构和大致处理过程
- 理解处理器调度各种调度算法
- 理解实时调度算法
- 理解优先级反转问题和相应的解决方法
- 了解当前的OS各部分的联系与交互
- 掌握Copy-on-Write技术
- 掌握进程管理的核心系统调用 fork, exec, waitpid, wait
- 能运用调度算法来分配处理器时间
- 灵活应用目前掌握的操作系统知识解决进程管理相关问题(功能、性能、安全性、便捷性等)
- 能够描述/分析 rt-v3::ch5的Process OS设计思路和实现的成效
- 能够完成rt-v3::ch5的进程管理相关练习
- 能够完成实验三
- 对称多处理与多核架构
- 多处理器调度策略
- 多处理器调度机制
- O(1) 调度(option)
- CFS调度(option)
- BFS调度算法(option)
- 实践:单处理器调度的实现
- 应用示例
- 调度相关数据结构
- 调度机制的具体实现
- 理解对称多处理与多核架构
- 理解操作系统如何管理对称多处理与多核架构
- 掌握多处理器调度与其中的负载迁移技术
- 能够完成rt-v3::ch5的进程管理相关练习
- 能够完成实验三
- 理解多核架构对软件的影响(好的方面,不好的方面)
- 能运用多核调度算法来分配处理器时间
- 了解RV硬件的多核启动过程和软件初始化过程
- 文件系统概述
- 文件系统接口
- 文件系统实现(涉及 VFS,按需加载(Demand loading)等)
- 实验:文件系统
- easyfs简介
- 块设备接口
- 块缓冲层
- 磁盘布局与管理
- 索引节点
- 在内核中接入easy-fs
- 实例:进程文件系统 procfs(option)
- 从不同的角度(应用、操作系统)理解文件系统
- 文件系统的核心系统调用
- 典型文件系统的设计实现
- 了解文件系统与OS其它部分的联系与交互
- 理解按需加载(Demand loading)的虚存与文件系统结合的优化技术
- 掌握文件系统的基本概念
- 掌握文件系统的内部机制和组成
- 能设计简单的文件系统
- 能够描述应用发出文件系统相关系统调用后OS的处理过程
- 灵活应用目前掌握的操作系统知识解决文件系统相关问题(功能、性能、安全性、便捷性等)
- 能够描述/分析 rt-v3::ch6的Filesystem OS设计思路和实现的成效
- 能够完成rt-v3::ch6的相关练习
- 能够完成实验四
- 线程与协程
- 线程
- 用户线程、内核线程
- 协程
- 协程、线程与进程的关系
- 线程
- 实践:线程实现
- 理解进程、线程,协程的概念
- 理解进程、线程,协程的区别与联系
- 能够在用户态和内核态设计并实现线程管理
- 灵活应用目前掌握的操作系统知识解决线程管理相关问题(功能、性能、安全性、便捷性等)
- 能够完成rt-v3::ch8的相关练习
- 进程通信概念
- 信号
- 管道
- 消息队列
- 共享内存
- 实验:进程间通信与I/O重定向
- 标准I/O
- 管道
- 命令行参数与I/O重定向
- D-Bus机制(option)
- Binder机制(option)
- 理解进程--进程,进程--内核的通信机制和特点
- 理解不同IPC机制的特征和大致实现
- 掌握I/O重定向
- 了解IPC与OS其它部分的联系与交互
- 能描述不同IPC机制的大致实现
- 能设计管道机制
- 能描述I/O重定向的设计实现思路和运行过程
- 灵活应用目前掌握的操作系统知识解决IPC相关问题(功能、性能、安全性、便捷性等)
- 能够描述/分析 rt-v3::ch7的IPC OS设计思路和实现的成效
- 能够完成rt-v3::ch7的相关练习
- 同步互斥基本概念
- 现实生活中的同步互斥问题
- 临界区
- 禁用硬件中断
- 基于软件的解决方法
- 更高级的抽象方法
- 信号量
- 管程(option)、条件变量
- 同步互斥问题
- 哲学家就餐问题(信号量/管程)
- 读者-写者问题(信号量/管程)
- 死锁
- 死锁概念
- 死锁的必要条件
- 死锁处理方法
- 银行家算法
- 死锁检测
- 死锁概念
- 实践:并发与同步互斥
- 锁机制实现
- 信号量机制
- 条件变量机制
- 并发错误检测(option)
- 同步互斥-RCU(option)
- 理解同步互斥的基本概念
- 掌握各种同步互斥的操作手段
- 解决同步互斥问题
- 理解死锁概念
- 掌握各种死锁处理方法
- 理解各种死锁处理方法的局限性
- 了解当前的OS各部分的联系与交互
- 能够采用不同的同步互斥手段(基于软件的方法、信号量、条件变量、禁用中断等)灵活解决各种同步互斥问题
- 能应用银行家算法
- 掌握如何进行死锁检测
- 灵活应用目前掌握的操作系统知识解决同步互斥/死锁相关问题(功能、性能、安全性、便捷性等)
- 能够描述/分析 rt-v3::ch8的SyncMutex OS设计思路和实现的成效
- 能够完成rt-v3::ch8的相关练习
- 能够完成实验五
- 设备概述
- 设备抽象
- 设备执行模型
- 实验:I/O设备管理
- 外设平台(option)
- 串口驱动(option)
- virtio设备驱动(option)
- 理解设备的分类和特点
- 理解设备的各种抽象形式
- 理解设备执行模型(同步,异步....)
- 掌握设备驱动的设计与实现
- 掌握OS与外设的交互过程
- 了解当前的OS各部分的联系与交互
- 能描述OS与外设的交互过程
- 能编写应用程序来与设备进行交互
- 能编写简单的设备驱动程序(如uart等)
- 灵活应用目前掌握的操作系统知识解决设备相关问题(功能、性能、安全性、便捷性等)
- 能够完成rt-v3::ch9的相关练习
OPTION1:可靠文件系统主题:
- 系统可靠性概述
- 基于日志的文件系统
- 实际文件习题
- FAT文件系统(option)
- EXT4文件系统(option)
- NTFS(option)
- Zettabyte File System (ZFS)(option)
- 数据库文件系统(option)
无
无
覆盖:1/2/3章
知识点:计算机/OS启动、特权级切换、系统调用、应用程序/库/内核的关系、特权级相关异常、任务切换
- 显示目录文件名
- 实现一个Linux应用程序ls,能显示当前目录中的文件。
- 显示调用栈
- 实现一个linux应用程序,能打印出调用栈信息
- 显示目录信息
- 睡眠
- 实现一个rcore应用程序,用sleep系统调用睡眠一段时间(in rcore tutorial v3 Branch 2022spring)
- 显示调用栈
- 实现裸机程序,能打印调用栈
- 实现新系统调用get_taskinfo
- 增加get_taskinfo系统调用,能显示task的id和task name
- 统计系统调用
- 实现内核扩展,能够统计应用执行过程中系统调用编号和次数
- 统计时间
- 实现内核扩展,能够统计应用执行的完成时间
- 分析异常
- 统计执行异常的程序的异常情况说明(主要是各种特权级涉及的异常)
- 能够打印异常程序的调用栈
覆盖:4章
知识点:地址空间、应用与内核之间在不同地址空间的数据交互/控制交互、内存/地址相关异常(如缺页异常)
提供系统调用sbrk 的实现
- linux应用访问内存相关系统调用
- 使用sbrk,mmap,munmap,mprotect系统调用
- 改进系统调用sys_get_time
- 引入虚存机制后,原来内核的 sys_get_time 函数实现就无效了。请你重写这个函数,恢复其正常功能。
- 实现新系统调用mmap, munmap
- 请实现 mmap 和 munmap 系统调用
- 惰性页面分配(Lazy page allocation)
- 局部页面置换算法:改进的Clock页面置换算法
- 全局页面置换算法:工作集置换策略
- 全局页面置换算法:缺页率置换策略
覆盖:5章
知识点:进程管理的关联性和必要性、调度算法
- 实现一个与进程管理相关的linux应用程序
- 能用nice,fork,exec,spawn等系统调用
- 实现新系统调用 spawn
- 实现一个调度算法-如:stride
- 相同页面共享(Same page sharing)fork时的Copy on Write
- 调度算法:可提升/降低优先级的多级反馈队列
- 多核支持与多核调度(支持进程迁移和多核模式执行应用程序,但在内核中没有抢占和多核支持)
覆盖:6,7章
知识点:文件系统的实现、进程间通信机制
- 实现一个应用程序能体现文件/进程间通信的特点
- 扩展文件系统功能
- 扩大单个文件的大小
- 支持三重间接inode
- 扩展mmap系统调用,支持对文件的映射
- 这样对内存读写,其实就是对文件读写
- 支持crash一致性(hard)
- 扩展log fs
- 扩大单个文件的大小
- 实现一个文件相关系统调用相关
- 实现硬链接相关系统调用
- 实现创建目录的系统调用
- 实现一个新的重定向能力
- 实现共享内存
- 按需加载机制
- log-easyfs:实现基于日志的文件系统
覆盖:8章
知识点:线程,同步互斥的机制,解决同步互斥问题,死锁,优先级反转问题。
- 实现一个Linux线程应用程序能体现线程属性和线程间同步互斥的特点
- 使用了pthread_* 系统调用
- 扩展内核功能:内核线程
- 在内核中支持内核线程
- 在内核线程中支持同步互斥机制
- 实现内核线程用的mutex, semaphore, cond-var
- 扩展内核功能:多核支持
- 扩展rcore-tutorial-v3运行在多核系统中
- 用银行家算法解决死锁问题
- 设计某种资源申请导致死锁的例子
- 设计银行家算法来避免死锁问题
- 解决优先级反转问题
- 实现RM实时调度算法
- 设计优先级反转的实例
- 实现优先级天花板和优先级继承方法
- 内核的协程支持
- 基于多核的OS内核线程支持,内核支持抢占,支持多核方式下的同步互斥
- 提升多核的OS内核性能,实现内核中的并行性能优化(fs中的缓冲区管理并行化, 物理内存分配的并行化)
- 更通用的内核+应用的死锁检查
- 支持简易网络协议栈和virtio_net device或e1000网卡驱动(需自学rCore Tutorial Book第九章)
前提条件:5周完成实验1~5并通过助教和老师的评审后,可选择完成扩展实验来代替期中和期末考试。
内容和要求:与全国大学生操作系统比赛要求基本一致:跑Linux应用,模块化OS设计(用OS比赛的测例)。