excel求和與計算器求和相差0.01(excel求和0.00)
646
2022-05-29
鴻蒙輕內核源碼分析系列一 前言
1 鴻蒙輕內核概述
鴻蒙輕內核是基于面向IoT領域構建的Huawei LiteOS輕量級物聯網操作系統內核演進發展的新一代內核。鴻蒙輕內核提供了小體積、低功耗、高性能、快速互聯體驗、生態統一開放的系統能力,新增了豐富的內核機制、更加全面的POSIX標準接口以及統一驅動框架HDF(OpenHarmony Driver Foundation)等,為設備廠商提供了更統一的接入方式,為OpenHarmony的應用開發者提供了更友好的開發體驗。
鴻蒙輕內核具有如下五大優勢:
小體積:內核組件輕量化設計,可根據業務需求,在128K到512M靈活配置伸縮。
低功耗:低功耗超長待機(Tickless、Run-Stop智能休眠技術),典型場景下功耗從mA降到uA級。
高性能:快速啟動系統,百ms級冷啟動抓拍到圖像。
快速互聯體驗:提供分布式軟總線、分布式設備安全連接基礎互聯協議,方便生態設備接入。
統一開放生態:兼容三方庫和生態圈,兼容CMSIS、POSIX接口,三方庫可平滑移植;提供統一的設備驅動框架HDF,方便外設Sensor、器件等驅動開發集成;提供可視化集成開發工具(IDE),實現一站式產品集成、應用開發。
2 鴻蒙輕內核開源介紹
OpenHarmony是開放原子開源基金會(OpenAtom Foundation)旗下開源項目,定位是一款面向全場景的開源分布式操作系統。開源站點是https://gitee.com/openharmony。
本源碼分析專題系列,計劃對OpenHarmony的輕量系統、小型系統的內核源碼進行詳細的分析,幫助開發者更好的理解內核運行機制,更好的掌握內核開發。分析時所涉及的源碼,均可以在開源站點獲取: 輕量系統 kernel_liteos_m代碼倉 、小型系統 kernel_liteos_a代碼倉。為了更容易找到鴻蒙輕內核代碼倉,建議關注Watch、Star、并Fork到自己賬戶下。有任何問題、建議,都可以留言給我們,歡迎反饋問題、貢獻代碼。
3 鴻蒙輕內核源碼分析系列大綱
鴻蒙輕內核源碼分析系列,首先會盤點下重要的數據結構,包含雙向鏈表、就緒隊列、排序鏈表等。會結合數據結構相關繪圖,剖析下據結構及其操作的源代碼,幫助更好的學習和理解這些數據結構的用法。分析完數據結構,會給后續源碼分析奠定基礎,接下來會分析中斷模塊、時間管理模塊的源代碼。然后分析操作系統非常重要的任務模塊、任務調度模塊。分析完畢任務和調度模塊后,會分析負責任務間通信的互斥鎖、信號量、消息隊列模塊。最后是軟件定時器和內存管理模塊。
建議開發者,結合源碼分析系列的講解,參考官方示例程序代碼,動手寫寫程序,實際編譯運行一下,看到運行效果,加深對鴻蒙輕內核的理解。
3.1 數據結構-雙向鏈表
雙向鏈表Doubly Linked List是鴻蒙輕內核最重要的數據結構之一,在各個模塊有著非常廣泛的使用。雙向鏈表是指含有往前和往后兩個方向的鏈表,每個結點中存放下一個節點指針,和一個指向前一個節點的指針。從雙向鏈表中的任意一個結點開始,都可以很方便地訪問它的前驅結點和后繼結點,這種數據結構形式能方便地完成查找、插入、刪除等操作。通過分析雙向鏈接提供的接口源代碼,深入掌握雙向鏈表的使用,在分析內核其他模塊源代碼時,更加容易理解。開發者開發自己的用戶程序時,也可以靈活的使用雙向鏈表。
3.2 數據結構-就緒隊列
在鴻蒙輕內核任務調度模塊,就緒隊列是個重要的數據結構,能夠高效、方便的支持任務基于優先級進行調度。任務創建后,狀態設置為就緒態,并放入就緒隊列。在實現上,就緒隊列是一個雙向循環鏈表數組,每個數組元素就是一個對應任務優先級的鏈表,相同優先級的任務放入同一個鏈表。任務就緒隊列Priority Queue主要供內核模塊內部使用,用戶進行業務開發時不涉及,所以并未對外提供接口。通過分析就緒隊列數據結構及其操作接口源代碼,可以更容易學習、掌握任務接口、任務調度模塊。
3.3 數據結構-排序鏈表
鴻蒙輕內核的任務排序鏈表,用于任務延遲到期/超時喚醒等業務場景,是一個非常重要、非常基礎的數據結構。任務排序鏈表是一個環狀的雙向鏈表數組,雙向鏈表的頭結點,指向雙向鏈表數組的第一個元素,維護游標信息,記錄當前的位置信息。每過一個Tick,游標指向數組下一個位置。數組元素是個雙向鏈表,鏈表節點維護索引和滾動數信息。當運行到的數組位置掛載的雙向鏈表不為空時,則把第一個節點維護的滾動數減1。這樣的數據結構類似鐘表表盤,也稱為時間輪。掌握排序鏈表這一重要的數據結構,會給進一步學習、分析源代碼奠定基礎,讓后續的學習更加容易。
3.4 中斷管理
中斷是指出現需要時,CPU暫停執行當前程序,轉而執行新程序的過程。當外設需要CPU時,將通過產生中斷信號使CPU立即中斷當前任務來響應中斷請求。通過中斷機制,在外設不需要CPU介入時,CPU可以執行其它任務,而當外設需要CPU時,將通過產生中斷信號使CPU立即中斷當前任務來響應中斷請求。這樣可以使CPU避免把大量時間耗費在等待、查詢外設狀態的操作上,有效提高系統實時性以及執行效率。本小節會掌握中斷相關的概念,剖析鴻蒙輕內核的中斷模塊的中斷初始化操作,中斷創建、刪除,開關中斷操作等源代碼。
3.5 時間管理
時間管理模塊以系統時鐘為基礎,可以分為兩部分,一部分是SysTick中斷,為任務調度提供必要的時鐘節拍;另外一部分是,給應用程序提供所有和時間有關的服務,如時間轉換、統計功能。
系統時鐘是由定時器/計數器產生的輸出脈沖觸發中斷產生的,一般定義為整數或長整數。輸出脈沖的周期叫做一個“時鐘滴答”,也稱為時標或者Tick。Tick是操作系統的基本時間單位,由用戶配置的每秒Tick數決定。另外一個計時單位是Cycle,這是系統最小的計時單位。Cycle的時長由系統主時鐘頻率決定,系統主時鐘頻率就是每秒鐘的Cycle數。用戶以秒、毫秒為單位計時,而操作系統以Tick為單位計時,當用戶需要對系統進行操作時,例如任務掛起、延時等,此時可以使用時間管理模塊對Tick和秒/毫秒進行轉換。本小節會剖析鴻蒙輕內核的時間管理模塊的源代碼。
3.6 任務和任務調度
任務是操作系統一個重要的概念,是競爭系統資源的最小運行單元。任務可以使用或等待CPU、使用內存空間等系統資源,并獨立于其它任務運行。任務模塊可以給用戶提供多個任務,實現任務間的切換,幫助用戶管理業務程序流程。任務調度也是操作系統的一個重要模塊,它負責選擇系統要處理的下一個任務。調度模塊需要協調處于就緒狀態的任務對資源的競爭,按優先級策略從就緒隊列中獲取高優先級的任務,給予資源使用權。本文我們來一起學習下任務和任務調度模塊的源代碼,包含任務棧初始化,任務上下文,任務初始化,任務常用操作接口,任務調度函數的源代碼。
3.7 互斥鎖
多任務環境下會存在多個任務訪問同一公共資源的場景,而有些公共資源是非共享的臨界資源,只能被獨占使用。鴻蒙輕內核使用互斥鎖Mutex來避免這種沖突,互斥鎖是一種特殊的二值性信號量,用于實現對臨界資源的獨占式處理。用互斥鎖處理臨界資源的同步訪問時,如果有任務訪問該資源,則互斥鎖為加鎖狀態。此時其他任務如果想訪問這個臨界資源則會被阻塞,直到互斥鎖被持有該鎖的任務釋放后,其他任務才能重新訪問該公共資源,此時互斥鎖再次上鎖,如此可確保同一時刻只有一個任務正在訪問這個臨界資源,保證了臨界資源操作的完整性。本小節會分析下互斥鎖模塊的源代碼。
3.8 信號量
信號量(Semaphore)是一種實現任務間通信的機制,可以實現任務間同步或共享資源的互斥訪問。一個信號量的數據結構中,通常有一個計數值,用于對有效資源數的計數,表示剩下的可被使用的共享資源數。本小節通過詳細分析信號量模塊的源碼,幫助更好的掌握信號量的使用。
3.9 隊列
隊列(Queue)是一種常用于任務間通信的數據結構。任務能夠從隊列里面讀取消息,當隊列中的消息為空時,掛起讀取任務;當隊列中有新消息時,掛起的讀取任務被喚醒并處理新消息。任務也能夠往隊列里寫入消息,當隊列已經寫滿消息時,掛起寫入任務;當隊列中有空閑消息節點時,掛起的寫入任務被喚醒并寫入消息。如果將讀隊列和寫隊列的超時時間設置為0,則不會掛起任務,接口會直接返回,這就是非阻塞模式。消息隊列提供了異步處理機制,允許將一個消息放入隊列,但不立即處理。同時隊列還有緩沖消息的作用。本小節通過分析隊列模塊的源碼,幫助更好的掌握隊列的使用。
3.10 事件
事件(Event)是一種任務間通信的機制,可用于任務間的同步。多任務環境下,任務之間往往需要同步操作,一個等待即是一個同步。事件可以提供一對多、多對多的同步操作。本小節通過分析內核事件模塊的源碼,幫助深入掌握事件的使用。
3.11 定時器
軟件定時器(Software Timer)是基于系統Tick時鐘中斷且由軟件來模擬的定時器。當經過設定的Tick數后,會觸發用戶自定義的回調函數。硬件定時器受硬件的限制,數量上不足以滿足用戶的實際需求。鴻蒙輕內核提供的軟件定時器功能可以提供更多的定時器,滿足用戶需求。本小節通過分析定時器模塊的源碼,幫助開發者更好的掌握定時器的使用。
3.12 靜態內存
內存管理模塊管理系統的內存資源,它是操作系統的核心模塊之一,主要包括內存的初始化、分配以及釋放。在系統運行過程中,內存管理模塊通過對內存的申請/釋放來管理用戶和OS對內存的使用,使內存的利用率和使用效率達到最優,同時最大限度地解決系統的內存碎片問題。鴻蒙輕內核的內存管理分為靜態內存管理和動態內存管理。
靜態內存模塊,支持在靜態內存池中分配用戶初始化時預設的固定大小的內存塊,分配和釋放效率高,靜態內存池中無碎片。只能申請到初始化預設大小的內存塊,不能按需申請。本小節主要分析靜態內存(Memory Box)模塊的源代碼,幫助開發者更深入的掌握靜態內存的使用。
3.13 動態內存
動態內存管理模塊主要用于用戶需要使用大小不等的內存塊的場景。當用戶需要使用內存時,可以通過操作系統的動態內存申請函數索取指定大小的內存塊,一旦使用完畢,通過動態內存釋放函數歸還所占用內存,使之可以重復使用。可以按需分配,缺點是內存池可能出現碎片。本小節主要分析動態內存模塊的源代碼,介紹動態內存分配算法,幫助開發者更深入的掌握動態內存的使用。
感謝閱讀,有任何問題和建議,請給我們留言。
任務調度 數據結構
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。