檔案緩衝區

檔案緩衝區

檔案是指存儲在外部存儲介質上的、由檔案名稱標識的一組相關信息的集合。由於CPU 與 I/O 設備間速度不匹配。為了緩和 CPU 與 I/O 設備之間速度不匹配矛盾。檔案緩衝區是用以暫時存放讀寫期間的檔案數據而在記憶體區預留的一定空間。使用檔案緩衝區可減少讀取硬碟的次數。

緩衝區簡介

檔案緩衝區是用以暫時存放讀寫期間的檔案數據而在記憶體區預留的一定空間。通過磁碟快取來實現,磁碟快取本身並不是一種實際存在的存儲介質,它依託於固定磁碟,提供對主存儲器存儲空間的擴充,即利用主存中的存儲空間, 來暫存從磁碟中讀出(或寫入)的信息。 主存也可以看做是輔存的高速快取, 因為,輔存中的數據必須複製到主存方能使用;反之,數據也必須先存在主存中,才能輸出到輔存。

一個檔案的數據可能出現在存儲器層次的不同級別中,例如,一個檔案數據通常被存儲在輔存中(如硬碟),當其需要運行或被訪問時,就必須調入主存,也可以暫時存放在主存的磁碟高速快取中。大容量的輔存常常使用磁碟,磁碟數據經常備份到磁帶或可移動磁碟組上,以防止硬碟故障時丟失數據。有些系統自動地把老檔案數據從輔存轉儲到海量存儲器中,如磁帶上,這樣做還能降低存儲價格。

緩衝的引入

在設備管理中,引入緩衝區的主要原因可歸結為以下幾點:

(1) 緩和 CPU 與 I/O 設備間速度不匹配的矛盾。事實上,凡在數據到達速率與其離去速率不同的地方,都可設定緩衝區,以緩和它們之間速率不匹配的矛盾。眾所周知,CPU的運算速率遠遠高於 I/O 設備的速率,如果沒有緩衝區,則在輸出數據時,必然會由於印表機的速度跟不上而使 CPU 停下來等待;然而在計算階段,印表機又空閒無事。顯然,如果在印表機或控制器中設定一緩衝區,用於快速暫存程式的輸出數據,以後由印表機“慢慢地”從中取出數據列印,這樣,就可提高 CPU 的工作效率。類似地,在輸入設備與 CPU 之間也設定緩衝區,也可使 CPU 的工作效率得以提高。

(2) 減少對 CPU 的中斷頻率,放寬對 CPU 中斷回響時間的限制。在遠程通信系統中,如果從遠地終端發來的數據僅用一位緩衝來接收,如圖 5-10(a)所示,則必須在每收到一位數據時便中斷一次 CPU, 這樣, 對於速率為 9.6 Kb/s 的數據通信來說, 就意味著其中斷 CPU的頻率也為 9.6 Kb/s, 即每 100 μs 就要中斷 CPU 一次, 而且 CPU 必須在 100 μs 內予以回響,否則緩衝區內的數據將被衝掉。倘若設定一個具有 8 位的緩衝(移位)暫存器,如圖 5-10(b)所示, 則可使 CPU 被中斷的頻率降低為原來的 1/8; 若再設定一個 8 位暫存器, 如圖所示,則又可把 CPU 對中斷的回響時間放寬到 800 μs。

(3) 提高 CPU和 I/O 設備之間的並行性。緩衝的引入可顯著地提高 CPU 和 I/O 設備間的並行操作程度,提高系統的吞吐量和設備的利用率。例如,在 CPU 和印表機之間設定了緩衝區後,便可使 CPU 與印表機並行工作。

緩衝區機制

根據應用程式對檔案的訪問方式,即是否存在緩衝區,對檔案的訪問可以分為帶緩衝區的操作和非緩衝區的檔案操作:

a) 帶緩衝區檔案操作:高級標準檔案I/O操作,將會在用戶空間中自動為正在使用的檔案開闢記憶體緩衝區。

b) 非緩衝區檔案操作:低級檔案I/O操作,讀寫檔案時,不會開闢對檔案操作的緩衝區,直接通過系統調用對磁碟進行操作(讀、寫等),當然用於可以在自己的程式中為每個檔案設定緩衝區。

