多路轉接介紹及代碼實現

目錄

1.多路轉接技術的產生背景

2.select

3.poll

3.epoll


1.多路轉接技術的產生背景

        一個技術的出現必然有它要解決的問題,那么多路轉接解決的問題是什么嗯?

        我們知道,一個進程里面有一個文件描述符表管理這個進程所打開的文件,我們進行網絡通信的時候,本質就是創建一個網絡文件進行通信,我們可能會同時多個文件進行通信。

        文件進行通信,不就是進行IO嗎?就要進行讀取,就要進行寫入,但是在網絡中,我們數據的發送需要時間,我們一個一個等就是串行的,效率低下,為了解決這種問題,我們提出多路轉接,就是OS提供系統調用,底層去同時等待多個fd,而非去等待一個fd,假如我們一秒一個文件準備就緒的概率是百分之一,如果我同時等待100個文件,理論上幾乎每秒都會有文件就緒,所以大大降低了我們等待的時間,我們IO抽象出來就是等待+拷貝,讀是一種拷貝,寫也是一種拷貝,通常,我們等待的時間是大于拷貝的時間,我們通過多路轉接的形式,不就可以降低等待的時間,單位時間內更多的數據被拷貝,效率提高。

        我們在代碼中的scanf不就是一種等待嗎?如果我的數據不輸入,它就一直在那里阻塞,當鍵盤數據準備就緒,觸發硬件中斷,通知操作系統去處理鍵盤的數據,這樣效率低下,我們等的時間太長了,所以我們要對我們讀取的文件進行非阻塞的設計。

鍵盤不就緒抽象出來就是讀的條件不就緒,我把文件設計成非阻塞模式,那么它就不會阻塞住。

fcntl的第一行是獲取選項,然后第二個是對fd的模式進行設計,采用|可以對模式進行添加。

如果我們的文件read條件不就緒就會出錯,這里就會引發兩種情況,一種是我的read真的出錯了,一種是我的read數據沒有準備好,沒有真的出錯,我們需要對這種情況進行處理。

在我們的read錯誤會返回對應的錯誤碼,我們可以用errno對錯誤碼進行提取,判斷,如果是讀的條件未就緒,我們就放行,讓它進行下一次檢查,如果寫端關閉read返回0,如果錯誤,返回小于0 的數,直接break;

errno是一個全局變量。

EINTR表示當我們正在讀取的時候,它進行了線程切換,導致我們讀到一半失敗了,再回來的時候可能就不再讀取了,我們還需要再次進行讀取。

#include<iostream>
#include<unistd.h>
#include<fcntl.h>
void setnoblock(int fd)
{int fl=fcntl(fd,F_GETFL);fcntl(fd,F_SETFL,fl | O_NONBLOCK);
}
int main()
{   setnoblock(0);//設置為非阻塞char buffer[64];while(true){int n=read(0,buffer,sizeof(buffer)-1);if(n>0){//   buffer[n]=0;printf("#%s",buffer);}else if(n==0){perror("read");break;}else {if(errno==EAGAIN){printf("你的數據沒有準備好,下次再來\n");//在這里下面的邏輯就可以做其他事情了。sleep(1);continue;}else if(errno==EINTR){continue;}else{perror("read");break;}}}return 0;
}

2.select

        知道了多路轉接的來源之后,我們了解多路轉接就是為了提高IO效率而誕生的,所以我們來介紹一下具體的系統為我們提供的接口select。IO=等+拷貝,select為了降低等的時間而誕生。

是一種具體的方案,而不是一種抽象的所謂的降低等的效率的抽象概念。這里認為任何抽象的概念都應該建立在具體的實現上面,沒有實踐理解, 怎么理解這么抽象的概念?

、、   它的功能是監視有沒有文件描述符發生變化。

sel

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

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

相關文章

《sklearn機器學習——回歸指標1》

skearn.metrics模塊實現一些損失函數&#xff0c;評分&#xff0c;并且應用函數去測度回歸標簽。其中一些已經改進&#xff0c;可以處理多指標案例&#xff1a;mean_squared_error&#xff0c;mean_absolute_error&#xff0c;explained_variance_score和r2_score。 這些函數使…

