網絡IO模型之多路復用器.md

多路復用是什么?怎么理解?

本文主要涉及為

程序中處理網絡IO時的模型,對于系統內核而言網絡IO模型。這里只做普及使用

前置知識,什么是IO?怎么理解IO

IO其實就是In和Out。中文翻譯是輸入和輸出,只要涉及到輸入和輸出的,我們都可以稱之為IO。

例如你在磁盤中讀取文件,讀取文件為In,輸出到其他地方為Out。

例如你Windows系統在網絡通信時,讀取客戶端的輸入數據包,這叫In,系統將數據包輸出給我們編寫的應用程序,這叫Out。

當然,我們如果成自身程序的角度去看網絡通信的話,我們根據系統內核給予的文件描述符去獲取TCP連接數據時,這就叫In,將數據輸出到其他位置,這叫Out。

所以,我們可以總結,IO其實就是輸入輸出,它是對輸入輸出這個動作的統稱,并不僅限于磁盤、網絡等。

當然,IO相關的設備有很多,比如鼠標、觸摸屏、NFC等

對于系統而言,處理IO有什么模型?

這里的系統,指的是Windows內核程序、Linux內核程序。

我們要知道,一個TCP連接到達服務器后,該連接是由系統內核程序進行管控的,它維護這條連接和上層應用與之交互的過程。

回到正題,我們今天說的是系統內核層面的IO模型情況,至于應用程序層的IO模型我會一筆帶過。

同步模型

畫個圖更好理解:

這張圖中,注意我們的業務程序中線程是需要不停的讀取TCP連接通道中的數據,我們可以稱之為為read操作。而本質上業務程序一直不停的主動讀取數據的這種情況,本質上就是一個同步模型,因為始終是應用程序主動來讀取的。

此時如果我們的線程,read數據沒有的話,一直等待讀取到數據的這個操作,對于我們業務程序而言,就是阻塞模型。而業務程序如果讀取read后發現沒有數據,直接跳過,這個就是非阻塞模型。至于業務程序讀取到數據后,自身如何去操作,其實就是業務層面的同步和異步模型。

說到這里,你應該也明白了,系統內核層面的IO模型和我們業務程序層面的IO模型是可以完全不相關的。舉個例子,我們先不談系統內核層面,只說應用程序,應用程序讀取到數據后,讀取數據的線程用來處理業務,那就是同步模型;而應用程序讀取數據的線程不參與業務處理,只處理網絡連接的事情,當其他業務處理線程執行完業務邏輯后再讓處理連接的線程響應數據,這就是異步模型。

那么此時你會有疑問,每次都要應用程序主動去讀取,這太浪費資源了,應用程序能不能等數據來,而不是主動去找內核要,那么就代表著系統內核級別上有沒有異步模型的存在?

實際上是有的,我們馬上來描述。

異步模型

我們可以假想一下它的模型:

其實真實的內核異步網絡IO的比這個圖大很多,這里為了方便理解,做了一些簡化。

從這張圖我們可以知道,內核要實現異步的網絡IO本身是可以實現的,但要注意,其實內核的異步IO應用并不廣泛,原因如下:

1、內核實現難度增大,出問題的風險更大:內核要實現異步IO要比同步復雜得多,涉及到回調函數、事件循環等概念,要知道內核程序對穩定性要求極高,因為它是整個程序運行最基礎的部分,增加復雜度則意味著增加風險。

2、性能考慮:雖然異步IO理論上可以提高性能,但在某些情況下,它可能不會帶來顯著的性能提升,尤其是當系統已經通過其他方式(如多線程或多路復用)進行了優化時。

3、內核實現限制:在Linux系統中,真正的異步IO模型發展面臨一些挑戰,特別是內核實現上的限制和歷史遺留問題。例如,Linux的io_uring雖然是真在往異步IO發展,但在某些領域(如網絡IO)還是基于epoll這種IO多路復用機制更加穩定和成熟。

等等還有很多理由可以說,總體來說,內核的異步IO應用不廣泛主要是在于復雜度與穩定性上,但還有一個重要因素,也就是IO多路復用模型的實現。

IO多路復用模型

