女人荫蒂被添全过程13种图片,亚洲+欧美+在线,欧洲精品无码一区二区三区 ,在厨房拨开内裤进入毛片

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)核源碼:32級(jí)優(yōu)先級(jí)的進(jìn)程和線程調(diào)度

鴻蒙系統(tǒng)HarmonyOS ? 來(lái)源:my.oschina ? 作者:鴻蒙內(nèi)核源碼分析 ? 2021-04-24 11:18 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

先看四個(gè)宏定義,進(jìn)程和線程(線程就是任務(wù))最高和最低優(yōu)先級(jí)定義,[0,31]區(qū)間,即32級(jí),優(yōu)先級(jí)用于調(diào)度,CPU根據(jù)這個(gè)來(lái)決定先運(yùn)行哪個(gè)進(jìn)程和任務(wù)。

#define OS_PROCESS_PRIORITY_HIGHEST      0 //進(jìn)程最高優(yōu)先級(jí)
#define OS_PROCESS_PRIORITY_LOWEST       31 //進(jìn)程最低優(yōu)先級(jí)
#define OS_TASK_PRIORITY_HIGHEST    0 //任務(wù)最高優(yōu)先級(jí),軟時(shí)鐘任務(wù)就是最高級(jí)任務(wù),見(jiàn)于 OsSwtmrTaskCreate
#define OS_TASK_PRIORITY_LOWEST     31 //任務(wù)最低優(yōu)先級(jí)

為何進(jìn)程和線程都是32個(gè)優(yōu)先級(jí)?

回答這個(gè)問(wèn)題之前,先回答另一個(gè)問(wèn)題,為什么人類(lèi)幾乎所有的文明都是用十進(jìn)制的計(jì)數(shù)方式。答案掰手指就知道了,因?yàn)槿擞惺种割^。瑪雅人的二十進(jìn)制那是把腳指頭算上了,但其實(shí)也算是十進(jìn)制的表示。

這是否說(shuō)明一個(gè)問(wèn)題,認(rèn)知受環(huán)境的影響,方向是怎么簡(jiǎn)單/方便怎么來(lái)。這也可以解釋為什么人類(lèi)語(yǔ)言發(fā)音包括各種方言對(duì)媽媽這個(gè)詞都很類(lèi)似,因?yàn)閶雰赫f(shuō)mama是最容易的。注意認(rèn)識(shí)這點(diǎn)很重要!

而計(jì)算機(jī)的世界是二進(jìn)制的,是是非非,清清楚楚,特別的簡(jiǎn)單,二進(jìn)制已經(jīng)最簡(jiǎn)單了,到底啦,不可能有更簡(jiǎn)單的了。還記得雙向鏈表篇中說(shuō)過(guò)的嗎,因?yàn)楹?jiǎn)單所以才不簡(jiǎn)單啊,大道若簡(jiǎn),計(jì)算機(jī)就靠著這01碼,表述萬(wàn)千世界。

但人類(lèi)的大腦不擅長(zhǎng)存儲(chǔ),二進(jìn)制太長(zhǎng)了數(shù)到100就撐爆了大腦,記不住,為了記憶和運(yùn)算方便,編程常用靠近10進(jìn)制的 16進(jìn)制來(lái)表示 ,0x9527ABCD看著比 0011000111100101010100111舒服多了。

應(yīng)用開(kāi)發(fā)和內(nèi)核開(kāi)發(fā)有哪些區(qū)別?

區(qū)別還是很大的,這里只說(shuō)一點(diǎn),就是對(duì)位的控制能力,內(nèi)核會(huì)出現(xiàn)大量的按位運(yùn)算(&,|,~,^) , 一個(gè)變量的不同位表達(dá)不同的含義,但這在應(yīng)用程序員那是很少看到的,他們用的更多的是邏輯運(yùn)算(&&,||,!)

