一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

淺談鴻蒙內(nèi)核代碼調(diào)度隊(duì)列

鴻蒙系統(tǒng)HarmonyOS ? 來源:oschina ? 作者:鴻蒙內(nèi)核發(fā)燒友 ? 2020-10-23 11:00 ? 次閱讀

為何單獨(dú)講調(diào)度隊(duì)列?

鴻蒙內(nèi)核代碼中有兩個源文件是關(guān)于隊(duì)列的,一個是用于調(diào)度的隊(duì)列,另一個是用于線程間通訊的IPC隊(duì)列。

本文詳細(xì)講述調(diào)度隊(duì)列,詳見代碼: kernel_liteos_a/kernel/base/sched/sched_sq/los_priqueue.c

IPC隊(duì)列后續(xù)有專門的博文講述,這兩個隊(duì)列的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)采用的都是雙向循環(huán)鏈表,LOS_DL_LIST實(shí)在是太重要了,是理解鴻蒙內(nèi)核的關(guān)鍵,說是最重要的代碼一點(diǎn)也不為過,源碼出現(xiàn)在 sched_sq模塊,說明是用于任務(wù)的調(diào)度的,sched_sq模塊只有兩個文件,另一個los_sched.c就是調(diào)度代碼。

涉及函數(shù)

功能分類 接口 描述
創(chuàng)建隊(duì)列 OsPriQueueInit 創(chuàng)建了32個就緒隊(duì)列
獲取最高優(yōu)先級隊(duì)列 OsPriQueueTop 查最高優(yōu)先級任務(wù)
從頭部入隊(duì)列 OsPriQueueEnqueueHead 從頭部插入某個就緒隊(duì)列
從尾部入隊(duì)列 OsPriQueueEnqueue 默認(rèn)是從尾部插入某個就緒隊(duì)列
出隊(duì)列 OsPriQueueDequeue 從最高優(yōu)先級的就緒隊(duì)列中刪除
OsPriQueueProcessDequeue 從進(jìn)程隊(duì)列中刪除
OsPriQueueProcessSize 用進(jìn)程查隊(duì)列中元素個數(shù)
OsPriQueueSize 用任務(wù)查隊(duì)列中元素個數(shù)
OsTaskPriQueueTop 查最高優(yōu)先級任務(wù)
OsDequeEmptySchedMap 進(jìn)程出列
OsGetTopTask 獲取被調(diào)度選擇的task

鴻蒙內(nèi)核進(jìn)程和線程各有32個就緒隊(duì)列,進(jìn)程隊(duì)列用全局變量存放,創(chuàng)建進(jìn)程時入隊(duì),任務(wù)隊(duì)列放在進(jìn)程的threadPriQueueList中。

映射張大爺?shù)墓适拢壕途w隊(duì)列就是在外面排隊(duì)的32個通道,按優(yōu)先級0-31依次排好,張大爺?shù)霓k公室有個牌子,類似打籃球的記分牌,一共32個,一字排開,隊(duì)列里有人時對應(yīng)的牌就是1,沒有就是0 ,這樣張大爺每次從0位開始看,看到的第一個1那就是最高優(yōu)先級的那個人。辦公室里的記分牌就是位圖調(diào)度器。

位圖調(diào)度器

//*kfy 0x80000000U = 10000000000000000000000000000000(32位,1是用于移位的,設(shè)計之精妙,點(diǎn)贊) 
#define PRIQUEUE_PRIOR0_BIT   0x80000000U 

#ifndef CLZ
#define CLZ(value)                                  (__clz(value)) //匯編指令
#endif

LITE_OS_SEC_BSS LOS_DL_LIST *g_priQueueList = NULL; //所有的隊(duì)列 原始指針
LITE_OS_SEC_BSS UINT32 g_priQueueBitmap; // 位圖調(diào)度
// priority = CLZ(bitmap); // 獲取最高優(yōu)先級任務(wù)隊(duì)列 調(diào)度位

