衡阳派盒市场营销有限公司

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

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

3天內不再提示

CPU進入idle進程狀態的流程

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

cpuidle framework

每一個 CPU 核心都會有一個 idle 進程,idle 進程是當系統沒有調度 CPU 資源的時候,會進入 idle 進程,而 idle 進程的作用就是不使用 CPU,以此達到省電的目的。

ARM64架構中,當CPU Idle時,會調用WFI指令(wait for interrupt),關掉CPU的Clock以便降低功耗,當有外設中斷觸發時,CPU又會恢復回來。

cpuidle core 是 cpuidle framework 的核心模塊,負責抽象出 cpuidle device、cpuidle driver 和 cpuidle governor 三個實體,如下所示:

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

cpuidle core 抽象出了 cpuidle device、cpuidle driver 和 cpuidle governor 三個數據結構。

數據結構

cpuidle_device

針對每個CPU核都對應一個struct cpuidle_device結構,主要字段介紹如下

structcpuidle_device{
//該cpu核是否注冊進內核中
unsignedintregistered:1;
//該cpu核是否已經使能
unsignedintenabled:1;
unsignedintuse_deepest_state:1;
//對應的cpunumber
unsignedintcpu;

//該cpu核上一次停留在cpuidle狀態的時間(us)
intlast_residency;
//記錄每個cpuidle狀態的統計信息,包括是否使能、進入該cpuidle狀態的次數,停留在該cpuidle狀態的總時間(us)
structcpuidle_state_usagestates_usage[CPUIDLE_STATE_MAX];
......
};

對應的注冊接口是 cpuidle_register_device。

cpuidle_driver

cpuidle driver用于驅動一個或多個CPU核,關鍵字段描述如下:

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

//用于驅動注冊時判斷是否需要設置broadcasttimer
unsignedintbctimer:1;
//用于描述cpuidle的狀態,需要按照功耗從大到小來排序,具體有多少個cpuidle狀態
structcpuidle_statestates[CPUIDLE_STATE_MAX];
......
};

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

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

//進入該state的回調函數
int(*enter)(structcpuidle_device*dev,
structcpuidle_driver*drv,
intindex);

//CPU長時間不需要工作時(稱作offline),可調用該回調函數。
int(*enter_dead)(structcpuidle_device*dev,intindex);
......
};

對應的注冊接口是 cpuidle_register_driver。

cpuidle_governor

governor 結構主要提供不同的回調函數,最終由 menu_governor 填充,主要字段如下:

structcpuidle_governor{
charname[CPUIDLE_NAME_LEN];
structlist_headgovernor_list;
//governor的級別,正常情況下,kernel會選擇系統中rating值最大的governor作為當前governor
unsignedintrating;

//在設備驅動注冊和注銷的時候調用
int(*enable)(structcpuidle_driver*drv,
structcpuidle_device*dev);
void(*disable)(structcpuidle_driver*drv,
structcpuidle_device*dev);

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

對應的注冊接口是 cpuidle_register_governor。

流程

我們先看下設備和驅動的注冊過程:

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

注冊之后便將設備和驅動建立起連接關系了,最終 cpuidle framework 的用戶便可通過接口來調用下層的接口,進而完成具體的硬件操作。

下面看下 CPU 進入 idle 狀態的流程圖:

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

可以看出,最終是通過 PSCI 來實現 CPU 的 suspend。

PSCI

PSCI, Power State Coordination Interface,由ARM定義的電源管理接口規范,通常由Firmware來實現,而Linux系統可以通過smc/hvc指令來進入不同的Exception Level,進而調用對應的實現。

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

PSCI 支持如下功能:

CPU hotplug (on/off)

CPU idle (suspend/resume)

System suspend/resume

System shutdown and reset

每個功能和ATF之間的調用接口如下所示:

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




審核編輯:劉清

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

    關注

    134

    文章

    9169

    瀏覽量

    369243
  • 電源管理
    +關注

    關注

    115

    文章

    6193

    瀏覽量

    144960
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10905

    瀏覽量

    213033

原文標題:CPU 進入 IDLE 都做了啥?

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    電源管理入門-CPU Idle有什么用?Idle狀態判斷

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

    【Linux學習雜談】之進程狀態

    正在運行,也就是就緒態的進程進入運行的一個狀態,得到CPU的執行權限3.僵尸態 僵尸態就是進程結束了,但是相應的資源沒有被父
    發表于 09-27 00:36

    關于CC1101的WOR問題,請問SLLEP狀態下想切換進入WOR,是要先進入IDLE,然后延時發送sworrs以及swor指令嗎?

    )時間后,開始進行event1,標定,發送;還是說直接就開始event1,標定,發送,然后再進入SLEEP?2、SLLEP狀態下想切換進入WOR,是要先進入
    發表于 06-06 06:37

    CPU調度的概念及問題解決

    1.1 cpu調度 其任務是控制、協調進程cpu的競爭,即按一定的調度算法從就緒隊列中選擇一個進程,把cpu的使用權交給被選中的
    發表于 08-05 06:42

    請問低功耗IDLE模式的喚醒如何做到幾個毫秒喚醒一次繼而再次進入該模式?

    資料中說:IDLE模式下,將CPU 置于低功耗模式。可有選擇性地關閉外設時鐘并且只有那些在IDLE 期間需要運行的外設保持運行狀態。來自激活外設或者安全裝置定時器的已啟用的中斷將把處理
    發表于 05-12 09:13

    鴻蒙內核源碼分析(進程管理篇):進程是內核的資源管理單元

    時,進程被阻塞掛起。僵尸態(Zombies):該進程運行結束,等待父進程回收其控制塊資源。圖 1 進程狀態遷移示意圖
    發表于 11-24 11:23

    進程有幾種狀態

    文章目錄操作系統進程和線程什么是進程?什么是線程?進程和線程有什么區別?何時使用多進程,何時使用多線程?進程有幾種
    發表于 12-24 07:16

    Linux 進程狀態淺析

    系統調用)、或TASK_DEAD狀態(如exit系統調用);或由于執行系統調用需要的資源得不到滿足,而進入TASK_INTERRUPTIBLE狀態或TASK_UNINTERRUPTIBLE狀態
    發表于 04-02 14:40 ?302次閱讀

    CPU核心中idle進程作用

    每一個 CPU 核心都會有一個 idle 進程idle 進程是當系統沒有調度 CPU 資源的時
    的頭像 發表于 10-14 09:28 ?2036次閱讀

    進程有哪些狀態?細說進程狀態

    進程有哪些狀態?這個問題在面試的時候出現的概率也比較高。
    的頭像 發表于 07-25 17:06 ?1417次閱讀
    <b class='flag-5'>進程</b>有哪些<b class='flag-5'>狀態</b>?細說<b class='flag-5'>進程</b>的<b class='flag-5'>狀態</b>

    如何在connected idle狀態下向手機同步音量

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

    進程進入等待狀態有哪幾種方式

    進程進入等待狀態的方式有多種,下面將詳細介紹。 一、阻塞等待狀態 阻塞等待狀態是指進程由于某些原
    的頭像 發表于 11-17 11:19 ?2539次閱讀

    python自帶的idle怎么進入

    詳細介紹Python的IDLE的各個方面,包括如何進入IDLEIDLE的功能和特點以及如何使用IDLE進行編程和調試等。 首先,
    的頭像 發表于 11-29 14:51 ?2390次閱讀

    如何在內核中啟動secondary cpu

    給調度器之前,并沒有實際的業務進程,而我們知道內核中cpu在空閑時會執行idle進程。因此,在其啟動之前需要為每個cpu初始化一個
    的頭像 發表于 12-05 15:46 ?672次閱讀
    如何在內核中啟動secondary <b class='flag-5'>cpu</b>

    secondary cpu執行流程介紹

    : 由于其底層相關初始化流程與primary cpu類似,因此此處不再介紹。我們這里主要看一下它是如何通過secondary_start_kernel啟動idle線程的: asmlinkage
    的頭像 發表于 12-05 16:12 ?936次閱讀
    secondary <b class='flag-5'>cpu</b>執行<b class='flag-5'>流程</b>介紹
    百家乐博百家乐的玩法技巧和规则 | 玩机器百家乐心得| 大发888娱乐场 注册| 百家乐官网代理每周返佣| 免费百家乐规则| 大发888官网客服| 百家乐官网讯特| 澳门玩百家乐的玩法技巧和规则| 霍林郭勒市| 百家乐纯数字玩法| 大发8888| 百家乐官网破解赌戏玩| 新乐园百家乐娱乐城| 网上百家乐官网合法吗| 噢门百家乐注码技巧| 战神线上娱乐| 百家乐官网桌子租| 太阳城娱乐城怎么样| 玩百家乐官网怎么能赢呢| 澳门顶级赌场手机在线链接| 百家乐官网赢利策略| 百家乐官网接线玩法| 玩百家乐怎么才能赢| 十堰市| 香港百家乐玩法| 永利高百家乐官网开户| 百家乐筹码币方形| 百家乐官网赢的秘诀| 希尔顿百家乐试玩| 网上百家乐官网开户送现金| 百家乐平注法规则| 新加坡百家乐官网赌法| 大发888官方zhuce| 巨星百家乐官网的玩法技巧和规则 | 百家乐官网网站程序| 威尼斯人娱乐中心老品牌| 百家乐官网伴侣| 六合彩香港| 百家乐必赢法软件| 百家乐官网终端下载| 淘宝博百家乐的玩法技巧和规则|