兩種檔案操作的解釋和比較

1、非緩衝的檔案操作訪問方式,每次對檔案進行一次讀寫操作時,都需要使用讀寫系統調用來處理此操作,即需要執行一次系統調用,執行一次系統調用將涉及到CPU狀態的切換,即從用戶空間切換到核心空間,實現進程上下文的切換,這將損耗一定的CPU時間,頻繁的磁碟訪問對程式的執行效率造成很大的影響。

2、ANSI標準C庫函式 是建立在底層的系統調用之上,即C函式館檔案訪問函式的實現中使用了低級檔案I/O系統調用,ANSI標準C庫中的檔案處理函式為了減少使用系統調用的次數,提高效率,採用緩衝機制,這樣,可以在磁碟檔案進行操作時,可以一次從檔案中讀出大量的數據到緩衝區中,以後對這部分的訪問就不需要再使用系統調用了,即需要少量的CPU狀態切換,提高了效率。

緩衝類型

單緩衝(Single Buffer)

檔案緩衝區 檔案緩衝區

在單緩衝情況下,每當用戶進程發出一 I/O 請求時,作業系統便在主存中為之分配一緩衝區,如圖所示。在塊設備輸入時,假定從磁碟把一塊數據輸入到緩衝區的時間為 T,作業系統將該緩衝區中的數據傳送到用戶區的時間為 M,而 CPU 對這一塊數據處理(計算)的時間為 C。由於 T 和 C 是可以並行的(見圖 ),當 T>C 時,系統對每一塊數據的處理時間為 M+T,反之則為 M+C,故可把系統對每一塊數據的處理時間表示為Max(C,T)+M。

在字元設備輸入時,緩衝區用於暫存用戶輸入的一行數據,在輸入期間,用戶進程被掛起以等待數據輸入完畢;在輸出時,用戶進程將一行數據輸入到緩衝區後,繼續進行處理。當用戶進程已有第二行數據輸出時,如果第一行數據尚未被提取完畢,則此時用戶進程應阻塞 。

雙緩衝(Double Buffer)

檔案緩衝區 檔案緩衝區

為了加快輸入和輸出速度,提高設備利用率,人們又引入了雙緩衝區機制,也稱為緩衝對換(Buffer Swapping)。在設備輸入時,先將數據送入第一緩衝區,裝滿後便轉向第二緩衝區。此時作業系統可以從第一緩衝區中移出數據,並送入用戶進程(見圖)。接著由 CPU 對數據進行計算。在雙緩衝時,系統處理一塊數據的時間可以粗略地認為是Max(C,T)。如果 C<T,可使塊設備連續輸入;如果 C>T,則可使 CPU 不必等待設備輸入。對於字元設備,若採用行輸入方式,則採用雙緩衝通常能消除用戶的等待時間,即用戶在輸入完第一行之後,在 CPU 執行第一行中的命令時,用戶可繼續向第二緩衝區輸入下一行數據。

循環緩衝

當輸入與輸出或生產者與消費者的速度基本相匹配時,採用雙緩衝能獲得較好的效果,可使生產者和消費者基本上能並行操作。但若兩者的速度相差甚遠,雙緩衝的效果則不夠理想,不過可以隨著緩衝區數量的增加,使情況有所改善。因此,又引入了多緩衝機制。可將多個緩衝組織成循環緩衝形式。對於用作輸入的循環緩衝,通常是提供給輸入進程或計算進程使用,輸入進程不斷向空緩衝區輸入數據,而計算進程則從中提取數據進行計算。

循環緩衝的組成

檔案緩衝區 檔案緩衝區

(1) 多個緩衝區。在循環緩衝中包括多個緩衝區,其每個緩衝區的大小相同。作為輸入的多緩衝區可分為三種類型:用於裝輸入數據的空緩衝區 R、已裝滿數據的緩衝區 G 以及計算進程正在使用的現行工作緩衝區 C,如圖所示。

(2) 多個指針。作為輸入的緩衝區可設定三個指針:用於指示計算進程下一個可用緩衝

區 G 的指針 Nextg、指示輸入進程下次可用的空緩衝區 R 的指針 Nexti,以及用於指示計算

進程正在使用的緩衝區 C 的指針 Current。

循環緩衝區的使用

計算進程和輸入進程可利用下述兩個過程來使用循環緩衝區。

(1) Getbuf 過程。當計算進程要使用緩衝區中的數據時,可調用 Getbuf 過程。該過程將由指針 Nextg 所指示的緩衝區提供給進程使用,相應地,須把它改為現行工作緩衝區,並令 Current 指針指向該緩衝區的第一個單元, 同時將 Nextg 移向下一個 G 緩衝區。 類似地,每當輸入進程要使用空緩衝區來裝入數據時,也調用 Getbuf 過程,由該過程將指針 Nexti所指示的緩衝區提供給輸入進程使用,同時將 Nexti 指針移向下一個 R 緩衝區。

(2) Releasebuf 過程。當計算進程把 C 緩衝區中的數據提取完畢時,便調用 Releasebuf過程,將緩衝區 C 釋放。此時,把該緩衝區由當前(現行)工作緩衝區 C 改為空緩衝區 R。類似地,當輸入進程把緩衝區裝滿時,也應調用 Releasebuf 過程,將該緩衝區釋放,並改為 G緩衝區。

進程同步

使用輸入循環緩衝,可使輸入進程和計算進程並行執行。相應地,指針 Nexti 和指針Nextg 將不斷地沿著順時針方向移動,這樣就可能出現下述兩種情況:

(1) Nexti 指針追趕上 Nextg 指針。這意味著輸入進程輸入數據的速度大於計算進程處理數據的速度,已把全部可用的空緩衝區裝滿,再無緩衝區可用。此時,輸入進程應阻塞,直到計算進程把某個緩衝區中的數據全部提取完,使之成為空緩衝區 R,並調用 Releasebuf過程將它釋放時,才將輸入進程喚醒。這種情況被稱為系統受計算限制。

(2) Nextg 指針追趕上 Nexti 指針。這意味著輸入數據的速度低於計算進程處理數據的速度,使全部裝有輸入數據的緩衝區都被抽空,再無裝有數據的緩衝區供計算進程提取數據。這時,計算進程只能阻塞,直至輸入進程又裝滿某個緩衝區,並調用 Releasebuf 過程將它釋放時,才去喚醒計算進程。這種情況被稱為系統受 I/O 限制。

緩衝池

上述的緩衝區僅適用於某特定的 I/O 進程和計算進程, 因而它們屬於專用緩衝。 當系統較大時,將會有許多這樣的循環緩衝,這不僅要消耗大量的記憶體空間,而且其利用率不高。為了提高緩衝區的利用率,目前廣泛流行公用緩衝池(Buffer Pool),在池中設定了多個可供若干個進程共享的緩衝區。

緩衝池的組成

對於既可用於輸入又可用於輸出的公用緩衝池,其中至少應含有以下三種類型的緩衝區:

① 空(閒)緩衝區;

② 裝滿輸入數據的緩衝區;

③ 裝滿輸出數據的緩衝區。

為了管理上的方便,可將相同類型的緩衝區鏈成一個佇列,於是可形成以下三個佇列:

(1) 空緩衝佇列 emq。這是由空緩衝區所鏈成的佇列。其隊首指針 F(emq)和隊尾指針L(emq)分別指向該佇列的首緩衝區和尾緩衝區。

(2) 輸入佇列 inq。這是由裝滿輸入數據的緩衝區所鏈成的佇列。其隊首指針 F(inq)和隊尾指針 L(inq)分別指向該佇列的首緩衝區和尾緩衝區。

(3) 輸出佇列 outq。這是由裝滿輸出數據的緩衝區所鏈成的佇列。其隊首指針 F(outq)和隊尾指針 L(outq)分別指向該佇列的首緩衝區和尾緩衝區。

除了上述三個佇列外, 還應具有四種工作緩衝區: ① 用於收容輸入數據的工作緩衝區;② 用於提取輸入數據的工作緩衝區;③ 用於收容輸出數據的工作緩衝區;④ 用於提取輸出數據的工作緩衝區。

相關詞條

熱門詞條

聯絡我們