整個los_priqueue.c就只有兩個全部變量,一個是LOS_DL_LIST *g_priQueueList是32個進(jìn)程就緒隊(duì)列的頭指針,在就緒隊(duì)列中會講另一個UINT32 g_priQueueBitmap 估計很多人會陌生,是一個32位的變量,叫位圖調(diào)度器。怎么理解它呢?

鴻蒙系統(tǒng)的調(diào)度是搶占式的,task分成32個優(yōu)先級,如何快速的知道哪個隊(duì)列是空的,哪個隊(duì)列里有任務(wù)需要一個標(biāo)識,而且要極高效的實(shí)現(xiàn)?答案是:位圖調(diào)度器。

簡單說就是一個變量的位來標(biāo)記對應(yīng)隊(duì)列中是否有任務(wù),在位圖調(diào)度下,任務(wù)優(yōu)先級的值越小則代表具有越高的優(yōu)先級,每當(dāng)需要進(jìn)行調(diào)度時,從最低位向最高位查找出第一個置 1 的位的所在位置,即為當(dāng)前最高優(yōu)先級,然后從對應(yīng)優(yōu)先級就緒隊(duì)列獲得相應(yīng)的任務(wù)控制塊,整個調(diào)度器的實(shí)現(xiàn)復(fù)雜度是 O(1),即無論任務(wù)多少,其調(diào)度時間是固定的。

進(jìn)程就緒隊(duì)列機(jī)制

CPU執(zhí)行速度是很快的,其運(yùn)算速度和內(nèi)存的讀寫速度是數(shù)量級的差異,與硬盤的讀寫更是指數(shù)級。鴻蒙內(nèi)核默認(rèn)一個時間片是 10ms,資源很寶貴,它不斷在眾多任務(wù)中來回的切換,所以絕不能讓CPU等待任務(wù),CPU時間很寶貴,沒準(zhǔn)備好的任務(wù)不要放進(jìn)來。這就是進(jìn)程和線程就緒隊(duì)列的機(jī)制,一共有32個任務(wù)就緒隊(duì)列,因?yàn)榫€程的優(yōu)先級是默認(rèn)32個, 每個隊(duì)列中放同等優(yōu)先級的task.

隊(duì)列初始化做了哪些工作?詳細(xì)看代碼

#define OS_PRIORITY_QUEUE_NUM 32

UINT32 OsPriQueueInit(VOID)
{
    UINT32 priority;

    /* system resident resource */
    g_priQueueList = (LOS_DL_LIST *)LOS_MemAlloc(m_aucSysMem0, (OS_PRIORITY_QUEUE_NUM * sizeof(LOS_DL_LIST)));
    if (g_priQueueList == NULL) {
        return LOS_NOK;
    }

    for (priority = 0; priority < OS_PRIORITY_QUEUE_NUM; ++priority) {
        LOS_ListInit(&g_priQueueList[priority]);
    }
    return LOS_OK;
}

因TASK 有32個優(yōu)先級,在初始化時內(nèi)核一次性創(chuàng)建了32個雙向循環(huán)鏈表,每種優(yōu)先級都有一個隊(duì)列來記錄就緒狀態(tài)的tasks的位置,g_priQueueList分配的是一個連續(xù)的內(nèi)存塊,存放了32個LOS_DL_LIST,再看一下LOS_DL_LIST結(jié)構(gòu)體,因?yàn)樗匾?!越簡單越靈活

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;

幾個常用函數(shù)

還是看入隊(duì)和出隊(duì)的源碼吧,注意bitmap的變化!

從代碼中可以知道,調(diào)用了LOS_ListTailInsert(&priQueueList[priority], priqueueItem); 注意是從循環(huán)鏈表的尾部插入的,也就是同等優(yōu)先級的TASK被排在了最后一個執(zhí)行,只要每次都是從尾部插入,就形成了一個按順序執(zhí)行的隊(duì)列。鴻蒙內(nèi)核的設(shè)計可謂非常巧妙,用極少的代碼,極高的效率實(shí)現(xiàn)了隊(duì)列功能。