#define OS_TASK_STATUS_INIT         0x0001U //初始化狀態(tài)
#define OS_TASK_STATUS_READY        0x0002U //就緒狀態(tài)的任務(wù)都將插入就緒隊(duì)列
#define OS_TASK_STATUS_RUNNING      0x0004U //運(yùn)行狀態(tài)
#define OS_TASK_STATUS_SUSPEND      0x0008U //掛起狀態(tài)
#define OS_TASK_STATUS_PEND         0x0010U //阻塞狀態(tài)

這是任務(wù)各種狀態(tài)(注者后續(xù)將比如成貼標(biāo)簽)表述,將它們還原成二進(jìn)制就是:

0000000000000001 =0x0001U

0000000000000010 =0x0002U

0000000000000100 =0x0004U

0000000000001000 =0x0008U

0000000000010000 =0x0010U

發(fā)現(xiàn)二進(jìn)制這邊的區(qū)別沒(méi)有,用每一位來(lái)表示一種不同的狀態(tài),1表示是,0表示不是。

這樣的好處有兩點(diǎn):

1.可以多種標(biāo)簽同時(shí)存在比如 0x07 = 0b00000111,對(duì)應(yīng)以上就是任務(wù)有三個(gè)標(biāo)簽(初始,就緒,和運(yùn)行),進(jìn)程和線程在運(yùn)行期間是允許多種標(biāo)簽同時(shí)存在的。

2.節(jié)省了空間,一個(gè)變量就搞定了,如果是應(yīng)用程序員要實(shí)現(xiàn)這三個(gè)標(biāo)簽同時(shí)存在,習(xí)慣上要定義三個(gè)變量的,因?yàn)槟愕呐潘灶w粒度是一個(gè)變量而不是一個(gè)位。

而對(duì)位的管理/運(yùn)算就需要有個(gè)專(zhuān)門(mén)的管理器:位圖管理器 (見(jiàn)源碼 los_bitmap.c )

什么是位圖管理器?

直接上部分代碼,代碼關(guān)鍵地方都加了中文注釋?zhuān)?jiǎn)單說(shuō)就是對(duì)位的各種操作,比如如何在某個(gè)位上設(shè)1?如何找到最高位為1的是哪個(gè)位置?這些函數(shù)都是有大用途的。

//對(duì)狀態(tài)字的某一標(biāo)志位進(jìn)行置1操作
VOID LOS_BitmapSet(UINT32 *bitmap, UINT16 pos)
{
    if (bitmap == NULL) {
        return;
    }

    *bitmap |= 1U << (pos & OS_BITMAP_MASK);//在對(duì)應(yīng)位上置1
}
//對(duì)狀態(tài)字的某一標(biāo)志位進(jìn)行清0操作
VOID LOS_BitmapClr(UINT32 *bitmap, UINT16 pos)
{
    if (bitmap == NULL) {
        return;
    }

    *bitmap &= ~(1U << (pos & OS_BITMAP_MASK));//在對(duì)應(yīng)位上置0
}
/********************************************************
雜項(xiàng)算術(shù)指令
CLZ 用于計(jì)算操作數(shù)最高端0的個(gè)數(shù),這條指令主要用于一下兩個(gè)場(chǎng)合
  計(jì)算操作數(shù)規(guī)范化(使其最高位為1)時(shí)需要左移的位數(shù)
  確定一個(gè)優(yōu)先級(jí)掩碼中最高優(yōu)先級(jí)
********************************************************/
//獲取狀態(tài)字中為1的最高位 例如: 00110110 返回 5
UINT16 LOS_HighBitGet(UINT32 bitmap)
{
    if (bitmap == 0) {
        return LOS_INVALID_BIT_INDEX;
    }

    return (OS_BITMAP_MASK - CLZ(bitmap));
}
//獲取狀態(tài)字中為1的最低位, 例如: 00110110 返回 2
UINT16 LOS_LowBitGet(UINT32 bitmap)
{
    if (bitmap == 0) {
        return LOS_INVALID_BIT_INDEX;
    }

    return CTZ(bitmap);//
}
位圖在哪些地方應(yīng)用?

