複製鏈接
請複製以下鏈接發送給好友

文件緩衝區

鎖定
文件是指存儲在外部存儲介質上的、由文件名標識的一組相關信息的集合。由於CPU 與 I/O 設備間速度不匹配。為了緩和 CPU 與 I/O 設備之間速度不匹配矛盾。文件緩衝區是用以暫時存放讀寫期間的文件數據而在內存區預留的一定空間。使用文件緩衝區可減少讀取硬盤的次數。
中文名
文件緩衝區
外文名
File Buffer
學    科
計算機
定    義
內存區預留的一定空間
目    的
減少讀取硬盤的次數
領    域
計算機系統

文件緩衝區緩衝區簡介

文件緩衝區是用以暫時存放讀寫期間的文件數據而在內存區預留的一定空間。通過磁盤緩存來實現,磁盤緩存本身並不是一種實際存在的存儲介質,它依託於固定磁盤,提供對主存儲器存儲空間的擴充,即利用主存中的存儲空間, 來暫存從磁盤中讀出(或寫入)的信息。 主存也可以看做是輔存的高速緩存, 因為,輔存中的數據必須複製到主存方能使用;反之,數據也必須先存在主存中,才能輸出到輔存。
一個文件的數據可能出現在存儲器層次的不同級別中,例如,一個文件數據通常被存儲在輔存中(如硬盤),當其需要運行或被訪問時,就必須調入主存,也可以暫時存放在主存的磁盤高速緩存中。大容量的輔存常常使用磁盤,磁盤數據經常備份到磁帶或可移動磁盤組上,以防止硬盤故障時丟失數據。有些系統自動地把老文件數據從輔存轉儲到海量存儲器中,如磁帶上,這樣做還能降低存儲價格。

文件緩衝區緩衝的引入

在設備管理中,引入緩衝區的主要原因可歸結為以下幾點:
(1) 緩和 CPU 與 I/O 設備間速度不匹配的矛盾。事實上,凡在數據到達速率與其離去速率不同的地方,都可設置緩衝區,以緩和它們之間速率不匹配的矛盾。眾所周知,CPU的運算速率遠遠高於 I/O 設備的速率,如果沒有緩衝區,則在輸出數據時,必然會由於打印機的速度跟不上而使 CPU 停下來等待;然而在計算階段,打印機又空閒無事。顯然,如果在打印機或控制器中設置一緩衝區,用於快速暫存程序的輸出數據,以後由打印機“慢慢地”從中取出數據打印,這樣,就可提高 CPU 的工作效率。類似地,在輸入設備與 CPU 之間也設置緩衝區,也可使 CPU 的工作效率得以提高。
(2) 減少對 CPU 的中斷頻率,放寬對 CPU 中斷響應時間的限制。在遠程通信系統中,如果從遠地終端發來的數據僅用一位緩衝來接收,則必須在每收到一位數據時便中斷一次 CPU, 這樣, 對於速率為 9.6 Kb/s 的數據通信來説, 就意味着其中斷 CPU的頻率也為 9.6 Kb/s, 即每 100 μs 就要中斷 CPU 一次, 而且 CPU 必須在 100 μs 內予以響應,否則緩衝區內的數據將被沖掉。倘若設置一個具有 8 位的緩衝(移位)寄存器, 則可使 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)
圖1 圖1
在單緩衝情況下,每當用户進程發出一 I/O 請求時,操作系統便在主存中為之分配一緩衝區,如圖1所示。在塊設備輸入時,假定從磁盤把一塊數據輸入到緩衝區的時間為 T,操作系統將該緩衝區中的數據傳送到用户區的時間為 M,而 CPU 對這一塊數據處理(計算)的時間為 C。由於 T 和 C 是可以並行的(見圖1 ),當 T>C 時,系統對每一塊數據的處理時間為 M+T,反之則為 M+C,故可把系統對每一塊數據的處理時間表示為Max(C,T)+M。
在字符設備輸入時,緩衝區用於暫存用户輸入的一行數據,在輸入期間,用户進程被掛起以等待數據輸入完畢;在輸出時,用户進程將一行數據輸入到緩衝區後,繼續進行處理。當用户進程已有第二行數據輸出時,如果第一行數據尚未被提取完畢,則此時用户進程應阻塞 [1] 
雙緩衝(Double Buffer)
圖2 圖2
為了加快輸入和輸出速度,提高設備利用率,人們又引入了雙緩衝區機制,也稱為緩衝對換(Buffer Swapping)。在設備輸入時,先將數據送入第一緩衝區,裝滿後便轉向第二緩衝區。此時操作系統可以從第一緩衝區中移出數據,並送入用户進程(見圖2)。接着由 CPU 對數據進行計算。在雙緩衝時,系統處理一塊數據的時間可以粗略地認為是Max(C,T)。如果 C<T,可使塊設備連續輸入;如果 C>T,則可使 CPU 不必等待設備輸入。對於字符設備,若採用行輸入方式,則採用雙緩衝通常能消除用户的等待時間,即用户在輸入完第一行之後,在 CPU 執行第一行中的命令時,用户可繼續向第二緩衝區輸入下一行數據。
循環緩衝
當輸入與輸出或生產者與消費者的速度基本相匹配時,採用雙緩衝能獲得較好的效果,可使生產者和消費者基本上能並行操作。但若兩者的速度相差甚遠,雙緩衝的效果則不夠理想,不過可以隨着緩衝區數量的增加,使情況有所改善。因此,又引入了多緩衝機制。可將多個緩衝組織成循環緩衝形式。對於用作輸入的循環緩衝,通常是提供給輸入進程或計算進程使用,輸入進程不斷向空緩衝區輸入數據,而計算進程則從中提取數據進行計算。
循環緩衝的組成
圖3 圖3
(1) 多個緩衝區。在循環緩衝中包括多個緩衝區,其每個緩衝區的大小相同。作為輸入的多緩衝區可分為三種類型:用於裝輸入數據的空緩衝區 R、已裝滿數據的緩衝區 G 以及計算進程正在使用的現行工作緩衝區 C,如圖3所示。
(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)分別指向該隊列的首緩衝區和尾緩衝區。
除了上述三個隊列外, 還應具有四種工作緩衝區: ① 用於收容輸入數據的工作緩衝區;② 用於提取輸入數據的工作緩衝區;③ 用於收容輸出數據的工作緩衝區;④ 用於提取輸出數據的工作緩衝區。
參考資料
  • 1.    湯子瀛.計算機操作系統(第3版):西安電子科技大學出版社,2010