VOID OsPriQueueEnqueue(LOS_DL_LIST *priQueueList, UINT32 *bitMap, LOS_DL_LIST *priqueueItem, UINT32 priority)
{
    /*
     * Task control blocks are inited as zero. And when task is deleted,
     * and at the same time would be deleted from priority queue or
     * other lists, task pend node will restored as zero.
     */
    LOS_ASSERT(priqueueItem->pstNext == NULL);

    if (LOS_ListEmpty(&priQueueList[priority])) {
        *bitMap |= PRIQUEUE_PRIOR0_BIT >> priority;//對應(yīng)優(yōu)先級位 置1
    }

    LOS_ListTailInsert(&priQueueList[priority], priqueueItem);
}

VOID OsPriQueueEnqueueHead(LOS_DL_LIST *priQueueList, UINT32 *bitMap, LOS_DL_LIST *priqueueItem, UINT32 priority)
{
    /*
     * Task control blocks are inited as zero. And when task is deleted,
     * and at the same time would be deleted from priority queue or
     * other lists, task pend node will restored as zero.
     */
    LOS_ASSERT(priqueueItem->pstNext == NULL);

    if (LOS_ListEmpty(&priQueueList[priority])) {
        *bitMap |= PRIQUEUE_PRIOR0_BIT >> priority;//對應(yīng)優(yōu)先級位 置1
    }

    LOS_ListHeadInsert(&priQueueList[priority], priqueueItem);
}

VOID OsPriQueueDequeue(LOS_DL_LIST *priQueueList, UINT32 *bitMap, LOS_DL_LIST *priqueueItem)
{
    LosTaskCB *task = NULL;
    LOS_ListDelete(priqueueItem);

    task = LOS_DL_LIST_ENTRY(priqueueItem, LosTaskCB, pendList);
    if (LOS_ListEmpty(&priQueueList[task->priority])) {
        *bitMap &= ~(PRIQUEUE_PRIOR0_BIT >> task->priority);//隊(duì)列空了,對應(yīng)優(yōu)先級位 置0
    }
}

同一個進(jìn)程下的線程的優(yōu)先級可以不一樣嗎?

請先想一下這個問題。

進(jìn)程和線程是一對多的父子關(guān)系,內(nèi)核調(diào)度的單元是任務(wù)(線程),鴻蒙內(nèi)核中任務(wù)和線程是一個東西,只是不同的身份。一個進(jìn)程可以有多個線程,線程又有各自獨(dú)立的狀態(tài),那進(jìn)程狀態(tài)該怎么界定?例如:ProcessA有 TaskA(阻塞狀態(tài)),TaskB(就緒狀態(tài)) 兩個線程,ProcessA是屬于阻塞狀態(tài)還是就緒狀態(tài)呢?

先看官方文檔的說明后再看源碼。

進(jìn)程狀態(tài)遷移說明:

Init→Ready:

進(jìn)程創(chuàng)建或fork時,拿到該進(jìn)程控制塊后進(jìn)入Init狀態(tài),處于進(jìn)程初始化階段,當(dāng)進(jìn)程初始化完成將進(jìn)程插入調(diào)度隊(duì)列,此時進(jìn)程進(jìn)入就緒狀態(tài)。

Ready→Running:

進(jìn)程創(chuàng)建后進(jìn)入就緒態(tài),發(fā)生進(jìn)程切換時,就緒列表中最高優(yōu)先級的進(jìn)程被執(zhí)行,從而進(jìn)入運(yùn)行態(tài)。若此時該進(jìn)程中已無其它線程處于就緒態(tài),則該進(jìn)程從就緒列表刪除,只處于運(yùn)行態(tài);若此時該進(jìn)程中還有其它線程處于就緒態(tài),則該進(jìn)程依舊在就緒隊(duì)列,此時進(jìn)程的就緒態(tài)和運(yùn)行態(tài)共存。

Running→Pend:

進(jìn)程內(nèi)所有的線程均處于阻塞態(tài)時,進(jìn)程在最后一個線程轉(zhuǎn)為阻塞態(tài)時,同步進(jìn)入阻塞態(tài),然后發(fā)生進(jìn)程切換。

Pend→Ready / Pend→Running:

阻塞進(jìn)程內(nèi)的任意線程恢復(fù)就緒態(tài)時,進(jìn)程被加入到就緒隊(duì)列,同步轉(zhuǎn)為就緒態(tài),若此時發(fā)生進(jìn)程切換,則進(jìn)程狀態(tài)由就緒態(tài)轉(zhuǎn)為運(yùn)行態(tài)。

Ready→Pend:

進(jìn)程內(nèi)的最后一個就緒態(tài)線程處于阻塞態(tài)時,進(jìn)程從就緒列表中刪除,進(jìn)程由就緒態(tài)轉(zhuǎn)為阻塞態(tài)。

Running→Ready:

進(jìn)程由運(yùn)行態(tài)轉(zhuǎn)為就緒態(tài)的情況有以下兩種:

有更高優(yōu)先級的進(jìn)程創(chuàng)建或者恢復(fù)后,會發(fā)生進(jìn)程調(diào)度,此刻就緒列表中最高優(yōu)先級進(jìn)程變?yōu)檫\(yùn)行態(tài),那么原先運(yùn)行的進(jìn)程由運(yùn)行態(tài)變?yōu)榫途w態(tài)。

若進(jìn)程的調(diào)度策略為SCHED_RR,且存在同一優(yōu)先級的另一個進(jìn)程處于就緒態(tài),則該進(jìn)程的時間片消耗光之后,該進(jìn)程由運(yùn)行態(tài)轉(zhuǎn)為就緒態(tài),另一個同優(yōu)先級的進(jìn)程由就緒態(tài)轉(zhuǎn)為運(yùn)行態(tài)。

Running→Zombies:

當(dāng)進(jìn)程的主線程或所有線程運(yùn)行結(jié)束后,進(jìn)程由運(yùn)行態(tài)轉(zhuǎn)為僵尸態(tài),等待父進(jìn)程回收資源。

注意看上面紅色的部分,一個進(jìn)程竟然可以兩種狀態(tài)共存!

UINT16 processStatus; /**< [15:4] process Status; [3:0] The number of threads currently

                                                            running in the process */

    processCB->processStatus &= ~(status | OS_PROCESS_STATUS_PEND);//取反后的與位運(yùn)算
    processCB->processStatus |= OS_PROCESS_STATUS_READY;//或位運(yùn)算

一個變量存兩種狀態(tài),怎么做到的?答案還是按位保存啊。還記得上面的位圖調(diào)度g_priQueueBitmap嗎,那可是存了32種狀態(tài)的。其實(shí)這在任何一個系統(tǒng)的內(nèi)核源碼中都很常見,類似的還有左移 <<,右移 >>等等

繼續(xù)說進(jìn)程和線程的關(guān)系,線程的優(yōu)先級必須和進(jìn)程一樣嗎?他們可以不一樣嗎?答案是:可以不一樣,否則怎么會有設(shè)置task優(yōu)先級的函數(shù)。

線程調(diào)度器

真正讓CPU工作的是線程,進(jìn)程只是個裝線程的容器,線程有任務(wù)??臻g,是獨(dú)立運(yùn)行于內(nèi)核空間,而進(jìn)程只有用戶空間,具體在后續(xù)的內(nèi)存篇會講,這里不展開說,但進(jìn)程結(jié)構(gòu)體LosProcessCB有一個這樣的定義??疵志椭懒耍鞘歉{(diào)度相關(guān)的。

    UINT32               threadScheduleMap;            /**< The scheduling bitmap table for the thread group of the
                                                            process */
    LOS_DL_LIST          threadPriQueueList[OS_PRIORITY_QUEUE_NUM]; /**< The process's thread group schedules the
                                                                         priority hash table */

咋一看怎么進(jìn)程的結(jié)構(gòu)體里也有32個隊(duì)列,其實(shí)這就是線程的就緒狀態(tài)隊(duì)列。threadScheduleMap就是進(jìn)程自己的位圖調(diào)度器。具體看進(jìn)程入隊(duì)和出隊(duì)的源碼。調(diào)度過程是先去進(jìn)程就緒隊(duì)列里找最高優(yōu)先級的進(jìn)程,然后去該進(jìn)程找最高優(yōu)先級的線程來調(diào)度。具體看筆者認(rèn)為的內(nèi)核最美函數(shù)OsGetTopTask,能欣賞到他的美就讀懂了就緒隊(duì)列是怎么管理的。

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;
}
映射張大爺?shù)墓适拢簭埓鬆敽暗綇埲皶r進(jìn)場時表演時,張全蛋要決定自己的哪個節(jié)目先表演,也要查下他的清單上優(yōu)先級,它同樣也有個張大爺同款記分牌,就這么簡單。
編輯:hfy
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 調(diào)度器
    +關(guān)注

    關(guān)注

    0

    文章

    98

    瀏覽量

    5428
  • 鴻蒙系統(tǒng)
    +關(guān)注

    關(guān)注

    183

    文章

    2638

    瀏覽量

    67512
