c++應用網絡編程之二網絡的IO模型

一、網絡編程的開發平臺

一般來說,目前開發者面對的主流開發平臺就是Windows和類Unix,或者干脆就是Windows和Linux平臺。至于如IBM或其它等公司的相關平臺,可能對絕大多數開發者來說,可能一生都遇不到。至于嵌入式平臺,除了專有的網絡通信外,一般情況下,不會有太復雜的網絡編程場景。基本都是借助網絡進行通信,而且大多基本也都是客戶端。
從上面的說明可以大概定義出,網絡編程的平臺,粗略的可以認為,針對絕大多數開發者,或者干脆就是Windows和Linux平臺。
而在網絡編程中,一般來講,客戶端編程是比較簡單的。大多數情況下基本都是一對一的通信,即使有異步等復雜情況,處理起來也相對簡單(不是絕對)。所以謂網絡編程一談起來復雜的原因,其實指的服務端。也就是說,在上述的兩個平臺上,如何進行高并發的服務端編程,這才是網絡編程的復雜度和難度的體現。

二、網絡服務端編程的特點

網絡服務端編程的難點和復雜度在哪兒?有如下幾點:
1、異步編程
即網絡數據的接收與發送的及時處理和非同步話的底層機制(即指排除簡單的網絡編程外)
2、內存管理
網絡IO與上層應用,上層應用與上層應用中大數據的交換時,內存的安全管理
3、多線程或者說線程池(協程)
高并發的網絡天然的需要多線程加快數據的吞吐,同時CPU核數的增加也要求更好的將多線程程與并發(并行)有機的結合起來
4、非阻塞IO
非阻塞IO等同于你做你的,我做我的。有事兒打招呼,沒事兒別找事兒。它的特點是不管有沒有IO可操作(讀寫),都會立即返回,只是返回值不同。即通過返回值可以判斷是否需要再次進行IO操作。所以,基本非阻塞IO都需要一個輪詢的過程。
5、異步IO
這里需要明白的是異步IO與非阻塞IO的不同,雖然二者可能在某些情況下被表述人混淆為一談,但其實是兩回事。異步IO強調的是對IO的異步操作,即更傾向于上層的應用。這個上層指的是IO的上層,可能是內核級也可能是用戶空間級。而非阻塞IO則指的IO操作本身,是否需要等待。異步IO其實是異步與IO操作的結合,當然開發者談起的異步IO,大多都是指異步和非阻塞IO的結合。
6、上述的結合
如果覺得上面的可能都不是多難,那么就一起吧。解決高并發的網絡服務時,把上述的技術融合到一起,如果還覺得得簡單,那么你就成為了一個真正的大牛。

三、網絡編程IO模型

所謂模型,可以理解為處理IO的標準流程或者說動作。而網絡IO模型就是處理網絡IO數據的流程。為了應對網絡IO的處理,無論哪個平臺,都可以抽象成幾個大類的模型:
1、阻塞I/O (blocking I/O)
這個非常容易理解,程序發起IO請求,如果內核沒有準備好,則阻塞,所謂阻塞就是等待,等待著內核準備好再把數據傳遞回來時,再進行動作。舉個例子,朝老婆要錢買東西,老婆去拿錢,你就得一直在原地等待,什么你不等待走了。好吧。錢也沒有了,當然東西也別買了。
2、非阻塞I/O (nonblocking I/O)
這個就有點意思,其實就是在用戶發起IO請求后,內核返回一個值(error,這個值大多數情況下不是一個真正的錯誤)告訴應用程序我開始準備數據了,你先去搞別的吧。回頭我把數據準備好你再來操作。所以上層應用會不斷的通過輪詢機制來查看數據是否準備成功。當然,也有可能已經準備好了,直接就把數據讀過來了,不阻塞。這就比如向老婆要錢買東西,老婆說,我去拿錢,你先忙別的,回頭我把錢放你書桌上。那你就可以去先洗碗,洗一個碗就去書桌看看有沒有錢,沒錢接著洗。直到發現有錢了,高高興興的出去買東西。
3、I/O多路復用(I/O multiplexing)
輪詢肯定不是一種好的機制,所以就出現這種多路復用技術,即內核提供一種機制,允許上層應用監控多個IO,一旦某個IO有動作,就通知上層來發起相關的IO請求。
4、信號機制驅動I/O (signal driven I/O (SIGIO))
這種機制就比較容易理解了,在上層應用進行IO請求發起時,只是向內核發送信號通知相關操作,然后應用就可以做其它任務了,當內核當相關的IO數據準備好后,向上層應用發送一個信號,上層應用得到信號后就會繼續進行IO操作,從而達到IO請求的一個整體流程。
5、異步I/O(asynchronous I/O (the POSIX aio_functions))
異步IO其實就上層應用在發起IO請求后,內核不會阻塞IO,會立刻返回一個error,通過其判斷內核的準備狀態,在內核未準備好的情況下,上層應用可以進行其它任務(準備好則繼續進行IO請求,這種情況比較簡單,不討論。當然也可能是真正的錯誤,直接返回即可)。當內核把數據準備完成后,通過通知機制(一般是信號),通知上層應用繼續操作IO。上層應用接到通知后,即再次發起IO請求即可得到相關數據。
這個有點類似于銀行的叫號機制,大家拿了一個號,然后坐在一排椅子上等著窗口叫號,叫到的前去辦理即可。

