五種網絡IO模型

目錄

前言

文件描述符

為什么要多種io模型

同步IO

1.阻塞IO

2.非阻塞IO

3.多路復用IO(事件驅動IO)

select:

poll:

epoll:

4.信號驅動IO

異步IO

區別


前言

文件描述符

首先我們了解一下文件描述符是什么:在linux下一切皆文件,進程是通過文件描述符(file descriptors)來訪問文件的,。默認有三個文件描述符:0(標準輸入),1(標準輸出),2(標準錯誤)。再打開一個新的文件的話,它的文件描述符就++。

為什么要多種io模型

網絡IO,會涉及到兩個系統對象,一個是用戶空間調用IO的進程或線程,另一個是內核空間的內核系統,比如發生IO操作read時,它會經歷兩個階段。

1.等待數據準備就緒2.將數據從內核拷貝到進程或線程中

因為在以上兩個階段上各有不同的情況,所以出現了多種網絡 IO 模型。

同步IO

1.阻塞IO

在linux下,所有socket默認都是阻塞的,我要向一個文件描述符做read操作,此時內核里沒有數據就緒,那么這個時候用戶進程就會阻塞,直到內核數據就緒了,會將數據從內核拷貝到用戶內存,然后返回結果,此時用戶進程解除阻塞狀態。

優點:開發簡單,在阻塞期間用戶線程掛起,掛起不會占用CPU資源。

缺點:不適合大并發,開銷會非常大。

但是如果有多個client阻塞IO就不適用了,所以引用了多線程,但是如果數據規模太大了,會很占用系統資源,而且線程和進程容易進入假死狀態。如果用線程池的話,數據規模非常非常大,線程池可能緩解部分壓力,但是不能解決所有問題,所以我們要引入其它io模型。

2.非阻塞IO

設置socket為非阻塞,如果內核還未將數據準備好,系統調用仍然會直接返回。我要向一個文件描述符做read操作,如果有數據,則成功讀取返回,如果沒有數據,也返回,但帶上錯誤碼。使用這種方式的話,我們做讀取,就必須每隔一段時間去看看,叫非阻塞輪詢檢測。

但是輪詢提高CPU占用率,并且系統也提供了select()多路復用模式,可以一次檢測多個連接是否活躍,所以非阻塞IO一般在特定場景使用。

優點:每次發起 IO 調用,在內核等待數據的過程中可以立即返回,用戶線程不會阻塞,實時性好

?缺點:多個線程不斷輪詢內核是否有數據,占用大量 CPU 資源,效率低。

3.多路復用IO(事件驅動IO)

單個進程/線程就可以同時處理多個IO請求,一個進程/線程可以監視多個文件句柄。

而多路復用IO利用了操作系統提供的一些機制,如select、poll、epoll,來同時監視多個I/O事件的狀態。

select:

底層是數組,采用輪詢,當用戶進程調用了 select(每次調用select()方法,都需要把 fd 集合從用戶態拷貝到內核態,并進行遍歷。),那么整個進程會被阻塞,一旦某個文件句柄就緒,select 就會返回。這個時候用戶進程再調用 read 操作,將數據從內核拷貝到用戶進程。

poll:

poll用鏈表方式存fd,沒有最大數量fd限制,其余和select一樣。

epoll:

只會返回就緒的文件描述符,而不是遍歷整個文件描述符集合。

紅黑樹方式存fd,沒有最大數量fd限制,可保存所有待檢測的socket,所以只需要拷貝一次,減少了內核和用戶空間大量的數據拷貝和內存分配,回調方式不是輪詢,不會因為fd增多性能下降。缺點:只能在Linux下工作。

這里補充一個知識點:

Reactor(反應堆),三部分組成,多路復用器(同時阻塞io socket),事件派發,事件處理(回調處理)。

4.信號驅動IO

內核將數據準備好的時候,使用SIGIO信號通知應用程序進行IO操作。

異步IO

