精品一区二区三区在线成人,欧美精产国品一二三区,Ji大巴进入女人66h,亚洲春色在线视频

當CPU空閑時它都在做什么?

系統 Linux
在 上篇文章中 我說了操作系統行為的基本原理是,在任何一個給定的時刻,在一個 CPU 上有且只有一個任務是活動的。但是,如果 CPU 無事可做的時候,又會是什么樣的呢?

 [[219194]]

上篇文章中 我說了操作系統行為的基本原理是,在任何一個給定的時刻,在一個 CPU 上有且只有一個任務是活動的。但是,如果 CPU 無事可做的時候,又會是什么樣的呢?

事實證明,這種情況是非常普遍的,對于絕大多數的個人電腦來說,這確實是一種常態:大量的睡眠進程,它們都在等待某種情況下被喚醒,差不多在 100% 的 CPU 時間中,都處于虛構的“空閑任務”中。事實上,如果一個普通用戶的 CPU 處于持續的繁忙中,它可能意味著有一個錯誤、bug、或者運行了惡意軟件。

因為我們不能違反我們的原理,一些任務需要在一個 CPU 上激活。首先是因為,這是一個良好的設計:持續很長時間去遍歷內核,檢查是否一個活動任務,這種特殊情況是不明智的做法。最好的設計是沒有任何例外的情況。無論何時,你寫一個 if 語句,Nyan Cat 就會喵喵喵。其次,我們需要使用空閑的 CPU 去做一些事情,讓它們充滿活力,你懂得,就是創建天網計劃唄。

因此,保持這種設計的連續性,并領先于那些邪惡計劃一步,操作系統開發者創建了一個空閑任務,當沒有其它任務可做時就調度它去運行。我們可以在 Linux 的 引導過程 中看到,這個空閑任務就是進程 0,它是由計算機打開電源時運行的第一個指令直接派生出來的。它在 rest_init 中初始化,在 initidlebootup_task 中初始化空閑調度類scheduling class

簡而言之,Linux 支持像實時進程、普通用戶進程等等的不同調度類。當選擇一個進程變成活動任務時,這些類按優先級進行查詢。通過這種方式,核反應堆的控制代碼總是優先于 web 瀏覽器運行。盡管在通常情況下,這些類返回 NULL,意味著它們沒有合適的任務需要去運行 —— 它們總是處于睡眠狀態。但是空閑調度類,它是持續運行的,從不會失敗:它總是返回空閑任務。

好吧,我們來看一下這個空閑任務到底做了些什么。下面是 cpuidleloop,感謝開源能讓我們看到它的代碼:

  1. while (1) {
  2. while(!need_resched()) {
  3. cpuidle_idle_call();
  4. }
  5.  
  6. /*
  7. [Note: Switch to a different task. We will return to this loop when the idle task is again selected to run.]
  8. */
  9. schedule_preempt_disabled();
  10. }

cpuidleloop

我省略了很多的細節,稍后我們將去了解任務切換,但是,如果你閱讀了這些源代碼,你就會找到它的要點:由于這里不需要重新調度(即改變活動任務),它一直處于空閑狀態。以所經歷的時間來計算,這個循環和其它操作系統中它的“堂兄弟們”相比,在計算的歷史上它是運行的最多的代碼片段。對于 Intel 處理器來說,處于空閑狀態意味著運行著一個 halt 指令:

  1. static inline void native_halt(void)
  2. {
  3. asm volatile("hlt": : :"memory");
  4. }

native_halt

hlt 指令停止處理器中的代碼執行,并將它置于 halt 的狀態。奇怪的是,全世界各地數以百萬計的 Intel 類的 CPU 們花費大量的時間讓它們處于 halt 的狀態,甚至它們在通電的時候也是如此。這并不是高效、節能的做法,這促使芯片制造商們去開發處理器的深度睡眠狀態,以帶來著更少的功耗和更長休眠時間。內核的 cpuidle 子系統 是這些節能模式能夠產生好處的原因。

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

除定時器中斷外的其它中斷也會使處理器再次發生變化。如果你再次點擊一個 web 頁面就會產生這種變化,例如:你的鼠標發出一個中斷,它的驅動會處理它,并且因為它產生了一個新的輸入,突然進程就可運行了。在那個時刻, need_resched() 返回 true,然后空閑任務因你的瀏覽器而被踢出而終止運行。

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

在這個示例中,由內核計劃的定時器中斷會每 4 毫秒發生一次。這就是滴答tick周期。也就是說每秒鐘將有 250 個滴答,因此,這個滴答速率(頻率)是 250 Hz。這是運行在 Intel 處理器上的 Linux 的典型值,而其它操作系統喜歡使用 100 Hz。這是由你構建內核時在 CONFIG_HZ 選項中定義的。

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

在這里的解決方案是 動態滴答,當 CPU 處于空閑狀態時,定時器中斷被 暫停或重計劃,直到內核知道將有事情要做時(例如,一個進程的定時器可能要在 5 秒內過期,因此,我們不能再繼續睡眠了),定時器中斷才會重新發出。這也被稱為無滴答模式。

最后,假設在一個系統中你有一個活動進程,例如,一個長時間運行的 CPU 密集型任務。那樣幾乎就和一個空閑系統是相同的:這些示意圖仍然是相同的,只是將空閑任務替換為這個進程,并且相應的描述也是準確的。在那種情況下,每 4 毫秒去中斷一次任務仍然是無意義的:它只是操作系統的性能抖動,甚至會使你的工作變得更慢而已。Linux 也可以在這種單一進程的場景中停止這種固定速率的滴答,這被稱為 自適應滴答 模式。最終,這種固定速率的滴答可能會 完全消失

對于閱讀一篇文章來說,CPU 基本是無事可做的。內核的這種空閑行為是操作系統難題的一個重要部分,并且它與我們看到的其它情況非常相似,因此,這將幫助我們理解一個運行中的內核。

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2019-09-15 19:11:14

CPU操作系統空閑

2015-11-03 15:22:31

CDO大數據首席數據官

2021-03-11 07:27:17

CPU空閑代碼

2013-02-22 09:59:22

移動醫療創業公司

2012-07-11 13:54:42

網頁重構

2015-07-14 09:24:03

京東618MySQL

2015-05-13 11:20:02

DockerDocker實踐者PaaS

2023-09-12 16:36:39

操作系統CPU周期性

2009-03-12 11:08:00

技術顧問職場雜談

2013-11-22 09:43:11

王小川許朝軍搜狗

2022-07-06 15:07:47

React開發

2021-08-26 11:09:51

systemdLinux

2023-12-18 16:02:04

OpenAI人工智能

2021-08-26 13:55:45

systemdLinux目標

2020-10-09 13:58:13

云服務商AWS谷歌

2024-04-16 10:09:42

2021-11-18 21:09:50

流批場景引擎

2012-11-27 10:17:04

2011-05-24 14:15:53

測試

2020-12-23 13:26:53

代碼麻省理工學院語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 临洮县| 望谟县| 万源市| 宁晋县| 丰顺县| 红桥区| 平乐县| 阿拉尔市| 库车县| 郸城县| 江达县| 竹溪县| 南城县| 富宁县| 南宫市| 林周县| 绿春县| 禹州市| 福建省| 涿鹿县| 新乡市| 通许县| 五原县| 淮北市| 怀来县| 扎鲁特旗| 威远县| 连云港市| 新田县| 门头沟区| 嵊州市| 淅川县| 桦南县| 萍乡市| 沭阳县| 鲁甸县| 长宁县| 大港区| 丘北县| 鄂温| 平顶山市|