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