想要管理多種具體的東西,那麼需要遵守每種東西的規範。如果想要提供一種通用模式來對這些具體的東西統一管理,需要使用一種古老的技術:抽象。 抽象是將多種具體的東西(管理時需要遵守的規範)的共同點抽取出來,放入到更高一層的抽象層。在抽象層不定義或少量定義具體的規範細則,而是讓下層更具體的東西遵守抽象出來的 ...
想要管理多種具體的東西,那麼需要遵守每種東西的規範。如果想要提供一種通用模式來對這些具體的東西統一管理,需要使用一種古老的技術:抽象。
抽象是將多種具體的東西(管理時需要遵守的規範)的共同點抽取出來,放入到更高一層的抽象層。在抽象層不定義或少量定義具體的規範細則,而是讓下層更具體的東西遵守抽象出來的規則去各自實現。之後只需通過這個抽象層中的通用規範就能管理所有具體的事物(即面向對象範疇中的多態概念,事實上面向對象的本質就是抽象),並且隨時可以添加新事物到這個抽象層之下,擴展性和適應性大大增強。
所以,抽象的兩個要點:
- 從多個具體事物中抽取出共同點,放入抽象層;
- 具體事物遵守抽象層的規則,各自實現細節;
比如,各種類型的文件系統(ext2、xfs、fat、zfs等)的特性都不一樣,但主要功能都一樣:讀、寫。操作系統希望以一種更通用的方式去管理這些不同的文件,可以在這些文件系統的更高一層提供一個抽象文件系統,這個抽象文件系統中定義讀和寫的規範,同時要求各種具體的文件系統按照這個規範去實現讀和寫的操作。以後就可以在操作系統上使用多種文件系統,不管使用何種文件系統,都可以直接通過這個抽象的文件系統來調用。
再繼續往下,還有抽象層。文件系統可以指定讀寫功能,從何處讀寫?可以是各種類型的塊設備,比如IDE磁碟、SATA磁碟等,但是文件系統並不能和這些磁碟進行直接的交互,只有這些外圍硬體的驅動程式才能和這些硬體直接交互,那麼文件系統就需要和各種塊設備的驅動交互。所以,在文件系統層和各種塊設備驅動中間,又對這些塊設備的驅動進行了抽象,提供一種抽象的塊設備層,然後要求各種塊設備的驅動按照這個抽象塊設備層的規範去編碼。以後只要文件系統和這個抽象的塊設備層交互,它就會自動調用到各種具體的塊設備驅動。
而這些抽象層次,通常會命名為“通用xxx”或者“虛擬xxx”。例如,抽象文件系統層稱為虛擬文件系統VFS,抽象塊設備層稱為虛擬塊設備層或通用塊設備層(generic-inode(g-inode)或virtual inode(vnode)正是這樣出現的)。