99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

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

yzcdx ? 來(lái)源:OS與AUTOSAR研究 ? 2023-11-16 16:46 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1. CPU Idle有什么用?

答案就是“省電”,當(dāng)多核CPU沒(méi)有任務(wù)執(zhí)行的時(shí)候,這時(shí)候需要將除主Core之外的其他Core進(jìn)行低功耗處理,這件事就是CPU Idle機(jī)制做的。

idle狀態(tài): 在Linux kernel中,當(dāng)cpu中沒(méi)有任務(wù)在執(zhí)行,也沒(méi)有任何中斷、異常信號(hào)過(guò)來(lái)的時(shí)候,我們稱(chēng)為處于idle狀態(tài),針對(duì)這種狀態(tài)Linux設(shè)計(jì)了一套cpuidle framework框架,專(zhuān)門(mén)用于cpuidle的管理。

Linux系統(tǒng)初始化時(shí)會(huì)為每個(gè)cpu創(chuàng)建一個(gè)idle線程,當(dāng)沒(méi)有其他進(jìn)程需要運(yùn)行的時(shí)候,便運(yùn)行idle線程。

對(duì)于不同的功耗及恢復(fù)時(shí)間的要求,可以根據(jù)芯片硬件支持的情況定義多種idle狀態(tài),這些狀態(tài)按功耗從低到高(對(duì)應(yīng)著恢復(fù)時(shí)間從少到多)排列,利用linux提供的cpuidle框架,用戶(hù)選用不同的idle策略。這么做的目的就是盡可能在不影響性能的前提下,減少功耗。

ARM64架構(gòu)中,至少會(huì)提供一個(gè)wfi的idle狀態(tài),有些芯片可能還會(huì)提供core下電的idle狀態(tài)。當(dāng)CPU idle時(shí),根據(jù)預(yù)測(cè)的idle時(shí)間、功耗受益大小、恢復(fù)的時(shí)間長(zhǎng)短,選用一個(gè)idle狀態(tài),比如進(jìn)入wfi,關(guān)掉CPU的arch timer以便降低功耗,當(dāng)有中斷觸發(fā)時(shí),CPU又會(huì)恢復(fù)回來(lái)。

2. CPU Idle整體框架

90220672-8456-11ee-939d-92fbcf53809c.png

首先是CPUIdle子系統(tǒng)通過(guò)sysfs向userspace提供的節(jié)點(diǎn):

一類(lèi)是針對(duì)整個(gè)系統(tǒng)的/sys/devices/system/cpu/cpuidle,通過(guò)其中的current_driver、current_governor、available_governors等節(jié)點(diǎn)可以獲取或設(shè)置CPUIdle的驅(qū)動(dòng)信息以及governor。

一類(lèi)是針對(duì)每個(gè)CPU的/sys/devices/system/cpu/cpux/cpuidle,通過(guò)子節(jié)點(diǎn)暴露各個(gè)在線的CPU中每個(gè)不同Idle級(jí)別的name、desc、power、latency等信息。

什么時(shí)候進(jìn)入idle?

關(guān)閉一些核可以節(jié)省功耗,但關(guān)閉之后對(duì)時(shí)延(性能)必會(huì)造成一定的影響,如果在關(guān)閉之后很短的時(shí)間內(nèi)就被喚醒,那么就會(huì)造成功耗/性能雙方都不討好,在進(jìn)入退出idle的過(guò)程中也是會(huì)有功耗的損失的,如果在idle狀態(tài)下面節(jié)省的功耗還無(wú)法彌補(bǔ)進(jìn)入退出該idle的功耗,那么反而會(huì)得不償失。

--解決方法就是:策略。是由cpuidle framework會(huì)根據(jù)不同的場(chǎng)景來(lái)進(jìn)行仲裁選擇使用何種的idle狀態(tài)。

903a4462-8456-11ee-939d-92fbcf53809c.png

在kernel中cpuidle framework主體包含三個(gè)模塊,分別為cpuidle core、cpuidle governors和cpuidle drivers,

cpu idle core:負(fù)責(zé)整體框架,同時(shí)負(fù)責(zé)和sched模塊對(duì)接,當(dāng)調(diào)度器發(fā)現(xiàn)沒(méi)有任務(wù)在執(zhí)行時(shí)候,就切換到idle進(jìn)程,通知到cpuidle framework的cpuidle core模塊要做接下來(lái)的idle操作。向cpuidle driver/governors模塊提供統(tǒng)一的driver和governors注冊(cè)和管理接口,向用戶(hù)空間程序提供governor選擇的接口。

cpuidle driver:負(fù)責(zé)具體idle機(jī)制的實(shí)現(xiàn)(不同等級(jí)下面idle的指標(biāo)也是在這個(gè)模塊進(jìn)行填充),不同的平臺(tái)會(huì)有不同的drivers實(shí)現(xiàn)。

cpudile governors:在這個(gè)模塊進(jìn)行cpuidle的選擇,選擇的算法主要是基于切換的功耗代價(jià)和系統(tǒng)的延遲容忍度,電源管理的目標(biāo)就是在保證延遲在系統(tǒng)可以接受的范圍內(nèi)盡可能的節(jié)省功耗。

3. Idle狀態(tài)判斷

在Linux系統(tǒng)啟動(dòng)的時(shí)候,會(huì)在每個(gè)cpu上創(chuàng)建對(duì)應(yīng)的idle進(jìn)程,start_kernel()函數(shù)初始化內(nèi)核需要的所有數(shù)據(jù)結(jié)構(gòu),并創(chuàng)建一個(gè)名為init的進(jìn)程(pid=1),當(dāng)init進(jìn)程創(chuàng)建完后,cpu的idle進(jìn)程處于cpu_idle_loop()無(wú)限循環(huán)中,當(dāng)沒(méi)有其他進(jìn)程處于TASK_RUNNING狀態(tài)時(shí)候,調(diào)度器才會(huì)執(zhí)行cpu idle線程,讓cpu進(jìn)入idle模式.其函數(shù)調(diào)用關(guān)系簡(jiǎn)要概括如下:

start_kernel –> rest_init –> cpu_startup_entry, 在cpu_startup_entry這個(gè)函數(shù)中,最終程序會(huì)進(jìn)入無(wú)限循環(huán)do_idle loop中。

這里我們又進(jìn)入看代碼環(huán)節(jié),可以參考公眾號(hào)之前的文章# Linux驅(qū)動(dòng)-IMX6ULL開(kāi)發(fā)板qemu環(huán)境搭建,我們修改好qemu啟動(dòng)腳本加-s -S后,在VS中打斷點(diǎn),進(jìn)行代碼查看。

90598a48-8456-11ee-939d-92fbcf53809c.png

cpu_idle_loop()函數(shù)中會(huì)不斷的進(jìn)行輪詢(xún)判斷

while (1) {
    ...
    if (cpu_is_offline(cpu)) {
            cpuhp_report_idle_dead();
            arch_cpu_idle_dead();
    }

    local_irq_disable();
    arch_cpu_idle_enter();
    ...
}

3. cpuidle core

cpuidle core抽象出了三個(gè)數(shù)據(jù)結(jié)構(gòu):

cpuidle device:用于描述CPU核的cpuidle設(shè)備。

cpuidle driver:用于描述CPU核的cpuidle驅(qū)動(dòng)。

cpuidle governor:主要根據(jù)cpuidle的device和driver狀態(tài)來(lái)選擇策略。

90856f32-8456-11ee-939d-92fbcf53809c.png

以cpuidle-pcsi.c為例,整個(gè)cpuidle注冊(cè)流程如下圖:

90a281e4-8456-11ee-939d-92fbcf53809c.png

4. 注冊(cè)初始化

cpuidle初始化包括governor注冊(cè)、驅(qū)動(dòng)注冊(cè)和設(shè)備注冊(cè)三部分

