国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux實現(xiàn)原理 — I/O 處理流程與優(yōu)化手段

這篇具有很好參考價值的文章主要介紹了Linux實現(xiàn)原理 — I/O 處理流程與優(yōu)化手段。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Linux I/O 接口

Linux I/O 接口可以分為以下幾種類型:

文件 I/O 接口:用于對文件進行讀寫操作的接口,包括 open()、read()、write()、close()、lseek() 等。

Linux實現(xiàn)原理 — I/O 處理流程與優(yōu)化手段,linux,網(wǎng)絡編程,網(wǎng)絡io,tcp

網(wǎng)絡 I/O 接口:用于網(wǎng)絡通信的接口,包括 socket()、connect()、bind()、listen()、accept() 等。

Linux實現(xiàn)原理 — I/O 處理流程與優(yōu)化手段,linux,網(wǎng)絡編程,網(wǎng)絡io,tcp

設備 I/O 接口:用于對設備(e.g. 字符設備、塊設備)進行讀寫操作的接口,包括 ioctl()、mmap()、select()、poll()、epoll() 等。

其他 I/O 接口:如管道接口、共享內(nèi)存接口、信號量接口等。

Linux I/O 處理流程

下面以最常用的 read() 和 write() 函數(shù)來介紹 Linux 的 I/O 處理流程。

read() 和 write()

read() 和 write() 函數(shù),是最基本的文件 I/O 接口,也可用于在 TCP Socket 中進行數(shù)據(jù)讀寫,屬于阻塞式 I/O(Blocking I/O),即:如果沒有可讀數(shù)據(jù)或者對端的接收緩沖區(qū)已滿,則函數(shù)將一直等待直到有數(shù)據(jù)可讀或者對端緩沖區(qū)可寫。

函數(shù)原型:

fd 參數(shù):指示 fd 文件描述符。

buf 參數(shù):指示 read/write 緩沖區(qū)的入口地址。

count 參數(shù):指示 read/write 數(shù)據(jù)的大小,單位為 Byte。

函數(shù)返回值:

  • 返回實際 read/write 的字節(jié)數(shù)。

  • 返回 0,表示已到達文件末尾。

  • 返回 -1,表示操作失敗,可以通過 errno 全局變量來獲取具體的錯誤碼。

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);

處理流程

下面以同時涉及了 Storage I/O 和 Network I/O 的一次網(wǎng)絡文件下載操作來展開 read() 和 write() 的處理流程。

read() 的處理流程:

  1. Application 調(diào)用 read(),CPU 模式從用戶態(tài)切換到內(nèi)核態(tài)。

  2. Kernel 根據(jù) file fd 查表(進程文件符表),找到對應的 file 結(jié)構(gòu)體(普通文件),從而找到此文件的 inode 編號。

  3. Kernel 將 buf 和 count 參數(shù)、以及文件指針位置等信息傳遞給 Device Driver(磁盤驅(qū)動程序)。

  4. Driver 將請求的數(shù)據(jù)從 Disk Device 中 DMA Copy 到 Kernel PageCache Buffer 中。

  5. Kernel 將數(shù)據(jù)從 Kernel PageCache Buffer 中 CPU Copy 到 Userspace Buffer 中(Application 不能直接訪問 Kernel space)。

  6. read() 最終返回讀取的字節(jié)數(shù)或錯誤代碼給 Application,CPU 模式從內(nèi)核態(tài)切換到用戶態(tài)。

write() 的處理流程:

  1. Application 調(diào)用 write(),CPU 模式從用戶態(tài)切換到內(nèi)核態(tài)。

  2. Kernel 根據(jù) socket fd 查表,找到對應的 file 結(jié)構(gòu)體(套接字文件),從而找到該 Socket 的 sock 結(jié)構(gòu)體。

  3. Kernel 將 buf 和 count 參數(shù)、以及文件指針位置等信息傳遞給 Device Driver(網(wǎng)卡驅(qū)動程序)。

  4. Driver 將請求的數(shù)據(jù)從 Userspace Buffer 中 CPU Copy 到 Kernel Socket Buffer 中。

  5. Kernel 將數(shù)據(jù)從 Kernel Socket Buffer 中 DMA Copy 到 NIC Device。

  6. write() 最終返回寫入的字節(jié)數(shù)或錯誤代碼給 Application,CPU 模式從內(nèi)核態(tài)切換到用戶態(tài)。

可見,在一次常規(guī)的 I/O(read/write)操作流程中 處理流程中,總共需要涉及到:

  • 4 次 CPU 模式切換:當 Application 調(diào)用 SCI 時,CPU 從用戶態(tài)切換到內(nèi)核態(tài);當 SCI 返回時,CPU 從內(nèi)核態(tài)切換回用戶態(tài)。

  • 2 次 CPU Copy:CPU 執(zhí)行進程數(shù)據(jù)拷貝指令,將數(shù)據(jù)從 User Process 虛擬地址空間 Copy 到 Kernel 虛擬地址空間。

  • 2 次 DMA Copy:CPU 向 DMA 控制器下達設備數(shù)據(jù)拷貝指令,將數(shù)據(jù)從 DMA 物理內(nèi)存空間 Copy 到 Kernel 虛擬地址空間。

Linux實現(xiàn)原理 — I/O 處理流程與優(yōu)化手段,linux,網(wǎng)絡編程,網(wǎng)絡io,tcp

相關(guān)視頻推薦

90分鐘搞定底層網(wǎng)絡IO模型,linux開發(fā)必須要懂得10種模型

手寫用戶態(tài)協(xié)議棧以及零拷貝的實現(xiàn)

epoll的原理與使用,epoll比select/poll強在哪里?

免費學習地址:c/c++ linux服務器開發(fā)/后臺架構(gòu)師

需要C/C++ Linux服務器架構(gòu)師學習資料加qun812855908獲?。ㄙY料包括C/C++,Linux,golang技術(shù),Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,TCP/IP,協(xié)程,DPDK,ffmpeg等),免費分享

Linux實現(xiàn)原理 — I/O 處理流程與優(yōu)化手段,linux,網(wǎng)絡編程,網(wǎng)絡io,tcp

I/O 性能優(yōu)化機制

I/O buff/cache

Linux Kernel 為了提高 I/O 性能,劃分了一部分物理內(nèi)存空間作為 I/O buff/cache,也就是內(nèi)核緩沖區(qū)。當 Kernel 接收到 read() / write() 等讀寫請求時,首先會到 buff/cache 查找,如果找到,則立即返回。如果沒有則通過驅(qū)動程序訪問 I/O 外設。

查看 Linux 的 buff/cache:

$ free -mh
              total        used        free      shared  buff/cache   available
Mem:           7.6G        4.2G        2.9G         10M        547M        3.1G
Swap:          4.0G          0B        4.0G

實際上,Cache(緩存)和 Buffer(緩沖)從嚴格意義上講是 2 個不同的概念,Cache 側(cè)重加速 “讀”,而 Buffer 側(cè)重緩沖 “寫”。但在很多場景中,由于讀寫總是成對存在的,所以并沒有嚴格區(qū)分兩者,而是使用 buff/cache 來統(tǒng)一描述。

Page Cache

Linux實現(xiàn)原理 — I/O 處理流程與優(yōu)化手段,linux,網(wǎng)絡編程,網(wǎng)絡io,tcp

Page Cache(頁緩存)是最常用的 I/O Cache 技術(shù),以頁為單位的,內(nèi)容就是磁盤上的物理塊,用于減少 Application 對 Storage 的 I/O 操作,能夠令 Application 對文件進行順序讀寫的速度接近于對內(nèi)存的讀寫速度。

頁緩存讀策略:當 Application 發(fā)起一個 Read() 操作,Kernel 首先會檢查需要的數(shù)據(jù)是否在 Page Cache 中:

  • 如果在,則直接從 Page Cache 中讀取。

  • 如果不在,則按照原 I/O 路徑從磁盤中讀取。同時,還會根據(jù)局部性原理,進行文件預讀,即:將已讀數(shù)據(jù)隨后的少數(shù)幾個頁面(通常是三個)一同緩存到 Page Cache 中。

頁緩存寫策略:當 Application 發(fā)起一個 write() 操作,Kernel 首先會將數(shù)據(jù)寫到 Page Cache,然后方法返回,即:Write back(寫回)機制,區(qū)別于 Write Through(寫穿)。此時數(shù)據(jù)還沒有真正的寫入到文件中去,Kernel 僅僅將已寫入到 Page Cache 的這一個頁面標記為 “臟頁(Dirty Page)”,并加入到臟頁鏈表中。然后,由 flusher(pdflush,Page Dirty Flush)kernel thread(回寫內(nèi)核線程)周期性地將臟頁鏈表中的頁寫到磁盤,并清理 “臟頁” 標識。在以下 3 種情況下,臟頁會被寫回磁盤:

  1. 當空閑內(nèi)存低于一個特定的閾值時,內(nèi)核必須將臟頁寫回磁盤,以便釋放內(nèi)存。

  2. 當臟頁在內(nèi)存中駐留時間超過一個特定的閾值時,內(nèi)核必須將超時的臟頁寫回磁盤。

  3. 當 Application 主動調(diào)用 sync、fsync、fdatasync 等 SCI 時,內(nèi)核會執(zhí)行相應的寫回操作。

flusher 刷新策略由以下幾個內(nèi)核參數(shù)決定(數(shù)值單位均為 1/100 秒):

# flush 每隔 5 秒執(zhí)行一次
$ sysctl vm.dirty_writeback_centisecs
vm.dirty_writeback_centisecs = 500

# 內(nèi)存中駐留 30 秒以上的臟數(shù)據(jù)將由 flush 在下一次執(zhí)行時寫入磁盤
$ sysctl vm.dirty_expire_centisecs
vm.dirty_expire_centisecs = 3000

# 若臟頁占總物理內(nèi)存 10% 以上,則觸發(fā) flush 把臟數(shù)據(jù)寫回磁盤
$ sysctl vm.dirty_background_ratio
vm.dirty_background_ratio = 10

綜上可見,Page Cache 技術(shù)在理想的情況下,可以在一次 Storage I/O 的流程中,減少 2 次 DMA Copy 操作(不直接訪問磁盤)。

Linux實現(xiàn)原理 — I/O 處理流程與優(yōu)化手段,linux,網(wǎng)絡編程,網(wǎng)絡io,tcp

Buffered I/O

下圖展示了一個 C 程序通過 stdio 庫中的 printf() 或 fputc() 等輸出函數(shù)來執(zhí)行數(shù)據(jù)寫入的操作處理流程。過程中涉及到了多處 I/O Buffer 的實現(xiàn):

  1. stdio buffer:在 Userspace 實現(xiàn)的 Buffer,因為 SCI 的成本昂貴,所以,Userspace Buffer 用于 “積累“ 到更多的待寫入數(shù)據(jù),然后再通過一次 SCI 來完成真正的寫入。另外,stdio 也支持 fflush() 強制刷新函數(shù)。

  2. Kernel buffer cache:處理包括上文以及提到的 Page Cache 技術(shù)之外,磁盤設備驅(qū)動程序也提供塊級別的 Buffer 技術(shù),用于 “積累“ 更多的文件系統(tǒng)元數(shù)據(jù)和磁盤塊數(shù)據(jù),然后在合適的時機完成真正的寫入。

Linux實現(xiàn)原理 — I/O 處理流程與優(yōu)化手段,linux,網(wǎng)絡編程,網(wǎng)絡io,tcp

零拷貝技術(shù)(Zero-Copy)

零拷貝技術(shù)(Zero-Copy),是通過盡量避免在 I/O 處理流程中使用 CPU Copy 和 DMA Copy 的技術(shù)。實際上,零拷貝并非真正做到了沒有任何拷貝動作,它更多是一種優(yōu)化的思想。

下列表格從 CPU Copy 次數(shù)、DMA Copy 次數(shù)以及 SCI 次數(shù)這 3 個方面來對比了幾種常見的零拷貝技術(shù)??梢钥匆?,2 次 DMA Copy 是不可避免的,因為 DMA 是外設 I/O 的基本行為。零拷貝技術(shù)主要從減少 CPU Copy 和 CPU 模式切換這 2 個方面展開。

Linux實現(xiàn)原理 — I/O 處理流程與優(yōu)化手段,linux,網(wǎng)絡編程,網(wǎng)絡io,tcp

1、Userspace Direct I/O

Userspace Direct I/O(用戶態(tài)直接 I/O)技術(shù)的底層原理由 Kernel space 中的 ZONE_DMA 支持。ZONE_DMA 是一塊 Kernel 和 User Process 都可以直接訪問的 I/O 外設 DMA 物理內(nèi)存空間?;诖?, Application 可以直接讀寫 I/O 外設,而 Kernel 只會輔助執(zhí)行必要的虛擬存儲配置工作,不直接參與數(shù)據(jù)傳輸。因此,該技術(shù)可以減少 2 次 CPU Copy。

Userspace Direct I/O 的缺點:

  1. 由于旁路了 要求 Kernel buffer cache 優(yōu)化,就需要 Application 自身實現(xiàn) Buffer Cache 機制,稱為自緩存應用程序,例如:數(shù)據(jù)庫管理系統(tǒng)。

  2. 由于 Application 直接訪問 I/O 外設,會導致 CPU 阻塞,浪費 CPU 資源,這個問題需要結(jié)合異步 I/O 技術(shù)來規(guī)避。

Linux實現(xiàn)原理 — I/O 處理流程與優(yōu)化手段,linux,網(wǎng)絡編程,網(wǎng)絡io,tcp

具體流程看下圖:Using Direct I/O with DMA

Linux實現(xiàn)原理 — I/O 處理流程與優(yōu)化手段,linux,網(wǎng)絡編程,網(wǎng)絡io,tcp

2、mmap() + write()

mmap() SCI 用于將 I/O 外設(e.g. 磁盤)中的一個文件、或一段內(nèi)存空間(e.g. Kernel Buffer Cache)直接映射到 User Process 虛擬地址空間中的 Memory Mapping Segment,然后 User Process 就可以通過指針的方式來直接訪問這一段內(nèi)存,而不必再調(diào)用傳統(tǒng)的 read() / write() SCI。

Linux實現(xiàn)原理 — I/O 處理流程與優(yōu)化手段,linux,網(wǎng)絡編程,網(wǎng)絡io,tcp

申請空間函數(shù)原型:

  • addr 參數(shù):分配 MMS 映射區(qū)的入口地址,由 Kernel 指定,調(diào)用時傳入 NULL。

  • length 參數(shù):指示 MMS 映射區(qū)的大小。

  • prot 參數(shù):指示 MMS 映射區(qū)的權(quán)限,可選:PROT_READ、PROT_WRITE、PROT_READ|PROT_WRITE 類型。

  • flags 參數(shù):標志位參數(shù),可選:

  • MAP_SHARED:映射區(qū)所做的修改會反映到物理設備(磁盤)上。

  • MAP_PRIVATE:映射區(qū)所做的修改不會反映到物理設備上。

  • fd 參數(shù):指示 MMS 映射區(qū)的文件描述符。

  • offset 參數(shù):指示映射文件的偏移量,為 4k 的整數(shù)倍,可以映射整個文件,也可以只映射一部分內(nèi)容。

  • 函數(shù)返回值:

  • 成功:更新 addr 入口地址。

  • 失?。焊?MAP_FAILED 宏。

void *mmap(void *adrr, size_t length, int prot, int flags, int fd, off_t offset);

釋放空間函數(shù)原型:

  • addr 參數(shù):分配 MMS 映射區(qū)的入口地址,由 Kernel 指定,調(diào)用時傳入 NULL。

  • length 參數(shù):指示 MMS 映射區(qū)的大小。

  • 函數(shù)返回值:

  • 成功:返回 0。

  • 失?。悍祷?-1。

int munmap(void *addr, size_t length)

Linux實現(xiàn)原理 — I/O 處理流程與優(yōu)化手段,linux,網(wǎng)絡編程,網(wǎng)絡io,tcp

可見,mmap() 是一種高效的 I/O 方式。通過 mmap() 和 write() 結(jié)合的方式,可以實現(xiàn)一定程度的零拷貝優(yōu)化。

// 讀
buf = mmap(diskfd, len);
// 寫
write(sockfd, buf, len);

mmap() + write() 的 I/O 處理流程如下。

mmap() 映射:

  1. Application 發(fā)起 mmap() 調(diào)用,進行文件操作,CPU 模式從用戶態(tài)切換到內(nèi)核態(tài)。

  2. mmap() 將指定的 Kernel Buffer Cache 空間映射到 Application 虛擬地址空間。

  3. mmap() 返回,CPU 模式從內(nèi)核態(tài)切換到用戶態(tài)。

  4. 在 Application 后續(xù)的文件訪問中,如果出現(xiàn) Page Cache Miss,則觸發(fā)缺頁異常,并執(zhí)行 Page Cache 機制。通過已經(jīng)建立好的映射關(guān)系,只使用一次 DMA Copy 就將文件數(shù)據(jù)從磁盤拷貝到 Application User Buffer 中。

write() 寫入:

  1. Application 發(fā)起 write() 調(diào)用,CPU 模式從用戶態(tài)切換到內(nèi)核態(tài)。

  2. 由于此時 Application User Buffer 和 Kernel Buffer Cache 的數(shù)據(jù)是一致的,所以直接從 Kernel Buffer Cache 中 CPU Copy 到 Kernel Socket Buffer,并最終從 NIC 發(fā)出。

  3. write() 返回,CPU 模式從內(nèi)核態(tài)切換到用戶態(tài)。

可見,mmap() + write() 的 I/O 處理流程減少了一次 CPU Copy,但沒有減少 CPU 模式切換的次數(shù)。另外,由于 mmap() 的進程間共享特性,非常適用于共享大文件的 I/O 場景。

mmap() + write() 的缺點:當 mmap 映射一個文件時,如果這個文件被另一個進程所截獲,那么 write 系統(tǒng)調(diào)用會因為訪問非法地址被 SIGBUS 信號終止,SIGBUS 默認會殺死進程并產(chǎn)生一個 coredump。解決這個問題通常需要使用文件租借鎖實現(xiàn)。在 mmap 之前加鎖,操作完之后解鎖。即:首先為文件申請一個租借鎖,當其他進程想要截斷這個文件時,內(nèi)核會發(fā)送一個實時的 RT_SIGNAL_LEASE 信號,告訴當前進程有進程在試圖破壞文件,這樣 write 在被 SIGBUS 殺死之前,會被中斷,返回已經(jīng)寫入的字節(jié)數(shù),并設置 errno 為 success。

Linux實現(xiàn)原理 — I/O 處理流程與優(yōu)化手段,linux,網(wǎng)絡編程,網(wǎng)絡io,tcp

3、sendfile()

Linux Kernel 從 v2.1 開始引入了 sendfile(),用于在 Kernel space 中將一個 in_fd 的內(nèi)容復制到另一個 out_fd 中,數(shù)據(jù)無需經(jīng)過 Userspace,所以應用在 I/O 流程中,可以減少一次 CPU Copy。同時,sendfile() 比 mmap() 方式更具安全性。

函數(shù)原型:

  • out_fd 參數(shù):目標文件描述符,數(shù)據(jù)輸入文件。

  • in_fd 參數(shù):源文件描述符,數(shù)據(jù)輸出文件。該文件必須是可以 mmap 的。

  • offset 參數(shù):指定從源文件的哪個位置開始讀取數(shù)據(jù),若不需要指定,傳遞一個 NULL。

  • count 參數(shù):指定要發(fā)送的數(shù)據(jù)字節(jié)數(shù)。

  • 函數(shù)返回值:

  • 成功:返回復制的字節(jié)數(shù)。

  • 失?。悍祷?-1,并設置 errno 全局變量來指示錯誤類型。

#include <sys/sendfile.h>

ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);

sendfile() 處理流程:

  1. Application 調(diào)用 sendfile(),CPU 從用戶態(tài)切換到內(nèi)核態(tài)。

  2. Kernel 將數(shù)據(jù)通過 DMA Copy 從磁盤設備寫入 Kernel Buffer Cache。

  3. Kernel 將數(shù)據(jù)從 Kernel Buffer Cache 中 CPU Copy 到 Kernel Socket Buffer。

  4. Kernel 將數(shù)據(jù)從 Kernel Socket Buffer 中 DMA Copy 到 I/O 網(wǎng)卡設備。

  5. sendfile() 返回,CPU 從內(nèi)核態(tài)切換到用戶態(tài)。

Linux實現(xiàn)原理 — I/O 處理流程與優(yōu)化手段,linux,網(wǎng)絡編程,網(wǎng)絡io,tcp

4、sendfile() + DMA Gather Copy

上文知道 sendfile() 還具有一次 CPU Copy,通過結(jié)合 DMA Gather Copy 技術(shù),可以進一步優(yōu)化它。

DMA Gather Copy 技術(shù),底層有 I/O 外設的 DMA Controller 提供的 Gather 功能支撐,所以又稱為 “DMA 硬件輔助的 sendfile()“。借助硬件設備的幫助,在數(shù)據(jù)從 Kernel Buffer Cache 到 Kernel Socket Buffer 之間,并不會真正的數(shù)據(jù)拷貝,而是僅拷貝了緩沖區(qū)描述符(fd + size)。待完成后,DMA Controller,可以根據(jù)這些緩沖區(qū)描述符找到依舊存儲在 Kernel Buffer Cache 中的數(shù)據(jù),并進行 DMA Copy。

顯然,DMA Gather Copy 技術(shù)依舊是 ZONE_DMA 物理內(nèi)存空間共享性的一個應用場景。

sendfile() + DMA Gather Copy 的處理流程:

  1. Application 調(diào)用 sendfile(),CPU 從用戶態(tài)切換到內(nèi)核態(tài)模式。

  2. Kernel 將數(shù)據(jù)通過 DMA Copy 從磁盤設備寫入 Kernel Buffer Cache。

  3. Kernel 將數(shù)據(jù)的緩沖區(qū)描述符從 Kernel Buffer Cache 中 CPU Copy 到 Kernel Socket Buffer(幾乎不費資源)。

  4. 基于緩沖區(qū)描述符,CPU 利用 DMA Controller 的 Gather / Scatter 操作直接批量地將數(shù)據(jù)從 Kernel Buffer Cache 中 DMA Copy 到網(wǎng)卡設備。

  5. sendfile() 返回,CPU 從內(nèi)核態(tài)切換到用戶態(tài)。

Linux實現(xiàn)原理 — I/O 處理流程與優(yōu)化手段,linux,網(wǎng)絡編程,網(wǎng)絡io,tcp

5、splice()

splice() 與 sendfile() 的處理流程類似,但數(shù)據(jù)傳輸方式有本質(zhì)不同。

  • sendfile() 的傳輸方式是 CPU Copy,且具有數(shù)據(jù)大小限制;

  • splice() 的傳輸方式是 Pipeline,打破了數(shù)據(jù)范圍的限制。但也要求 2 個 fd 中至少有一個必須是管道設備類型。

函數(shù)原型:

  • fd_in 參數(shù):源文件描述符,數(shù)據(jù)輸出文件。

  • off_in 參數(shù):輸出偏移量指針,表示從源文件描述符的哪個位置開始讀取數(shù)據(jù)。

  • fd_out 參數(shù):目標文件描述符,數(shù)據(jù)輸入文件。

  • off_out 參數(shù):輸入偏移量指針,表示從目標文件描述符的哪個位置開始寫入數(shù)據(jù)。

  • len 參數(shù):指示要傳輸?shù)臄?shù)據(jù)長度。

  • flags:控制數(shù)據(jù)傳輸?shù)男袨榈臉酥疚弧?/p>

#define _GNU_SOURCE         /* See feature_test_macros(7) */

#include <fcntl.h>

ssize_t splice(int fd_in, loff_t *off_in, int fd_out, loff_t *off_out, size_t len, unsigned int flags);

splice() 的處理流程如下:

  1. Application 調(diào)用 splice(),CPU 從用戶態(tài)切換到內(nèi)核態(tài)。

  2. Kernel 將數(shù)據(jù)通過 DMA Copy 從磁盤設備寫入 Kernel Buffer Cache。

  3. Kernel 在 Kernel Buffer Cache 和 Kernel Socket Buffer 之間建立 Pipeline 傳輸。

  4. Kernel 將數(shù)據(jù)從 Kernel Socket Buffer 中 DMA Copy 到 I/O 網(wǎng)卡設備。

  5. splice() 返回,CPU 從內(nèi)核態(tài)切換到用戶態(tài)。

Linux實現(xiàn)原理 — I/O 處理流程與優(yōu)化手段,linux,網(wǎng)絡編程,網(wǎng)絡io,tcp

6、緩沖區(qū)共享技術(shù)

緩沖區(qū)共享技術(shù),是對 Linux I/O 的一種顛覆,所以往往需要由 Application 和設備來共同實現(xiàn)。

其核心思想是:每個 Applications 都維護著一個 Buffer Pool,并且這個 Buffer Pool 可以同時映射到 Kernel 虛擬地址空間,這樣 Userspace 和 Kernel space 就擁有了一塊共享的空間。以此來規(guī)避掉 CPU Copy 的行為。

Linux實現(xiàn)原理 — I/O 處理流程與優(yōu)化手段,linux,網(wǎng)絡編程,網(wǎng)絡io,tcp文章來源地址http://www.zghlxwxcb.cn/news/detail-725421.html

到了這里,關(guān)于Linux實現(xiàn)原理 — I/O 處理流程與優(yōu)化手段的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • Linux socket網(wǎng)絡編程實戰(zhàn)(tcp)實現(xiàn)雙方聊天

    Linux socket網(wǎng)絡編程實戰(zhàn)(tcp)實現(xiàn)雙方聊天

    在上節(jié)已經(jīng)系統(tǒng)介紹了大致的流程和相關(guān)的API,這節(jié)就開始寫代碼! 回顧上節(jié)的流程: 創(chuàng)建一個NET文件夾 來存放網(wǎng)絡編程相關(guān)的代碼: 這部分先實現(xiàn)服務器的連接部分的代碼并進行驗證 server1.c: 代碼驗證: 先編譯并運行這部分代碼: 可見,此時沒有客戶端進行連接,程

    2024年02月03日
    瀏覽(22)
  • 【Linux網(wǎng)絡編程】基于UDP實現(xiàn)多人聊天室

    【Linux網(wǎng)絡編程】基于UDP實現(xiàn)多人聊天室

    UDP(User Datagram Protocol)用戶數(shù)據(jù)報協(xié)議,是不可靠的無連接的協(xié)議。在數(shù)據(jù)發(fā)送前,因為不需要進行連接,所以可以進行高效率的數(shù)據(jù)傳輸。 數(shù)據(jù)報格式套接字 SOCK_DGRAM 采用UDP只管發(fā)送數(shù)據(jù)而不去驗證發(fā)送數(shù)據(jù)的正確性,不論傳輸是否被接收,數(shù)據(jù)流是否有丟失,都不再重新發(fā)

    2024年02月08日
    瀏覽(27)
  • Linux網(wǎng)絡編程:socket實現(xiàn)client/server通信

    Linux網(wǎng)絡編程:socket實現(xiàn)client/server通信

    閱讀 UNIX網(wǎng)絡編程 卷1:套接字聯(lián)網(wǎng)API 第3版 的前4個章節(jié),覺得有必要對書籍上的源碼案例進行復現(xiàn),并推敲TCP的C/S通信過程。 ?? 測試環(huán)境:CentOS7.6 x64 編譯server.c 和 client.c gcc server.c -g -std=gnu99 -o server 和 gcc client.c -g -std=gnu99 -o client 運行測試: ?? server.c僅僅實現(xiàn)對單個客戶

    2024年02月03日
    瀏覽(20)
  • linux性能優(yōu)化-內(nèi)存原理

    linux性能優(yōu)化-內(nèi)存原理

    只有內(nèi)核才可以直接訪問物理內(nèi)存,Linux內(nèi)核給每個進程都提供了一個獨立的虛擬地址空間,并且這個地址空間是連續(xù)的。這樣,進程通過訪問虛擬內(nèi)存來訪問內(nèi)存。 虛擬地址空間的內(nèi)部又被分為內(nèi)核空間和用戶空間兩部分,不同字長(也就是單個 CPU 指令可以處理數(shù)據(jù)的最

    2024年02月01日
    瀏覽(23)
  • Unity 性能優(yōu)化的手段(對象池、靜/動態(tài)批處理、GPU實例化、垃圾回收、LOD、LightMap)【更新中】

    Unity 性能優(yōu)化的手段(對象池、靜/動態(tài)批處理、GPU實例化、垃圾回收、LOD、LightMap)【更新中】

    目錄 對象池 擴容策略 收縮策略 DrawCall DrawCall的過程 為什么減少DrawCall可以實現(xiàn)性能優(yōu)化? 減少Draw Call的方法 靜態(tài)批處理(Static Batching) 動態(tài)批處理(Dynamic Batching) GPU Instancing(GPU實例化)??????? 貼圖集 垃圾回收的優(yōu)化 垃圾回收的性能影響 延遲垃圾回收 避免

    2024年02月04日
    瀏覽(17)
  • Linux網(wǎng)絡編程:socket & fork實現(xiàn)clients/server通信

    Linux網(wǎng)絡編程:socket & fork實現(xiàn)clients/server通信

    UNIX網(wǎng)絡編程:socket實現(xiàn)client/server通信 隨筆簡單介紹了TCP Server服務單客戶端的socket通信,但是并未涉及多客戶端通信。 對于網(wǎng)絡編程肯定涉及到多客戶端通信和并發(fā)編程 (指在同時有大量的客戶鏈接到同一服務器),故本隨筆補充這部分知識。 而且并發(fā)并發(fā)編程涉及到多進程

    2024年02月05日
    瀏覽(21)
  • Linux網(wǎng)絡編程——C++實現(xiàn)進程間TCP/IP通信

    地址接口 1、通用地址接口 共16字節(jié) = 2字節(jié)地址類型 + 14字節(jié)地址數(shù)據(jù) 2、自定義地址接口 地址轉(zhuǎn)換 1、需要將點分字符串ip轉(zhuǎn)化為程序ip,使用inet_addr函數(shù): 2、字節(jié)序轉(zhuǎn)換 地址接口配置中的端口需要字節(jié)序轉(zhuǎn)換,網(wǎng)絡規(guī)定使用大端字節(jié)序。 地址接口配置 1、socket:創(chuàng)建套接

    2024年02月20日
    瀏覽(33)
  • 【Linux網(wǎng)絡】網(wǎng)絡編程套接字 -- 基于socket實現(xiàn)一個簡單UDP網(wǎng)絡程序

    【Linux網(wǎng)絡】網(wǎng)絡編程套接字 -- 基于socket實現(xiàn)一個簡單UDP網(wǎng)絡程序

    我們把數(shù)據(jù)從A主機發(fā)送到B主機,是目的嗎?不是,真正通信的不是這兩個機器!其實是這兩臺機器上面的軟件(人) 數(shù)據(jù)有 IP(公網(wǎng)) 標識一臺唯一的主機 ,用誰來標識各自主機上客戶或者服務進程的唯一性呢? 為了更好的表示一臺主機上服務進程的唯一性,我們采用 端口號

    2024年02月12日
    瀏覽(848)
  • Linux網(wǎng)絡編程:Socket服務器和客戶端實現(xiàn)雙方通信

    Linux網(wǎng)絡編程:Socket服務器和客戶端實現(xiàn)雙方通信

    目錄 一,什么是網(wǎng)絡編程 二,為什么使用端口號 三,TCP協(xié)議與UDP協(xié)議 ①TCP(傳輸控制協(xié)議) ②UDP(用戶數(shù)據(jù)報協(xié)議,User Data Protocol) ③總結(jié)歸納 四,Socket服務器和客戶端的開發(fā)流程 五,服務器和客戶端相關(guān)API說明 ①socket()函數(shù) ②bind()函數(shù) ③listen()函數(shù) ④accept()函數(shù) ⑤客戶端

    2024年02月11日
    瀏覽(34)
  • Linux網(wǎng)絡編程:socket & fork()多進程 實現(xiàn)clients/server通信

    Linux網(wǎng)絡編程:socket & fork()多進程 實現(xiàn)clients/server通信

    UNIX網(wǎng)絡編程:socket實現(xiàn)client/server通信 隨筆簡單介紹了TCP Server服務單客戶端的socket通信,但是并未涉及多客戶端通信。 對于網(wǎng)絡編程肯定涉及到多客戶端通信和并發(fā)編程 (指在同時有大量的客戶鏈接到同一服務器),故本隨筆補充這部分知識。 而且并發(fā)并發(fā)編程涉及到多進程

    2024年02月05日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包