Io-Redirection
linux 重定向如何管理快速輸入和慢速輸出?
當我這樣做時,
$ cat ssd/file1 > hdd/file1
從 ssd 讀取比在 hdd 中寫入更快,cat 正在讀取的數據會發生什麼?輸入和輸出之間是否有任何通信,告訴 cat 放慢速度?
考慮一下
cat
(自己)做了什麼:它從輸入讀取到記憶體中的緩衝區(其大小由 決定cat
),然後寫入其標準輸出。它執行的讀取和寫入是阻塞的:直到它們到達輸入的末尾,讀取將停止並在必要時等待數據,同樣,寫入將停止並在必要時等待數據寫入。這提供了輸出和輸入之間的某種通信;如果輸入提供數據的速度快於輸出吸收數據的速度,則寫入將阻塞,cat
因此將停止讀取,直到可以再次寫入為止。作業系統記憶體使情況稍微複雜了一點,但它們並沒有顯著改變行為。特別是對於寫入,作業系統通常不會等待目標儲存數據,而是將寫入的數據儲存在記憶體中,然後再將其刷新。從的角度來看,這允許在必須停止
cat
之前寫入更多數據(只要另一側有輸入數據) 。cat
但是基本原理沒有改變,當寫入比讀取慢時,作業系統最終會決定阻止寫入(例如,因為記憶體中有太多數據等待寫入,或者因為等待時間過長)。