4.1 cpuidle governor注冊(cè)

90d62fd0-8456-11ee-939d-92fbcf53809c.png

cpuidle governor在cpuidle驅(qū)動(dòng)和設(shè)備之前注冊(cè),內(nèi)核使用一個(gè)鏈表維護(hù)系統(tǒng)中所有已注冊(cè)的governor。當(dāng)前新版內(nèi)核一共支持ladder、menu、teo和haltpoll四種governor,它們都通過(guò)調(diào)用cpuidle_register_governor函數(shù)將自身注冊(cè)到系統(tǒng)中。

Haltpoll governor:它是用于優(yōu)化虛擬機(jī)性能的一種cpuidle governor。其原理為當(dāng)vcpu進(jìn)入idle時(shí),通過(guò)guest端執(zhí)行poll操作,以避免使其陷入host中。它的優(yōu)點(diǎn)是減少了vm切換和通過(guò)ipi喚醒vcpu的成本,但它也造成在guest睡眠時(shí),host無(wú)法復(fù)用該vcpu對(duì)應(yīng)的物理cpu,從而降低系統(tǒng)吞吐量的問(wèn)題。

Ladder governor:該governor通過(guò)cpu前一次idle狀態(tài)的駐留時(shí)間是否超過(guò)該state延遲時(shí)間一個(gè)特定的值(promotion_time_ns),以及下一個(gè)state的延遲時(shí)間是否超過(guò)系統(tǒng)延遲容忍度,來(lái)確定是否需要提升idle state。由于該governor每次只能提升一個(gè)state,因此其state提升方式就像梯子一樣逐級(jí)往上,這也是它的名字由來(lái)。它往往用于periodic timer tick system。

Menu governor:直接選擇可能滿(mǎn)足需求的最深休眠態(tài),就好像你拿著菜單(menu)選菜一樣。如果深度的idle state更好,那么就會(huì)直接進(jìn)入到深度的idle state。

Teo governor:采用的策略跟menu governor一樣,都是預(yù)測(cè)接下來(lái)會(huì)有多長(zhǎng)時(shí)間能待在idle狀態(tài),然后據(jù)此選擇合適的idle mode。不過(guò)它跟menu governor考慮多方因素的策略是不同的。teo的理念是,多數(shù)系統(tǒng)上CPU喚醒最頻繁的喚醒源都是timer events,而不是設(shè)備中斷(device interrupts)。timer中斷的數(shù)量要比其他中斷高幾個(gè)數(shù)量級(jí)。所以只要依據(jù)timer event就可以做好預(yù)測(cè)工作了。

4.2 cpuidle driver注冊(cè)

90ec8348-8456-11ee-939d-92fbcf53809c.png

cpuidle驅(qū)動(dòng)注冊(cè)流程比較簡(jiǎn)單,它主要包含以下三部分內(nèi)容

idle state相關(guān)參數(shù)設(shè)置、以及可能的broadcast timer

若設(shè)置了local-timer-stop屬性,則為每個(gè)cpu設(shè)置相應(yīng)的broadcast timer

若為該driver指定了governor,則切換current governor

cpuidle driver的主要工作是定義所支持的cpuidle state,以及state的enter接口,如下面所示,cpudile driver就要負(fù)責(zé)將平臺(tái)定義的idle-state信息填充到這個(gè)結(jié)構(gòu)體中

91037c92-8456-11ee-939d-92fbcf53809c.png

4.3 cpuidle device注冊(cè)

911808ba-8456-11ee-939d-92fbcf53809c.png

cpuidle設(shè)備注冊(cè)主要包括初始化一些參數(shù)值,將該設(shè)備添加到全局設(shè)備鏈表中,然后為其初始化sysfs屬性和使能該設(shè)備。

注冊(cè)之后,cpuidle設(shè)備、cpuidle驅(qū)動(dòng)及governor之間建立起了連接,最終系統(tǒng)經(jīng)由cpuidle framework,通過(guò)接口來(lái)調(diào)用下層的接口,進(jìn)而完成具體的硬件操作。

