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

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

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

你的計算機(jī)CPU使用率是多少?CPU空閑時在干嘛?

strongerHuang ? 來源:碼農(nóng)的荒島求生 ? 2023-12-05 09:27 ? 次閱讀

人空閑時會發(fā)呆會無聊,計算機(jī)呢?

假設(shè)你正在用計算機(jī)瀏覽網(wǎng)頁,當(dāng)網(wǎng)頁加載完成后你開始閱讀,此時你沒有移動鼠標(biāo),沒有敲擊鍵盤,也沒有網(wǎng)絡(luò)通信,那么你的計算機(jī)此時在干嘛?

你的計算機(jī) CPU 使用率是多少?

如果此時你正在計算機(jī)旁,并且安裝有 Windows 或者 Linux ,你可以立刻看到自己的計算機(jī) CPU 使用率是多少。 這是博主的一臺安裝有 Win10 的電腦

affbaf2c-9304-11ee-939d-92fbcf53809c.png

可以看到大部分情況下 CPU 利用率很低,也就在 8% 左右,而且開啟了 283 個進(jìn)程,這么多進(jìn)程基本上無所事事,都在等待某個特定事件來喚醒自己,就好比你寫了一個打印用戶輸入的程序,如果用戶一直不按鍵盤,那么你的進(jìn)程就處于這種狀態(tài)。 那么有的同學(xué)可能會問,剩下的 CPU 時間都去哪里了?

這個問題也很簡單,還是以 Win10 為例,打開任務(wù)管理器,找到 “詳細(xì)信息” 這一欄,你會發(fā)現(xiàn)有一個 “系統(tǒng)空閑進(jìn)程”,其 CPU 使用率達(dá)到了 99%,正是這個進(jìn)程消耗了幾乎所有的 CPU 時間。

那么為什么存在這樣一個進(jìn)程呢?以及這個進(jìn)程什么時候開始運行呢? 這就要從操作系統(tǒng)說起了。

程序、進(jìn)程與操作系統(tǒng)

當(dāng)你用最喜歡的代碼編輯器編寫代碼時,這時的代碼不過就是磁盤上的普通文件,此時的程序和操作系統(tǒng)沒有半毛錢關(guān)系,操作系統(tǒng)也不認(rèn)知這種文本文件。

b011ad2c-9304-11ee-939d-92fbcf53809c.png

程序員寫完代碼后開始編譯,這時編譯器將普通的文本文件翻譯成二進(jìn)制可執(zhí)行文件,此時的程序依然是保存在磁盤上的文件,和普通沒有本質(zhì)區(qū)別。

b018f32a-9304-11ee-939d-92fbcf53809c.png

但此時不一樣的是,該文件是可執(zhí)行文件,也就是說操作系統(tǒng)開始 “懂得” 這種文件,所謂 “懂得” 是指操作系統(tǒng)可以識別、解析、加載,因此必定有某種類似協(xié)議的規(guī)范,這樣編譯器按照這種協(xié)議生成可執(zhí)行文件,操作系統(tǒng)就能加載了。 在 Linux 下可執(zhí)行文件格式為 ELF ,在 Windows 下是 EXE 。

此時雖然操作系統(tǒng)可以識別可執(zhí)行程序,但如果你不去雙擊一下(或者在Linux下運行相應(yīng)命令)的依然和操作系統(tǒng)沒有半毛錢關(guān)系。

但是當(dāng)你運行可執(zhí)行程序時魔法就出現(xiàn)了。 此時操作系統(tǒng)開始將可執(zhí)行文件加載到內(nèi)存,解析出代碼段、數(shù)據(jù)段等,并為這個程序創(chuàng)建運行時需要的堆區(qū)棧區(qū)等內(nèi)存區(qū)域,此時這個程序在內(nèi)存中就是這樣了:

b02973b2-9304-11ee-939d-92fbcf53809c.png

最后,根據(jù)可執(zhí)行文件的內(nèi)容,操作系統(tǒng)知道該程序應(yīng)該執(zhí)行的第一條機(jī)器指令是什么,并將其告訴 CPU ,CPU 從該程序的第一條指令開始執(zhí)行,程序就這樣運行起來了。

一個在內(nèi)存中運行起來的程序顯然和保存在磁盤上的二進(jìn)制文件是不一樣的,總的有個名字吧,根據(jù)“弄不懂原則”,這個名字就叫進(jìn)程,英文名叫做Process。

我們把一個運行起來的程序叫做進(jìn)程,這就是進(jìn)程的由來。

此時操作系統(tǒng)開始掌管進(jìn)程,現(xiàn)在進(jìn)程已經(jīng)有了,那么操作系統(tǒng)是怎么管理進(jìn)程的呢? 實際上在很多操作系統(tǒng)實現(xiàn)中都用隊列來管理進(jìn)程。

b036f8fc-9304-11ee-939d-92fbcf53809c.png