內(nèi)核很多模塊在使用位圖,這里只說(shuō)進(jìn)程和線程模塊,還記得開(kāi)始的問(wèn)題嗎,為何進(jìn)程和線程都是32個(gè)優(yōu)先級(jí)?因?yàn)樗麄兊膬?yōu)先級(jí)是由位圖管理的,管理一個(gè)UINT32的變量,所以是32級(jí),一個(gè)位一個(gè)級(jí)別,最高位優(yōu)先級(jí)最低。

    UINT32          priBitMap;          /**< BitMap for recording the change of task priority, //任務(wù)在執(zhí)行過(guò)程中優(yōu)先級(jí)會(huì)經(jīng)常變化,這個(gè)變量用來(lái)記錄所有曾經(jīng)變化
                                             the priority can not be greater than 31 */   //過(guò)的優(yōu)先級(jí),例如 ..01001011 曾經(jīng)有過(guò) 0,1,3,6 優(yōu)先級(jí)

這是任務(wù)控制塊中對(duì)調(diào)度優(yōu)先級(jí)位圖的定義,注意一個(gè)任務(wù)的優(yōu)先級(jí)在運(yùn)行過(guò)程中可不是一成不變的,內(nèi)核會(huì)根據(jù)運(yùn)行情況而改變它的,這個(gè)變量是用來(lái)保存這個(gè)任務(wù)曾經(jīng)有過(guò)的所有優(yōu)先級(jí)歷史記錄。

比如 任務(wù)A的優(yōu)先級(jí)位圖是 00000001001011 ,可以看出它曾經(jīng)有過(guò)四個(gè)調(diào)度等級(jí)記錄,那如果想知道優(yōu)先級(jí)最低的記錄是多少時(shí)怎么辦呢?

誒,上面的位圖管理器函數(shù)UINT16 LOS_HighBitGet(UINT32 bitmap)就很有用啦 ,它返回的是1在高位出現(xiàn)的位置,可以數(shù)一下是 6

因?yàn)槿蝿?wù)的優(yōu)先級(jí)0最大,所以最終的意思就是A任務(wù)曾經(jīng)有過(guò)的最低優(yōu)先級(jí)是6

一定要理解位圖的操作,內(nèi)核中大量存在這類(lèi)代碼,尤其到了匯編層,對(duì)寄存器的操作大量的出現(xiàn)。