前面鋪墊那么多,就是為了引出IO多路復用模型。

我們前面說了異步IO模型的本質是為了提高性能,而在內核層面上為了提高這個性能付出的代價未免太大了一點,那么就需要產生一個折中的辦法。

這個折中的辦法需要滿足以下條件:

? 1、應用程序不能一直去等待讀取數據,節約線程資源。

? 2、內核方面不能用異步操作,保持原來同步讀的模型。

那么**【多路復用】**就能滿足這兩個條件,多路復用模型如圖所示:

內核提供多路復用器,多路復用器中會監聽各個網絡TCP連接的狀態,然后業務程序方面有專門的線程用來不停往多路復用器處查詢連接狀態,當發現有連接的狀態發生變更后,就通知其他對應的線程去讀取數據。

這樣就達到了我們前面說的兩個條件,應用程序無需一直反復嘗試讀取連接中的數據,而內核也無需實現異步模型。

在目前的環境下,絕大多數系統和應用都是使用這類模型來處理網絡請求,例如Windows的IOCP,Linux的epoll,而業務程序方面代表性最強的則是Netty。

當然,多路復用可不是這一點講清楚的,這里讓大家對多路復用的基本原理有個了解,其實在上圖中每一個涉及的點都有不同的實現方式,可以自行網上搜索了解下。

那么最后做個總結:

? 1、業務程序自身處理IO和內核處理IO是無關的,本身是兩個層面。

? 2、內核層面絕大多數都是同步模型,此時加入多路復用后性能已經足夠當下環境的需求,而異步模型由于復雜度和穩定性問題普及并不廣泛。

? 3、多路復用器不僅僅用于IO方面,其他很多場景都可以使用,所以多路復用器我們要理解其模型,而不能限定于IO。

? 4、在Java層面,多路復用器在JVM的NIO包中已經實現好了,我們只管用就行,而當我們使用了Netty這類集成框架后,大多數情況下我們并不需要關系底層的內容

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/40939.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40939.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/40939.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

clone()方法

在Java中,clone() 方法是一個非常有趣且強大的工具,用于創建對象的一個副本。這個方法位于 Object 類中,因此可以被所有類使用。讓我們討論一下它的幾個要點: 什么是克隆? 克隆就是創建一個對象的新副本,這…

2005-2022全國及各省家庭承包耕地流轉總面積及經營耕地面積數據(無缺失)

2005-2022全國及各省家庭承包耕地流轉總面積及經營耕地面積數據(無缺失) 1、時間:2005-2022年 2、范圍:全國及30省 3、指標:家庭承包耕地流轉總面積、家庭承包經營耕地面積、土地流轉率、 4、來源:農村…

《web應用技術》第十一次課后作業

驗證過濾器進行權限驗證的原理。 創建Filter: package com.example.filter;import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException;WebFilter(urlPatterns "/*") public class DemoFilter implements Filter …

【3維BFS】個人練習-Leetcode-LCP 79. 提取咒文

題目鏈接:https://leetcode.cn/problems/kjpLFZ/ 題目大意:給一個矩陣matrix[][],元素為小寫英文字母。給一個字符串mantra,求從矩陣的(0,0)位置開始,可以移動(上下左右)或者提取字母&#xff…

怎么搭建個人博客教程,附云主機選購指南

一、搭建個人博客教程 1. 規劃博客內容與技術棧 確定博客主題:首先明確博客的定位和主題,這將影響后續的技術選擇和內容規劃。選擇技術棧:根據個人偏好和技術背景,選擇合適的建站技術。例如,可以使用WordPress&#…

adobe pdf設置默認打開是滾動而不是單頁視圖

上班公司用adobe pdf,自己還不能安裝其它軟件。 每次打開pdf,總是默認單頁視圖,修改滾動后,下次打開又 一樣,有時候比較煩。 后面打開編輯->首選項, 如下修改,下次打開就是默認滾動了

Websocket通信實戰項目(圖片互傳應用)+PyQt界面+python異步編程(async) (上)服務器端python實現

