《OS2ATC-叶自立-v1_20230328_114013.pdf》由会员分享,可在线阅读,更多相关《OS2ATC-叶自立-v1_20230328_114013.pdf(37页珍藏版)》请在三个皮匠报告上搜索。
1、FTL OS:基于rust无栈协程的RISC-V64多核操作系统团队:叶自立樊博李羿廷哈尔滨工业大学(深圳)指导老师:夏文、仇洁婷主讲人:叶自立OS2ATC 2022总体概览系统设计开发方式其他建议目 录01总体概览FTL OS的开发目标FTL:Faster Than Light我们的理想:让性能前无古人,后无来者使用一切潜在优化把多核和性能放在首位从零开始设计,掌握一切细节复杂,但扩展性高FTL OS的完成情况初赛阶段,通过全部功能测试,获得满分102分决赛第一阶段,通过全部功能测试,获满分220分决赛第二阶段,性能全程排名第一,最终得分117.7977分完全支持多核运行支持gcc、vi等真
2、实应用程序代码行数30000+FTL OS架构大量优化基于无栈协程的调度系统设计彻底面向多核用户态一切页面懒分配大量使用per-CPU缓存结构更快的内存分配器页目录项缓存快速系统调用路径读写并行管道RCU与垃圾回收系统基于侵入式链表的VFS浮点寄存器的延迟加载与保存最坏O(1)的信号系统共享页的多核预读基础函数常数优化总结FTL OS是以性能为第一目标,面向现实的操作系统基于rust asnyc架构支持多核运行应用了大量优化支持真实应用程序实时开源一切代码与文档致谢感谢哈工深其他参赛队伍Oops:现实程序支持健康向上好青年:优化交流与push随便取名不队:本地开发板基建感谢所有开源代码的参赛队
3、伍项目成员:樊博、李羿廷指导老师:夏文、仇洁婷灵感来源与基础设施:xv6 MITrCore-tutorial-v3rCoreLinuxUltraOS飓风内核RustSBIOpenSBI02系统设计为什么要使用rust?比赛前的OS实验课程要求以C语言实现EXT2文件系统决定参赛后,使用rust完成EXT2实验,积累了很多经验为什么要使用rust?语言上提供了泛型、Drop、trait、闭包等高效好用的抽象模块化,不需要前置声明,强大的类型推导快速可靠的rust-analyzer(LL(1)文法优势)在编译期间暴露BUG的生命周期系统语言层面支持的无栈协程async有效避免重复造轮子的crate
4、s.io(smallvec、arrayvec、triomphe:Arc、)高效、好用的IDE、安全、无栈协程、包管理无栈协程无栈协程的本质:协作式调度、编译器重写的状态机好处:可以有效节约内存,栈可以开得很大任何async函数都调度进出不同的“环境”时非常方便能够非常方便地实现睡眠与唤醒需要资源!上下文持续存在的变量(放在堆上)ABCABCnext=Bnext=Anext=Crun_a()get_source().awaitrun_b()多核支持立项即决定支持多核,一切代码都基于多核环境FTL OS将所有数据都尽可能局部化,尽可能降低多核竞争大部分操作都使用double-check方式,避免原
5、子操作开销所有操作都考虑了内存序,避免因访存乱序导致的错误多核支持:double-check当处理进程实时信号时需求:线程需要在进程信号存在时取出信号普通做法:获取锁当队列不为空时从队列中取出信号释放锁获取一次锁需要几十个时钟!double-check:当队列不为空时获取锁当队列不为空时从队列中取出信号释放锁当队列为空时避免了锁开销更进一步:版本号优化多核支持:内存序RISC-V采用RVWMO(RISC-V弱内存序)内存模型。多线程时会发生两种乱序:写入:当当前核心的修改没有及时同步到其他核时发生向后乱序读取:当其他核发来的信息没有及时更新进cache时发生向前乱序因此需要内存序来约束。多核支
6、持:内存序RCU方式两个变量:缓存V,指针PRCU更新:先生成(write)资源V,再将原子指针P指向VRCU读:先读取原子指针P获得&V,再读取Vwrite VP&Vload*pvpv P多核支持:内存序向后乱序(P优先V将更新发送至其他核)向前乱序(P优先于V先同步进cache)load乱序到了write之前,获取到的数据是错误的!write VP&Vload*pvpv PRCU方式两个变量:缓存V,指针P-write V-load*pv-多核支持:内存序release内存序,阻止向store之后乱序riscv指令:fence rw,wacquire内存序,阻止向load之前乱序riscv
7、指令:fence r,rwrelease-acquire内存序保证了获取到pv时,pv的数据一定是完整的。write VP&Vload*pvpv P多核优化:并行管道现实中的管道都是连续的。如果使用互斥锁,那么读写只能二选一。如何实现读写并行?多核优化:隐藏开销fork-exitexit()T2T1join(T2)Kill(T1)SIGCHLDwakerunningrelease sourceexit()T2T1join(T2)Kill(T1)SIGCHLDwakerunningrelease source调试系统高效的调试系统让BUG出现即暴露,同时不影响上线性能。使用大量的调试开关来显示调
8、试信息。内存模块支持DEBUG模式,尽早检测出野指针或二次释放。栈追踪系统发生panic时,如何知道出错的位置?栈追踪系统用来追踪panic的位置,甚至是异步函数。当panic发生时,会输出追踪栈信息。设置追踪点创建检测结构体使用PUSH/POP修改追踪栈03开发方式从零开始设计操作系统操作系统可以从baseline开始。xv6rCore-tutorial-v3rCoreLinux从xv6开始缺点:使用C语言为教学作出了诸多妥协锁的粒度非常大系统调用不遵循POSIX标准优势:支持多核精简、易于理解高扩展性从rCore-tutorial-v3开始缺点:完全没有考虑多核的可能性为教学作出了诸多妥协
9、系统调用不遵循POSIX标准优势:使用rust精简、易于理解高扩展性从rCore/Linux开始缺点:非常复杂,更适合作为参考如果从它开始比赛可以就此结束了优势:功能众多,十分靠谱从零开始设计操作系统掌控OS的一切细节,满足对性能的追求经历OS会遇到的一切问题,学到最多的知识不需要去揣测“为什么这里要这么写?”模块级瀑布开发OS可以分为多个模块,例如内存系统、线程系统、文件系统等。如何完成这些模块?普通的开发方式:所有模块都先写一个简单能用的版本,组合成一个简易的操作系统。在这个操作系统的基础上优化。FTL OS的开发方式:模块级瀑布开发(见下页)模块级瀑布开发FTL OS的开发方式:理解这个
10、模块要干什么,POSIX标准是如何定义的在文档上把模块详细运行过程写出来思考怎么优化,这些优化需要哪些数据,接口应该是怎样的把这些优化全都写到文档里对着文档在脑中调试,让其他人看看这么设计会不会有问题看着文档一次性完成这个模块的代码DEBUG,通过测试通常情况下,这个模块的代码再也不会修改了(文档是什么?)瀑布开发:需求、设计、编码、测试、维护模块级瀑布开发FTL OS的文档里面有什么?文档是给自己看的。文档的重点是怎么做,而不是毫无意义的接口定义。文档的成型基于如下的过程:我想要怎样的功能此功能需要哪些数据有了这些数据,应该如何实现这项功能实现失败时,修改需要的数据实现成功,想想怎么优化模块
11、级瀑布开发优点:每个模块的对外接口在完成后不会大改。以极高效率完成优化。缺点:设计失误会导致大量代码灰飞烟灭。画不出激动人心的优化性能曲线。每个模块大约花费10天完成。5天写文档,2天写代码,3天debug。失误:文件系统Version 1:只有FAT32文件系统,只有块缓存Version 2:只有FAT32文件系统,加入inode缓存Version 3:加入虚拟文件系统VFS,FAT32的缓存基本作废Version 4:允许删除引用计数不为零的文件与目录Version 5:允许用户态页表直接指向虚拟文件系统的缓存Version 6(虚构):使用页缓存机制管理文件系统的缓存块每次重构都要大改实现与接口,花费了很长时间,效率极低。04其他建议其他建议学习第一、比赛第二拥有理想、永不放弃实时开源全部的代码和文档思考真实的操作系统是怎样的ENDOS2ATC 20222022 年全国大学生计算机系统能力大赛操作系统设计赛FTL OS团队:叶自立 樊博 李羿廷指导老师:夏文 仇洁婷主讲人:叶自立