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

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

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

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

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

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

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

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

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

涉及函數(shù)

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

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

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

位圖調(diào)度器

//*kfy 0x80000000U = 10000000000000000000000000000000(32位,1是用于移位的,設(shè)計(jì)之精妙,點(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)先級(jí)任務(wù)隊(duì)列 調(diào)度位

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

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

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

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

CPU執(zhí)行速度是很快的,其運(yùn)算速度和內(nèi)存的讀寫(xiě)速度是數(shù)量級(jí)的差異,與硬盤(pán)的讀寫(xiě)更是指數(shù)級(jí)。鴻蒙內(nèi)核默認(rèn)一個(gè)時(shí)間片是 10ms,資源很寶貴,它不斷在眾多任務(wù)中來(lái)回的切換,所以絕不能讓CPU等待任務(wù),CPU時(shí)間很寶貴,沒(méi)準(zhǔn)備好的任務(wù)不要放進(jìn)來(lái)。這就是進(jìn)程和線程就緒隊(duì)列的機(jī)制,一共有32個(gè)任務(wù)就緒隊(duì)列,因?yàn)榫€程的優(yōu)先級(jí)是默認(rèn)32個(gè), 每個(gè)隊(duì)列中放同等優(yōu)先級(jí)的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個(gè)優(yōu)先級(jí),在初始化時(shí)內(nèi)核一次性創(chuàng)建了32個(gè)雙向循環(huán)鏈表,每種優(yōu)先級(jí)都有一個(gè)隊(duì)列來(lái)記錄就緒狀態(tài)的tasks的位置,g_priQueueList分配的是一個(gè)連續(xù)的內(nèi)存塊,存放了32個(gè)LOS_DL_LIST,再看一下LOS_DL_LIST結(jié)構(gòu)體,因?yàn)樗匾?!越?jiǎ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;

幾個(gè)常用函數(shù)

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

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

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

請(qǐng)先想一下這個(gè)問(wèn)題。

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

先看官方文檔的說(shuō)明后再看源碼。

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

Init→Ready:

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

Ready→Running:

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

Running→Pend:

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

Pend→Ready / Pend→Running:

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

Ready→Pend:

進(jìn)程內(nèi)的最后一個(gè)就緒態(tài)線程處于阻塞態(tài)時(shí),進(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í)的進(jìn)程創(chuàng)建或者恢復(fù)后,會(huì)發(fā)生進(jìn)程調(diào)度,此刻就緒列表中最高優(yōu)先級(jí)進(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í)的另一個(gè)進(jìn)程處于就緒態(tài),則該進(jìn)程的時(shí)間片消耗光之后,該進(jìn)程由運(yùn)行態(tài)轉(zhuǎn)為就緒態(tài),另一個(gè)同優(yōu)先級(jí)的進(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)程回收資源。

注意看上面紅色的部分,一個(gè)進(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)算

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

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

線程調(diào)度器

真正讓CPU工作的是線程,進(jìn)程只是個(gè)裝線程的容器,線程有任務(wù)??臻g,是獨(dú)立運(yùn)行于內(nèi)核空間,而進(jìn)程只有用戶空間,具體在后續(xù)的內(nèi)存篇會(huì)講,這里不展開(kāi)說(shuō),但進(jìn)程結(jié)構(gòu)體LosProcessCB有一個(gè)這樣的定義??疵志椭懒耍鞘歉{(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個(gè)隊(duì)列,其實(shí)這就是線程的就緒狀態(tài)隊(duì)列。threadScheduleMap就是進(jìn)程自己的位圖調(diào)度器。具體看進(jìn)程入隊(duì)和出隊(duì)的源碼。調(diào)度過(guò)程是先去進(jìn)程就緒隊(duì)列里找最高優(yōu)先級(jí)的進(jìn)程,然后去該進(jìn)程找最高優(yōu)先級(jí)的線程來(lái)調(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(shí)進(jìn)場(chǎng)時(shí)表演時(shí),張全蛋要決定自己的哪個(gè)節(jié)目先表演,也要查下他的清單上優(yōu)先級(jí),它同樣也有個(gè)張大爺同款記分牌,就這么簡(jiǎn)單。
編輯:hfy
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 調(diào)度器
    +關(guān)注

    關(guān)注

    0

    文章

    98

    瀏覽量

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

    關(guān)注

    183

    文章

    2627

    瀏覽量

    65784
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

    、使用內(nèi)存空間等系統(tǒng)資源,并獨(dú)立于其它線程運(yùn)行。 鴻蒙內(nèi)核每個(gè)進(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 ?2103次閱讀
    <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)比較核心的問(wèn)題。 也許,鴻蒙內(nèi)核確實(shí)對(duì)
    發(fā)表于 08-20 08:00

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

    看task從哪些渠道產(chǎn)生:渠道很多,可能是shell 的一個(gè)命令,也可能由內(nèi)核創(chuàng)建,更多的是大家編寫(xiě)應(yīng)用程序new出來(lái)的一個(gè)線程。調(diào)度的內(nèi)容已經(jīng)有了,那他們?nèi)绾斡行虻谋?b class='flag-5'>調(diào)度?答案:是32個(gè)進(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ī)制源碼 詳見(jiàn):代碼庫(kù)建議先閱讀閱讀之前建議先讀本系列其他文章,進(jìn)入鴻蒙系統(tǒng)源碼分析(總目錄),以便對(duì)本文任務(wù)調(diào)度機(jī)制的理解。為什么學(xué)一個(gè)東西要學(xué)那么多的概念?
    發(fā)表于 11-23 10:53

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

    為何單獨(dú)講調(diào)度隊(duì)列?鴻蒙內(nèi)核代碼中有兩個(gè)源文件是關(guān)于隊(duì)列的,一個(gè)是用于
    發(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ī)制,同時(shí)支持時(shí)間片輪轉(zhuǎn)
    發(fā)表于 11-23 14:01

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

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

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

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

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

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

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

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

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

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

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

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

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

    從系統(tǒng)的角度看,線程是競(jìng)爭(zhēng)系統(tǒng)資源的最小運(yùn)行單元。線程可以使用或等待CPU、使用內(nèi)存空間等系統(tǒng)資源,并獨(dú)立于其它線程運(yùn)行。 鴻蒙內(nèi)核每個(gè)進(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ì)列對(duì)調(diào)度的作用

    鴻蒙內(nèi)核代碼中有兩個(gè)源文件是關(guān)于隊(duì)列的,一個(gè)是用于調(diào)度隊(duì)列,另一個(gè)是用于線程間通訊的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>對(duì)<b class='flag-5'>調(diào)度</b>的作用