收藏 人收藏

    評論

    相關(guān)推薦

    鴻蒙內(nèi)核源碼Task/線程技術(shù)分析

    、使用內(nèi)存空間等系統(tǒng)資源,并獨(dú)立于其它線程運(yùn)行。 鴻蒙內(nèi)核每個進(jìn)程內(nèi)的線程獨(dú)立運(yùn)行、獨(dú)立調(diào)度,當(dāng)前進(jìn)程內(nèi)線程的調(diào)度不受其它進(jìn)程內(nèi)線程的影響。 鴻蒙
    的頭像 發(fā)表于 10-18 10:42 ?2411次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>內(nèi)核</b>源碼Task/線程技術(shù)分析

    (轉(zhuǎn))HarmonyOS(鴻蒙OS)發(fā)布,聊聊操作系統(tǒng)的調(diào)度

    內(nèi)核,但不是這篇。 本文想再談?wù)勱P(guān)于人機(jī)交互操作系統(tǒng)本身以及微內(nèi)核,調(diào)度等操作系統(tǒng)比較核心的問題。 也許,鴻蒙內(nèi)核確實(shí)對
    發(fā)表于 08-20 08:00

    【HarmonyOS】鴻蒙內(nèi)核源碼分析(調(diào)度機(jī)制篇)

    看task從哪些渠道產(chǎn)生:渠道很多,可能是shell 的一個命令,也可能由內(nèi)核創(chuàng)建,更多的是大家編寫應(yīng)用程序new出來的一個線程。調(diào)度的內(nèi)容已經(jīng)有了,那他們?nèi)绾斡行虻谋?b class='flag-5'>調(diào)度?答案:是32個進(jìn)程和線程就緒
    發(fā)表于 10-14 14:00

    鴻蒙源碼分析系列(總目錄) | 給HarmonyOS源碼逐行加上中文注釋

    |-鴻蒙內(nèi)核源碼分析(調(diào)度機(jī)制篇) | 任務(wù)是如何被調(diào)度執(zhí)行的|-鴻蒙內(nèi)核源碼分析(
    發(fā)表于 11-20 11:24

    鴻蒙內(nèi)核源碼分析(調(diào)度機(jī)制篇):Task是如何被調(diào)度執(zhí)行的

    本文分析任務(wù)調(diào)度機(jī)制源碼 詳見:代碼庫建議先閱讀閱讀之前建議先讀本系列其他文章,進(jìn)入鴻蒙系統(tǒng)源碼分析(總目錄),以便對本文任務(wù)調(diào)度機(jī)制的理解。為什么學(xué)一個東西要學(xué)那么多的概念?
    發(fā)表于 11-23 10:53

    鴻蒙內(nèi)核源碼分析(調(diào)度隊(duì)列篇):進(jìn)程和Task的就緒隊(duì)列調(diào)度的作用

    為何單獨(dú)講調(diào)度隊(duì)列鴻蒙內(nèi)核代碼中有兩個源文件是關(guān)于隊(duì)列的,一個是用于
    發(fā)表于 11-23 11:09

    鴻蒙內(nèi)核源碼分析(Task管理篇):task是內(nèi)核調(diào)度的單元

    獨(dú)立運(yùn)行、獨(dú)立調(diào)度,當(dāng)前進(jìn)程內(nèi)線程的調(diào)度不受其它進(jìn)程內(nèi)線程的影響。鴻蒙內(nèi)核中的線程采用搶占式調(diào)度機(jī)制,同時支持時間片輪轉(zhuǎn)
    發(fā)表于 11-23 14:01

    鴻蒙內(nèi)核源碼分析(Task管理篇):task是內(nèi)核調(diào)度的單元

    )代碼 ,這是怎么回事?其實(shí)在鴻蒙內(nèi)核中, task就是線程, 初學(xué)者完全可以這么理解,但二者還是有區(qū)別,否則干嘛要分兩個詞描述。到底有什么區(qū)別?是管理上的區(qū)別,task是調(diào)度層面的概
    發(fā)表于 11-24 10:24

    VxWorks實(shí)時內(nèi)核調(diào)度的研究分析

    VxWorks實(shí)時內(nèi)核調(diào)度的研究分析論述了0S中調(diào)度的概念、類型、調(diào)度隊(duì)列模型,并著重對VxWorks實(shí)時
    發(fā)表于 12-16 14:07 ?13次下載

    Vx Works實(shí)時內(nèi)核調(diào)度的研究分析

    論述了OS 中調(diào)度的概念、類型、調(diào)度隊(duì)列模型,并著重對VxWorks 實(shí)時內(nèi)核進(jìn)行了分析。關(guān)鍵詞:嵌入式實(shí)時操作系統(tǒng)(RTOS) ;VxWorks ;
    發(fā)表于 03-25 10:36 ?33次下載

    VxWorks實(shí)時內(nèi)核調(diào)度的研究分析

    論述了0S中調(diào)度的概念、類型、調(diào)度隊(duì)列模型,并著重對VxWorks實(shí)時內(nèi)核進(jìn)行了分析。
    發(fā)表于 11-27 16:22 ?16次下載

    淺談鴻蒙內(nèi)核源碼的棧

    上面的代碼鴻蒙內(nèi)核用棧方式一樣,都采用了遞減滿棧的方式, 什么是遞減滿棧?
    的頭像 發(fā)表于 04-24 11:21 ?1583次閱讀
    <b class='flag-5'>淺談</b><b class='flag-5'>鴻蒙</b><b class='flag-5'>內(nèi)核</b>源碼的棧

    鴻蒙內(nèi)核源碼:誰來觸發(fā)調(diào)度工作?

    鴻蒙內(nèi)核中 Task 和 線程 在廣義上可以理解為是一個東西,但狹義上肯定會有區(qū)別,區(qū)別在于管理體系的不同,Task是調(diào)度層面的概念,線程是進(jìn)程層面概念。
    的頭像 發(fā)表于 04-24 10:50 ?1644次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>內(nèi)核</b>源碼:誰來觸發(fā)<b class='flag-5'>調(diào)度</b>工作?

    鴻蒙內(nèi)核源碼分析:task是內(nèi)核調(diào)度的單元

    從系統(tǒng)的角度看,線程是競爭系統(tǒng)資源的最小運(yùn)行單元。線程可以使用或等待CPU、使用內(nèi)存空間等系統(tǒng)資源,并獨(dú)立于其它線程運(yùn)行。 鴻蒙內(nèi)核每個進(jìn)程內(nèi)的線程獨(dú)立運(yùn)行、獨(dú)立調(diào)度,當(dāng)前進(jìn)程內(nèi)線程的調(diào)度
    發(fā)表于 11-23 15:51 ?22次下載
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>內(nèi)核</b>源碼分析:task是<b class='flag-5'>內(nèi)核</b><b class='flag-5'>調(diào)度</b>的單元

    鴻蒙內(nèi)核源碼分析:進(jìn)程和Task的就緒隊(duì)列調(diào)度的作用

    鴻蒙內(nèi)核代碼中有兩個源文件是關(guān)于隊(duì)列的,一個是用于調(diào)度隊(duì)列,另一個是用于線程間通訊的IPC
    發(fā)表于 11-23 15:48 ?31次下載
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>內(nèi)核</b>源碼分析:進(jìn)程和Task的就緒<b class='flag-5'>隊(duì)列</b>對<b class='flag-5'>調(diào)度</b>的作用