《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弱內存序)內存模型。多線程時會發生兩種亂序:寫入:當當前核心的修改沒有及時同步到其他核時發生向后亂序讀?。寒斊渌税l來的信息沒有及時更新進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團隊:葉自立 樊博 李羿廷指導老師:夏文 仇潔婷主講人:葉自立