那么很顯然,如果隊列已經(jīng)為空,那么說明此時操作系統(tǒng)內(nèi)部沒有進(jìn)程需要運行,這是 CPU 就空閑下來了,此時,我們需要做點什么,就像這樣:

if (queue.empty()) {
  do_someting();
}
這些編寫內(nèi)核代碼雖然簡單,但內(nèi)核中到處充斥著 if 這種異常處理的語句,這會讓代碼看起來一團(tuán)糟,因此更好的設(shè)計是沒有異常,那么怎樣才能沒有異常呢?

很簡單,那就是讓隊列永遠(yuǎn)不會空,這樣調(diào)度器永遠(yuǎn)能從隊列中找到一個可供運行的進(jìn)程。

而這也是為什么鏈表中通常會有哨兵節(jié)點的原因,就是為了避免各種判空,這樣既容易出錯也會讓代碼一團(tuán)糟。

b043bf92-9304-11ee-939d-92fbcf53809c.png

就這樣,內(nèi)核設(shè)計者創(chuàng)建了一個叫做空閑任務(wù)的進(jìn)程,這個進(jìn)程就是Windows 下的我們最開始看到的“系統(tǒng)空閑進(jìn)程”,在 Linux 下就是第 0號進(jìn)程。

當(dāng)其它進(jìn)程都處于不可運行狀態(tài)時,調(diào)度器就從隊列中取出空閑進(jìn)程運行,顯然,空閑進(jìn)程永遠(yuǎn)處于就緒狀態(tài),且優(yōu)先級最低。

既然我們已經(jīng)知道了,當(dāng)系統(tǒng)無所事事后開始運行空閑進(jìn)程,那么這個空閑進(jìn)程到底在干嘛呢? 這就需要硬件來幫忙了。

一切都要歸結(jié)到硬件

在計算機(jī)系統(tǒng)中,一切最終都要靠 CPU 來驅(qū)動,CPU 才是那個真正干活的。 原來,CPU 設(shè)計者早就考慮到系統(tǒng)會存在空閑的可能,因此設(shè)計了一條機(jī)器指令,這個機(jī)器指令就是 halt 指令,停止的意思。

這條指令會讓部分CPU進(jìn)入休眠狀態(tài),從而極大減少對電力的消耗,通常這條指令也被放到循環(huán)中執(zhí)行,原因也很簡單,就是要維持這種休眠狀態(tài)。

值得注意的是,halt 指令是特權(quán)指令,也就是說只有在內(nèi)核態(tài)下 CPU 才可以執(zhí)行這條指令,程序員寫的應(yīng)用都運行在用戶態(tài),因此你沒有辦法在用戶態(tài)讓 CPU 去執(zhí)行這條指令。

軟件硬件結(jié)合

現(xiàn)在我們有了 halt 機(jī)器指令,同時有一個循環(huán)來不停的執(zhí)行 halt 指令,這樣空閑任務(wù)進(jìn)程的實際上就已經(jīng)實現(xiàn)了,其本質(zhì)上就是這個不斷執(zhí)行 halt 指令的循環(huán),大功告成。

這樣,當(dāng)調(diào)度器在沒有其它進(jìn)程可供調(diào)度時就開始運行空間進(jìn)程,也就是在循環(huán)中不斷的執(zhí)行 halt 指令,此時 CPU 開始進(jìn)入低功耗狀態(tài)。

b048247e-9304-11ee-939d-92fbcf53809c.png

在 Linux 內(nèi)核中,這段代碼是這樣寫的:

while (1) {
  while(!need_resched()) {
      cpuidle_idle_call();
  }
}
其中 cpuidle_idle_call函數(shù)最終會執(zhí)行 halt 指令,注意,這里刪掉了很多細(xì)節(jié),只保留最核心代碼,實際上 Linux 內(nèi)核在實現(xiàn)空閑進(jìn)程時還要考慮很多很多,不同類型的 CPU 可能會有深睡眠淺睡眠之類,操作系統(tǒng)必須要預(yù)測出系統(tǒng)可能的空閑時長并以此判斷要進(jìn)入哪種休眠等等,但這并不是我們關(guān)注的重點。

總的來說,這就是計算機(jī)系統(tǒng)空閑時 CPU 在干嘛,就是在執(zhí)行這一段代碼,本質(zhì)上就是 CPU 在執(zhí)行 halt 指令。

實際上,對于個人計算機(jī)來說,halt 可能是 CPU 執(zhí)行最多的一條指令,全世界的 CPU 大部分時間都用在這條指令上了,是不是很奇怪。







審核編輯:劉清

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

    關(guān)注

    68

    文章

    10804

    瀏覽量

    210843
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11207

    瀏覽量

    208721
  • 計算機(jī)
    +關(guān)注

    關(guān)注

    19

    文章

    7360

    瀏覽量

    87633
  • LINUX內(nèi)核
    +關(guān)注

    關(guān)注

    1

    文章

    316

    瀏覽量

    21608

