色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

深度解析鴻蒙內核最重要的結構體

鴻蒙系統HarmonyOS ? 來源:my.oschina ? 作者:鴻蒙內核源碼分析 ? 2021-04-25 11:58 ? 次閱讀

誰是鴻蒙內核最重要的結構體?

答案一定是: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;

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

內核的各自模塊都能看到雙向鏈表的身影,下圖是各處初始化雙向鏈表的操作,因為太多了,只截取了部分:

pIYBAGCE6DKAAf-bAARvRfH2FV4405.png

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

可以豪不夸張的說理解LOS_DL_LIST及相關函數是讀懂鴻蒙內核的關鍵。前后指針(注者后續將比喻成一對左右觸手)靈活的指揮著系統精準的運行,越是深入分析內核源碼,越能感受到內核開發者對LOS_DL_LIST非凡的駕馭能力,筆者仿佛看到了無數雙手前后相連,拉起了一個個雙向循環鏈表,把指針的高效能運用到了極致,這也許就是編程的藝術吧!這么重要的結構體還是需詳細講解一下.

基本概念

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

有好幾個同學問數據在哪? 確實LOS_DL_LIST這個結構看起來怪怪的,它竟沒有數據域!所以看到這個結構的人第一反應就是我們怎么訪問數據?其實LOS_DL_LIST不是拿來單獨用的,它是寄生在內容結構體上的,誰用它誰就是它的數據.看圖就明白了.

pIYBAGCE6EaAToV1AADMtl72i_g471.png

功能接口

鴻蒙系統中的雙向鏈表模塊為用戶提供下面幾個接口。

pIYBAGCE6FOAL5ATAAEsiAQ3PvI596.png

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

//將指定節點初始化為雙向鏈表節點
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;
}

pIYBAGCE6GqAMe0lAAHgHk5dkIE576.png

強大的宏

除了內聯函數,對雙向遍歷的初始化,定位,遍歷 等等操作提供了更強大的宏支持.使內核以極其簡潔高效的代碼實現復雜邏輯的處理.

//定義一個節點并初始化為雙向鏈表節點
#define LOS_DL_LIST_HEAD(list) LOS_DL_LIST list = { &(list), &(list) }

//獲取指定結構體內的成員相對于結構體起始地址的偏移量
#define LOS_OFF_SET_OF(type, member) ((UINTPTR)&((type *)0)->member)

//獲取包含鏈表的結構體地址,接口的第一個入參表示的是鏈表中的某個節點,第二個入參是要獲取的結構體名稱,第三個入參是鏈表在該結構體中的名稱
#define LOS_DL_LIST_ENTRY(item, type, member) \
    ((type *)(VOID *)((CHAR *)(item) - LOS_OFF_SET_OF(type, member)))

//遍歷雙向鏈表
#define LOS_DL_LIST_FOR_EACH(item, list) \
    for (item = (list)->pstNext;         \
         (item) != (list);               \
         item = (item)->pstNext)

//遍歷指定雙向鏈表,獲取包含該鏈表節點的結構體地址,并存儲包含當前節點的后繼節點的結構體地址
#define LOS_DL_LIST_FOR_EACH_ENTRY_SAFE(item, next, list, type, member)               \
    for (item = LOS_DL_LIST_ENTRY((list)->pstNext, type, member),                     \
         next = LOS_DL_LIST_ENTRY((item)->member.pstNext, type, member);              \
         &(item)->member != (list);                                                   \
         item = next, next = LOS_DL_LIST_ENTRY((item)->member.pstNext, type, member))

//遍歷指定雙向鏈表,獲取包含該鏈表節點的結構體地址
#define LOS_DL_LIST_FOR_EACH_ENTRY(item, list, type, member)             \
    for (item = LOS_DL_LIST_ENTRY((list)->pstNext, type, member);        \
         &(item)->member != (list);                                      \
         item = LOS_DL_LIST_ENTRY((item)->member.pstNext, type, member))

例如在調度算法中獲取當前最高優先級的任務時,就需要遍歷整個進程和進程任務的所有就緒列表.LOS_DL_LIST_FOR_EACH_ENTRY高效的解決了層層循環的問題,讓代碼簡潔易懂.

