輕松理解吞吐量與延遲,信號量與互斥鎖

兩個精彩的比喻
服務器君一共花費了228.097 ms進行了7次數據庫查詢,努力地為您提供了這個頁面。
試試閱讀模式?希望聽取您的建議

我們知道,計算機中有很多概念并不容易理解,有些時候一個好的比喻能勝過很多句解釋。下面兩個是我看到的兩個很精彩的比喻,拿出來和大家分享一下。

吞吐量和延遲

第一比喻是關于吞吐量(throughput)和延遲(latency)的。如果你要搞網絡性能優化,這兩個概念是你必須要知道的,它們看似簡單實則不是。我相信包括我在內的很多人都曾經認為大的吞吐量就意味著低延遲,高延遲就意味著吞吐量變小。下面的比喻可以解釋這種觀點根本不對。該比喻來自這里,我來做個大體意譯(非逐字翻譯)。

我們可以把網絡發送數據包比喻成去街邊的 ATM 取錢。每一個人從開始使用 ATM 到取錢結束整個過程都需要一分鐘,所以這里的延遲是60秒,那吞吐量呢?當然是 1/60 人/秒。現在銀行升級了他們的 ATM 機操作系統,每個人只要30秒就可以完成取款了!延遲是 30秒,吞吐量是 1/30 人/秒。很好理解,可是前面的問題依然存在對不對?別慌,看下面。

因為這附近來取錢的人比較多,現在銀行決定在這里增加一臺 ATM 機,一共有兩臺 ATM 機了。現在,一分鐘可以讓4個人完成取錢了,雖然你去排隊取錢時在 ATM 機前還是要用 30 秒!也就是說,延遲沒有變,但吞吐量增大了!可見,吞吐量可以不用通過減小延遲來提高。

好了,現在銀行為了改進服務又做出了一個新的決定:每個來取錢的客戶在取完錢之后必須在旁邊填寫一個調查問卷,用時也是30秒。那么,現在你去取錢的話從開始使用 ATM 到完成調查問卷離開的時間又是 60 秒了!換句話說,延遲是60秒。而吞吐量根本沒變!一分鐘之內還是可以進來4個人!可見,延遲增加了,而吞吐量沒有變。

從這個比喻中我們可以看出,延遲測量的是每個客戶(每個應用程序)感受到的時間長短,而吞吐量測量的是整個銀行(整個操作系統)的處理效率,是兩個完全不同的概念。用作者的原話說是:

In short, the throughput is a function of how many stages are in parallel while latency is a function of how many are in series when there are multiple stages in the processing. The stage with the lowest throughput determines the overall throughput.

正如銀行為了讓客戶滿意不光要提高自身的辦事效率外,還要盡量縮短客戶在銀行辦事所花的時間一樣,操作系統不光要盡量讓網絡吞吐量大,而且還要讓每個應用程序發送數據的延遲盡量小。這是兩個不同的目標。

信號量和互斥鎖

另外一個比喻是解釋信號量(semaphore)和互斥鎖(mutex)的區別。該比喻最初來自這里,我先翻譯一下,然后對它做個改進。

互斥鎖是一把公共廁所的鑰匙。一個人使用廁所的時候可以拿到這把鑰匙,用完之后把這把鑰匙交給排隊的下一個人。

信號量是沒有人使用的廁所的鑰匙數量,所有廁所的鑰匙都一樣。比如有4個廁所有相同的鑰匙和鎖。信號量的值就是鑰匙的數量,一開始是4。當進來一個人的時候數量就是少一個,如果4個廁所都滿了,信號量就成0了,出去一個人就增加1,并把鑰匙交給排隊的下一個人。

這個比喻并不是太好,尤其是它無法解釋二元(binary)信號量和互斥鎖的區別!我把這個比喻做了改進。互斥鎖的比喻還是和上面一樣,需要指出的是,當你拿到那把鑰匙的時候你就是它的擁有者(owner),別人是無法打開廁所門的。

而信號量到底是什么呢?它就是一個大的公共廁所,里面有若干個位置,外面的大門口有一個可以翻動牌子寫著“已滿”和“可用”,當里面還有空的位置的時候,進去的人不用翻動這個牌子,直到沒有位置時最后一個進去的人必須把它設成“已滿”,這時后面的人必須排隊等候,然后出去的人必須把牌子翻到“可用”,如果需要的話。

很好理解對嘛?那么它怎么解釋二元信號量呢?也就是當這個廁所里面只能容納一個人的時候,每個人進去的時候都要把門口的牌子翻到“已滿”,出去的時候翻到“可用”。它和互斥鎖的區別馬上就可以看出來了,翻動的牌子在外面可以被別人翻的,而鎖住的鎖只有拿鑰匙的人才可以開!

當然了,信號量之所以翻譯成“信號”,還是有道理的,因為它(廁所門口的牌子)標示的是資源(廁所空位)的狀態,而互斥鎖就是鎖,它實實在在地鎖住了資源。這在生產者消費者的情況下區別更明顯。

本文地址:http://www.zqhthc.tw/librarys/veda/detail/2386,歡迎訪問原出處。

不打個分嗎?

轉載隨意,但請帶上本文地址:

http://www.zqhthc.tw/librarys/veda/detail/2386

如果你認為這篇文章值得更多人閱讀,歡迎使用下面的分享功能。
小提示:您可以按快捷鍵 Ctrl + D,或點此 加入收藏

大家都在看

閱讀一百本計算機著作吧,少年

很多人覺得自己技術進步很慢,學習效率低,我覺得一個重要原因是看的書少了。多少是多呢?起碼得看3、4、5、6米吧。給個具體的數量,那就100本書吧。很多人知識結構不好而且不系統,因為在特定領域有一個足夠量的知識量+足夠良好的知識結構,系統化以后就足以應對大量未曾遇到過的問題。

奉勸自學者:構建特定領域的知識結構體系的路徑中再也沒有比學習該專業的專業課程更好的了。如果我的知識結構體系足以囊括面試官的大部分甚至吞并他的知識結構體系的話,讀到他言語中的一個詞我們就已經知道他要表達什么,我們可以讓他坐“上位”畢竟他是面試官,但是在知識結構體系以及心理上我們就居高臨下。

所以,閱讀一百本計算機著作吧,少年!

《深入理解計算機系統(原書第2版)》 布萊恩特(Randal E.Bryant) (作者), 奧哈拉倫(David R.O'Hallaron) (作者), 龔奕利 (譯者), 雷迎春 (譯者)

《深入理解計算機系統》從程序員的視角詳細闡述計算機系統的本質概念,并展示這些概念如何實實在在地影響應用程序的正確性、性能和實用性。全書共12章,主要內容包括信息的表示和處理、程序的機器級表示、處理器體系結構、優化程序性能、存儲器層次結構、鏈接、異常控制流、虛擬存儲器、系統級I/O、網絡編程、并發編程等。書中提供子大量的例子和練習題,并給出部分答案,有助于讀者加深對正文所述概念和知識的理解。

更多計算機寶庫...

英超直播吻球网