消息存儲機制-索引文件及頁緩存

對于生產者來說&#xff0c;將消息寫到commit log文件里面。這里會有消息的邏輯隊列&#xff0c;邏輯隊列里面保存了消息的偏移量。除了consumerquenue之外&#xff0c;它還會將數據分發到另外一個文件叫indexfile索引文件里面。這個索引文件可以保存消息的一些信息&#xff0c…

輾轉相除法(歐幾里得算法)的證明

歡迎訪問我的主頁: https://heeheeaii.github.io/ 輾轉相除法是一種用于計算兩個非負整數最大公約數的有效算法。它的證明主要分為兩個部分&#xff1a; 證明核心引理&#xff1a; gcd(a,b)gcd(b,amodb)證明算法的收斂性&#xff1a; 證明算法一定會在有限步內結束。 輾轉相除法…

RL【3】:Bellman Optimality Equation

系列文章目錄 文章目錄系列文章目錄前言Definition of optimal policyBellman optimality equationIntroductionMaximization on the right-hand sideContraction mapping theoremSolutionOptimalityAnalyzing optimal policies總結前言 本系列文章主要用于記錄 B站 趙世鈺老師…

有序數組,距離目標最近的k個數 二分查找

&#x1f914; 新手做題思路&#xff1a;第1步&#xff1a;理解題目- 找距離x最近的k個數- 數組已排序- 返回結果也要排序&#xff08;升序&#xff09;- 距離相同時&#xff0c;選擇較小的數第2步&#xff1a;關鍵insight- 數組已排序 → 考慮二分查找- 最近的k個數一定是連續…

學習心得分享

我認為知識是一定要系統化的學習&#xff0c;結構化梳理&#xff0c;這樣在運用或思考的時候&#xff0c;能夠回憶起自己在這一塊梳理的知識結構&#xff0c;如果有記錄那么能快速回憶并理解&#xff0c;如果沒有記錄&#xff0c;那么說明對自己來說超綱了&#xff0c;把知識進…

為什么說 Linode 和 DigitalOcean 的差距,不止于 VPS?

在今天這個全球化的商業戰場上&#xff0c;中國企業的出海已從“選擇題”變為“必答題”。當我們滿懷雄心&#xff0c;將產品和業務推向海外市場時&#xff0c;基礎設施的選擇&#xff0c;往往是決定成敗的第一步。它不僅關乎成本與性能&#xff0c;更直接影響著團隊的開發效率…

NSSCTF每日一題_Web_[SWPUCTF 2022 新生賽]奇妙的MD5

為了保持做題的感覺和持續學習&#xff0c;也就有了每日一題系列&#xff0c;選一些有意義的題目或者一些CTF新穎題目作為參考學習。[SWPUCTF 2022 新生賽]奇妙的MD51. 訪問首頁界面并進行分析估計題目MD5提示,查詢得知ffifdyop 這個字符串是一個奇妙的MD5字符串因為將“ffifdy…

服務器IP暴露被攻擊了怎么辦?

當服務器IP暴露后&#xff0c;可能會面臨各種網絡攻擊&#xff0c;如DDoS攻擊、端口掃描、惡意入侵等&#xff0c;這將嚴重影響服務器的正常運行和數據安全。本文將從檢測攻擊類型、采取緊急防護措施、優化服務器配置、尋求專業支持以及預防未來攻擊五個方面&#xff0c;詳細探…

TDengine 時間函數 TIMETRUNCATE 用戶手冊

TDengine TIMETRUNCATE 函數用戶使用手冊 函數概述 TIMETRUNCATE 是 TDengine 中的一個時間處理標量函數&#xff0c;用于將時間戳按照指定的時間單位進行截斷操作。該函數在時間數據聚合、分組和統計分析中非常有用&#xff0c;特別適用于智能電表等時序數據的分析場景。 語…

Linux電腦怎樣投屏到客廳的大電視?支持遠程投屏嗎?

一般的電腦投屏軟件都會推出Windows版本和macOS版本&#xff0c;雖然這兩個版本已經覆蓋大部分消費者的常用電腦&#xff0c;但是依然有一部分群體因為電腦系統版本問題不能使用投屏軟件。 如果你當前使用的是Linux系統的電腦&#xff0c;而且又要將電腦投屏投屏到客廳的大電視…