LITE_OS_SEC_TEXT_MINOR LosTaskCB *OsGetTopTask(VOID)
{
    UINT32 priority, processPriority;
    UINT32 bitmap;
    UINT32 processBitmap;
    LosTaskCB *newTask = NULL;
#if (LOSCFG_KERNEL_SMP == YES)
    UINT32 cpuid = ArchCurrCpuid();
#endif
    LosProcessCB *processCB = NULL;
    processBitmap = g_priQueueBitmap;
    while (processBitmap) {
        processPriority = CLZ(processBitmap);
        LOS_DL_LIST_FOR_EACH_ENTRY(processCB, &g_priQueueList[processPriority], LosProcessCB, pendList) {
            bitmap = processCB->threadScheduleMap;
            while (bitmap) {
                priority = CLZ(bitmap);
                LOS_DL_LIST_FOR_EACH_ENTRY(newTask, &processCB->threadPriQueueList[priority], LosTaskCB, pendList) {
#if (LOSCFG_KERNEL_SMP == YES)
                    if (newTask->cpuAffiMask & (1U << cpuid)) {
#endif
                        newTask->taskStatus &= ~OS_TASK_STATUS_READY;
                        OsPriQueueDequeue(processCB->threadPriQueueList,
                                          &processCB->threadScheduleMap,
                                          &newTask->pendList);
                        OsDequeEmptySchedMap(processCB);
                        goto OUT;
#if (LOSCFG_KERNEL_SMP == YES)
                    }
#endif
                }
                bitmap &= ~(1U << (OS_PRIORITY_QUEUE_NUM - priority - 1));
            }
        }
        processBitmap &= ~(1U << (OS_PRIORITY_QUEUE_NUM - processPriority - 1));
    }

OUT:
    return newTask;
}

結構體的最愛

LOS_DL_LIST是復雜結構體的最愛,以下舉例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個民族是一家,來自同一個父進程.
    LOS_DL_LIST          subordinateGroupList;         /**< linkage in my group list */ //進程是組長時,有哪些組員進程
    LOS_DL_LIST          threadSiblingList;            /**< List of threads under this process *///進程的線程(任務)列表
    LOS_DL_LIST          threadPriQueueList[OS_PRIORITY_QUEUE_NUM]; /**< The process's thread group schedules thepriority hash table */	//進程的線程組調度優先級哈希表
    LOS_DL_LIST          waitList;     /**< The process holds the waitLits to support wait/waitpid *///進程持有等待鏈表以支持wait/waitpid
} LosProcessCB;

解讀

pendList個人認為它是鴻蒙內核功能最多的一個鏈表,它遠不止字面意思阻塞鏈表這么簡單,只有深入解讀源碼后才能體會它真的是太會來事了,一般把它理解為阻塞鏈表就行.上面掛的是處于阻塞狀態的進程.

childrenList孩子鏈表,所有由它fork出來的進程都掛到這個鏈表上.上面的孩子進程在死亡前會將自己從上面摘出去,轉而掛到exitChildList鏈表上.

exitChildList退出孩子鏈表,進入死亡程序的進程要掛到這個鏈表上,一個進程的死亡是件挺麻煩的事,進程池的數量有限,需要及時回收進程資源,但家族管理關系復雜,要去很多地方消除痕跡.尤其還有其他進程在看你笑話,等你死亡(wait/waitpid)了通知它們一聲.

siblingList兄弟鏈表,和你同一個父親的進程都掛到了這個鏈表上.

subordinateGroupList朋友圈鏈表,里面是因為興趣愛好(進程組)而掛在一起的進程,它們可以不是一個父親,不是一個祖父,但一定是同一個老祖宗(用戶態和內核態根進程).

threadSiblingList線程鏈表,上面掛的是進程ID都是這個進程的線程(任務),進程和線程的關系是1:N的關系,一個線程只能屬于一個進程.這里要注意任務在其生命周期中是不能改所屬進程的.

threadPriQueueList線程的調度隊列數組,一共32個,任務和進程一樣有32個優先級,調度算法的過程是先找到優先級最高的進程,在從該進程的任務隊列里去最高的優先級任務運行.

