最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

一文讀懂零拷貝技術(shù)|splice使用

2022-10-15 16:03 作者:補(bǔ)給站Linux內(nèi)核  | 我要投稿

服務(wù)端要向客戶端連接發(fā)送一個(gè)文件,一般過(guò)程如下:

  • 服務(wù)端首先調(diào)用 read() 函數(shù)讀取文件內(nèi)容。

  • 服務(wù)端通過(guò)調(diào)用 write()/send() 函數(shù)將文件內(nèi)容發(fā)送給客戶端連接。

上面過(guò)程如下圖所示:


從上圖可以看出,在發(fā)送文件的過(guò)程中,首先需要將文件頁(yè)緩存(Page Cache)從內(nèi)核態(tài)復(fù)制到用戶態(tài)緩存中,然后再?gòu)挠脩魬B(tài)緩存復(fù)制到客戶端的 Socket 緩沖區(qū)中。

其實(shí)在上面的過(guò)程中,復(fù)制文件數(shù)據(jù)到用戶態(tài)緩存這個(gè)操作是多余的,我們完全可以直接把文件頁(yè)緩存的數(shù)據(jù)復(fù)制到 Socket 緩沖區(qū)即可,這樣就可以減少一次拷貝數(shù)據(jù)的操作。

為了實(shí)現(xiàn)這樣的功能,內(nèi)核提供了一個(gè)名為 splice() 的系統(tǒng)調(diào)用,使用 splice() 系統(tǒng)調(diào)用可以避免從內(nèi)核態(tài)拷貝數(shù)據(jù)到用戶態(tài)。

不需要將內(nèi)核態(tài)的數(shù)據(jù)拷貝到用戶態(tài)緩存的技術(shù)被稱為:零拷貝技術(shù)。

下面我們將介紹 splice() 系統(tǒng)調(diào)用的原理和實(shí)現(xiàn)。


【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個(gè)人覺(jué)得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)??

splice 使用實(shí)例

如果服務(wù)端要發(fā)送文件給客戶端,使用 read()/write() 方式來(lái)實(shí)現(xiàn)的話,代碼如下所示:

上面代碼的流程比較簡(jiǎn)單,如下:

  • 首先通過(guò)調(diào)用 stat() 系統(tǒng)調(diào)用獲取文件的大小。

  • 然后通過(guò)調(diào)用 read() 系統(tǒng)調(diào)用讀取文件內(nèi)容。

  • 最后通過(guò)調(diào)用 write() 系統(tǒng)調(diào)用將文件內(nèi)容發(fā)送給客戶端連接。

從上面的代碼可以看出,使用 read()/write() 方式發(fā)送文件給客戶端,首先需要將文件內(nèi)容讀到用戶態(tài)緩存中,然后才能發(fā)送給客戶端連接。

然而,將文件內(nèi)容讀取到用戶態(tài)緩存這個(gè)過(guò)程是多余的,我們看看怎么使用 splice() 系統(tǒng)調(diào)用來(lái)避免將文件內(nèi)容拷貝到用戶態(tài)緩存。

使用 splice() 發(fā)送文件時(shí),需要?jiǎng)?chuàng)建一個(gè)管道作為中轉(zhuǎn),代碼如下:

從上面代碼可以看出,使用 splice() 發(fā)送文件時(shí),我們并不需要將文件內(nèi)容讀取到用戶態(tài)緩存中,但需要使用管道作為中轉(zhuǎn)。

其實(shí)這里的管道只是作為一個(gè)通道,并不會(huì)產(chǎn)生數(shù)據(jù)拷貝的,如下圖所示:


對(duì)比 read()/write() 版本的原理圖,可以看出 splice() 版本省去了拷貝文件內(nèi)容到用戶態(tài)緩存這個(gè)步驟。

總結(jié)

本文主要介紹了使用 read()/write() 方式傳輸文件與使用 splice() 方式傳輸文件的原理,也提供了這兩種方式的實(shí)例代碼。

當(dāng)然,從原理上看,使用 splice() 方式傳輸文件會(huì)比 read()/write() 方式性能要高。但如果真實(shí)測(cè)試這兩種方式,會(huì)發(fā)現(xiàn)性能相差并不大。這是由于 splice() 方式雖然減少了數(shù)據(jù)拷貝過(guò)程,但是其處理邏輯比 read()/write() 方式更為復(fù)雜,所以性能提升并不理想,有興趣的讀者可以自己測(cè)試一下。

下一篇文章,我們將會(huì)介紹 splice() 的實(shí)現(xiàn)過(guò)程。


原文作者:Linux內(nèi)核那些事



一文讀懂零拷貝技術(shù)|splice使用的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
屏东县| 常熟市| 桓台县| 墨江| 永和县| 武威市| 神池县| 新余市| 沐川县| 平利县| 阿坝| 宣武区| 赤峰市| 扶余县| 怀远县| 罗田县| 阿拉善左旗| 邵阳县| 文成县| 象山县| 库尔勒市| 绿春县| 乃东县| 海盐县| 兴隆县| 德令哈市| 邵武市| 定日县| 迁安市| 林口县| 宜春市| 新昌县| 沙坪坝区| 白城市| 河曲县| 香港| 樟树市| 苍梧县| 扶沟县| 眉山市| 色达县|