比如以下這段匯編代碼。

    MSR     CPSR_c, #(CPSR_INT_DISABLE | CPSR_SVC_MODE)  @禁止中斷并切到管理模式
    LDRH    R1, [R0, #4]  @將存儲(chǔ)器地址為R0+4 的低16位數(shù)據(jù)讀入寄存器R1,并將R1的高16 位清零
    ORR     R1, #OS_TASK_STATUS_RUNNING @或指令 R1=R1|OS_TASK_STATUS_RUNNING
    STRH    R1, [R0, #4]  @將寄存器R1中的低16位寫(xiě)入以R0+4為地址的存儲(chǔ)器中

編程實(shí)例

對(duì)數(shù)據(jù)實(shí)現(xiàn)位操作,本實(shí)例實(shí)現(xiàn)如下功能:

某一標(biāo)志位置1。

獲取標(biāo)志位為1的最高bit位。

某一標(biāo)志位清0。

獲取標(biāo)志位為1的最低bit位。

#include "los_bitmap.h"
#include "los_printf.h"

static UINT32 Bit_Sample(VOID)
{
  UINT32 flag = 0x10101010;
  UINT16 pos;

  dprintf("\nBitmap Sample!\n");
  dprintf("The flag is 0x%8x\n", flag);

  pos = 8;
  LOS_BitmapSet(&flag, pos);
  dprintf("LOS_BitmapSet:\t pos : %d, the flag is 0x%0+8x\n", pos, flag);

  pos = LOS_HighBitGet(flag);
  dprintf("LOS_HighBitGet:\t The highest one bit is %d, the flag is 0x%0+8x\n", pos, flag);

  LOS_BitmapClr(&flag, pos);
  dprintf("LOS_BitmapClr:\t pos : %d, the flag is 0x%0+8x\n", pos, flag);

  pos = LOS_LowBitGet(flag);
  dprintf("LOS_LowBitGet:\t The lowest one bit is %d, the flag is 0x%0+8x\n\n", pos, flag);

  return LOS_OK;
}

結(jié)果驗(yàn)證

Bitmap Sample!
The flag is 0x10101010
LOS_BitmapSet: pos : 8,  the flag is 0x10101110
LOS_HighBitGet:The highest one bit is 28, the flag is 0x10101110
LOS_BitmapClr: pos : 28, the flag is 0x00101110
LOS_LowBitGet: The lowest one bit is 4, the flag is 0x00101110

編輯: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)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11070

    瀏覽量

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

    關(guān)注

    183

    文章

    2642

    瀏覽量

    68013
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    基于優(yōu)先級(jí)搶占系統(tǒng)的QNX調(diào)度算法

    調(diào)度算法,是基于優(yōu)先級(jí)的。QNX的線程優(yōu)先級(jí),是一個(gè)0-255的數(shù)字,數(shù)字越大優(yōu)先級(jí)越高。所以,優(yōu)先級(jí)
    發(fā)表于 10-31 09:17 ?971次閱讀

    基于優(yōu)先級(jí)調(diào)度的嵌入式實(shí)時(shí)操作系統(tǒng)內(nèi)核詳解(上)

    今日分享參加瑞薩RA MCU創(chuàng)意氛圍賽的選手項(xiàng)目——基于優(yōu)先級(jí)的RTOS內(nèi)核。本項(xiàng)目為基于優(yōu)先級(jí)調(diào)度的嵌入式實(shí)時(shí)操作系統(tǒng)內(nèi)核,其中
    發(fā)表于 09-04 14:12 ?1133次閱讀

    用戶級(jí)線程內(nèi)核級(jí)線程

    級(jí)線程的創(chuàng)建、撤消和調(diào)度不需要OS內(nèi)核的支持,是在語(yǔ)言(如Java)這一級(jí)處理的;而內(nèi)核支持
    發(fā)表于 01-10 15:01

    任務(wù)優(yōu)先級(jí)問(wèn)題

    優(yōu)先級(jí)的任務(wù)可以通過(guò)時(shí)間片輪轉(zhuǎn)調(diào)度來(lái)實(shí)現(xiàn)任務(wù)切換。在不同優(yōu)先級(jí)的任務(wù)中,如果高優(yōu)先級(jí)的任務(wù)沒(méi)有延時(shí),沒(méi)有等待信號(hào)量等使用任務(wù)調(diào)度
    發(fā)表于 04-02 04:35

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

    有以下兩種:有更高優(yōu)先級(jí)進(jìn)程創(chuàng)建或者恢復(fù)后,會(huì)發(fā)生進(jìn)程調(diào)度,此刻就緒列表中最高優(yōu)先級(jí)進(jìn)程變?yōu)檫\(yùn)
    發(fā)表于 10-14 14:00

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

    執(zhí)行. 不允許任何中斷發(fā)生, 沒(méi)錯(cuò),說(shuō)的是任何事是不能去打斷它,否則后果太嚴(yán)重了,這可是內(nèi)核在切換進(jìn)程線程的操作啊。在就緒隊(duì)列里找個(gè)最高優(yōu)先級(jí)的task切換
    發(fā)表于 11-23 10:53

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

    進(jìn)程下的線程優(yōu)先級(jí)可以不一樣嗎?請(qǐng)先想一下這個(gè)問(wèn)題。進(jìn)程線程是一對(duì)多的父子關(guān)系,內(nèi)核
    發(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)線程的影響。
    發(fā)表于 11-23 14:01

    rt-thread高優(yōu)先級(jí)線程可以調(diào)度執(zhí)行嗎?

    請(qǐng)教下,在rt-thread中,如果低優(yōu)先級(jí)線程中用while(1){}直接死循環(huán),是不是高優(yōu)先級(jí)線程也無(wú)法調(diào)度執(zhí)行了?如果高
    發(fā)表于 05-13 10:51

    Linux內(nèi)核線程優(yōu)先級(jí)設(shè)置的方法介紹

    內(nèi)核級(jí)線程進(jìn)程是一樣的,前者與POSIX線程(pthread)有很大的區(qū)別。因此,內(nèi)核
    發(fā)表于 04-23 14:58 ?5941次閱讀
    Linux<b class='flag-5'>內(nèi)核</b><b class='flag-5'>線程</b><b class='flag-5'>優(yōu)先級(jí)</b>設(shè)置的方法介紹

    鴻蒙內(nèi)核源碼分析:任務(wù)池管理技術(shù)

    當(dāng)前進(jìn)程內(nèi)高優(yōu)先級(jí)線程可搶占當(dāng)前進(jìn)程內(nèi)低優(yōu)先級(jí)線程,當(dāng)前進(jìn)
    的頭像 發(fā)表于 04-24 11:11 ?1827次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>源碼</b>分析:任務(wù)池管理技術(shù)

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

    進(jìn)程內(nèi)線程的影響。 鴻蒙內(nèi)核中的線程采用搶占式調(diào)度機(jī)制,同時(shí)支持時(shí)間片輪轉(zhuǎn)
    發(fā)表于 11-23 15:51 ?22次下載
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>源碼</b>分析:task是<b class='flag-5'>內(nèi)核</b><b class='flag-5'>調(diào)度</b>的單元

    cortex M內(nèi)核優(yōu)先級(jí)設(shè)置

    Cortex M內(nèi)核中每個(gè)中斷都有一個(gè)8位的優(yōu)先級(jí)設(shè)置寄存器這個(gè)8位的寄存器可以分為搶占優(yōu)先級(jí)和子優(yōu)先級(jí)兩個(gè)部分(通過(guò)設(shè)置優(yōu)先級(jí)組設(shè)置)搶占
    發(fā)表于 12-01 11:51 ?4次下載
    cortex M<b class='flag-5'>內(nèi)核</b><b class='flag-5'>優(yōu)先級(jí)</b>設(shè)置

    uC/OS-II學(xué)習(xí)筆記——優(yōu)先級(jí)反轉(zhuǎn)與優(yōu)先級(jí)繼承機(jī)制

    優(yōu)先級(jí)反轉(zhuǎn),是指某同步資源被較低優(yōu)先級(jí)進(jìn)程/線程所擁有,較高優(yōu)先級(jí)進(jìn)程/
    發(fā)表于 02-09 10:33 ?2次下載
    uC/OS-II學(xué)習(xí)筆記——<b class='flag-5'>優(yōu)先級(jí)</b>反轉(zhuǎn)與<b class='flag-5'>優(yōu)先級(jí)</b>繼承機(jī)制

    基于優(yōu)先級(jí)調(diào)度的嵌入式實(shí)時(shí)操作系統(tǒng)內(nèi)核詳解(下)

    基于優(yōu)先級(jí)調(diào)度的嵌入式實(shí)時(shí)操作系統(tǒng)內(nèi)核詳解(下)
    的頭像 發(fā)表于 09-06 12:46 ?1255次閱讀
    基于<b class='flag-5'>優(yōu)先級(jí)</b><b class='flag-5'>調(diào)度</b>的嵌入式實(shí)時(shí)操作系統(tǒng)<b class='flag-5'>內(nèi)核</b>詳解(下)
    主站蜘蛛池模板: 文水县| 湖南省| 登封市| 天全县| 武宁县| 德保县| 抚宁县| 璧山县| 汨罗市| 巩留县| 邳州市| 象州县| 阿克陶县| 威远县| 临邑县| 习水县| 黄浦区| 平阴县| 衡东县| 鹤庆县| 漾濞| 金堂县| 湟源县| 黄骅市| 南靖县| 阳谷县| 开封市| 中牟县| 三明市| 黄山市| 莱阳市| 大安市| 北宁市| 鄂托克前旗| 伊春市| 衡南县| 铜鼓县| 温州市| 珲春市| 山东| 曲麻莱县|