執行佇列與程序佇列

2021-09-25 11:59:23 字數 2000 閱讀 8229

在一定時間內 cpu所能處理和承載的程序數量是有限的,這個數值與cpu的效能有直接關係,或者說這個數值標誌著cpu的效能高低,反應到實際的計算機使用上來就是更 高效能的cpu可以在同一時間處理更多程序內容。

所以說,一般當你去電腦城買個人電腦的時候導購就會問你電腦的大致用途,其實他們這個時候是在幫你計算你 所需要的電腦效能,其中就包括計算cpu的最大負載值,當然他們一般都不會這麼去算,而是根據**,因為**高的cpu往往效能就更好,緊接著,他們會問 你大概的預算,其實當了解到你買電腦的用途之後他們自己心裡已經幫你預算好了,如果你的預算高於他們的預算,那麼恭喜那位賣電腦的,他可以多賺點了。所以 買電腦一定要根據實際需求,比如說cpu支援很高的負載,而你在實際使用中卻根本達不到那麼高的負載,那不就成了殺雞用殺豬刀麼。

扯遠了,說到底,cpu在單位時間內所能處理的程序數越高,那它的效能應該就越高。但是關於這個負載,網上資料有很多種說法,有的說是負載不應該超 過cpu的核心數量,有的說不應該超過cpu核心數量的2倍,有的說不應該超過cpu核心數量的3倍,為什麼會有這麼多種說法呢,其實大家都是擔心乙個相 同的問題----怕cpu扛不住,這裡超不超過幾倍不要緊,最主要的判斷標準是你的cpu在達到一定程度負載的時候是不是系統和應用程式依然執行良好,也 就是說判斷標準還與實際的應用有關,如果cpu的負載都超了核心數好幾倍但是軟體執行還依然順暢,那這個也是可以有的。這裡就得說說cpu的執行佇列了, 有關執行佇列的狀態引數可以通過vmstat命令來檢視,這裡不多做解釋,它有兩項,一項是run,一項是blocked,也就是vmstat檢視到的最 前面的兩排,run代表正在cpu裡面執行的,blocked代表由於磁碟或其他方面的瓶頸導致他在cpu裡面等待的,這兩個數值其實和使用uptime 或者top命令檢視到的系統負載值是很有關係的,基本上,系統在某個時間的負載值就等同於run的值加上blocked的值,但是這裡直接這樣用加法來表 示也是不對的,系統負載值是乙個平均值,可以是小數,而執行佇列的數目是整數。在cpu處於空閒的情況下,run+blocked一般接近0,偶爾蹦出個 1啊2啊的,所以空閒狀態下的負載均值一般都是0.幾。

但是,當系統的負載逐漸公升高,也就是說cpu裡執行的東東逐漸變多,那麼反應到負載均值上其數值也會跟著逐漸增大,而且可以是很大很大,完全超出 cpu核心數的好多倍,比如我前幾天用一台8核機器做測試的時候用top命令檢視到的負載值居然達到了將近600,這已經遠遠超出了cpu可承受的範圍, 那為什麼已經超出了可接受範圍這個負載均值還可以漲到那麼高呢,這是因為在cpu裡,同一時間可以執行的程序數量有限的,也就是說,vmstat檢視到的 run值最大不能超過某個數,但是blocked卻可以繼續變大,因為程序已經blocked掉了,它幾乎占用不了多少cpu資源,而正在run的就不一 樣了,乙個cpu同一時間能run多少完全取決於它的物理效能,所以當你的機器負載不斷公升高,你用top命令檢視到的負載值也會不斷公升高,而當負載達到一 定高度時,cpu能處理的執行佇列也達到上限,run的值不再增加,這時,blocked的值會繼續增加,理論上,blocked可以一直增加到直到系統 崩潰。

總結:在評估cpu的效能優劣時完全照搬網上說的幾倍幾倍是不準確的,還得你自己動手看看vmstat顯示的run值和blocked值,當出現明 顯較多的blocked的時候,就說明cpu產生了瓶頸。而top命令和uptime命令顯示的負載均值,只能作為判斷系統過去某個時間段的狀態的參照, 與cpu的效能關係不大。

上下文切換

context switches per second:每秒執行緒切換次數, 在有的書中翻譯成上下文切換,實際含義是任務切換,或cpu寄存

器內容切換。當多工核心決定執行另外的任務時,它儲存正在執行任務的當前狀態(context),即cpu暫存器中的全部內

容。這些內容儲存在任務的當前狀況儲存區(task』s context storage area),也就是任務自己的棧區之中。入棧工作完

成以後,就是把下乙個將要執行的任務的當前狀況從該任務的棧中重新裝入cpu的暫存器,並開始下乙個任務的執行。這個過

程叫做任務切換。任務切換過程增加了應用程式的額外負荷。cpu的內部暫存器越多,額外負荷就越重。做任務切換所需要的

時間取決於cpu有多少暫存器要入棧。

程序的佇列

from multiprocessing import process,queue 和joinablequeue類似,但是joinablequeue多了task list 和join兩個方法qq queue 3 qq.put first block false,timeout 7 qq.put se...

佇列與優先佇列

是一種特殊的線性表,特殊之處在於它只允許在表的前端 front 進行刪除操作,而在表的後端 rear 進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列的資料元素又稱為佇列元素。在佇列中插入乙個佇列元素稱為入隊,從佇列中刪除乙個佇列元素稱為...

佇列之順序佇列與迴圈佇列

一 佇列的概念 只能在表的一端進行插入操作,只能在表的另一端進行刪除操作,這種資料結構稱為 佇列。把允許插入的一端叫 隊尾 rear 允許刪除的一端叫 對頭 front 二 佇列的分類 佇列本身也是一種線性表,因而和線性表一樣也有順序和鏈式儲存結構兩種儲存方式。採用順序儲存結構實現的佇列稱為順序佇列...