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

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

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

CPU進(jìn)入idle進(jìn)程狀態(tài)的流程

Linux閱碼場(chǎng) ? 來源:人人都是極客 ? 作者:布道師Peter ? 2022-10-14 09:26 ? 次閱讀

cpuidle framework

每一個(gè) CPU 核心都會(huì)有一個(gè) idle 進(jìn)程,idle 進(jìn)程是當(dāng)系統(tǒng)沒有調(diào)度 CPU 資源的時(shí)候,會(huì)進(jìn)入 idle 進(jìn)程,而 idle 進(jìn)程的作用就是不使用 CPU,以此達(dá)到省電的目的。

ARM64架構(gòu)中,當(dāng)CPU Idle時(shí),會(huì)調(diào)用WFI指令(wait for interrupt),關(guān)掉CPU的Clock以便降低功耗,當(dāng)有外設(shè)中斷觸發(fā)時(shí),CPU又會(huì)恢復(fù)回來。

cpuidle core 是 cpuidle framework 的核心模塊,負(fù)責(zé)抽象出 cpuidle device、cpuidle driver 和 cpuidle governor 三個(gè)實(shí)體,如下所示:

88ab3e4e-4b55-11ed-a3b6-dac502259ad0.png

cpuidle core 抽象出了 cpuidle device、cpuidle driver 和 cpuidle governor 三個(gè)數(shù)據(jù)結(jié)構(gòu)。

數(shù)據(jù)結(jié)構(gòu)

cpuidle_device

針對(duì)每個(gè)CPU核都對(duì)應(yīng)一個(gè)struct cpuidle_device結(jié)構(gòu),主要字段介紹如下

structcpuidle_device{
//該cpu核是否注冊(cè)進(jìn)內(nèi)核中
unsignedintregistered:1;
//該cpu核是否已經(jīng)使能
unsignedintenabled:1;
unsignedintuse_deepest_state:1;
//對(duì)應(yīng)的cpunumber
unsignedintcpu;

//該cpu核上一次停留在cpuidle狀態(tài)的時(shí)間(us)
intlast_residency;
//記錄每個(gè)cpuidle狀態(tài)的統(tǒng)計(jì)信息,包括是否使能、進(jìn)入該cpuidle狀態(tài)的次數(shù),停留在該cpuidle狀態(tài)的總時(shí)間(us)
structcpuidle_state_usagestates_usage[CPUIDLE_STATE_MAX];
......
};

對(duì)應(yīng)的注冊(cè)接口是 cpuidle_register_device。

cpuidle_driver

cpuidle driver用于驅(qū)動(dòng)一個(gè)或多個(gè)CPU核,關(guān)鍵字段描述如下:

structcpuidle_driver{
constchar*name;
structmodule*owner;
intrefcnt;

//用于驅(qū)動(dòng)注冊(cè)時(shí)判斷是否需要設(shè)置broadcasttimer
unsignedintbctimer:1;
//用于描述cpuidle的狀態(tài),需要按照功耗從大到小來排序,具體有多少個(gè)cpuidle狀態(tài)
structcpuidle_statestates[CPUIDLE_STATE_MAX];
......
};

//CPU有多種不同的idle級(jí)別。這些idle級(jí)別有不同的功耗和延遲,從而可以在不同的場(chǎng)景下使用
//主要包括exit_latency、power_usage、target_residency。這些特性是governor制定idle策略的依據(jù)
structcpuidle_state{
charname[CPUIDLE_NAME_LEN];
chardesc[CPUIDLE_DESC_LEN];

unsignedintflags;
//CPU從該idle state下返回運(yùn)行狀態(tài)的延遲,單位為us。它決定了CPU在idle狀態(tài)和run狀態(tài)之間切換的效率,如果延遲過大,將會(huì)影響系統(tǒng)性能;
unsignedintexit_latency;/*inUS*/
//CPU在該idlestate下的功耗,單位為mW
intpower_usage;/*inmW*/
//期望的停留時(shí)間,單位為us。進(jìn)入和退出idle state是需要消耗額外的能量的,如果在idle狀態(tài)停留的時(shí)間過短,節(jié)省的功耗少于額外的消耗,則得不償失。governor會(huì)根據(jù)該字段,結(jié)合當(dāng)前的系統(tǒng)情況(如可以idle多久),選擇idle level;
unsignedinttarget_residency;/*inUS*/
booldisabled;/*disabledonallCPUs*/

//進(jìn)入該state的回調(diào)函數(shù)
int(*enter)(structcpuidle_device*dev,
structcpuidle_driver*drv,
intindex);

//CPU長(zhǎng)時(shí)間不需要工作時(shí)(稱作offline),可調(diào)用該回調(diào)函數(shù)。
int(*enter_dead)(structcpuidle_device*dev,intindex);
......
};

對(duì)應(yīng)的注冊(cè)接口是 cpuidle_register_driver。

cpuidle_governor

governor 結(jié)構(gòu)主要提供不同的回調(diào)函數(shù),最終由 menu_governor 填充,主要字段如下:

structcpuidle_governor{
charname[CPUIDLE_NAME_LEN];
structlist_headgovernor_list;
//governor的級(jí)別,正常情況下,kernel會(huì)選擇系統(tǒng)中rating值最大的governor作為當(dāng)前governor
unsignedintrating;

//在設(shè)備驅(qū)動(dòng)注冊(cè)和注銷的時(shí)候調(diào)用
int(*enable)(structcpuidle_driver*drv,
structcpuidle_device*dev);
void(*disable)(structcpuidle_driver*drv,
structcpuidle_device*dev);

//根據(jù)當(dāng)前系統(tǒng)的運(yùn)行狀況,以及各個(gè)idlestate的特性,選擇一個(gè)state(即決策)
int(*select)(structcpuidle_driver*drv,
structcpuidle_device*dev,
bool*stop_tick);
//通過該回調(diào)函數(shù),可以告知governor,系統(tǒng)上一次所處的idlestate是哪個(gè)
void(*reflect)(structcpuidle_device*dev,intindex);
};

對(duì)應(yīng)的注冊(cè)接口是 cpuidle_register_governor。

流程

我們先看下設(shè)備和驅(qū)動(dòng)的注冊(cè)過程:

88d8a2f8-4b55-11ed-a3b6-dac502259ad0.png

注冊(cè)之后便將設(shè)備和驅(qū)動(dòng)建立起連接關(guān)系了,最終 cpuidle framework 的用戶便可通過接口來調(diào)用下層的接口,進(jìn)而完成具體的硬件操作。

下面看下 CPU 進(jìn)入 idle 狀態(tài)的流程圖:

88ea354a-4b55-11ed-a3b6-dac502259ad0.png

可以看出,最終是通過 PSCI 來實(shí)現(xiàn) CPU 的 suspend。

PSCI

PSCI, Power State Coordination Interface,由ARM定義的電源管理接口規(guī)范,通常由Firmware來實(shí)現(xiàn),而Linux系統(tǒng)可以通過smc/hvc指令來進(jìn)入不同的Exception Level,進(jìn)而調(diào)用對(duì)應(yīng)的實(shí)現(xiàn)。

88ffd206-4b55-11ed-a3b6-dac502259ad0.png

PSCI 支持如下功能:

CPU hotplug (on/off)

CPU idle (suspend/resume)

System suspend/resume

System shutdown and reset

每個(gè)功能和ATF之間的調(diào)用接口如下所示:

892f577e-4b55-11ed-a3b6-dac502259ad0.png89970bee-4b55-11ed-a3b6-dac502259ad0.png




審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    9027

    瀏覽量

    366491
  • 電源管理
    +關(guān)注

    關(guān)注

    115

    文章

    6140

    瀏覽量

    144107
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10805

    瀏覽量

    210847

