輸入輸出系統與裝置管理

排存(spooling)

想像一間辦公室裡有二十個人共用一台印表機。如果每個人想餵紙就走上去餵,輸出會交錯成一團亂碼。於是改成每個人把自己的工作放進一個收件匣,印表機一次一個完整工作地處理那個匣子。排存就是那個收件匣:作業系統把整個整個的輸入輸出工作收集在一個佇列裡(通常在磁碟上),按順序餵給一個一次只能服務一項的裝置,使並行的使用者不會相撞。

具體來說,排存就是為一個不可共享的裝置所做的緩衝加上排隊。當你列印時,你的資料不會直接送到印表機;它被寫進磁碟上的一個排存檔,並在列印佇列裡放一個項目。一個背景行程——排存程式或列印守護程式——一個接一個地從佇列取出工作,把每一個完整、不中斷地送到印表機。由於資料停在磁碟上,你的程式可以立刻完成並返回,即使印表機又慢又忙;緩慢的裝置與快速的程式被完全解耦。同樣的模式服務任何必須一次處理一個請求、不能混在一起的裝置:列印佇列是教科書案例,批次工作與電子郵件的寄件佇列也以同樣方式運作。

為什麼重要:排存在歷史上是效率的一大躍進——它讓許多使用者共用一台印表機,也讓程式不必再守著緩慢的周邊裝置。它和單純的緩衝有兩點不同:它排的是整個整個獨立的工作(不只是一次傳輸的位元組),而且它的存在正是為了多工一個不能逐刻共享的裝置。要注意的也很明顯:被排存的工作是排了隊、而不是做完了——你的文件可能幾分鐘後才印出,而如果它卡在一個卡住的工作後面、或排存程式當機,它可能根本印不出來。

三個人同時列印。作業系統把三個排存檔寫到磁碟並排入佇列。印表機把工作 1 印到完成,再印工作 2,再印工作 3——絕不交錯——而三個程式都早在列印完成之前就立即返回了。

整個整個的工作被排存在磁碟上,一次一個地餵給一次只能服務一項的裝置。

排存替一個無法逐刻共享的裝置排入整個整個的獨立工作;普通的緩衝只是讓單一傳輸的位元組變平順。被排存的工作是被接受了,而不是已被執行。

又稱
SPOOLsimultaneous peripheral operations on-lineprint queue假離線排存緩衝