弄清硬盤的低格和高格的概念數據庫
系統中能夠隨機訪問(不須要按順序)訪問固定大小數據片(chunks)的設備稱爲塊設備,這些數據片就稱做塊。最多見的塊設備是硬盤,除此之外,還有軟盤驅動器(floppy),CD-ROM驅動器和閃存等等許多其餘塊設備。注意,他們都是以安裝文件系統的方式使用的-----這也是塊設備的通常訪問方式。緩存
另外一種基本的設備類型是字符設備。字符設備按照字節流的方式被有序訪問,像串口和鍵盤就屬於字符設備(網卡??)。若是一個硬件設備以字符流的方式被訪問的話,那就應該歸於字符設備;反過來,若是一個設備是隨機(無序的)訪問的,那麼就屬於塊設備。性能
這兩種類型的設備的根本區別在於它們是否能夠被隨機訪問——換句話說就是,可否在訪問設備時隨意地從一個位置跳轉到另外一個位置。舉個例子,鍵盤這種設備提供的就是一個數據流,當你敲入「fox」 這個字符串時,鍵盤驅動程序會按照和輸入徹底相同的順序返回這個由三個字符組成的數據流。若是讓鍵盤驅動程序打亂順序來讀字符串,或讀取其餘字符,都是沒有意義的。因此鍵盤就是一種典型的字符設備,它提供的就是用戶從鍵盤輸入的字符流。對鍵盤進行讀操做會獲得一個字符流,首先是「f」,而後是「o」,最後是「x」,最終是文件的結束(EOF)。當沒人敲鍵盤時,字符流就是空的。硬盤設備的狀況就不大同樣了。硬盤設備的驅動可能要求讀取磁盤上任意塊的內容,而後又轉去讀取別的塊的內容,而被讀取的塊在磁盤上位置不必定要連續,因此說硬盤能夠被隨機訪問,而不是以流的方式被訪問,顯然它是一個塊設備。 內核管理塊設備要比管理字符設備細緻得多,須要考慮的問題和完成的工做相比字符設備來講要複雜許多。這是由於字符設備僅僅須要控制一個位置—當前位置—而塊設備訪問的位置必須可以在介質的不一樣區間先後移動。因此事實上內核沒必要提供一個專門的子系統來管理字符設備,可是對塊設備的管理卻必需要有一個專門的提供服務的子系統。不只僅是由於塊設備的複雜性遠遠高於字符設備,更重要的緣由是塊設備對執行性能的要求很高;對硬盤每多一分利用都會對整個系統的性能帶來提高,其效果要遠遠比鍵盤吞吐速度成倍的提升大得多。另外,咱們將會看到,塊設備的複雜性會爲這種優化留下很大的施展空間。 簡單來說,塊設備能夠隨機存取,而字符設備不能隨機存取,那裸設備又該如何解釋呢? 難道裸設備,如磁盤裸設備也不能隨機讀取嗎?那在數據庫中用裸設備建一個2g的數據文件,爲了存取最後一個數據塊,難道ORACLE還要把前面的全部數據塊都讀一遍,顯然不符合事實,若是這樣解釋呢,操做系統不能隨機讀取,並不意味着數據庫也不能隨機讀取。優化
塊設備經過系統緩存進行讀取,不是直接和物理磁盤讀取。字符設備能夠直接物理磁盤讀取。不通過系統緩存。(如鍵盤,直接相應中斷)spa
在計算機,特別是在類Unix操做系統中,裸設備是一種特殊類型的塊設備文件,容許以直接訪問硬盤的方式訪問一個存儲設備,而不通過操做系統的高速緩存和緩衝器(儘管可能仍舊使用硬件高速緩存)。應用程序如數據庫管理系統能夠直接使用裸設備,啓用它們來管理數據的緩存方式,而不將這些任務推給操做系統。操作系統
在FreeBSD系統中,全部的塊設備實際都是裸設備。爲了簡化緩存的管理以及加強可測量性和性能,FreeBSD 4.0中中止了對非裸設備的支持。接口
在Linux中,裸設備被反對並列入了移除計劃,由於能夠經過使用O_DIRECT標誌來替代。[1]爲了代替訪問裸設備文件,應用程序能夠(且必須!)經過啓用O_DIRECT標誌來訪問一個文件,且高速緩存將被禁用。因爲如今裸設備仍然有必定用戶羣且仍有一些應用程序沒有對O_DIRECT的支持,有關在Linux內核中將裸設備移除仍然是一個有爭議的話題。裸設備是一種設備文件系統(major number 162)。Linux爲裸設備預留了(i.e. 0),一般狀況能夠在/dev/rawctl找到它。有人主張,裸設備技術能夠將一個裸設備綁定至一個已有的塊設備。「已有的塊設備」多是Linux所能支持的全部類型接口的磁盤或CDROM/DVD。(如,IDE/ATA或SCSI)ip