關於spooling的一些理解

2022-09-09 11:00:29 字數 1152 閱讀 6889

1.將獨佔裝置(印表機)虛擬化,變成乙個邏輯上的共享裝置。

怎麼理解?虛擬化,通俗來講,就是讓單個資源仿似變成了多個資源。

以印表機為例,沒有虛擬化之前,只能有乙個程序申請到印表機資源。

有了虛擬化,多個程序可以同申請到印表機的使用權。也就是說把印表機從獨佔裝置變成了共享裝置。

2.將低速裝置(字元裝置)變成了高速裝置。

對於字元裝置,我們通常會採用忙等或者中斷的方式來進行互動。這樣效率比較低。

spooling使用硬碟作為中轉,不再直接讀寫低速裝置,從而提高了io效率。

我們使用印表機來舉例。有兩種方式來使用。

1.同步的方式:就是程序需要等待列印任務執行完畢。

由於印表機這類裝置是低速的獨佔裝置,因此該程序會長時間占用印表機,從而導致其他需要印表機的程序處於忙等或者阻塞的狀態。

2.非同步的方式:程序不再需要等待列印任務執行完畢。程序將列印任務提交給乙個專門的印表機管理程序,然後通過**函式獲取列印結果。

使用非同步的方式,增加了併發度,同時也減少了阻塞喚醒或者忙等的開銷。

離線技術指的是任務可以脫離本機(cpu)執行。cpu會將任務交給乙個專用的外圍裝置來處理。一旦任務提交以後,就不需要cpu進行干預。

假離線沒有專門的外圍裝置,它使用單獨的系統程序模擬外圍裝置,因此稱為假離線。使用者程序將任務提交給專門的系統程序(如印表機程序)來處理。

通過乙個具體的例子,來看看虛擬化是如何實現的:

作業系統為印表機提供乙個專門的程序,稱為印表機守護程序,不妨稱為d程序。只有d程序擁有使用印表機的權利。

作業系統維護乙個印表機訊息佇列。想要使用印表機的程序,提交乙個印表機請求,放入到該訊息佇列中進行排隊。

程序提交了請求以後,就可以繼續往下面執行其他邏輯了,可以使用**函式得知列印執行結果。

d程序負責處理訊息佇列中的列印任務。當訊息隊列為空時,則陷入阻塞狀態,直到出現新的列印任務。

我們可以看到,訊息的處理速度是比較慢的,同時一次只能處理一條訊息,所以我們沒有必要將整個訊息佇列都放入記憶體中。

因此,我們將不用的資料,暫時放入硬碟中。記憶體中只保留一條訊息。

關於熵的一些理解

對於理工科學生來說,熵 並不是乙個陌生的名詞。在諸如 大學物理 熱力學 和 資訊理論 等課程中都會有所介紹。但同時 熵 又是乙個顯得有點神秘的概念,看不見也摸不著。我最早是在高中物理課中聽說的,大概是在介紹 熱力學第二定律 時提到的。熱力學第二定律的內容是 熱力學過程是不可逆的 孤立系統自發地朝著熱...

關於float的一些理解

float是否脫離文件流,乙個父元素不設定overflow的話,子元素float,就不會把父元素撐開,換句話說,他就不會有高度,但是做個demo 父元素overflow hidden 子元素前兩個float,第三個不float,結果是第三個沒有clear浮動的元素,跟float的元素出現在同乙個位置...

關於android layout的一些理解

1 wrap content view的尺寸根據它的內容確定 match parent view的尺寸盡量和它的parent view group一樣大 2 獲得view的位置 position getleft gettop getright getleft getwidth getwidth 3 ...