Rqtz : 個人主頁 ?? 共享IT之美,共創機器未來 ? Sharing the Beauty of IT and Creating the Future of Machines Together 目錄 項目背景 ?編輯?專有名詞介紹 服務器GUI展示 功能(位置見上圖序號) 客戶端GUI展示(h5cssjs&#xf…

flask的進階使用方法

【 一 】一對多關系 # 1 一對一 [本質就是一對多--》多的那個唯一] # 2 一對多 # 3 多對多1.1 關系 #### 一對多關系 class Hobby(Base):__tablename__ hobbyid Column(Integer, primary_keyTrue)caption Column(String(50), default籃球)def __str__(self):return sel…

C++多態(虛函數,純虛函數,抽象類)

一.多態 1.理解: 多種形態,多種形式 eg:多個派生類均把基類的方法run重新實現,但是實現的方式不同,體現了多種形式,即為多態 2.分類 (1)編譯時的多態:在編譯過程中確定了同名操…

Java中的代碼優化與重構策略

Java中的代碼優化與重構策略 大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿! 1. 引言 代碼優化與重構在軟件開發中扮演著至關重要的角色。優秀的代碼不僅令人…

將游戲降權運行 2024年,防止游戲檢測,泄漏個人隱私

不得不說,現在的游戲,膽子是真的越來越大了。很多都帶了個啟動器,你開著游戲的時候他就給他開多了1個掃描器,看下你有沒看一些小孩不宜的,玩游戲不宜打開的軟件什么的,包括你的MAC地址啊,你當前…

pydub、ffmpeg 音頻文件聲道選擇轉換、采樣率更改

快速查看音頻通道數和每個通道能力判斷具體哪個通道說話;一般能量大的那個算是說話 import wave from pydub import AudioSegment import numpy as npdef read_wav_file(file_path):with wave.open(file_path, rb) as wav_file:params wav_file.getparams()num_cha…

量化交易:金融投資的新篇章

在金融投資的世界里,量化交易正逐漸成為一股不可忽視的力量。它以數據驅動和算法決策為特點,為投資者提供了一種全新的交易方式。本文將深入探討量化交易的基本概念、優勢、挑戰以及如何開始使用量化交易策略。 量化交易的定義與起源 量化交易&#xf…

Android10以上實現獲取設備序列號功能

Android10以上實現獲取設備唯一標識,目前只支持華為和榮耀設備。實現原理:通過無障礙服務讀取序列號界面。 public class DeviceHelper implements Application.ActivityLifecycleCallbacks {static final String TAG "WADQ_DeviceHelper";s…

Zoom使用的基本步驟和注意事項

Zoom是一款功能強大的視頻會議軟件,廣泛應用于遠程辦公、在線教育、團隊協作等多個場景。以下是Zoom使用的基本步驟和注意事項: 一、注冊與登錄 注冊Zoom賬戶: 訪問Zoom官方網站(如zoom.us),點擊“注冊”…

Android Enable 和clickable

setEnabled 使能控件 設置為false,該控件永遠不會活動,不管設置為什么屬性,都無效; 設置為true,表明激活該控件,控件處于活動狀態,處于活動狀態,就能響應事件了,比如觸摸…

mybatis實現動態sql

第一章、動態SQL MyBatis 的強大特性之一便是它的動態 SQL。如果你有使用 JDBC 或其它類似框架的經驗,你就能體會到根據不同條件拼接 SQL 語句的痛苦。例如拼接時要確保不能忘記添加必要的空格,還要注意去掉列表最后一個列名的逗號。利用動態 SQL 這一特…

2024北京大健康展,北京健康生活產品展覽會十月舉辦

2024北京健博會,立足北京,效應輻射全國買方市場,助力健康中國事業建設; 2024第11屆中國(北京)國際大健康產業博覽會 The 2024 China (Beijing) International Health Service Expo 時間:2024年…

華為 RIP 協議中 RIP 兼容版本、RIPv1、RIPv2 在收發 RIP 報文時的區別

華為 RIP 協議中 RIP 兼容版本、RIPv1、RIPv2 的區別 為了更好地支持實際環境中路由器對 RIP 的支持,華為 VRP 平臺具有一個兼容版本,默認情況下啟動 RIP 進程后,如果沒有配置 RIP 版本,該版本就為兼容版本,對 versio…