成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

六張圖講清楚Linux零拷貝技術

系統 Linux
相比于傳統的數據傳輸技術,零拷貝技術能夠大大提高系統性能,在實際項目開發中,我們可以選擇符合項目特點的零拷貝技術,以最低的成本提高系統性能。?

大家好,今天我們來聊一聊Linux零拷貝技術,今天我們以一個比較有代表性的技術sendfile系統調用為切入點,詳細介紹一下零拷貝技術的原理。

1.零拷貝技術簡介

Linux零拷貝技術是一種優化數據傳輸的技術,它可以減少數據在內核態和用戶態之間的拷貝次數,提高數據傳輸的效率。

在傳統的數據傳輸過程中,數據需要從內核緩沖區拷貝至應用程序的緩沖區,然后再從應用程序緩沖區拷貝到網絡設備的緩沖區,最后才能發送出去。

而零拷貝技術通過直接在應用程序和網絡設備之間傳輸數據,避免了中間的拷貝過程,從而提高了數據傳輸的效率。

Linux零拷貝技術實現方式:

  • sendfile系統調用:sendfile系統調用可以在內核態中直接將文件內容發送到網絡設備的緩沖區,避免了數據在用戶態和內核態之間的拷貝。
  • splice系統調用:splice系統調用可以將一個文件描述符的數據直接傳輸到另一個文件描述符,也可以將數據從一個文件描述符傳輸到網絡設備的緩沖區,避免了中間的拷貝過程。
  • mmap和write系統調用:mmap系統調用可以將文件映射到內存中,然后使用write系統調用將內存中的數據直接發送到網絡設備的緩沖區,避免了數據在用戶態和內核態之間的拷貝。
  • DMA(Direct Memory Access):DMA是一種硬件技術,可以直接將數據從內存傳輸到網絡設備的緩沖區,避免了CPU的介入,提高了數據傳輸的效率。

2.sendfile系統調用

sendfile系統調用直接在內核中操作文件數據,將數據從源文件描述符復制到目標文件描述符的發送緩沖區,然后通過網絡協議棧將數據發送出去。

這樣就避免了數據在內核和用戶空間之間的復制,提高了傳輸效率。

sendfile系統調用函數原型:

#include <sys/sendfile.h>
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);

參數說明:
out_fd:目標文件描述符,用于發送數據。
in_fd:源文件描述符,從該文件讀取數據。
offset:指定從源文件的哪個位置開始讀取數據,可以為NULL表示從當前位置開始。
count:要傳輸的字節數。

返回值:
成功:返回寫入out_fd文件的字節數。
失?。悍祷?1,并設置errno。

3.sendfile實現原理

3.1 傳統方式發送文件

使用傳統方式把一個文件通過socket發送出去,我們需要執行一個比較長的路徑。

路徑:磁盤->文件頁緩存->用戶緩沖區->套接字緩沖區->網卡。

上下文切換和內存拷貝情況如下:

  • 上下文切換:4次(read調用,read返回,write調用,write返回)
  • DMA拷貝:2次
  • CPU拷貝:2次(文件頁緩存->用戶緩沖區,用戶緩沖區->套接字緩沖區)

圖片圖片

3.2 sendfile發送文件

使用sendfile發送文件,相對來說整個路徑會短一些。

路徑:磁盤->文件頁緩存->套接字緩沖區->網卡。

上下文切換和內存拷貝情況如下:

上下文切換:2次(sendfile調用,sendfile返回)

DMA拷貝:2次

CPU拷貝:1次(文件頁緩存->套接字緩沖區)

圖片圖片

3.3 sendfile實現原理

sendfile實現的核心是管道,管道在Linux系統中應用的比較多,比如說通過管道實現進程間通信。

當需要將文件數據拷貝至socket緩沖區時,會臨時創建一個管道(環形緩沖區),將文件數據先拷貝至管道,再將管道數據遷移至socket緩沖區,數據遷移并不是數據拷貝,只是將指針指向內存地址。

圖片圖片

3.4 小節

通過采用sendfile發送文件,可以減少2次上下文切換和1次CPU拷貝,如果我們的實際應用場景是需要進行大量的文件發送,采用sendfile能夠很大程度上提高系統性能。

4.管道

4.1 管道簡介

管道在Linux系統中應用很廣泛,除了零拷貝技術使用到管道,進程間通信同樣使用到管道,那么管道到底是什么?

圖片圖片

管道是什么?

管道其實就是一個環形緩沖區,通過管道可以將數據從一個文件拷貝另外一個文件。

