OOo異步打印模式引發的思考

        前幾天日本的客戶對項目中的打印功能作了反饋。該項目使用OpenOffice的來進行打印的,本來之前是要用Micorosoft Office來做這一塊的,不過被客戶否決了,客戶的技術能力很不錯,知道Microsoft很多Bug。

 

        問題是這樣的,在windows平臺OOo是一個多進程系統,“soffice.bin”、“soffice.exe”。但是它對所有實例都是用同樣的進程,簡單地說也就是不管開多少窗口這樣個進程都只有一個(有點繞好像)。想法是好的,不過很可惜有Bug,客戶在對打印功能進行測試的過程中發現有時候這兩個進程會多一些出來,這個時候打印功能就會罷工。關於這個問題,OOo官方說把它們都Kill掉就好了。

 

        不過好像問題沒有這麼簡單。執行打印方法,釋放資源。然後獲取所有名爲“soffice.bin”、“soffice.exe”的進程(服務器環境),全部Kill掉。然後,打印機一動不動。

 

        看來我擔心的事情發生了。對於打印機的工作原理我瞭解的比較少,所以做這個解決方案的時候就有點擔心如果OOo打印和打印機之間同異步的關係。Debug了一下,發現如果在打印方法返回後線程Sleep大約500毫秒就沒問題了。看來果然是異步的。這回可鬱悶了,Sleep絕不是一個可行的解決方案,因爲時間沒法確定。不過在OOo官方看了一下,居然有一個叫“Wait”的參數,可以指定打印的同異步模式,而默認的就是異步方式。

 

        OK,馬上設置這個參數爲True,然後行TestCode。打印機響了起來,問題解決了。

 

        問題是解決了,不過疑問卻留在心中。以前做企業級產品比較少,沒有研究過打印機的功能。沒想到打印居然還分同步和異步方式,有意思(其實我應該早想到,白費了那麼多功夫去研究操作系統內核原理了)。

 

         關於IO體系結構和設備驅動的這種老生常談的換提就不討論了,這裏着重研究打印機的工作式(以前基本上沒關注過這個設備)

 

        仔細研究了一下,事情和一種叫Spooling的技術有關。Windows上面有個叫Print Spooler的服務,結束了就不能打印了印了。

 

        Spooling技術是這樣的,全名叫做Simultaneous Peripheral Operation On-Line (即外部設備聯機並行操作),它是關於慢速字符設備如何與計算機主機交換信息的一種技術,通常稱爲“假脫機技術”。很顯然,打印機是一種字符設備。

 

        所謂假脫機就是說並不是真正的脫機,當然也不是直接耦合了。SPOOLing是一種外圍設備同時聯機操作的技術,又叫排隊轉存。在輸入和輸出之間有個輸入和輸出的緩衝區(對於打印機來說就是打印機列了)。這個緩衝區可以消除用戶聯機等待的時間。

       

        SPOOLing的工作方式是這樣的:在系統輸入模塊收到作業輸入請求信號後,輸入管理模塊中的讀過程負責將信息從輸入裝置中讀入輸入緩衝區。當緩衝區滿時,由寫過程將信息從緩衝區寫到外存的輸入緩衝區中,讀過程和寫過程反覆循環,直到一個作業輸入完畢。當讀過程讀到一個硬件結束標誌之後,系統再次驅動寫過程把最後一批信息寫入外存輸入緩衝區並調用中斷處理程序結束該次輸入。然後,系統爲該作業建立作業控制塊,從而使輸入緩衝區中的作業進入作業等待隊列,等待作業調度程序選中後進入內存運行。系統在管理輸入緩衝區過程中可以“不斷”讀入輸入的作業,直到輸入結束或輸入緩衝區滿而暫停。

 

        這就是說若系統的某臺臺行式打印機採用了虛擬設備技術,那麼若有進程要求對它打印輸出時,SPOOLing系統並不是將這臺打印機直接分配給進程,而是在共享設備(磁盤或磁鼓)上的輸出SPOOLing存儲區中爲其分配一塊存儲空間,進程的輸出數據以文件形式此。各進程的數據輸出文件形成了一個輸出隊列,由輸出POOLing系統控制這臺打印機進程,依次將隊列中的輸出文件實際打印輸出。在SPOOLing 系統中,實際上並沒有爲任何進程分配,而只是在輸入緩衝區和輸出緩衝區中,爲進程分配一存儲區和建立一個IO請求表。這樣,便把獨佔設備改造爲共享設備。

 

        SPOOLing是在通道技術喝多道程序設計的基礎上產生的,使用主機和通道共同作業,並使用外存作爲設備緩衝區的的後援,實現外圍設備同時聯機的操作。通常會有一個負責IO的常駐內存的進程來處理(Windows下就是spoolsv.exe了)。

 

        打印機正式SPOOLing的典型實例。

 

        使用SPOOLing技術的好處如下:
               1、提高了IO速度
               2、將獨佔設備改造爲共享設備

 

         打印機的工作方式終於弄清楚了,不過似乎和我的問題關係不大。從SPOOLing的角度來看,打印永遠是異步的。那麼同步是什麼呢?那就是對於緩衝區讀寫的同步異步了,具體的話涉及到IO體系結構,不多說了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章