waitList是等待子進程消亡的任務鏈表,注意上面掛的是任務.任務是通過系統調用

  pid_t wait(int *status);
  pid_t waitpid(pid_t pid, int *status, int options);
將任務掛到waitList上.鴻蒙waitpid系統調用為SysWait,具體看進程回收篇.

雙向鏈表是內核最重要的結構體,精讀內核的路上它會反復的映入你的眼簾,理解它是理解內核運作的關鍵所在!

編輯:hfy

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    3

    文章

    1372

    瀏覽量

    40281
  • 鴻蒙系統
    +關注

    關注

    183

    文章

    2634

    瀏覽量

    66308
收藏 人收藏

    評論

    相關推薦

    鴻蒙案例技術分享 | 基于AIoT-3568X的鴻蒙通行一機方案項目

    案例展示視美泰鴻蒙通行一機方案以鴻蒙版AIoT-3568X人工智能主板為核心平臺,搭載OpenHarmony操作系統,使用自研算法和國產芯片,可管可控,并提供身份識別以及其他外設配件生態鏈支持
    的頭像 發表于 12-13 16:25 ?225次閱讀
    <b class='flag-5'>鴻蒙</b>案例技術分享 | 基于AIoT-3568X的<b class='flag-5'>鴻蒙</b>通行一<b class='flag-5'>體</b>機方案項目

    結構成員的順序會影響結構的大小嗎

    相同的結構成員,如果把順序調整一下,會不會影響結構的大小? 答案是會的,這主要跟字節對齊有關。 比如這樣的結構
    的頭像 發表于 11-25 16:24 ?154次閱讀

    增強型MOS管的結構解析

    增強型MOS管(Enhancement MOSFET)是一種重要的場效應晶體管,具有高輸入阻抗、低輸入電流、高速開關和低噪聲等優點,被廣泛應用于電子設備中。以下是對增強型MOS管結構的詳細解析
    的頭像 發表于 07-24 10:51 ?1495次閱讀

    溫度補償振蕩器TG-3541CE的深度解析

    溫度補償振蕩器TG-3541CE的深度解析
    的頭像 發表于 07-18 17:48 ?321次閱讀

    深度神經網絡(DNN)架構解析與優化策略

    深度神經網絡(Deep Neural Network, DNN)作為機器學習領域中的一種重要技術,以其強大的特征學習能力和非線性建模能力,在多個領域取得了顯著成果。DNN的核心在于其多層結構,通過
    的頭像 發表于 07-09 11:00 ?1793次閱讀

    華為鴻蒙內核獲中國信通院自主成熟度A級認證

    在科技創新的浪潮中,華為再次以其卓越的自主研發能力引領行業前行。近日,中國信息通信研究院(簡稱“中國信通院”)官方公眾號宣布了一項重要成果:華為技術有限公司的鴻蒙內核成功通過了自主成熟度等級認證
    的頭像 發表于 07-03 14:32 ?642次閱讀

    歡創播報 華為宣布鴻蒙內核已超越Linux內核

    1 華為宣布鴻蒙內核已超越Linux內核 ? 6月21日,在華為開發者大會上, HarmonyOS NEXT(鴻蒙NEXT)——真正獨立于安卓和iOS的
    的頭像 發表于 06-27 11:30 ?828次閱讀

    PLC基本結構解析

    方式和便捷的編程方式,被廣泛應用于各種工業控制系統中。本文將詳細解析PLC的基本結構,包括其主要組成部分的功能和特點,以便讀者對PLC有更深入的了解。
    的頭像 發表于 06-25 14:30 ?941次閱讀

    華為發布鴻蒙原生智能,OS深度融合AI,小藝升級為系統級智能

    Beta。鴻蒙原生智能是基于軟硬芯云協同的硬件與基礎設施架構,AI與OS深度融合的智能系統。 小藝智能:能思考,會規劃,可執行 基于鴻蒙原生智能強大的AI底座,搭載盤古大模型,小藝升
    的頭像 發表于 06-24 14:30 ?527次閱讀
    華為發布<b class='flag-5'>鴻蒙</b>原生智能,OS<b class='flag-5'>深度</b>融合AI,小藝升級為系統級智能<b class='flag-5'>體</b>

    HDC2024華為發布鴻蒙原生智能:AI與OS深度融合,開啟全新的AI時代

    6月21日,華為開發者大會2024(HDC.2024)召開。 HarmonyOS NEXT將AI與OS深度融合,構筑全新鴻蒙原生智能框架。大會現場,華為常務董事、終端BG董事長、智能汽車解決方案BU
    的頭像 發表于 06-24 09:28 ?613次閱讀
    HDC2024華為發布<b class='flag-5'>鴻蒙</b>原生智能:AI與OS<b class='flag-5'>深度</b>融合,開啟全新的AI時代

    【JAVA UI】【HarmonyOS】【Demo】 鴻蒙如何進行 xml 解析

    鴻蒙鴻蒙如何進行數據解析 【問題描述】有時候我們從服務器獲取是 xml 格式數據,我們需要將 xml 轉化成 model 對象,該如何使用呢?下面舉個例子說明一下,將分以下幾步進行 1.準備條件
    的頭像 發表于 02-19 15:59 ?566次閱讀
    【JAVA UI】【HarmonyOS】【Demo】 <b class='flag-5'>鴻蒙</b>如何進行 xml <b class='flag-5'>解析</b>

    鴻蒙開發者預覽版如何?

    Linux內核以及AOSP代碼,采用的鴻蒙內核以及代碼,HarmonyOS NEXT系統僅支持鴻蒙內核
    發表于 02-17 21:54

    鴻蒙使用的是微內核

    我們常說,看一個系統是不是自研,就看它的內核,常見的內核分為:宏內核和微內核,當然還有兩者結合體,他們到底有什么區別? 白話宏內核和微
    的頭像 發表于 01-30 16:43 ?480次閱讀
    <b class='flag-5'>鴻蒙</b>使用的是微<b class='flag-5'>內核</b>?

    鴻蒙OS和開源鴻蒙什么關系?

    開源鴻蒙(Open Harmony) 鴻蒙系統愿來的設計初衷,就是讓所有設備都可以運行一個系統,但是每個設備的運算能力和功能都不同,所以內核的設計上,采用了微內核的設計,除了最基礎的功
    的頭像 發表于 01-30 15:44 ?1130次閱讀
    <b class='flag-5'>鴻蒙</b>OS和開源<b class='flag-5'>鴻蒙</b>什么關系?

    結構與指針的關系

    在C語言中,結構(Struct)是一種用戶自定義的數據類型,它允許您將不同類型的數據項組合在一起,以便形成一個更復雜的數據結構結構可以
    的頭像 發表于 01-11 08:00 ?981次閱讀
    <b class='flag-5'>結構</b><b class='flag-5'>體</b>與指針的關系
    主站蜘蛛池模板: 乱爱性全过程免费视频| 俄罗斯mm| 伊人久久国产免费观看视频| 无颜之月全集免费观看| 色情在线avav| 日本无码色哟哟婷婷最新网站 | 亚洲 小说 欧美 激情 另类| 日日干夜夜艹| 日本邪恶全彩工囗囗番海贼王| 嫩草成人国产精品| 免费成人小视频| 美女久久久| 久久精品国产只有精品| 久草视频在线观看免费4| 精品久久久亚洲精品中文字幕| 国产在线精品视频资源| 国内精品蜜汁乔依琳视频| 果冻传媒2021精品影视| 精品国产成人AV在线看| 护士被老头边摸边吃奶的视频| 精品成人片深夜| 久久人人爽人人片AV人成| 无修肉动漫在线观看影片| 亚洲 欧美 国产 综合 在线| 亚洲AV色香蕉一区二区三区| 亚洲国产在线精品国偷产拍| 亚洲中文无码AV在线观看| 一一本之道高清视频在线观看中文字幕| 亚洲一区免费观看| 在线看免费毛片| babesvideos欧美最新| 成人精品综合免费视频| 国产扒开美女双腿屁股流白浆| 国产欧美国日产在线播放| 狠狠狠狠狠狠干| 老熟人老女人国产老太| 女人麻豆国产香蕉久久精品| 日韩精品亚洲专区在线电影不卡| 午夜神器18以下不能进免费| 亚洲中文字幕欧美自拍一区 | 男女牲交全过程免费播放|