管道由struct pipe_inode_info結構體定義,該數據結構有4個重要成員:

  • pipe_buffer:管道緩沖區數組,一個固定長度的數組,每個數組成員都是一個緩沖區,對應一個struct pipe_buffer結構。
  • head:頭部序號,表示當前可寫緩沖區的位置,需要配合mask使用。
  • tail:尾部序號,表示當前可讀緩沖區的位置,需要配合mask使用。
  • ring_size:管道緩沖區數組長度,ring_size - 1計算出mask,head & mask獲取當前可寫緩沖區數組下標,tail & mask獲取當前可讀緩沖區數組下標。

管道緩沖區由struct pipe_buffer定義,該結構有3個重要成員:

  • page:頁指針
  • offset:數據在頁中偏移
  • len:數據長度

管道已滿或為空判斷?

管道已滿判斷:

head - tail >= ring_size,表示管道已滿。

管道為空判斷:

head == tail,表示管道為空。

相關結構體定義 

struct pipe_inode_info是Linux內核中用于管道文件的數據結構。它定義在include/linux/pipe_fs_i.h頭文件中。

pipe_inode_info結構體的定義如下:

struct pipe_inode_info {
    unsigned int head; //頭部序號
    unsigned int tail; //尾部序號
    unsigned int max_usage; //最大使用量
    unsigned int ring_size; //緩沖區數組大小
    unsigned int nr_accounted; //已使用緩沖區數量
    struct pipe_buffer *bufs; //緩沖區數組
    ......
}

struct pipe_buffer是Linux內核中用于管道(pipe)緩沖區的數據結構。它定義在include/linux/pipe_fs_i.h頭文件中。

4.2 管道寫

通過head & mask獲取緩沖區數組下標,將數據寫入pipe_buffer對應的內存頁,數據起始位置為offset偏移值,寫入的數據長度記錄在len成員中。

完成數據寫操作后,head頭部序號增加1,指向下一個可寫位置。

圖片圖片

4.3 管道讀

通過tail & mask獲取緩沖區數組下標,將數據從pipe_buffer對應的內存頁讀取出來,數據起始位置為offset偏移值,讀取數據長度不能大于len記錄的數據長度。

完成數據讀操作后,len設置成0,pipe_buffer被清空,tail尾部序號增加1,指向下一個可讀位置。

圖片圖片

5.總結

相比于傳統的數據傳輸技術,零拷貝技術能夠大大提高系統性能,在實際項目開發中,我們可以選擇符合項目特點的零拷貝技術,以最低的成本提高系統性能。

責任編輯:武曉燕 來源: 物聯網心球
相關推薦

2024-01-05 07:55:39

Linux虛擬內存

2024-10-21 10:30:00

2022-02-16 18:00:19

動態代理代碼靜態代理

2020-07-29 09:21:34

Docker集群部署隔離環境

2021-07-05 22:22:24

協議MQTT

2024-07-01 13:45:18

2019-07-07 08:18:10

MySQL索引數據庫

2022-01-05 09:27:24

讀擴散寫擴散feed

2025-02-10 08:55:47

2021-10-29 11:30:31

補碼二進制反碼

2024-09-26 08:53:43

2024-04-01 10:09:23

AutowiredSpring容器

2019-06-20 17:49:51

RPCHTTP協議

2017-12-17 20:17:23

NoSQLSQL數據

2018-08-13 09:20:21

NoSQLSQL數據

2018-05-21 07:08:18

行為驅動開發BDD編碼

2025-03-27 03:00:00

toB分析客戶畫像LTC模型

2020-12-24 15:18:27

大數據數據分析

2021-09-07 05:04:53

HTTPHTTP3.0面試

2021-04-21 10:00:08

MySQL索引數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 狠狠操你 | 日一日操一操 | 一级毛片视频 | 欧美日韩国产不卡 | 成人网av | 中文精品视频 | 午夜精品久久久久久久99黑人 | 中文字幕二区 | 91精品国产乱码久久久久久 | 91一区二区三区在线观看 | 中文字幕日韩欧美一区二区三区 | 一区二区三区四区国产 | 亚洲精品一区二区三区蜜桃久 | 欧美日韩一区二区三区在线观看 | 在线男人天堂 | 91av在线不卡| 国产精品一区二区在线播放 | 粉嫩一区二区三区性色av | 99精品视频免费观看 | 国产精品久久国产精品99 gif | 夜夜夜久久久 | 91在线播 | 亚洲国产aⅴ成人精品无吗 综合国产在线 | 亚洲成人午夜电影 | 一级毛片成人免费看a | 一区二区精品在线 | 国产一区二区三区四区hd | 欧美在线看片 | 免费视频99 | 亚洲国产精品99久久久久久久久 | av午夜电影 | 午夜激情小视频 | 日韩精品一区二区不卡 | 二区精品 | 日韩精品在线看 | 成人精品鲁一区一区二区 | 久久精品国产免费一区二区三区 | 一区二区三区免费 | 精品一区二区三区免费视频 | 99精品视频免费观看 | 久久久久九九九女人毛片 |