鴻蒙核心原始碼分析(雙向連結串列篇) | 誰是核心最重要結構體 ?

HarmonyOS技術社群發表於2021-01-19

鴻蒙核心原始碼註釋中文版 < Gitee倉 | CSDN倉 | Github倉 | Coding倉 >精讀核心原始碼,中文註解分析,深挖地基工程,構建底層網圖,四大碼倉每日同步更新

鴻蒙原始碼分析系列篇 < CSDN | OSCHINA | WeHarmony | 公眾號 >問答式導讀,生活式比喻,表格化說明,圖形化展示,主流站點每日同步更新

 
誰是鴻蒙核心最重要的結構體?
答案一定是: LOS_DL_LIST(雙向連結串列),它長這樣.

typedef struct LOS_DL_LIST {//雙向連結串列,核心最重要結構體
    struct LOS_DL_LIST *pstPrev; /**< Current node's pointer to the previous node *///前驅節點(左手)
    struct LOS_DL_LIST *pstNext; /**< Current node's pointer to the next node *///後繼節點(右手)
} LOS_DL_LIST;

 

  
結構體夠簡單了吧,只有前後兩個指向自己的指標,但恰恰是因為太簡單,所以才太不簡單. 就像氫原子一樣,宇宙中無處不在,佔比最高,原因是因為它最簡單,最穩定!

核心的各自模組都能看到雙向連結串列的身影,下圖是各處初始化雙向連結串列的操作,因為太多了,只擷取了部分:

 

很多人問圖怎麼來的, source insight 4.0 是閱讀大型C/C++工程的必備工具,要用4.0否則中文有亂碼.

可以豪不誇張的說理解LOS_DL_LIST及相關函式是讀懂鴻蒙核心的關鍵。前後指標(注者後續將比喻成一對左右觸手)靈活的指揮著系統精準的執行,越是深入分析核心原始碼,越能感受到核心開發者對LOS_DL_LIST非凡的駕馭能力,筆者彷彿看到了無數雙手前後相連,拉起了一個個雙向迴圈連結串列,把指標的高效能運用到了極致,這也許就是程式設計的藝術吧!這麼重要的結構體還是需詳細講解一下.

基本概念
雙向連結串列是指含有往前和往後兩個方向的連結串列,即每個結點中除存放下一個節點指標外,還增加一個指向其前一個節點的指標。其頭指標head是唯一確定的。從雙向連結串列中的任意一個結點開始,都可以很方便地訪問它的前驅結點和後繼結點,這種資料結構形式使得雙向連結串列在查詢時更加方便,特別是大量資料的遍歷。由於雙向連結串列具有對稱性,能方便地完成各種插入、刪除等操作,但需要注意前後方向的操作。

功能介面
鴻蒙系統中的雙向連結串列模組為使用者提供下面幾個介面。

請結合下面的程式碼和圖去理解雙向連結串列,不管花多少時間,一定要理解它的插入/刪除動作, 否則後續內容將無從談起.

//將指定節點初始化為雙向連結串列節點
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListInit(LOS_DL_LIST *list)
{
    list->pstNext = list;
    list->pstPrev = list;
}

//將指定節點掛到雙向連結串列頭部
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListAdd(LOS_DL_LIST *list, LOS_DL_LIST *node)
{
    node->pstNext = list->pstNext;
    node->pstPrev = list;
    list->pstNext->pstPrev = node;
    list->pstNext = node;
}
//將指定節點從連結串列中刪除,自己把自己摘掉
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListDelete(LOS_DL_LIST *node)
{
    node->pstNext->pstPrev = node->pstPrev;
    node->pstPrev->pstNext = node->pstNext;
    node->pstNext = NULL;
    node->pstPrev = NULL;
}

 

  具體用法
舉例 ProcessCB(程式控制塊)是描述一個程式的所有資訊,其中用到了 8個雙向連結串列,這簡直比章魚還牛逼,章魚也才四雙觸手,但程式有8雙(16只)觸手.

typedef struct ProcessCB {
    LOS_DL_LIST          pendList;                     /**< Block list to which the process belongs */ //程式所屬的阻塞列表,如果因拿鎖失敗,就由此節點掛到等鎖連結串列上
    LOS_DL_LIST          childrenList;                 /**< my children process list */ //孩子程式都掛到這裡,形成雙迴圈連結串列
    LOS_DL_LIST          exitChildList;                /**< my exit children process list */ //那些要退出孩子程式掛到這裡,白髮人送黑髮人。
    LOS_DL_LIST          siblingList;                  /**< linkage in my parent's children list */ //兄弟程式連結串列, 56個民族是一家,來自同一個父程式.
    ProcessGroup         *group;                       /**< Process group to which a process belongs */ //所屬程式組
    LOS_DL_LIST          subordinateGroupList;         /**< linkage in my group list */ //程式是組長時,有哪些組員程式
    UINT32               threadGroupID;                /**< Which thread group , is the main thread ID of the process */ //哪個執行緒組是程式的主執行緒ID
    UINT32               threadScheduleMap;            /**< The scheduling bitmap table for the thread group of the
                                                            process */ //程式的各執行緒排程點陣圖
    LOS_DL_LIST          threadSiblingList;            /**< List of threads under this process *///程式的執行緒(任務)列表
    LOS_DL_LIST          threadPriQueueList[OS_PRIORITY_QUEUE_NUM]; /**< The process's thread group schedules the
                                                                         priority hash table */ //程式的執行緒組排程優先順序雜湊表
    volatile UINT32      threadNumber; /**< Number of threads alive under this process */ //此程式下的活動執行緒數
    UINT32               threadCount;  /**< Total number of threads created under this process */ //在此程式下建立的執行緒總數
    LOS_DL_LIST          waitList;     /**< The process holds the waitLits to support wait/waitpid *///程式持有等待連結串列以支援wait/waitpid
} LosProcessCB;

 

  
看個簡單點的 pendList表示這個程式中所有被阻塞的任務(task)都會掛到這個連結串列上管理. 任務阻塞的原因很多,可能是申請互斥鎖失敗,可能等待事件讀訊息佇列,還可能開了一個定時任務等等.

再來看一個複雜點的 threadPriQueueList,這又是幹嘛的?從名字可以看出來是執行緒的佇列連結串列,在鴻蒙核心執行緒就是任務(task),任務分等了32個優先順序,同級的任務放在同一個雙向連結串列中, 32級就是32個雙向連結串列,所以是個連結串列陣列,每條連結串列中存放的是已就緒等待被排程的任務.

雙向連結串列是核心最重要的結構體,精讀核心的路上它會反覆的映入你的眼簾,理解它是理解記憶體運作的關鍵所在!

作者:weharmony

想了解更多內容,請訪問: 51CTO和華為官方戰略合作共建的鴻蒙技術社群https://harmonyos.51cto.com/

相關文章