速讀原著-TCP/IP(電腦時鐘)

  • 2020 年 3 月 18 日
  • 筆記

電腦時鐘

既然本書中的大多數的例子都需要測量一個時間間隔,我們需要更仔細地介紹一下當前U n i x系統所採用的記錄時間的方法。下面的描述適用於本書中例子所使用的系統,也適用於大多數的U n i x系統。[ L e ffler et al. 1989]的3 . 4節和3 . 5節給出了另外的細節。

硬體按照一定的頻率產生一個時鐘中斷。對於 Sun SPA R C和Intel 80386,時鐘中斷每10 ms產生一次。應該注意到大多數的電腦使用一種無補償的晶體振蕩器來生成這些時鐘中斷。正如RFC1305 [Mills 1992] 的表7指出的,你不要想知道這種振蕩器一天的偏差有多少。這就意味著幾乎沒有電腦能維持精確的時間(即,中斷並不是精確地每 10 ms發生一次)。一個0 . 0 1%的誤差就會產生一個每天 8 . 6 4秒的差錯。為了得到更好的時間測量需要: (1)一個更好的振蕩器; (2)一個外部的更精確的時間資源(如,全球定位衛星提供的時間資源);或者 ( 3)通過網際網路訪問一個具有更精確時鐘的系統。後者通過 R F C 1 3 0 5定義的網路時間協議實現,對該協議的描述超出了本書的範圍。

U n i x系統中引起時間差錯的另一個公共的原因是 10 ms的中斷只是引起內核給一個記錄時間的變數增 1。如果內核丟失了一個中斷(也就是說兩個連續中斷之間間隔 10 ms 對於內核來說太快了),時鐘將失去 10 ms 。丟失這種類型的中斷經常引起 U n i x系統丟失時間。

儘管時間中斷近似於每10 ms到達一次,更新的系統,如 S PA R C,提供了一個更高精度的定時器來測量時間差異。通過 N I T驅動程式,t c p d u m p(在附錄A中描述)已經訪問了這個更高精度的定時器。在 S PA R C上,這個定時器提供了 微 秒 級 的 精 度 。 用 戶 進 程 也 可 以 通 過g e t t i m e o f d a y( 2 )函數來訪問這個更高精度的定時器。

作者做了下面的試驗。我們運行了一個程式,這個程式在一個循環里調用了10 000次g e t t i m e o f d a y函數,並將每次的返回值保存在一個數組中。在循環結束後,列印了9 9 9 9個時間差。對於一個S PARC ELC,時間差的分布如圖B – 1所示。

在一個空閑的系統中,運行這個程式所花的時鐘時間為 0 . 3 8秒。根據這一點,我們可以說進程調用g e t t i m e o f d a y所花的時間大約 3 7微秒。既然E L C的速度是2 1 M I P S(M I P S表示每秒1 0 0萬指令),3 7微秒相應於大約8 0 0個指令。這些指令對於內核處理一個用戶進程的調用、執行系統調用、複製 8個位元組的結果及返回給用戶進程看起來是合理的( M I P S速度是不可靠的,很難測量當前系統的指令時間。我們試圖做的只是得到一個粗略的估計來評價一下上面的值是否有意義)。

從這個簡單的試驗,我們可以說 g e t t i m e o f d a y返回的值確實包含了微秒級的精度。

如果我們在S V R 4 / 3 8 6上進行類似的測試,結果是不同的。這是因為很多 386 Unix 系統,如S V R 4,只計數 10 ms的時鐘中斷,而沒有提供更高的精度。圖 B – 2是運行在 25 MHz 80386 上的S V R 4中9 9 9 9個時間差的分布。

這些值是無意義的,因為時間差一般小於 1 0 m s,都被認為是0了。在這些系統中,我們所能做的就是在一個空閑的系統上測量時鐘時間,除以循環的次數。這個結果提供了一個上界,因為它包含了調用 p r i n t f函數9 9 9 9次的時間和將結果寫入一個文件的時間(在 S PA R C的情況,圖B – 1,時間差沒有包括p r i n t f的時間,因為所有10 000個值都是首先獲得的,然後才列印結果)。在S V R 4的時鐘時間為3 . 1 5秒,每個系統調用消耗了3 1 5微秒。這個大約比S PA R C慢8 . 5倍的系統調用時間看來是正確的。

BSD/386 1.0版提供了類似於S PA R C的微秒級的精度。它讀8 2 5 3時鐘暫存器,計算從上次時鐘中斷以來的微秒次數。調用 g e t t i m e o f d a y的進程和內核模組,如BSD 分組過濾器,可以使用這個精度。

和t c p d u m p聯繫起來,這些數字意味著我們可以相信在 S PA R C和B S D / 3 8 6系統上列印的毫秒和亞毫秒( s u b m i l l i s e c o n d )的值。而在S V R 4 / 3 8 6上,t c p d u m p列印的值總是10 ms的倍數。對於其他列印往返時間的程式,如 p i n g(第7章)和t r a c e r o u t e(第8章),在S PA R C和B S D / 3 8 6系統上,我們可以相信它們輸出的毫秒值,但在 S V R 4 / 3 8 6上,列印的值總是 1 0的倍數。為了在 L A N上測量某個 p i n g的時間,在第 7章中我們顯示的時間是 3 ms,所以需要在S PA R C和B S D / 3 8 6系統上運行p i n g程式。

本書中的一些例子是運行在BSD/386 0.9.4版上,它類似於S V R 4,只提供了10 ms的時鐘精度。在我們顯示這個系統的t c p d u m p輸出時,只顯示到小數點後面兩位,因為這就是所提供的精度。