在現(xiàn)在的SMP系統(tǒng)中,每個(gè)cpu core都會(huì)有一個(gè)對(duì)應(yīng)的cpuidle device,內(nèi)核是通過(guò)使用struct cpuidle_device抽象cpuidle device,該結(jié)構(gòu)體主要成員含義如下:

lenabled:設(shè)備是否已經(jīng)使能 lcpu:該device對(duì)應(yīng)的cpu number llast_residency:該設(shè)備上一次停留在idle狀態(tài)的時(shí)間 lstates_usage:記錄了該設(shè)備的每個(gè)idle state的統(tǒng)計(jì)信息

5.cpuidle觸發(fā)流程

Idle task通過(guò)cpu_startup_entry為入口,調(diào)用到cpuidle_framework,流程如下圖:

913292ca-8456-11ee-939d-92fbcf53809c.png

cpu啟動(dòng)完成時(shí),會(huì)通過(guò)cpu_startup_entry函數(shù)將其自身切換到idle線程。除此之外,當(dāng)某個(gè)cpu上沒(méi)有可運(yùn)行線程時(shí),也會(huì)切換idle線程(上流程沒(méi)畫(huà)出,后面梳理進(jìn)程調(diào)度的時(shí)候再細(xì)講)。切換idle線程后,最終都會(huì)執(zhí)行idle線程的主函數(shù)do_idle,并最終通過(guò)該函數(shù)將cpu設(shè)置為特定的idle state。

其中g(shù)overnor中的select、reflect函數(shù)是cpuidle的核心功能,決定了cpuidle狀態(tài)的選擇策略。








審核編輯:劉清

聲明:本文內(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)投訴
  • 電源管理
    +關(guān)注

    關(guān)注

    117

    文章

    6432

    瀏覽量

    146100
  • Linux系統(tǒng)
    +關(guān)注

    關(guān)注

    4

    文章

    605

    瀏覽量

    28582
  • 調(diào)度器
    +關(guān)注

    關(guān)注

    0

    文章

    98

    瀏覽量

    5496

原文標(biāo)題:電源管理入門(mén)-9 CPU Idle