原文標(biāo)題:CPU 進(jìn)入 IDLE 都做了啥?

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux進(jìn)程怎么綁定CPU

    昨天在群里有朋友問:把進(jìn)程綁定到某個(gè) CPU 上運(yùn)行是怎么實(shí)現(xiàn)的。
    發(fā)表于 10-26 10:26 ?1839次閱讀

    電源管理入門-CPU Idle有什么用?Idle狀態(tài)判斷

    答案就是“省電”,當(dāng)多核CPU沒有任務(wù)執(zhí)行的時(shí)候,這時(shí)候需要將除主Core之外的其他Core進(jìn)行低功耗處理,這件事就是CPU Idle機(jī)制做的。
    的頭像 發(fā)表于 11-16 16:46 ?7118次閱讀
    電源管理入門-<b class='flag-5'>CPU</b> <b class='flag-5'>Idle</b>有什么用?<b class='flag-5'>Idle</b><b class='flag-5'>狀態(tài)</b>判斷

    【Linux學(xué)習(xí)雜談】之進(jìn)程狀態(tài)

    正在運(yùn)行,也就是就緒態(tài)的進(jìn)程進(jìn)入運(yùn)行的一個(gè)狀態(tài),得到CPU的執(zhí)行權(quán)限3.僵尸態(tài) 僵尸態(tài)就是進(jìn)程結(jié)束了,但是相應(yīng)的資源沒有被父
    發(fā)表于 09-27 00:36

    關(guān)于CC1101的WOR問題,請(qǐng)問SLLEP狀態(tài)下想切換進(jìn)入WOR,是要先進(jìn)入IDLE,然后延時(shí)發(fā)送sworrs以及swor指令嗎?

    )時(shí)間后,開始進(jìn)行event1,標(biāo)定,發(fā)送;還是說直接就開始event1,標(biāo)定,發(fā)送,然后再進(jìn)入SLEEP?2、SLLEP狀態(tài)下想切換進(jìn)入WOR,是要先進(jìn)入
    發(fā)表于 06-06 06:37

    CPU調(diào)度的概念及問題解決

    1.1 cpu調(diào)度 其任務(wù)是控制、協(xié)調(diào)進(jìn)程對(duì)cpu的競(jìng)爭(zhēng),即按一定的調(diào)度算法從就緒隊(duì)列中選擇一個(gè)進(jìn)程,把cpu的使用權(quán)交給被選中的
    發(fā)表于 08-05 06:42

    請(qǐng)問低功耗IDLE模式的喚醒如何做到幾個(gè)毫秒喚醒一次繼而再次進(jìn)入該模式?

    資料中說:IDLE模式下,將CPU 置于低功耗模式??捎羞x擇性地關(guān)閉外設(shè)時(shí)鐘并且只有那些在IDLE 期間需要運(yùn)行的外設(shè)保持運(yùn)行狀態(tài)。來自激活外設(shè)或者安全裝置定時(shí)器的已啟用的中斷將把處理
    發(fā)表于 05-12 09:13

    進(jìn)程有幾種狀態(tài)

    文章目錄操作系統(tǒng)進(jìn)程和線程什么是進(jìn)程?什么是線程?進(jìn)程和線程有什么區(qū)別?何時(shí)使用多進(jìn)程,何時(shí)使用多線程?進(jìn)程有幾種
    發(fā)表于 12-24 07:16

    Linux 進(jìn)程狀態(tài)淺析

    系統(tǒng)調(diào)用)、或TASK_DEAD狀態(tài)(如exit系統(tǒng)調(diào)用);或由于執(zhí)行系統(tǒng)調(diào)用需要的資源得不到滿足,而進(jìn)入TASK_INTERRUPTIBLE狀態(tài)或TASK_UNINTERRUPTIBLE狀態(tài)
    發(fā)表于 04-02 14:40 ?282次閱讀

    CPU核心中idle進(jìn)程作用

    每一個(gè) CPU 核心都會(huì)有一個(gè) idle 進(jìn)程,idle 進(jìn)程是當(dāng)系統(tǒng)沒有調(diào)度 CPU 資源的時(shí)
    的頭像 發(fā)表于 10-14 09:28 ?1894次閱讀

    進(jìn)程有哪些狀態(tài)?細(xì)說進(jìn)程狀態(tài)

    進(jìn)程有哪些狀態(tài)?這個(gè)問題在面試的時(shí)候出現(xiàn)的概率也比較高。
    的頭像 發(fā)表于 07-25 17:06 ?1232次閱讀
    <b class='flag-5'>進(jìn)程</b>有哪些<b class='flag-5'>狀態(tài)</b>?細(xì)說<b class='flag-5'>進(jìn)程</b>的<b class='flag-5'>狀態(tài)</b>

    如何在connected idle狀態(tài)下向手機(jī)同步音量

    在QCC517x/QCC518x新的ADK下,headset工程如果有音量加減事件,只有當(dāng)前有A2DP播放音樂或者HFP通話狀態(tài)下才會(huì)給手機(jī)發(fā)送事件,否則程序會(huì)忽略音量加減事件。本文介紹如何在connected idle狀態(tài)下向
    的頭像 發(fā)表于 10-20 12:22 ?682次閱讀
    如何在connected <b class='flag-5'>idle</b><b class='flag-5'>狀態(tài)</b>下向手機(jī)同步音量

    進(jìn)程進(jìn)入等待狀態(tài)有哪幾種方式

    進(jìn)程進(jìn)入等待狀態(tài)的方式有多種,下面將詳細(xì)介紹。 一、阻塞等待狀態(tài) 阻塞等待狀態(tài)是指進(jìn)程由于某些原
    的頭像 發(fā)表于 11-17 11:19 ?2023次閱讀

    python自帶的idle怎么進(jìn)入

    詳細(xì)介紹Python的IDLE的各個(gè)方面,包括如何進(jìn)入IDLE、IDLE的功能和特點(diǎn)以及如何使用IDLE進(jìn)行編程和調(diào)試等。 首先,
    的頭像 發(fā)表于 11-29 14:51 ?2143次閱讀

    如何在內(nèi)核中啟動(dòng)secondary cpu

    給調(diào)度器之前,并沒有實(shí)際的業(yè)務(wù)進(jìn)程,而我們知道內(nèi)核中cpu在空閑時(shí)會(huì)執(zhí)行idle進(jìn)程。因此,在其啟動(dòng)之前需要為每個(gè)cpu初始化一個(gè)
    的頭像 發(fā)表于 12-05 15:46 ?507次閱讀
    如何在內(nèi)核中啟動(dòng)secondary <b class='flag-5'>cpu</b>

    secondary cpu執(zhí)行流程介紹

    : 由于其底層相關(guān)初始化流程與primary cpu類似,因此此處不再介紹。我們這里主要看一下它是如何通過secondary_start_kernel啟動(dòng)idle線程的: asmlinkage
    的頭像 發(fā)表于 12-05 16:12 ?768次閱讀
    secondary <b class='flag-5'>cpu</b>執(zhí)行<b class='flag-5'>流程</b>介紹