精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

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

yzcdx ? 來源:OS與AUTOSAR研究 ? 2023-11-16 16:46 ? 次閱讀

1. CPU Idle有什么用?

答案就是“省電”,當多核CPU沒有任務執行的時候,這時候需要將除主Core之外的其他Core進行低功耗處理,這件事就是CPU Idle機制做的。

idle狀態: 在Linux kernel中,當cpu中沒有任務在執行,也沒有任何中斷、異常信號過來的時候,我們稱為處于idle狀態,針對這種狀態Linux設計了一套cpuidle framework框架,專門用于cpuidle的管理。

Linux系統初始化時會為每個cpu創建一個idle線程,當沒有其他進程需要運行的時候,便運行idle線程。

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

ARM64架構中,至少會提供一個wfi的idle狀態,有些芯片可能還會提供core下電的idle狀態。當CPU idle時,根據預測的idle時間、功耗受益大小、恢復的時間長短,選用一個idle狀態,比如進入wfi,關掉CPU的arch timer以便降低功耗,當有中斷觸發時,CPU又會恢復回來。

2. CPU Idle整體框架

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

首先是CPUIdle子系統通過sysfs向userspace提供的節點:

一類是針對整個系統的/sys/devices/system/cpu/cpuidle,通過其中的current_driver、current_governor、available_governors等節點可以獲取或設置CPUIdle的驅動信息以及governor。

一類是針對每個CPU的/sys/devices/system/cpu/cpux/cpuidle,通過子節點暴露各個在線的CPU中每個不同Idle級別的name、desc、power、latency等信息。

什么時候進入idle?

關閉一些核可以節省功耗,但關閉之后對時延(性能)必會造成一定的影響,如果在關閉之后很短的時間內就被喚醒,那么就會造成功耗/性能雙方都不討好,在進入退出idle的過程中也是會有功耗的損失的,如果在idle狀態下面節省的功耗還無法彌補進入退出該idle的功耗,那么反而會得不償失。

--解決方法就是:策略。是由cpuidle framework會根據不同的場景來進行仲裁選擇使用何種的idle狀態。

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

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

cpu idle core:負責整體框架,同時負責和sched模塊對接,當調度器發現沒有任務在執行時候,就切換到idle進程,通知到cpuidle framework的cpuidle core模塊要做接下來的idle操作。向cpuidle driver/governors模塊提供統一的driver和governors注冊和管理接口,向用戶空間程序提供governor選擇的接口。

cpuidle driver:負責具體idle機制的實現(不同等級下面idle的指標也是在這個模塊進行填充),不同的平臺會有不同的drivers實現。

cpudile governors:在這個模塊進行cpuidle的選擇,選擇的算法主要是基于切換的功耗代價和系統的延遲容忍度,電源管理的目標就是在保證延遲在系統可以接受的范圍內盡可能的節省功耗。

3. Idle狀態判斷

在Linux系統啟動的時候,會在每個cpu上創建對應的idle進程,start_kernel()函數初始化內核需要的所有數據結構,并創建一個名為init的進程(pid=1),當init進程創建完后,cpu的idle進程處于cpu_idle_loop()無限循環中,當沒有其他進程處于TASK_RUNNING狀態時候,調度器才會執行cpu idle線程,讓cpu進入idle模式.其函數調用關系簡要概括如下:

start_kernel –> rest_init –> cpu_startup_entry, 在cpu_startup_entry這個函數中,最終程序會進入無限循環do_idle loop中。

這里我們又進入看代碼環節,可以參考公眾號之前的文章# Linux驅動-IMX6ULL開發板qemu環境搭建,我們修改好qemu啟動腳本加-s -S后,在VS中打斷點,進行代碼查看。

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

cpu_idle_loop()函數中會不斷的進行輪詢判斷

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抽象出了三個數據結構:

cpuidle device:用于描述CPU核的cpuidle設備。

cpuidle driver:用于描述CPU核的cpuidle驅動。

cpuidle governor:主要根據cpuidle的device和driver狀態來選擇策略。

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

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

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

4. 注冊初始化

cpuidle初始化包括governor注冊、驅動注冊和設備注冊三部分

4.1 cpuidle governor注冊

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

cpuidle governor在cpuidle驅動和設備之前注冊,內核使用一個鏈表維護系統中所有已注冊的governor。當前新版內核一共支持ladder、menu、teo和haltpoll四種governor,它們都通過調用cpuidle_register_governor函數將自身注冊到系統中。

Haltpoll governor:它是用于優化虛擬機性能的一種cpuidle governor。其原理為當vcpu進入idle時,通過guest端執行poll操作,以避免使其陷入host中。它的優點是減少了vm切換和通過ipi喚醒vcpu的成本,但它也造成在guest睡眠時,host無法復用該vcpu對應的物理cpu,從而降低系統吞吐量的問題。

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

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

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

4.2 cpuidle driver注冊

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

cpuidle驅動注冊流程比較簡單,它主要包含以下三部分內容

idle state相關參數設置、以及可能的broadcast timer

若設置了local-timer-stop屬性,則為每個cpu設置相應的broadcast timer

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

cpuidle driver的主要工作是定義所支持的cpuidle state,以及state的enter接口,如下面所示,cpudile driver就要負責將平臺定義的idle-state信息填充到這個結構體中

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

4.3 cpuidle device注冊

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

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

注冊之后,cpuidle設備、cpuidle驅動及governor之間建立起了連接,最終系統經由cpuidle framework,通過接口來調用下層的接口,進而完成具體的硬件操作。

在現在的SMP系統中,每個cpu core都會有一個對應的cpuidle device,內核是通過使用struct cpuidle_device抽象cpuidle device,該結構體主要成員含義如下:

lenabled:設備是否已經使能 lcpu:該device對應的cpu number llast_residency:該設備上一次停留在idle狀態的時間 lstates_usage:記錄了該設備的每個idle state的統計信息

5.cpuidle觸發流程

Idle task通過cpu_startup_entry為入口,調用到cpuidle_framework,流程如下圖:

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

cpu啟動完成時,會通過cpu_startup_entry函數將其自身切換到idle線程。除此之外,當某個cpu上沒有可運行線程時,也會切換idle線程(上流程沒畫出,后面梳理進程調度的時候再細講)。切換idle線程后,最終都會執行idle線程的主函數do_idle,并最終通過該函數將cpu設置為特定的idle state。

其中governor中的select、reflect函數是cpuidle的核心功能,決定了cpuidle狀態的選擇策略。








審核編輯:劉清

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

    關注

    115

    文章

    6154

    瀏覽量

    144227
  • Linux系統
    +關注

    關注

    4

    文章

    591

    瀏覽量

    27352
  • 調度器
    +關注

    關注

    0

    文章

    98

    瀏覽量

    5238

原文標題:電源管理入門-9 CPU Idle

文章出處:【微信號:OS與AUTOSAR研究,微信公眾號:OS與AUTOSAR研究】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    AliOS Things電源管理框架怎么滿足物聯網設備低功耗需求

    任務處于阻塞狀態,將執行idle task。idle task的通常做法是一個while(1)空循環,從匯編視角看是不斷執行跳轉指令,也就是說當操作系統空閑時,CPU將處于空轉
    的頭像 發表于 10-29 08:57 ?5155次閱讀

    新建SYSBIOS的idle任務

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

    利用串口空閑中斷接收數據一直無法判斷起空閑狀態IDLE

    if(RESET != __HAL_UART_GET_FLAG(&huart2, UART_IT_IDLE) ){}一直無法判斷起空閑狀態,仿真到這里直接跳過,無法進入if語句內
    發表于 12-28 12:06

    怎樣使用IDLE中斷+DMA接收的方式接收數據呢

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

    idle線程資源回收問題求解

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

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

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

    CPU核心中idle進程作用

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

    CPU進入idle進程狀態的流程

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

    如何在Ubuntu中安裝IDLE Python IDE

    當初學Python時,設置編碼環境可能會很具有挑戰性。IDLE(集成開發和學習環境)是一個Python IDE,可簡化相同的過程。安裝后,您可以立即開始編碼。
    的頭像 發表于 04-10 10:29 ?728次閱讀

    使用UART IDLE中斷接收不定長數據

    使用UART IDLE中斷接收不定長數據
    的頭像 發表于 09-18 15:41 ?1028次閱讀
    使用UART <b class='flag-5'>IDLE</b>中斷接收不定長數據

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

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

    python idle在哪里找到

    Python IDLE是一種集成開發環境(Integrated Development Environment,簡稱IDE),用于編寫和運行Python語言的代碼。它是Python官方提供的標準
    的頭像 發表于 11-29 14:39 ?1045次閱讀

    python自帶的idle怎么進入

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

    python安裝后idle在哪兒

    安裝即可。 在安裝 Python 后,您將獲得一個名為 IDLE(Python Shell)的集成開發環境(IDE)。IDLE 是專門為 Python 設計的一種輕量級的開發環境,它提供了一個交互式
    的頭像 發表于 11-29 14:52 ?1152次閱讀

    python軟件IDLE怎么打多行代碼

    用于編寫、編輯和運行Python代碼的編輯器窗口。在IDLE中編寫多行代碼幾種方法可以實現。 使用括號與換行符: 在IDLE中編寫多行代碼的一種常見方法是使用括號來將多行代碼括起來,并在每行末尾添加
    的頭像 發表于 11-29 15:00 ?3940次閱讀