文章出處:【微信號(hào):OS與AUTOSAR研究,微信公眾號(hào):OS與AUTOSAR研究】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    AliOS Things電源管理框架怎么滿(mǎn)足物聯(lián)網(wǎng)設(shè)備低功耗需求

    任務(wù)處于阻塞狀態(tài),將執(zhí)行idle task。idle task的通常做法是一個(gè)while(1)空循環(huán),從匯編視角看是不斷執(zhí)行跳轉(zhuǎn)指令,也就是說(shuō)當(dāng)操作系統(tǒng)空閑時(shí),CPU將處于空轉(zhuǎn)
    的頭像 發(fā)表于 10-29 08:57 ?5496次閱讀

    新建SYSBIOS的idle任務(wù)

    在系統(tǒng)的使用中,空閑任務(wù)是必不可少的,在windows,linux,ucos ii,MQX 等等和操作系統(tǒng)中,都少不了idle的影子,那么在TI的DSP中的SYSBIOS也不例外。 那么
    發(fā)表于 09-15 12:27

    利用串口空閑中斷接收數(shù)據(jù)一直無(wú)法判斷起空閑狀態(tài)IDLE

    if(RESET != __HAL_UART_GET_FLAG(&huart2, UART_IT_IDLE) ){}一直無(wú)法判斷起空閑狀態(tài),仿真到這里直接跳過(guò),無(wú)法進(jìn)入if語(yǔ)句內(nèi)
    發(fā)表于 12-28 12:06

    怎樣使用IDLE中斷+DMA接收的方式接收數(shù)據(jù)呢

    怎樣使用IDLE中斷+DMA接收的方式接收數(shù)據(jù)呢?怎樣使用IDLE中斷去判斷串口線是否空閑呢?
    發(fā)表于 01-27 06:20

    idle線程資源回收問(wèn)題求解

    線程退出的時(shí)候,需要idle線程執(zhí)行rt_thread_idle_excute才能回收退出線程的資源,但是工作線程比idle線程級(jí)別高的話,idle線程得不到執(zhí)行,跟
    發(fā)表于 02-01 14:56

    STM32 串口使用IDLE中斷+DMA接收(HAL庫(kù)函數(shù))

    1.9.0開(kāi)發(fā)工具:MDK Keil 5.32二、原理過(guò)程在STM32上接9個(gè)串口,每個(gè)串口約收發(fā)50個(gè)字節(jié)數(shù)據(jù)每幀,若使用傳統(tǒng)的按字節(jié)中斷HAL_UART_Receive_IT()的方式,則會(huì)因中斷響應(yīng)過(guò)于頻繁導(dǎo)致系統(tǒng)響應(yīng)不過(guò)來(lái),因此需要使用IDLE中斷+DMA接收的方式接收數(shù)據(jù)。DMA的作用是無(wú)需
    發(fā)表于 12-02 21:06 ?42次下載
    STM32 串口使用<b class='flag-5'>IDLE</b>中斷+DMA接收(HAL庫(kù)函數(shù))

    STM32 HAL CubeMX 串口IDLE接收空閑中斷+DMA

    方法:一種是 :IDLE 接收空閑中斷+DMA一種是: IDLE 接收空閑中斷+RXNE接收數(shù)據(jù)中斷都可完成串口數(shù)據(jù)的收發(fā)知識(shí)點(diǎn)介紹:STM32 IDLE 接收空閑中斷功能:在使用...
    發(fā)表于 12-20 19:39 ?31次下載
    STM32 HAL CubeMX 串口<b class='flag-5'>IDLE</b>接收空閑中斷+DMA

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

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

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

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

    使用UART IDLE中斷接收不定長(zhǎng)數(shù)據(jù)

    使用UART IDLE中斷接收不定長(zhǎng)數(shù)據(jù)
    的頭像 發(fā)表于 09-18 15:41 ?1578次閱讀
    使用UART <b class='flag-5'>IDLE</b>中斷接收不定長(zhǎng)數(shù)據(jù)

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

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

    python idle在哪里找到

    Python IDLE是一種集成開(kāi)發(fā)環(huán)境(Integrated Development Environment,簡(jiǎn)稱(chēng)IDE),用于編寫(xiě)和運(yùn)行Python語(yǔ)言的代碼。它是Python官方提供的標(biāo)準(zhǔn)
    的頭像 發(fā)表于 11-29 14:39 ?1532次閱讀

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

    Python自帶的IDLE是一個(gè)集成開(kāi)發(fā)環(huán)境(Integrated Development Environment),它通過(guò)提供編輯器和交互式解釋器,使得Python的開(kāi)發(fā)變得更加簡(jiǎn)單和便捷。本文將
    的頭像 發(fā)表于 11-29 14:51 ?3015次閱讀

    python安裝后idle在哪兒

    安裝即可。 在安裝 Python 后,您將獲得一個(gè)名為 IDLE(Python Shell)的集成開(kāi)發(fā)環(huán)境(IDE)。IDLE 是專(zhuān)門(mén)為 Python 設(shè)計(jì)的一種輕量級(jí)的開(kāi)發(fā)環(huán)境,它提供了一個(gè)交互式
    的頭像 發(fā)表于 11-29 14:52 ?1573次閱讀

    python軟件IDLE怎么打多行代碼

    用于編寫(xiě)、編輯和運(yùn)行Python代碼的編輯器窗口。在IDLE中編寫(xiě)多行代碼幾種方法可以實(shí)現(xiàn)。 使用括號(hào)與換行符: 在IDLE中編寫(xiě)多行代碼的一種常見(jiàn)方法是使用括號(hào)來(lái)將多行代碼括起來(lái),并在每行末尾添加
    的頭像 發(fā)表于 11-29 15:00 ?4979次閱讀