用戶進程發起操作之后,就可以開始去做其它的事。而另一方面,當內核收到read后首先它會立刻返回,所以不會對用戶進程產生任何阻塞。然后內核會等待數據準備完成,然后將數據拷貝到用戶內存,然后會給用戶進程發送一個信號,告訴它操作完成了。

區別

阻塞IO,非阻塞IO,多路復用IO,信號驅動IO這四種的主要區別在第一階段,他們在第二階段是一樣的:數據從內核緩沖區復制到調用者緩沖區期間都被阻塞住。異步 IO 都是非阻塞。

同步和異步,看是誰把內核緩沖區數據拷貝到用戶緩沖區的,如果不是自己寫代碼實現的,那就是異步。

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

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

相關文章

【Python報錯】已解決AttributeError: ‘method‘ object has no attribute ‘xxx‘

解決Python報錯:AttributeError: ‘method’ object has no attribute ‘xxx’ 在Python中,AttributeError通常表明你試圖訪問的對象沒有你請求的屬性或方法。如果你遇到了AttributeError: method object has no attribute xxx的錯誤,這通常意…

批量處理腳本,用于刪除指定目錄下3天前的備份文件和日志。

echo off echo 刪除3天前的備份文件和日志 set SrcDirD:\home set DaysAgo3 echo 準備刪除3天前的備份文件和日志 forfiles /p %SrcDir% /d -%DaysAgo% /c "cmd /c del /f /q /a path && rd /s /q path" echo 正在執行刪除,請稍等…… set SrcDi…

奇跡MU最強法師介紹

1、黑龍波 釋放出深淵中的黑龍之魂,對一定范圍內的目標造成中等程度傷害。 奧義: 怒哮——法師釋放出深淵龍魂的怨怒之力,在電閃雷鳴中中咆哮的龍魂將對敵人額外造成少量傷害。 魂陣——法師利用法陣控制黑龍之魂進行更大范圍的攻擊&…

如何使用SeaFile文件共享服務器結合內網穿透將家中電腦變成個人云盤

文章目錄 1. 前言2. SeaFile云盤設置2.1 Owncould的安裝環境設置2.2 SeaFile下載安裝2.3 SeaFile的配置 3. cpolar內網穿透3.1 Cpolar下載安裝3.2 Cpolar的注冊3.3 Cpolar云端設置3.4 Cpolar本地設置 4.公網訪問測試5.結語 1. 前言 本文主要為大家介紹,如何使用兩個…

opt 優化

【整理】深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT條件 【amos注】:通俗易懂,讓人易于理解。

【Oracle篇】rman全庫異機恢復:從RAC環境到單機測試環境的轉移(第四篇,總共八篇)

💫《博主介紹》:?又是一天沒白過,我是奈斯,DBA一名? 💫《擅長領域》:??擅長Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式數據倉庫)、Linux,也在擴展大數據方向的知識面??…

【TensorFlow深度學習】深度學習中的損失函數種類與適用場景

