BIO和NIO的區別和原理

来源:https://www.cnblogs.com/reim/archive/2022/12/09/16968278.html
-Advertisement-
Play Games

大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家講的是國內外串列NOR Flash廠商官網Cross Reference功能。 串列 NOR Flash 是一個相對發展穩定的市場,目前全球市場約 90% 的份額被中國的三家廠商(Winbond華邦/MXIC旺巨集/GigaDevice兆易創新) ...


BIO

BIO(Blocking IO) 又稱同步阻塞IO,一個客戶端由一個線程來進行處理

img

當客戶端建立連接後,服務端會開闢線程用來與客戶端進行連接。以下兩種情況會造成IO阻塞:

  1. 服務端會一直阻塞,直到和客戶端進行連接
  2. 客戶端也會一直阻塞,直到和服務端進行連接

基於BIO,當連接時,每有一個客戶端,服務就開啟線程處理,這樣對資源的占用時非常大的;如果使用線城市來做優化,當大量連接時,服務端也會面臨無空閑線程處理的問題。那麼怎麼設計才能讓單個線程能夠處理更多請求,而不是一個。所以NIO就被提出。

NIO

NIO(Non Blocking IO)又稱同步非阻塞IO。伺服器實現模式為把多個連接(請求)放入集合中,只用一個線程可以處理多個請求(連接),也就是多路復用。

NIO有3大核心組件:

  1. Buffer:緩衝區,buffer 底層就是數組
  2. Channel:通道,channel 類似於流,每個 channel 對應一個 buffer緩衝區
  3. Selector:多路復用器,channel 會註冊到 selector 上,由 selector 根據 channel 讀寫事件的發生將其交由某個空閑的線程處理

img

這樣就大大提升了連接的數量,用於接收請求。

NIO目前有三個函數(模型)

  • select
  • poll
  • epoll

Select函數

Select 是Linux提供的一個函數,可以將一批fd一次性傳遞給內核,然後由內核去遍歷,來確定哪個fd符合,並提供給用戶空間

img

Select 函數處理過程

  1. 將用戶空間的fd數組拷貝到內核空間
  2. 內核空間會遍歷fd數組,查看是否有數據到達
    1. 遍歷所有fd,將當前進程掛到每個fd的等待隊列中
    2. 當設備收到一條消息(網路設備)或填寫完文件數據(磁碟設備)後,會喚醒設備等待隊列上睡眠的進程,隨後當前進程就會被喚醒
  3. 遍歷完成後,如果有數據到達,返回有數據到達的fd的數量,並對用戶空間的fd標記
  4. 如果無數據到達,則當前進程進入睡眠,當有某個fdI/O事件或當前進程睡眠超時後,當前進程重新喚醒再次遍歷所有fd文件
  5. 用戶空間再此迴圈遍歷,沒有標記fd 不處理,只有標記fd才會去處理

Select存在的問題

  1. fd數量有限制:單個進程所打開的fd是有限制的,通過 FD_SETSIZE 設置,預設1024
  2. fd拷貝耗時:每次調用 select,需要將fd數組從用戶空間拷貝到內核空間
  3. 內核空間遍歷耗時:內核空間通過遍歷的方式,查看fd是否有數據到達,這是一個同步的過程
  4. 找到fd後,返回的是數量,而不是fd本身select返回的是fd的數量,具體是哪個還需要用戶自己遍歷

Poll函數

Poll 也是Linux提供的內核函數,pollselect 基本是一致,唯一的區別在於它們支持的fd的數量不一致

  • select : 只能監聽 1024 個fd
  • poll :無限制,操作系統支持多少,poll 就可以支持多少

Epoll函數

poll解決了select函數的fd數量問題,而epoll解決了selectpoll函數其餘問題:

  1. fd數量有限制poll已經解決此問題
  2. fd拷貝耗時:內核空間種保存一份fd數組,無需用戶每次都重新傳入,只需要告訴內核修改的部分即可
  3. 內核空間遍歷耗時:內核空間不再通過遍歷的方式找fd,而是通過非同步 IO 事件喚醒
  4. 找到fd後,返回的是數量,而不是fd本身:內核空間會通過非同步 IO 事件,將fd返回給用戶,用戶無需在遍歷整個fd數組

img

因此,epoll提供3 個函數,來處理上述改進的方案:

  1. epoll_create:創建 epoll 句柄
  2. epoll_ctl:向內核空間添加,修改,刪除需要監控的fd
  3. epoll_waitepoll_pwait:類似 select 函數

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • JZ36 二叉搜索樹與雙向鏈表 描述 輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表 註意: 1.要求不能創建任何新的結點,只能調整樹中結點指針的指向。當轉化完成以後,樹中節點的左指針需要指向前驅,樹中節點的右指針需要指向後繼 2.返回鏈表中的第一個節點的指針 3.函數返回的TreeNo ...
  • 類模版std::function是一種通用、多態的函數封裝。std::function的實例可以對任何可以調用的目標實體進行存儲、複製、和調用操作,這些目標實體包括普通函數、Lambda表達式、函數指針、以及其它函數對象等。std::function對象是對C++中現有的可調用實體的一種類型安全的包 ...
  • Listener記憶體馬 0x01Lintener機制分析 Java Web 開發中的監聽器(Listener)就是 Application、Session 和 Request 三大對象創建、銷毀或者往其中添加、修改、刪除屬性時自動執行代碼的功能組件。 Listener 三個域對象 ServletCo ...
  • 就像黑火藥時代里突然誕生的核彈一樣,OpenAI的ChatGPT語言模型的橫空出世,是人工智慧技術發展史上的一個重要里程碑。這是一款無與倫比、超凡絕倫的模型,能夠進行自然語言推理和對話,並且具有出色的語言生成能力。 ...
  • 前言 之所以會搞這個手勢識別分類,其實是為了滿足之前群友提的需求,就是針對稚暉君的ElectronBot機器人的上位機軟體的功能豐富,因為本來擅長的技術棧都是.NET,也剛好試試全能的.NET是不是真的全能就想著做下試試了,MediaPipe作為谷歌開源的機器視覺庫,功能很豐富了,而且也支持c++, ...
  • 一:背景 1. 簡介 .NET 高級調試要想玩的好,看懂彙編是基本功,但看懂彙編和能寫點彙編又完全是兩回事,所以有時候看的多,總手癢癢想寫一點,在 Windows 平臺上搭建彙編環境不是那麼容易,大多還是用微軟的 MASM + DosBox 搭一個 8086 的環境,這玩意距今快 50 年了。 在以 ...
  • 原文鏈接 [https://www.cnblogs.com/densen2014/p/16964858.html] 在Blazor項目嵌入 pdf.js 時不能正確顯示中文,瀏覽器F12顯示如下錯誤 錯誤 l10n.js /web/locale/locale.properties not found ...
  • 大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家講的是存儲器大廠Micron的NOR Flash晶元特殊絲印設計(FBGA代碼)。 痞子衡之前寫過一篇文章 《J-Flash在Micron Flash固定區域下載校驗失敗的故事》,這篇文章里提及了 Micron 家的串列 NOR Flash 與 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...