MP4視頻太大如何壓縮?分享6種簡單便捷的壓縮小技巧

隨著拍攝高清視頻的設備越來越多&#xff0c;我們經常會遇到MP4視頻文件體積過大的問題&#xff0c;無論是上傳到社交平臺、發送給朋友&#xff0c;還是存儲在設備中&#xff0c;過大的視頻文件都會帶來諸多不便。那么&#xff0c;MP4視頻太大怎么壓縮呢&#xff1f;本文將介紹…

k8s 部署 redis

創建部署文件 vim redis.yaml添加如下內容&#xff1a; apiVersion: v1 kind: Namespace metadata:name: redis --- apiVersion: v1 kind: Secret metadata:name: redis-passwordnamespace: redis type: Opaque data:password: d2d3cmhnZWE # 建議生產環境使用更復雜的密碼 ---…

FFMPEG H264

一、H264壓縮編碼1.1 H264 中的 I 幀、P幀和 B幀H264 使用幀內壓縮和幀間壓縮的方式提高編碼壓縮率&#xff1b;H264 采用了獨特的 I 幀、P 幀和 B 幀策略來實現&#xff0c;連續幀之間的壓縮&#xff1b;1.2 其他概念GOP&#xff08;圖像組&#xff09;&#xff1a;一個IDR幀到…

Unity 解決天空盒中間出現一條線

問題解決找到天空盒對應貼圖&#xff0c;在Inspector 面板中找到Advanced →Generate Mip Maps 并取消勾選即可。效果動態修改天空盒RenderSettings.skybox targetSkyboxMaterial; DynamicGI.UpdateEnvironment();

Python爬蟲實戰:研究Showcase模塊,構建電商平臺銷售數據采集和分析系統

1. 引言 1.1 研究背景 在數字經濟快速發展的今天,電商平臺積累了海量的商品信息、交易數據和用戶反饋,這些數據蘊含著豐富的市場洞察。根據中國電子商務研究中心數據,2024 年我國網絡零售市場規模突破 15 萬億元,平臺商品數據呈現指數級增長。如何高效提取這些數據并轉化…

C++中的Reactor和Proactor模型進行系統性解析

<摘要> 本解析系統闡述了網絡編程中Reactor與Proactor兩種高性能I/O模型的核心概念。Reactor基于同步I/O多路復用&#xff0c;通過事件循環分發通知&#xff0c;由應用層自行完成I/O操作&#xff1b;而Proactor則基于異步I/O&#xff0c;由操作系統完成I/O操作后主動回調…

【技術教程】如何將文檔編輯器集成至基于Node.js的網頁應用程序中

當今數字化時代&#xff0c;Web應用對在線文檔編輯的需求日益增長。無論是構建在線辦公系統、內容管理平臺還是協作工具&#xff0c;讓用戶能夠直接在瀏覽器中編輯和處理文檔已成為基本需求。 想知道如何為你的 Node.js 應用添加強大的在線文檔編輯功能嗎&#xff1f;本文手把…

[論文閱讀] 人工智能 + 軟件工程 | 別讓AI寫的代碼帶“漏洞”!無觸發投毒攻擊的防御困境與啟示

別讓AI寫的代碼帶“漏洞”&#xff01;無觸發投毒攻擊的防御困境與啟示 論文信息 原標題&#xff1a;Evaluating Defenses Against Trigger-Free Data Poisoning Attacks on NL-to-Code Models&#xff08;評估NL-to-Code模型應對無觸發數據投毒攻擊的防御方法&#xff09;主要…

【Windows】通過 runas 命令實現多用戶權限測試的完整流程

? 目錄 ?&#x1f6eb; 導讀需求1?? 前期準備&#xff1a;創建管理員/普通測試用戶1.1 創建普通用戶Test&#xff08;無管理員權限&#xff09;1.2 創建管理員用戶Admin&#xff08;含管理員權限&#xff09;2?? 核心操作&#xff1a;通過runas命令切換用戶命令行環境2.1…