需要注意的是,對內核來說,IO操作是針對所有IO的,包括網口、串口等等。在網絡編程中,一般的描述中,一般不會明顯的去區分是網絡IO還是其它IO,畢竟大家在這個環境中,應該知道指的就是網絡IO。但是,在網絡應用上支持的一些IO模型未必在其它模型上可用,所以如果嚴格的討論一些具體的問題時,請注意表述的嚴謹性。
在此處還要談一個老生常談的問題,同步、異步與阻塞、非阻塞的關系。同步和異步一般是指多線(進)程間的協調一致或不一致;而阻塞一般是指IO的處理是否等待并交出時間片。二者間沒有必然的聯系。雖然在開發過程中二者聯系非常緊密,但其實它們之間確實是沒有必然的聯系,完全可以不搭界。比如一個IO可以直接連接另外一個IO,根本不過上層。同樣,線程和進程可以完全不訪問IO。
如果二者有關系呢?一般來說,分為以下幾種情況:
1、同步阻塞IO
這種一般用于非常簡單的場景,比如只是一個基本的數據交換或者命令傳遞。沒有并發量。這種情況下,整個線程會被阻塞,然后直到有IO響應。
2、同步非阻塞IO
這種一般用于處理多個IO,比如有三個網口,需要不斷的查詢一些命令數據之類的。所以不能在查詢某一個網絡IO時被阻塞住,誰也不知道另外兩個是不是已經有數據傳遞過來了。但它需要不斷的輪詢導致消耗較多的CPU時間片。
3、異步阻塞IO
這個應用景比較少,一般異步和IO結合后,都是指異步非阻塞IO。異步阻塞IO其實劃分到更細的程度后,其實和同步阻塞IO是一致的,只是邏輯上不同罷了。這種IO模型應用場景非常少。
4、異步非阻塞IO
這個就是常見的異步IO。一般來說,異步操作IO會拿到一個返回值,表示IO已經接收了處理動作。上層應用可以繼續處理其它任務,當此IO動作處理完成后,內核會以一定的機制(信號、回調或者事件等)通知應用進程處理相關數據,從而避免了輪詢的操作。
基本上目前高并發的各種網絡框架、庫及程序等都是基于這種情況進行開發的。

四、總結

網絡服務端編程是復雜的,要先從宏觀上把網絡通信的相關機制搞清楚。這樣才能更好的在開發過程中明白一些細節的掌控,而不至于迷失在細節當中。這個系列會從頂層一點點的抽絲剝繭的把相關背景和技術棧分析展開,并對它們的相對關系進行分析說明。某些具體的細節如果不必要就不展開了,請大家自行查閱相關書籍或者資料。

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

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

相關文章

上位機圖像處理和嵌入式模塊部署(mcu項目1:用戶手冊)

【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱:feixiaoxing 163.com】 一個完整的產品,除了上位機軟件、固件、硬件、包裝之外,一般還需要一個用戶手冊。好的用戶手冊應該能夠兼顧到大多數人的認…

力扣(3200)- 三角形的最大高度

好方法: 垃圾方法:

Python面試題:請解釋 `lambda` 函數是什么,并舉一個例子

lambda函數是Python中用于創建小型匿名函數的一種方式。這些函數通常用于需要一個簡單函數的場景,例如作為參數傳遞給高階函數。lambda函數以lambda關鍵字開始,后跟參數列表和表達式,語法形式如下: lambda arguments: expression…

nginx配置stream代理

項目中遇到某些服務在內網,需要外網訪問的情況,需要配置代理訪問。可用nginx搭建代理服務。 TCP代理 通過nginx的stream模塊可以直接代理TCP服務,步驟如下: 在/etc/nginx/下新建proxy文件夾,用于存放代理配置。此處…

吉洪諾夫正則化隨筆

