輸入輸出系統與裝置管理

區塊裝置與字元裝置(block vs character devices)

裝置大致有兩種性格,作業系統對它們的對待方式不同。一種性格是一整面書架,上面是固定大小、各自編號、可以任意順序打開的抽屜——那是區塊裝置。另一種是一條單向水管,東西以串流的形式一件一件流過、無法倒帶——那是字元裝置。磁碟是經典的區塊裝置;鍵盤、滑鼠與序列線是經典的字元裝置。

具體來說,區塊裝置把資料存在固定大小的區塊裡(比方 512 位元組或 4 KB),這些區塊可以任意順序讀寫——它是可隨機定址的,所以你能直接要求第 90000 號區塊,而不必碰其他的。磁碟、SSD 與 USB 隨身碟都是區塊裝置,檔案系統就建立在它們之上;核心通常對區塊裝置大量緩衝與快取,並可能為了效率而重排請求。相對地,字元裝置依序、一個字元一個字元地送出或接收一串位元組,沒有可定址區塊的概念,通常也不能定位——你讀到的就是接下來的那個。鍵盤、滑鼠、終端機、音訊與序列埠都是字元裝置。在類 Unix 系統上,兩種都以特殊檔案出現(例如磁碟區塊裝置是 /dev/sda、終端機字元裝置是 /dev/tty),目錄列表中單一個 'b' 或 'c' 就標明了哪個是哪個。

為什麼重要:這個劃分塑造了整個輸入輸出軟體堆疊。區塊裝置之上有區塊層、緩衝快取、請求排程與檔案系統;字元裝置則走較簡單的位元組串流路徑。這些類別是有用的預設、而非絕對的鐵律——有些裝置擺得很尷尬(網路介面兩者皆非,由它自己的子系統處理),而同一顆實體磁碟有時也能透過繞過區塊緩衝的原始(raw)字元介面來存取。但區塊對字元,是核心面對任何儲存型或串流型裝置時問的第一個問題,因為它決定了該套用哪一套機制。

ls -l /dev 會顯示以 'b' 或 'c' 開頭的項目:/dev/sda(b)是可依區塊定址的磁碟區塊裝置;/dev/ttyS0(c)是當作位元組串流讀取的序列埠字元裝置。那單一個字母就告訴核心該用哪一條輸入輸出路徑。

區塊=可隨機定址的固定大小區塊;字元=一串依序的位元組串流。

區塊與字元的劃分是核心的預設分類,而非鐵律:網路卡兩者皆非、有自己的路徑,而磁碟也能以繞過區塊快取的原始字元裝置方式開啟。

又稱
block devicecharacter deviceraw device區塊裝置/字元裝置