1. 程式人生 > >[Linux]字元裝置和塊裝置的區別

[Linux]字元裝置和塊裝置的區別

前言: 最根本區別在於它們是否可以被隨機訪問,字元裝置可以不定長度依循先後順序存取資料;塊裝置可以隨機存取。

裝置檔案分為Block Device Driver和Character Device Drive兩類。Character Device Drive又被稱為字元裝置或裸裝置raw devices; Block Device Driver通常成為塊裝置。而Block Device Driver是以固定大小長度來傳送轉移資料 ;Character Device Driver是以不定長度的字元傳送資料 。且所連線的Devices也有所不同,Block Device大致是可以隨機存取(Random Access)資料的裝置,如硬碟機或光碟機;而Character Device剛好相反,依循先後順序存取資料的裝置,如印表機 、終端機等皆是。

    /dev/dsk對應的為塊裝置,檔案系統的操作用到它,如mount。/dev/rdsk對應的為字元裝置(裸裝置,rdsk的r即為 raw),fsck newfs等會涉及到。一般我們的作業系統和各種軟體都是以塊方式讀寫硬碟,這裡的塊是邏輯塊,建立檔案系統時可以選擇,windows裡叫簇。可看 newfs or mkfs的manual。oracle是比較常見的字元方式讀寫硬碟。

    字元裝置還是塊裝置的定義屬於作業系統的裝置訪問層,與實際物理裝置的特性無必然聯絡。裝置訪問層下面是驅動程式,所以只要驅動程式提供的方式,都可以。 也就是說驅動程式支援stream方式,那麼就可以用這種方式訪問,驅動程式如果還支援block方式,那麼你想用哪種方式訪問都可以,典型的比如硬碟式 的裸裝置,兩種都支援塊裝置(block device):是一種具有一定結構的隨機存取裝置,對這種裝置的讀寫是按塊進行的,他使用緩衝區來存放暫時的資料,待條件成熟後,從快取一次性寫入裝置 或從裝置中一次性讀出放入到緩衝區,如磁碟和檔案系統等字元裝置(Character device):這是一個順序的資料流裝置,對這種裝置的讀寫是按字元進行的,而且這些字元是連續地形成一個數據流。他不具備緩衝區,所以對這種裝置的讀 寫是實時的,如終端、磁帶機等。

系 統中能夠隨機(不需要按順序)訪問固定大小資料片(chunks)的裝置被稱作塊裝置,這些資料片就稱作塊。最常見的塊裝置是硬碟,除此以外,還有軟盤驅 動器、CD-ROM驅動器和快閃記憶體等等許多其他塊裝置。注意,它們都是以安裝檔案系統的方式使用的——這也是塊裝置一般的訪問方式。

    另一種基本的裝置型別是字元裝置。字元裝置按照字元流的方式被有序訪問,像串列埠和鍵盤就都屬於字元裝置。如果一個硬體裝置是以字元流的方式被訪問的話,那就應該將它歸於字元裝置;反過來,如果一個裝置是隨機(無序的)訪問的,那麼它就屬於塊裝置。

這 兩種型別的裝置的根本區別在於它們是否可以被隨機訪問——換句話說就是,能否在訪問裝置時隨意地從一個位置跳轉到另一個位置。舉個例子,鍵盤這種裝置提供 的就是一個數據流,當你敲入“fox”這個字串時,鍵盤驅動程式會按照和輸入完全相同的順序返回這個由三個字元組成的資料流。如果讓鍵盤驅動程式打亂順 序來讀字串,或讀取其他字元,都是沒有意義的。所以鍵盤就是一種典型的字元裝置,它提供的就是使用者從鍵盤輸入的字元流。對鍵盤進行讀操作會得到一個字元 流,首先是“f”,然後是“o”,最後是“x”,最終是檔案的結束(EOF)。當沒人敲鍵盤時,字元流就是空的。硬碟裝置的情況就不大一樣了。硬碟裝置的 驅動可能要求讀取磁碟上任意塊的內容,然後又轉去讀取別的塊的內容,而被讀取的塊在磁碟上位置不一定要連續,所以說硬碟可以被隨機訪問,而不是以流的方式 被訪問,顯然它是一個塊裝置。

    核心管理塊裝置要比管理字元裝置細緻得多,需要考慮的問題和完成的工作相比字元裝置來說要複雜許多。這是因為字元裝置僅僅需要控制一個位置—當前位置—而 塊裝置訪問的位置必須能夠在介質的不同區間前後移動。所以事實上核心不必提供一個專門的子系統來管理字元裝置,但是對塊裝置的管理卻必須要有一個專門的提 供服務的子系統。不僅僅是因為塊裝置的複雜性遠遠高於字元裝置,更重要的原因是塊裝置對執行效能的要求很高;對硬碟每多一分利用都會對整個系統的效能帶來 提升,其效果要遠遠比鍵盤吞吐速度成倍的提高大得多。另外,我們將會看到,塊裝置的複雜性會為這種優化留下很大的施展空間。

1.字元裝置只能以位元組為最小單位訪問,而塊裝置以塊為單位訪問,例如512位元組,1024位元組等

2.塊裝置可以隨機訪問,但是字元裝置不可以

3.字元和塊沒有訪問量大小的限制,塊也可以以位元組為單位來訪問