當(dāng)前位置 主頁 > 技術(shù)大全 >
它們分別代表了文件系統(tǒng)操作的抽象層和跨網(wǎng)絡(luò)通信的接口
理解并熟練運用這兩者,是掌握Linux系統(tǒng)編程的關(guān)鍵
本文將從VFS的基本概念出發(fā),逐步深入到Socket編程的基礎(chǔ),旨在為讀者提供一個全面而深入的視角
VFS:Linux的核心抽象層 VFS,即虛擬文件系統(tǒng),是Linux內(nèi)核中的一個非常核心的概念
它作為文件系統(tǒng)操作的抽象層,為應(yīng)用程序員提供了一層屏蔽底層文件系統(tǒng)差異的抽象
不同的文件系統(tǒng),如Ext2/3、XFS、FAT32等,具有不同的結(jié)構(gòu),而用戶調(diào)用如`open`等文件I/O函數(shù)時,如果直接面對這些底層差異,將極大地增加編程的復(fù)雜性
因此,Linux引入了VFS的概念,相當(dāng)于是Linux自建了一個新的貯存在內(nèi)存中的文件系統(tǒng),所有其他文件系統(tǒng)都需要先轉(zhuǎn)換成VFS的結(jié)構(gòu)才能為用戶所調(diào)用
VFS的構(gòu)建與結(jié)構(gòu) VFS的構(gòu)建過程,實質(zhì)上是加載實際文件系統(tǒng)的過程,也就是`mount`命令被調(diào)用的過程
以掛載一個Ext2文件系統(tǒng)為例,`mount`命令的一般形式為`mount /dev/sdb1 /mnt/mysdb1`,其中`/dev/sdb1`是設(shè)備名,`/mnt/mysdb1`是掛載點
VFS文件系統(tǒng)的基本結(jié)構(gòu)由`dentry`結(jié)構(gòu)體與`inode`結(jié)構(gòu)體組成
`dentry`代表一個文件目錄中的一個點,可以是目錄也可以是文件
而`inode`則代表一個在磁盤上的文件,它與磁盤文件一一對應(yīng)
需要注意的是,`inode`與`dentry`不一定一一對應(yīng),一個`inode`可能會對應(yīng)多個`dentry`項
在掛載文件系統(tǒng)時,Linux首先找到磁盤分區(qū)的super block,然后通過解析磁盤的`inodetable`與`file data`,構(gòu)建出自己的`dentry`列表與`inode`列表
這一過程對于Ext2/3等Linux原生文件系統(tǒng)而言相對簡單,但對于其他文件系統(tǒng)則可能會慢得多
VFS的dentry cache與文件定位 為了避免資源浪費,VFS采用了`dentry cache`的設(shè)計
當(dāng)有用戶用`ls`命令查看某一個目錄或用`open`命令打開一個文件時,VFS會為這里用的每個目錄項與文件建立`dentry`項與`inode`,即“按需創(chuàng)建”
然后維護一個LRU(Least Recently Used)列表,當(dāng)Linux認(rèn)為VFS占用太多資源時,VFS會釋放掉長時間沒有被使用的`dentry`項與`inode`項
由于`dentry cache`的存在,文件的定位方式也分為兩種:有`dentry`時定位與無`dentry`時定位
在有`dentry`時,可以通過`dentry`中的`d_subdirs`快速定位到目標(biāo)文件;而在無`dentry`時,則需要通過遍歷`inode`列表和解析目錄文件數(shù)據(jù)來重建`dentry`和`inode`
Socket:網(wǎng)絡(luò)通信的橋梁 在Linux系統(tǒng)編程中,Socket是網(wǎng)絡(luò)編程的基礎(chǔ)
它提供了跨網(wǎng)絡(luò)通信的接口,使得不同主機上的應(yīng)用程序能夠進行通信
互聯(lián)網(wǎng)通過TCP/IP協(xié)議完成通信,而Socket把TCP/IP復(fù)雜的協(xié)議族集成為相關(guān)函數(shù),通過調(diào)用Socket相關(guān)函數(shù)就可以完成網(wǎng)絡(luò)通信
Socket的分類與工作原理 Socket分為流Socket和數(shù)據(jù)報Socket
流Socket提供了一個可靠的雙向的字節(jié)流通信信道,即保證發(fā)送者傳輸?shù)臄?shù)據(jù)會完整地到達(dá)接收程序,它使用了傳輸控制協(xié)議(TCP)
數(shù)據(jù)報Socket允許數(shù)據(jù)以消息的形式進行交換,但數(shù)據(jù)傳輸是不可靠的,消息的到達(dá)可能是無序的、重復(fù)的或根本無法到達(dá),它使用了用戶數(shù)據(jù)報協(xié)議(UDP)
流Socket通常分為主動Socket和被動Socket,被動Socket通常也叫服務(wù)器,主動Socket通常叫客戶端
Socket編程的基本流程如下: 1.服務(wù)器端: