日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

當(dāng) CPU 空閑時(shí)它都在做什么?

5RJg_mcuworld ? 來(lái)源:未知 ? 作者:楊鑫 ? 2018-03-06 15:43 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

操作系統(tǒng)行為的基本原理是,在任何一個(gè)給定的時(shí)刻,在一個(gè) CPU 上有且只有一個(gè)任務(wù)是活動(dòng)的。但是,如果 CPU 無(wú)事可做的時(shí)候,又會(huì)是什么樣的呢?

事實(shí)證明,這種情況是非常普遍的,對(duì)于絕大多數(shù)的個(gè)人電腦來(lái)說(shuō),這確實(shí)是一種常態(tài):大量的睡眠進(jìn)程,它們都在等待某種情況下被喚醒,差不多在 100% 的 CPU 時(shí)間中,都處于虛構(gòu)的“空閑任務(wù)”中。事實(shí)上,如果一個(gè)普通用戶的 CPU 處于持續(xù)的繁忙中,它可能意味著有一個(gè)錯(cuò)誤、bug、或者運(yùn)行了惡意軟件。

因?yàn)槲覀儾荒苓`反我們的原理,一些任務(wù)需要在一個(gè) CPU 上激活。首先是因?yàn)?,這是一個(gè)良好的設(shè)計(jì):持續(xù)很長(zhǎng)時(shí)間去遍歷內(nèi)核,檢查是否有一個(gè)活動(dòng)任務(wù),這種特殊情況是不明智的做法。最好的設(shè)計(jì)是沒(méi)有任何例外的情況。無(wú)論何時(shí),你寫一個(gè) if 語(yǔ)句,Nyan Cat 就會(huì)喵喵喵。其次,我們需要使用空閑的 CPU 去做一些事情,讓它們充滿活力,你懂得,就是創(chuàng)建天網(wǎng)計(jì)劃唄。

因此,保持這種設(shè)計(jì)的連續(xù)性,并領(lǐng)先于那些邪惡計(jì)劃一步,操作系統(tǒng)開發(fā)者創(chuàng)建了一個(gè)空閑任務(wù),當(dāng)沒(méi)有其它任務(wù)可做時(shí)就調(diào)度它去運(yùn)行。我們可以在 Linux 的 引導(dǎo)過(guò)程 中看到,這個(gè)空閑任務(wù)就是進(jìn)程 0,它是由計(jì)算機(jī)打開電源時(shí)運(yùn)行的第一個(gè)指令直接派生出來(lái)的。它在 rest_init 中初始化,在 init_idle_bootup_task 中初始化空閑調(diào)度類scheduling class。

簡(jiǎn)而言之,Linux 支持像實(shí)時(shí)進(jìn)程、普通用戶進(jìn)程等等的不同調(diào)度類。當(dāng)選擇一個(gè)進(jìn)程變成活動(dòng)任務(wù)時(shí),這些類按優(yōu)先級(jí)進(jìn)行查詢。通過(guò)這種方式,核反應(yīng)堆的控制代碼總是優(yōu)先于 web 瀏覽器運(yùn)行。盡管在通常情況下,這些類返回 NULL,意味著它們沒(méi)有合適的任務(wù)需要去運(yùn)行 —— 它們總是處于睡眠狀態(tài)。但是空閑調(diào)度類,它是持續(xù)運(yùn)行的,從不會(huì)失?。核偸欠祷乜臻e任務(wù)。

好吧,我們來(lái)看一下這個(gè)空閑任務(wù)到底做了些什么。下面是 cpu_idle_loop,感謝開源能讓我們看到它的代碼:

cpu_idle_loop

我省略了很多的細(xì)節(jié),稍后我們將去了解任務(wù)切換,但是,如果你閱讀了這些源代碼,你就會(huì)找到它的要點(diǎn):由于這里不需要重新調(diào)度(即改變活動(dòng)任務(wù)),它一直處于空閑狀態(tài)。以所經(jīng)歷的時(shí)間來(lái)計(jì)算,這個(gè)循環(huán)和其它操作系統(tǒng)中它的“堂兄弟們”相比,在計(jì)算的歷史上它是運(yùn)行的最多的代碼片段。對(duì)于 Intel 處理器來(lái)說(shuō),處于空閑狀態(tài)意味著運(yùn)行著一個(gè) halt 指令:

native_halt

hlt 指令停止處理器中的代碼執(zhí)行,并將它置于 halt 的狀態(tài)。奇怪的是,全世界各地?cái)?shù)以百萬(wàn)計(jì)的 Intel 類的 CPU 們花費(fèi)大量的時(shí)間讓它們處于 halt 的狀態(tài),甚至它們?cè)谕姷臅r(shí)候也是如此。這并不是高效、節(jié)能的做法,這促使芯片制造商們?nèi)ラ_發(fā)處理器的深度睡眠狀態(tài),以帶來(lái)著更少的功耗和更長(zhǎng)休眠時(shí)間。內(nèi)核的 cpuidle 子系統(tǒng) 是這些節(jié)能模式能夠產(chǎn)生好處的原因。

現(xiàn)在,一旦我們告訴 CPU 去 halt(睡眠)之后,我們需要以某種方式讓它醒來(lái)。如果你讀過(guò) 上篇文章《你的操作系統(tǒng)什么時(shí)候運(yùn)行?》 ,你可能會(huì)猜到中斷會(huì)參與其中,而事實(shí)確實(shí)如此。中斷促使 CPU 離開 halt 狀態(tài)返回到激活狀態(tài)。因此,將這些拼到一起,下圖是當(dāng)你閱讀一個(gè)完全呈現(xiàn)的 web 網(wǎng)頁(yè)時(shí),你的系統(tǒng)主要做的事情:

定時(shí)器中斷外的其它中斷也會(huì)使處理器再次發(fā)生變化。如果你再次點(diǎn)擊一個(gè) web 頁(yè)面就會(huì)產(chǎn)生這種變化,例如:你的鼠標(biāo)發(fā)出一個(gè)中斷,它的驅(qū)動(dòng)會(huì)處理它,并且因?yàn)樗a(chǎn)生了一個(gè)新的輸入,突然進(jìn)程就可運(yùn)行了。在那個(gè)時(shí)刻, need_resched() 返回 true,然后空閑任務(wù)因你的瀏覽器而被踢出而終止運(yùn)行。

如果我們呆呆地看著這篇文章,而不做任何事情。那么隨著時(shí)間的推移,這個(gè)空閑循環(huán)就像下圖一樣:

在這個(gè)示例中,由內(nèi)核計(jì)劃的定時(shí)器中斷會(huì)每 4 毫秒發(fā)生一次。這就是滴答tick周期。也就是說(shuō)每秒鐘將有 250 個(gè)滴答,因此,這個(gè)滴答速率(頻率)是 250 Hz。這是運(yùn)行在 Intel 處理器上的 Linux 的典型值,而其它操作系統(tǒng)喜歡使用 100 Hz。這是由你構(gòu)建內(nèi)核時(shí)在 CONFIG_HZ 選項(xiàng)中定義的。

對(duì)于一個(gè)空閑 CPU 來(lái)說(shuō),它看起來(lái)似乎是個(gè)無(wú)意義的工作。如果外部世界沒(méi)有新的輸入,在你的筆記本電腦的電池耗盡之前,CPU 將始終處于這種每秒鐘被喚醒 250 次的地獄般折磨的小憩中。如果它運(yùn)行在一個(gè)虛擬機(jī)中,那我們正在消耗著宿主機(jī) CPU 的性能和寶貴的時(shí)鐘周期。

在這里的解決方案是 動(dòng)態(tài)滴答,當(dāng) CPU 處于空閑狀態(tài)時(shí),定時(shí)器中斷被 暫停或重計(jì)劃,直到內(nèi)核知道將有事情要做時(shí)(例如,一個(gè)進(jìn)程的定時(shí)器可能要在 5 秒內(nèi)過(guò)期,因此,我們不能再繼續(xù)睡眠了),定時(shí)器中斷才會(huì)重新發(fā)出。這也被稱為無(wú)滴答模式。

最后,假設(shè)在一個(gè)系統(tǒng)中你有一個(gè)活動(dòng)進(jìn)程,例如,一個(gè)長(zhǎng)時(shí)間運(yùn)行的 CPU 密集型任務(wù)。那樣幾乎就和一個(gè)空閑系統(tǒng)是相同的:這些示意圖仍然是相同的,只是將空閑任務(wù)替換為這個(gè)進(jìn)程,并且相應(yīng)的描述也是準(zhǔn)確的。在那種情況下,每 4 毫秒去中斷一次任務(wù)仍然是無(wú)意義的:它只是操作系統(tǒng)的性能抖動(dòng),甚至?xí)鼓愕墓ぷ髯兊酶?。Linux 也可以在這種單一進(jìn)程的場(chǎng)景中停止這種固定速率的滴答,這被稱為 自適應(yīng)滴答 模式。最終,這種固定速率的滴答可能會(huì) 完全消失。

對(duì)于閱讀一篇文章來(lái)說(shuō),CPU 基本是無(wú)事可做的。內(nèi)核的這種空閑行為是操作系統(tǒng)難題的一個(gè)重要部分,并且它與我們看到的其它情況非常相似,因此,這將幫助我們理解一個(gè)運(yùn)行中的內(nèi)核。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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

    文章

    11332

    瀏覽量

    225984

原文標(biāo)題:當(dāng) CPU 空閑時(shí)它都在做什么?

文章出處:【微信號(hào):mcuworld,微信公眾號(hào):嵌入式資訊精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    0基礎(chǔ)看懂電阻:到底在電路里做什么?

    不管是手機(jī)、充電器、家電,還是各種電路板,里面都藏著一個(gè)超基礎(chǔ)的電子元件——電阻。看起來(lái)就是個(gè)小小的貼片、不起眼的小圓柱,很多人都好奇:這個(gè)小東西,到底在電路里有什么用? 這篇文章完全拋開復(fù)雜公式
    的頭像 發(fā)表于 04-27 14:32 ?103次閱讀
    0基礎(chǔ)看懂電阻:<b class='flag-5'>它</b>到底在電路里<b class='flag-5'>做什么</b>?

    當(dāng) VisionFive V1 處于空閑狀態(tài)并僅通過(guò) ssh 使用時(shí),按下鍵盤或鼠標(biāo)時(shí)顯示器沒(méi)有喚醒,為什么?

    當(dāng) VisionFive V1 處于空閑狀態(tài)并僅通過(guò) ssh 使用時(shí),顯示器將關(guān)閉。當(dāng)按下按鍵激活 USB 鍵盤時(shí),或者移動(dòng) USB 鼠標(biāo)時(shí),它不會(huì)再次打開。有沒(méi)有讓顯示器再次顯示桌面的技巧?目前,我必須重新啟動(dòng) VisionF
    發(fā)表于 03-31 07:24

    ADS131A04讀取ID失敗,空閑時(shí)引腳電壓都正確,DRDY配置上拉但是空閑時(shí)一直測(cè)試1.98

    發(fā)表于 03-26 14:17

    ADS131A04讀取ID錯(cuò)誤,DRDY配置上拉但是空閑時(shí)一直是1.98V

    ADS131A04讀取ID錯(cuò)誤,DRDY配置上拉但是空閑時(shí)一直是1.98V,其他引腳空閑時(shí)電壓都正常image.png
    發(fā)表于 03-26 11:34

    貼片都在哪里做的?

    你們貼片都在哪里做的?
    發(fā)表于 02-26 18:02

    CPU空閑時(shí)溫度為 50° 攝氏度這正常嗎?

    大家好 空閑時(shí) CPU 溫度為 50°。 硬件: VF2 1.2A 8GB Waveshare VisionFive2 CPU 散熱風(fēng)扇 注意:尚未涂抹導(dǎo)熱膏或?qū)釅|。 由于我沒(méi)有使用這些墊子的經(jīng)驗(yàn),因此將不勝感激建議
    發(fā)表于 02-11 08:20

    FreeRTOS 空閑任務(wù)

    FreeRTOS 中很多人會(huì)注意到為什么有一個(gè)叫IDLE task的任務(wù)占用了CPU百分之九十多的使用權(quán),但是這個(gè)任務(wù)并沒(méi)有自己手動(dòng)創(chuàng)建。原因就是這個(gè)空閑任務(wù)是系統(tǒng)自己創(chuàng)建的,每當(dāng)系統(tǒng)沒(méi)有其他任務(wù)要運(yùn)行時(shí)
    發(fā)表于 12-04 07:35

    串口空閑中斷與串口超時(shí)中斷介紹

    1. 空閑中斷(Idle Interrupt) 觸發(fā)條件 當(dāng)串口總線在接收數(shù)據(jù)后持續(xù)保持空閑狀態(tài)(如高電平)超過(guò)一幀時(shí)間(即一個(gè)字符傳輸時(shí)間)時(shí)觸發(fā)。 硬件自動(dòng)檢測(cè)總線空閑狀態(tài),與數(shù)據(jù)
    發(fā)表于 11-21 08:31

    USART RX引腳的配置

    。 優(yōu)點(diǎn):節(jié)省硬件成本,減少電路復(fù)雜度。 2. 上拉輸入 推薦場(chǎng)景: 長(zhǎng)距離通信:線纜較長(zhǎng)或環(huán)境存在電磁干擾時(shí),上拉電阻可穩(wěn)定空閑狀態(tài)電平。 協(xié)議要求:USART協(xié)議規(guī)定總線空閑時(shí)為高電平,上拉確保RX
    發(fā)表于 11-20 08:23

    MSP430FR2433的SPI通信為什么收不到?

    (幾乎是和時(shí)鐘一同跳變) 2、2355上MOSI在時(shí)鐘空閑時(shí)始終為低,而2433在空閑時(shí)會(huì)保持發(fā)送的最后一位電平(如圖) 有沒(méi)有高手能指點(diǎn)一二看看怎么解決
    發(fā)表于 11-18 20:31

    串口空閑中斷原理和特點(diǎn)

    空閑中斷 (Idle Interrupt): 觸發(fā)條件: 當(dāng)串口接收數(shù)據(jù)線(RX)從有數(shù)據(jù)傳輸?shù)臓顟B(tài)(低電平)進(jìn)入并保持高電平狀態(tài)(即“空閑”狀態(tài))超過(guò)一個(gè)完整數(shù)據(jù)幀的時(shí)間(通常是 1 個(gè)字
    發(fā)表于 11-13 08:11

    空閑線程堆棧出現(xiàn)內(nèi)存溢出的問(wèn)題,怎么解決?

    rtthread版本: 5.1.0 硬件: stm32f407vgt6 具體我也不知道什么原因引起的, 目前將堆棧調(diào)到1024后能為穩(wěn)定運(yùn)行 更新 設(shè)置1024堆棧, 運(yùn)行久了也不行 我有什么操作會(huì)影響到空閑線程?
    發(fā)表于 10-11 10:36

    電子工程師上班都在做什么

    行業(yè)資訊
    揚(yáng)興科技
    發(fā)布于 :2025年08月22日 18:24:07

    STM32407使用串口閑時(shí)中斷+DMA方式接收最大接收字節(jié)是多少?

    使用串口閑時(shí)中斷+DMA方式接收數(shù)據(jù),波特率為460800,DMA接收長(zhǎng)度為1024個(gè)字節(jié),并開啟串口閑時(shí)中斷,當(dāng)上位機(jī)一次發(fā)送520個(gè)字節(jié),我發(fā)現(xiàn)串口產(chǎn)生了兩次中斷,第一次接收的最大字節(jié)為272
    發(fā)表于 07-22 08:16

    為什么 KT142C 芯片 BUSY 腳空閑高電平僅 0.2V?附低功耗模式配置指南

    文檔圍繞 KT142C 芯片 busy 引腳展開,該引腳為 15 腳 PA12,播放時(shí)輸出低電平,空閑時(shí)本應(yīng)輸出 3.3V 高電平,但芯片空閑 5 秒進(jìn)入 2μA 超低功耗狀態(tài)后,busy 腳呈高阻
    的頭像 發(fā)表于 06-16 09:38 ?1686次閱讀
    為什么 KT142C 芯片 BUSY 腳<b class='flag-5'>空閑</b>高電平僅 0.2V?附低功耗模式配置指南
    孝义市| 白河县| 泰顺县| 辰溪县| 大渡口区| 晋城| 任丘市| 永登县| 句容市| 松阳县| 巴里| 来凤县| 诏安县| 湛江市| 咸阳市| 香港 | 怀来县| 曲松县| 高碑店市| 太和县| 会同县| 岑溪市| 西和县| 沿河| 江川县| 三台县| 远安县| 沁阳市| 金华市| 松原市| 页游| 开远市| 陆丰市| 凤翔县| 郓城县| 融水| 奉贤区| 浪卡子县| 昌平区| 康平县| 滕州市|