深度學習中的損失函數種類與適用場景 深度學習中的損失函數種類與適用場景:精確度量模型誤差的藝術一、均方誤差(Mean Squared Error, MSE)二、交叉熵損失(Cross-Entropy)三、Hinge損失(Margin Loss&#x…

ROS RViz觀測傳感器數據

ROS RViz觀測傳感器數據 The Robot Visualization Tool 可視化工具 機器人傳感器采集到的數據都可以圖形化的顯示在這個軟件里,機器人運算處理的中間結果,和即將要執行的目標指示,比如機器人對空間中某個物體進行識別后,我們可以…

【Linux】Linux工具——make/Makefile

1.背景 會不會寫makefile,從一個側面說明了一個人是否具備完成大型工程的能力一個工程中的源文件不計數,其按類型、功能、模塊分別放在若干個目錄中,makefile定義了一系列的 規則來指定,哪些文件需要先編譯,哪些文件需…

Edge 工作區是什么?它都有哪些作用?

什么是工作區 Edge 工作區是什么?它是微軟 Edge 瀏覽器中的一個功能,在幫助用戶更好地組織和管理他們的瀏覽會話。通過工作區,用戶可以創建多個獨立的瀏覽環境,每個工作區內包含一組相關的標簽頁和瀏覽器設置。這使得用戶能夠根據…

SQL進階day9————聚合與分組

目錄 1聚合函數 1.1SQL類別高難度試卷得分的截斷平均值 1.2統計作答次數 1.3 得分不小于平均分的最低分 2 分組查詢 2.1平均活躍天數和月活人數 2.2 月總刷題數和日均刷題數 2.3未完成試卷數大于1的有效用戶 1聚合函數 1.1SQL類別高難度試卷得分的截斷平均值 我的錯誤…

開放式耳機十大品牌推薦!怎么選耳機看這六招!

隨著耳機廠家的瘋狂內卷,以前讓學生黨望其項背的千元耳機技術,紛紛被廠家下沉至百元耳機,是以2024年始,百元開放式耳機以新物種、價低格而爆火。看到身邊朋友爭相購買開放式耳機,既當耳飾,又當耳機&#xf…

分享:2024年(第12屆)“泰迪杯”數據挖掘挑戰賽成績公示

2024年(第12屆)“泰迪杯”數據挖掘挑戰賽歷時兩個月順利結束。競賽采用盲審(屏蔽參賽者信息;評審專家只能評閱非本區域作品;三位評閱專家同時評閱同一作品,超限調整后再取平均分),答…

redis做為緩存,mysql的數據如何與redis進行同步呢?

讓我們一步步來實現如何讓MySQL數據庫的數據和Redis緩存保持同步。想象一下,MySQL是一個大倉庫,存放著所有重要的貨物(數據),而Redis則像是一個快速取貨窗口,讓你能更快拿到常用的東西。為了讓兩者保持一致…

FC-135是一款受歡迎的32.768kHz晶振

KHZ中愛普生是以32.768KHZ最為出名的。32.768K晶振是一款數字電路板都要使用到的重要部件,有人比喻為電路板的冰發生器,也就是說心如果停止了跳動,那么電路板也將無法進行穩定的工作了,愛普生晶振FC-135是一款受歡迎的32.768KHz晶…

ALOS PALSAR 產品介紹

簡介 L1.0 產品 該產品由原始觀測數據(0 級)通過數據編輯(如位重新調整和添加軌道信息)生成。它是重建的、未經處理的信號數據,帶有輻射和幾何校正系數(附加但未應用)。 L1.1 產品 該產品由…

Java Web學習筆記13——JSON

JavaScript自定義對象 定義格式&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Js-對…

前端面試題日常練-day57 【面試題】

題目 希望這些選擇題能夠幫助您進行前端面試的準備&#xff0c;答案在文末 1. 在PHP中&#xff0c;以下哪個符號用于連接兩個字符串&#xff1f; a) b) . c) , d) : 2. PHP中的預定義變量$_SESSION用于存儲什么類型的數據&#xff1f; a) 用戶的輸入數據 b) 瀏覽器發送的…

前后端不分離與前后端分離的Java Web開發對比介紹

在現代Web開發中&#xff0c;前后端架構設計有兩種主要模式&#xff1a;前后端不分離和前后端分離。本文將詳細介紹這兩種模式&#xff0c;展示如何使用Spring Boot開發應用&#xff0c;并提供可運行的示例代碼。 前后端不分離的Java Web開發 在前后端不分離的架構中&#xf…

Linux 命令 `uniq`:去重利器

Linux 命令 uniq&#xff1a;去重利器 在 Linux 系統中&#xff0c;處理文本數據是日常任務中不可或缺的一部分。當我們面對大量重復的數據行時&#xff0c;如何高效地去除這些重復項成為了一個值得探討的話題。這時&#xff0c;uniq 命令就派上了用場。本文將介紹 uniq 命令的…