原文標(biāo)題:CPU 空閑時在干嘛?

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    一種基于FreeRTOS的CPU使用率測算方法及原理介紹

    函數(shù),即每次產(chǎn)生系統(tǒng)tick中斷都會進(jìn)入到此鉤子函數(shù)。此鉤子函數(shù)實際上就是具體計算CPU使用率的算法了。osCPU_TotalIdleTime是一個全局變量,表示1000個tick時
    發(fā)表于 08-12 16:17

    請問CPU使用率是怎么計算的?和節(jié)拍計數(shù)是什么關(guān)系?

    CPU使用率是怎么計算的???和統(tǒng)計任務(wù)中的任務(wù)計數(shù)以及空閑任務(wù)中的節(jié)拍計數(shù)是什么關(guān)系?
    發(fā)表于 06-06 03:23

    UCOSIII統(tǒng)計任務(wù)如何計算CPU使用率

    如題,關(guān)于UCOSIII統(tǒng)計任務(wù)計算CPU使用率問題,統(tǒng)計任務(wù)的鉤子函數(shù)中將OSStatTaskCPUUsage發(fā)到串口上顯示,可是發(fā)現(xiàn)不屏蔽下圖程序中的程序為1668,利
    發(fā)表于 05-22 00:07

    CPU使用率問題求解

    對于我們的 CPU 使用率分析任務(wù),MathWorks 團(tuán)隊 PIL 模式下對 Nucleo-F303RE 72 MHz 板實施了一個 simulink 示例。我 MPC5775E
    發(fā)表于 04-03 09:07

    C#教程之CPU內(nèi)存使用率

    C#教程之CPU內(nèi)存使用率,很好的C#資料,快來學(xué)習(xí)吧。
    發(fā)表于 04-20 14:16 ?7次下載

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

    人在空閑的時候免不了昏昏欲睡那cpu空閑時在做什么呢?
    的頭像 發(fā)表于 03-06 15:43 ?4946次閱讀
    當(dāng) <b class='flag-5'>CPU</b> <b class='flag-5'>空閑時</b>它都在做什么?

    cpu使用率忽高忽低問題原因有哪些

    cpu使用率忽高忽低可能是大量的蠕蟲病毒系統(tǒng)內(nèi)部迅速復(fù)制,造成CPU占用資源率據(jù)高不下。
    的頭像 發(fā)表于 03-01 05:21 ?1.9w次閱讀

    cpu使用率多少算正常_cpu使用率100怎么辦

    本文首先分析了cpu使用率多少算正常,其次闡述了cpu使用率100的解決方法,最后介紹了優(yōu)化cpu使用率
    發(fā)表于 04-29 09:28 ?1.5w次閱讀

    cpu使用率過高怎么解決_cpu使用率過高是什么原因

    本文主要闡述了cpu使用率過高的原因及解決方法。
    發(fā)表于 04-29 09:34 ?1592次閱讀

    為什么明明沒開多少軟件,計算CPU使用率卻莫名的高

    utilization)直觀顯示了運行程序占用的CPU資源,使用率越高,說明的機(jī)器在這個時間上運行了很多程序,一般情況下,CPU使用率
    的頭像 發(fā)表于 02-03 17:09 ?2.7w次閱讀
    為什么明明沒開多少軟件,<b class='flag-5'>計算</b>的<b class='flag-5'>CPU</b><b class='flag-5'>使用率</b>卻莫名的高

    CPU使用率達(dá)到100%會怎樣

    我們使用電腦的時候,點擊太多程序會導(dǎo)致CPU使用率達(dá)到100%。
    的頭像 發(fā)表于 02-02 10:59 ?5.2w次閱讀

    CPU使用率是什么意思

    打開電腦的任務(wù)管理器,看著跳動的CPU使用率,發(fā)現(xiàn)很舒服。每一個線程占用了多少CPU清清楚楚,也就能針對性的確認(rèn)為啥的電腦跑的慢了。
    的頭像 發(fā)表于 05-12 10:37 ?8979次閱讀

    使用Bolt監(jiān)控CPU使用率

    電子發(fā)燒友網(wǎng)站提供《使用Bolt監(jiān)控CPU使用率.zip》資料免費下載
    發(fā)表于 12-14 11:23 ?0次下載
    使用Bolt監(jiān)控<b class='flag-5'>CPU</b><b class='flag-5'>使用率</b>

    什么是CPU使用率?如何測量CPU使用率?

    CPU 使用率CPU 計算機(jī)上執(zhí)行各種任務(wù)和進(jìn)程所花費的時間量的度量。
    的頭像 發(fā)表于 08-06 17:07 ?5594次閱讀

    如何在Linux系統(tǒng)中檢查CPU使用率

    首先在Linux系統(tǒng)中檢查CPU使用率??梢酝ㄟ^命令行中輸入top或htop命令來查看當(dāng)前系統(tǒng)中各個進(jìn)程的CPU使用率。如果
    發(fā)表于 01-06 10:42 ?1238次閱讀
    如何在Linux系統(tǒng)中檢查<b class='flag-5'>CPU</b><b class='flag-5'>使用率</b>