這篇比喻是我在網上看到的,覺得比晦澀難懂的術語容易理解很多,所以轉載。出處是輕鬆理解輸送量與延遲,訊號量與互斥鎖 1輸送量和延遲
第一比喻是關於輸送量(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.
正如銀行為了讓客戶滿意不光要提高自身的辦事效率外,還要盡量縮短客戶在銀行辦事所花的時間一樣,作業系統不光要盡量讓網路輸送量大,而且還要讓每個應用程式發送資料的延遲盡量小。這是兩個不同的目標。 2訊號量和互斥鎖
另外一個比喻是解釋訊號量(semaphore)和互斥鎖(mutex)的區別。該比喻最初來自這裡,我先翻譯一下,然後對它做個改進。
互斥鎖是一把公用廁所的鑰匙。一個人使用廁所的時候可以拿到這把鑰匙,用完之後把這把鑰匙交給排隊的下一個人。
訊號量是沒有人使用的廁所的鑰匙數量,所有廁所的鑰匙都一樣。比如有4個廁所有相同的鑰匙和鎖。訊號量的值就是鑰匙的數量,一開始是4。當進來一個人的時候數量就是少一個,如果4個廁所都滿了,訊號量就成0了,出去一個人就增加1,並把鑰匙交給排隊的下一個人。
這個比喻並不是太好,尤其是它無法解釋二元(binary)訊號量和互斥鎖的區別。我把這個比喻做了改進。互斥鎖的比喻還是和上面一樣,需要指出的是,當你拿到那把鑰匙的時候你就是它的擁有者(owner),別人是無法開啟廁所門的。
而訊號量到底是什麼呢。它就是一個大的公用廁所,裡面有若干個位置,外面的大門口有一個可以翻動牌子寫著“已滿”和“可用”,當裡面還有空的位置的時候,進去的人不用翻動這個牌子,直到沒有位置時最後一個進去的人必須把它設成“已滿”,這時後面的人必須排隊等候,然後出去的人必須把牌子翻到“可用”,如果需要的話。
很好理解對嘛。那麼它怎麼解釋二元訊號量呢。也就是當這個廁所裡面只能容納一個人的時候,每個人進去的時候都要把門口的牌子翻到“已滿”,出去的時候翻到“可用”。它和互斥鎖的區別馬上就可以看出來了,翻動的牌子在外面可以被別人翻的,而鎖住的鎖只有拿鑰匙的人才可以開。
當然了,訊號量之所以翻譯成“訊號”,還是有道理的,因為它(廁所門口的牌子)標示的是資源(廁所空位)的狀態,而互斥鎖就是鎖,它實實在在地鎖住了資源。這在生產者消費者的情況下區別更明顯。