前言 前幾天在回顧壓縮感知中的特征選擇與LASSO回歸發現了這個Tikhonov regularization,查了一下叫個如題的名字。先來淺說一下正則化這玩意:正則化(Regularization)是一種用來防止模型過擬合(Overfitting&#xff09…

孫溟?篆刻《睡片原諒一切,醒來不問過往》

孫溟?篆刻《睡片原諒一切,醒來不問過往》 佛陀言:睡前原諒一切,醒來不問過往,珍惜所有不期而遇,看淡所有不辭而別甲辰夏溟?于寒舍小窗下刊。

相關向量機RVM算法介紹繼承sklearn-SVM-API實現回歸預測算例

一、相關向量機RVM與支持向量機SVM對比 1、相關向量機(RVM) ①定義與原理 相關向量機(Relevance Vector Machine, RVM)是一種基于概率模型的機器學習算法,主要用于分類和回歸分析。基于稀疏貝葉斯學習框架&#xff…

Springboot助農農產品銷售系統-計算機畢業設計源碼16718

摘要 SpringBoot助農農產品銷售系統旨在通過利用SpringBoot框架開發一個便捷高效的農產品銷售平臺。該系統包括用戶注冊登錄、商品瀏覽、購物車管理、訂單生成、支付功能等模塊。通過整合支付接口、地圖定位、推薦系統等技術,提供給用戶更好的購物體驗。本文介紹了…

Docker安裝遇到問題:curl: (7) Failed to connect to download.docker.com port 443: 拒絕連接

問題描述 首先,完全按照Docker官方文檔進行安裝: Install Docker Engine on Ubuntu | Docker Docs 在第1步:Set up Dockers apt repository,執行如下指令: sudo curl -fsSL https://download.docker.com/linux/ubu…

人工智能開發中的數據隱私

人工智能開發中的數據隱私對于建立用戶信任和遵守嚴格法規至關重要。保護敏感信息可確保合乎道德的人工智能使用并防止有害的數據泄露。 為什么在人工智能開發中優先考慮數據隱私至關重要 人工智能的迅猛發展開啟了一個前所未有的技術進步時代,徹底改變了各行各業&…

使用Python繪制雙向條形圖

使用Python繪制雙向條形圖 雙向條形圖效果代碼 雙向條形圖 雙向條形圖用于比較兩個類別的數值分布,條形在中軸線兩側對稱排列。這種圖表常用于顯示兩個變量的對比情況,例如男女不同年齡段人口數量對比。 效果 代碼 import matplotlib.pyplot as plt i…

linux的服務管理

systemd systemd 是一個系統和服務管理器,用于Linux操作系統中,旨在替代傳統的Unix系統V初始化系統(SysV init)。 不一定所有使用 yum 安裝的軟件都可以通過 systemctl start 來管理。能否通過 systemctl start 管理取決于軟件包…

Shopee(蝦皮)怎么獲取流量?

店鋪流量的高低會直接關聯到賣家店鋪單量,也關系到一個店鋪的營業情況和利潤,那么Shopee的流量從哪里來呢? Shopee的平臺流量可分為五個部分: 1.自然流量 2.關鍵字廣告流量 3.平臺活動流量 4.營銷流量 5.粉絲流量 怎么提升…

【C語言小知識】getchar與putchar

getchar與putchar getchar介紹putchar介紹總結 在學習c語言階段存在著許多要求輸入數值的例子,在輸入字符時,如果使用scanf()和printf()根據%c轉換說明讀寫字符,接下來介紹一堆字符輸入/輸出函數:getchar()和putchar()。 getchar…

Andriod安裝termux并換源

問題匯總 Error: The repository ‘https://mirrors.tuna.tsinghua.edu.cn/termux/termux-package-24 stable Release’ does not have a Release file. 更換源(這里使用的是清華大學源) 打開文件 nano $PREFIX/etc/apt/sources.list手動修改 deb htt…

web學習筆記(七十八)

目錄 1.自定義子組件的配置 2. 自定義子組件生命周期函數 3.父子組件傳值 3.1 父傳子 3.2 子傳父 1.自定義子組件的配置 在components文件中可以創建子組件,首先需要創建一個文件夾,然后右擊文件夾選擇新建Component 選擇這個配置系統不會自動配置…

ssm“落雪”動漫網站-計算機畢業設計源碼81664

目 錄 摘要 1 緒論 1.1 研究背景 1.2 研究意義 1.3論文結構與章節安排 2系統分析 2.1 可行性分析 2.2 系統流程分析 2.2.1 數據新增流程 3.2.2 數據刪除流程 2.3 系統功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系統用例分析 2.5本章小結 3 系統總體設…

Golang | Leetcode Golang題解之第217題存在重復元素

題目: 題解: func containsDuplicate(nums []int) bool {set : map[int]struct{}{}for _, v : range nums {if _, has : set[v]; has {return true}set[v] struct{}{}}return false }

溫州網站建設方案及報價

隨著互聯網的發展,網站建設已經成為企業推廣和營銷的重要手段。溫州作為中國經濟發達地區之一,各行各業企業紛紛意識到網站建設的重要性,紛紛加大網站建設工作的投入。那么,溫州網站建設方案及報價是怎樣的呢?下面我們…

Python | Leetcode Python題解之第218題天際線問題

題目: 題解: class Solution:def getSkyline(self, buildings: List[List[int]]) -> List[List[int]]:buildings.sort(keylambda bu:(bu[0],-bu[2],bu[1]))buildings.append([inf,inf,inf])heap [[-inf,-inf,-inf]]ans []for l,r,h in buildings:i…