嵌入式學習筆記——day36-多路IO復用

一、基本概念

(服務器多客戶端模型)

定義:

? ? ? ? 單線程或單進程同時監測若干個文件描述符是否可以執行IO操作的能力

作用:

? ? ? ? 應用程序通常需要處理來自多條事件流中的事件,比如我現在用的電腦,需要同時處理鍵盤鼠標的輸入、中斷信號等等事件,再比如web服務器如nginx,需要同時處理來來自N個客戶端的事件。

? ? ? ? 邏輯控制流在時間上的重疊叫做 并發(時間段是并行,但時間點上是串行的)

并行:

? ? ? ? 在一個時間點上同時運行。
? ??
? ? ? ? 而CPU單核在同一時刻只能做一件事情,一種解決辦法是對CPU進行時分復用(多個事件流將CPU切割成多個時間片,不同事件流的時間片交替進行)。在計算機系統中,我們用線程或者進程來表示一條執行流,通過不同的線程或進程在操作系統內部的調度,來做到對CPU處理的時分復用。這樣多個事件流就可以并發進行,不需要一個等待另一個太久,在用戶看起來他們似乎就是并行在做一樣。

使用并發處理的成本:
? ? ? ? 線程/進程創建成本
? ? ? ? CPU切換不同線程/進程成本 Context Switch ? ? ? ?

? ? ? (上下文切換:頁表、寄存器、緩存)
? ? ? ???多線程的資源競爭

? ? ? ?

有沒有一種可以在單線程/進程中處理多個事件流的方法呢?一種答案就是IO多路復用。

因此IO多路復用解決的本質問題是在用更少的資源完成更多的事。

二、IO模型?

1、阻塞IO ?
2、非阻塞IO ?EAGAIN ?忙等待 errno
3、信號驅動IO ?SIGIO 用的相對少(了解)
4、并行模型 進程,線程?

2.1阻塞IO?

最常用 默認設置

?

2.2非阻塞IO?

在阻塞IO的基礎上調整其為不再阻塞等待。
?? ? 在程序執行階段調整文件的執行方式為非阻塞:
?? ??? ??? ?===》fcntl() ===>動態調整文件的阻塞屬性?

int fcntl(int fd,         int cmd,         ... /* arg */ );操作對象    進行何種操作        看第二個參數是否需要

?? 功能:修改指定文件的屬性信息。
?? ?參數:fd 要調整的文件描述符
?? ??? ? ?cmd 要調整的文件屬性宏名稱
?? ??? ? ?... 可變長的屬性值參數。
?? ?返回值:成功 ?不一定,看cmd;?失敗 ?-1

1.獲得原設備狀態標志位

2.在原標志位基礎上加上 非阻塞

3.當是FILE *文件時,使用fileno,轉換為標志位

4.當寫0,是只讀

eg:修改文件的非阻塞屬性:
? ? ? ? int flag ;
? ? ? ? flag ?= fcntl(fd,F_GETFL,0); ?///獲取fd文件的默認屬性到flag變量中。
? ? ? ? flag ?= flag | O_NONBLOCK; ? ?///將變量的值調整并添加非阻塞屬性
? ? ? ? fcntl(fd,F_SETFL,flag); ? ? ? ///將新屬性flag設置到fd對應的文件生效。

? ? ? ? 以上代碼執行后的阻塞IO將變成非阻塞方式。

缺點:CPU占用率高??

2.3信號驅動IO(了解)?

文件描述符需要追加 O_ASYNC//信號通知 標志。
? ? 設備有io事件可以執行時,內核發送SIGIO信號。
? ??
? ? ? ? 1.追加標志
? ? ? ? int flag ;
? ? ? ? flag ?= fcntl(fd,F_GETFL,0);
? ? ? ? fcntl(fd,F_SETFL,flag | O_ASYNC); ? ?//設置為異步
? ? ? ? 2.設置信號接收者
? ? ? ? fcntl(fd,F_SETOWN,getpid());//常用設置
? ? ? ? 3.對信號進行捕獲
? ? ? ? signal(SIGIO,myhandle);

2.4并行模型?

?1.進程
?? ??? ?2.線程
?IO 多路復用 ===》并發服務器 ===》TCP協議?? ?
?? ??? ?3、select循環服務器 ===> 用select函數來動態檢測有數據流動的文件描述符?

2.5 IO多路復用

2.5.1 select函數

select:

?

  1. 創建fd集合
  2. 文件描述符加入集合
  3. select等待事件到來
  4. 找到對應的fd,進行讀寫操作
  5. 清除標志位
int select(int nfds, fd_set *readfds, fd_set *writefds,檢測讀            一般不檢測fd_set *exceptfds,錯誤struct timeval *timeout);超時控制,NULL為阻塞,填秒數/毫秒,都寫0,非阻塞工作,只掃一圈,都沒有準備好,返-1;

功能:完成指定描述符集合中有效描述符的動態檢測。
? ? ? ? ? 該函數具有阻塞等待功能,在函數執行完畢后
? ? ? ? ? 目標測試集合中將只保留最后有數據的描述符。

? ? 參數:nfds 描述符的上限值,一般是鏈接后描述符的最大值+1;
? ? ? ? ? ? ? ?readfds 只讀描述符集
? ? ? ? ? ? ? ?writefds 只寫描述符集
? ? ? ? ? ? ? ?exceptfds 異常描述符集
? ? ? ? ? ? ? ?以上三個參數都是 fd_set * 的描述符集合類型
? ? ? ? ? ? ? ?timeout ?檢測超時 如果是NULL表示一直檢測不超時 。

? ? 返回值:超時 0
? ? ? ? ? ? ? ? ? 失敗 ?-1
? ? ? ? ? ? ? ? ? 成功 >0

為了配合select函數執行,有如下宏函數:
? ? ? ? void FD_CLR(int fd, fd_set *set);
? ? ? ? 功能:將指定的set集合中編號為fd的描述符號刪除。

? ? ? ? int ?FD_ISSET(int fd, fd_set *set);//是否就緒
? ? ? ? 功能:判斷值為fd的描述符是否在set集合中,
? ? ? ? ? ? ? 如果在則返回真,否則返回假。

? ? ? ? void FD_SET(int fd, fd_set *set);
? ? ? ? 功能:將指定的fd描述符,添加到set集合中。

? ? ? ? void FD_ZERO(fd_set *set);
? ? ? ? 功能:將指定的set集合中所有描述符刪除。?

?

2.5.2 epoll函數?

epoll:

?

創建fd集合(二叉樹)
加入關心的文件描述符
epoll_wait ? ? ? ? ? ? ? ? 當 epoll_wait 成功時,它返回準備就緒的文件描述符的數量,如果超時則返回 0。如果發生錯誤,則返回 -1 并設置相應的 errno。
epoll把準備就緒的fd放入rev集合(數組)

1.int epoll_create(int size);

2.int epoll_ctl(int epfd, ? ? ? int op, ? ? ? ? int fd, ? ? ? ? struct epoll_event *event);

? ? ? ? ? ? ? ? ? ? ? ? 哪個集合 ? 何種操作 ? ? ? ? ? 放入誰 ? ? ? ?監視事件,用戶自定義變量

3.int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?-1?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?0 非阻塞

epoll 解決了select和poll的幾個性能上的缺陷:

①不限制監聽的描述符個數(poll也是),只受進程打開描述符總數的限制;

②監聽性能不隨著監聽描述 符數的增加而增加,是O(1)的,不再是輪詢描述符來探測事件,而是由描述符主動上報事件;

③使用共享內存的方式,不在用戶和內核之間反復傳遞監聽的描述 符信息;

④返回參數中就是觸發事件的列表,不用再遍歷輸入事件表查詢各個事件是否被觸發。
epoll顯著提高性能的前提是:監聽大量描述符,并且每次觸發事件的描述符文件非常少。
epoll的另外區別是:①epoll創建了描述符,記得close;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?②支持水平觸發和邊沿觸發。

?僅TCP使用(由對方的通信套接字)

getpeername函數是一個網絡編程中常用的函數,它用于獲取與某個套接字關聯的遠程協議地址。這個函數在網絡通信中非常有用,尤其是在需要獲取連接對方的IP地址和端口號時。

int getpeername(int sockfd, struct sockaddr *peeraddr, socklen_t *addrlen);

sockfd 是需要獲取遠程協議地址的套接字描述符。

peeraddr 是一個指向struct sockaddr結構的指針,該結構將被填充遠程地址信息。

addrlen 是一個指向socklen_t類型的變量,初始時表示peeraddr指向的緩沖區的大小,函數返回時,它包含遠程地址的實際大小。

getpeername(conn,(SA),&cli,&len);

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

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

相關文章

微服務數據一致性技術解析:從單體到微服務的數據困局

關鍵詞: 微服務數據一致性, 企業應用, 技術架構, 最佳實踐 本文基于多位資深架構師在大型互聯網公司的實戰經驗總結,希望能為正在進行微服務改造的團隊提供有價值的參考。如果您在實踐中遇到問題,歡迎交流討論! 目錄 一、引言:從…

華為云Flexus+DeepSeek征文 | 基于華為云ModelArts Studio搭建Chatbox AI聊天助手

華為云FlexusDeepSeek征文 | 基于華為云ModelArts Studio搭建Chatbox AI聊天助手 引言一、ModelArts Studio平臺介紹華為云ModelArts Studio簡介ModelArts Studio主要特點 二、Chatbox介紹Chatbox簡介主要特點 三、安裝Chatbox應用下載Chatbox軟件安裝Chatbox工具 四、開通Deep…

基于cpolar的GPT-SoVITS遠程訪問實踐過程

文章目錄 前言1.GPT-SoVITS V2下載2.本地運行GPT-SoVITS V23.簡單使用演示4.安裝內網穿透工具4.1 創建遠程連接公網地址 5. 固定遠程訪問公網地址 前言 在人工智能技術持續革新之際,語音合成領域涌現出突破性進展。由開發者團隊"花兒不哭"研發的GPT-SoVI…

Redis數據結構之HyperLogLog

本文作者沒有設置VIP可見,并首發在我的博客:https://blog.liuzijian.com/post/redis-data-structure-hyperloglog.html 目錄 1.概述2.常用命令2.1 添加元素2.2 返回基數估算值2.3 合并hyperloglog 3.總結 1.概述 基數統計是一種去重復統計功能的基數估計…

django調用 paramiko powershell 獲取cpu 核數

在 Django 應用中使用 paramiko 庫通過 SSH 連接到遠程服務器并執行命令(例如獲取 CPU 核數)是一個常見的需求。下面是一個如何實現這一過程的步驟指南: 步驟 1: 安裝必要的庫 首先,確保你的 Django 項目中安裝了 paramiko 庫。如…

08-Python文件處理

08-Python文件處理 一、打開關閉文件 可以用 file 對象做大部分的文件操作。 file()在python3中已經被廢除,使用open()打開文件 open 函數 先用open()打開一個文件,創建一個file 對象,再用相關方法才可以調用它進行讀寫。 語法 file ob…

增強現實—Multimodal text style transfer for outdoor vision-and-language navigation

🌟🌟 歡迎來到我的技術小筑,一個專為技術探索者打造的交流空間。在這里,我們不僅分享代碼的智慧,還探討技術的深度與廣度。無論您是資深開發者還是技術新手,這里都有一片屬于您的天空。讓我們在知識的海洋中…

黑馬程序員新版Linux學習筆記——第二部分 基礎命令

一、Linux目錄結構 二、命令基礎 三、ls 列目錄內容 3.1 命令 3.2 參數 3.3 總結 四、cd 切換工作目錄 4.1命令 五、pwd 查看當前工作目錄 5.1命令 六、相對路徑、絕對路徑、特殊路徑符 七、mkdir 創建目錄命令 7.1命令 八、touch、cat、more 文件操作命令 8.1 touch 8.2c…

日常運維問題匯總-25

76.銷售訂單交貨單狀態更新 實務中偶有發生交貨已完成,無需開票或開票已經完成,交貨單狀態為:處理中,且仍然出現在VF04中,如下圖所示: 解決方法: T-CODE:VL_COMPLETE,可對錯誤的DN狀態進行更新…

【2025 年】軟件體系結構考試試卷-期末考試

2025 年軟件體系結構考試試卷 考試學期:2025 考試形式:閉卷 考試時間:120 分鐘 年級:______ 專業:軟件工程 班級:______ 一、單選題(每小題 1.5 分,共 24 分) 關于策略…

4.查看、刪除數據庫

1.顯示所有數據庫 SHOW DATABASE 2.顯示數據庫創建語句 SHOW CREAT DATABASE db_name 例如想查看某個數據庫是怎樣創建的,用的什么字符集啥的。 3.數據庫刪除語句【慎用】 DROP DATABASE [IF EXISTS] db_name 刪除某個數據庫之前一定要確定是否進行了備份。

設計模式 - 原型模式

原型模式(Prototype),在制造業種通常是指大批量生產開始之前研發出的概念模型,并基于各種參數指標對其進行檢驗,效果達到了質量要求,即可參照這個原型進行批量生產。即,原型模式可以用對象創建對…

MySQL數據庫基礎:從零開始的第一步【Linux】

前言 各位小伙伴們,好久不見!近期,我的文章更新頻率確實有些緩慢,在此誠摯地向大家道歉。這個月是我的期末考試月,正處于緊張的復習(也可以說是重新學習)階段。盡管學業繁忙,但我依然…

502 Bad Gateway:服務器作為網關或代理時收到無效響應處理方式

502 Bad Gateway 錯誤是 Web 開發和服務器管理中常見的問題,通常表示網關或代理服務器收到無效響應。這種錯誤可能由多種原因引起,包括后端服務故障、網絡問題或配置錯誤等。了解502錯誤的原因及其處理方式,對于維護網站的可用性和用戶體驗至…

Abel 變換,離散型分部積分

文章目錄 零、引入:分部積分一、Abel 變換1.1 Abel 變換1.2 證明 二、一些比較淺顯的應用2.1 等差 乘 等比型求和2.2 平方求和公式2.3 不等式證明 三、一些算法題的式子優化3.1 3500.將數組分割為子數組的最小代價3.2 D. Array Splitting3.3 300. 任務安排1 零、引入…

火山 RTC 引擎12----合流轉推 集成

一、火山、網易 合流轉推集成 1、 首次先要startPush,要不然,推不了流 void NRTCEngine::PushToCDN(std::string taskID, std::string url) {if (m_video == nullptr) return;bytertc::IMixedStreamConfig* config = getMixedStreamConfig(url);int ret = m_video->star…

基于STM32設計的物聯網疫苗冷鏈物流監測系統

文章目錄 一、前言1.1 項目介紹【1】項目開發背景【2】設計實現的功能【3】項目硬件模塊組成【4】設計意義【5】國內外研究現狀(1)國內研究現狀(2)國外研究現狀(3)技術演進趨勢分析(4)現存技術缺口(5)關鍵案例技術對比表【6】摘要1.2 設計思路1.3 系統功能總結1.4 開…

音頻中采樣率和幀是什么?怎么理解?

視頻中的“幀”是指一張圖片,那么在音頻中,“幀”的含義就完全不同了。理解音頻中的“幀”概念,對做音視頻處理、流媒體開發非常關鍵。 一、聲音是怎么采集的? 音頻采集是指通過麥克風等設備捕捉周圍環境中的聲波,并…

第三方檢測護航軟件登記:企業合規的技術通行證與市場信任基石

一、軟件產品登記測試:合規化的必經之路 根據《軟件產品管理辦法》,所有上市軟件必須通過第三方檢測機構的專業評估,確保功能、性能、安全性等指標符合國家標準(如GB/T 25000系列)。這一強制性要求不僅規避了法律風險…

產品頁不被收錄的6個技術原因(非重復內容/爬蟲限制類)

頁面未被收錄的原因可能藏在代碼架構或服務器配置中 比如爬蟲無法“看懂”你的動態內容,或是某個參數設置錯誤導致頁面被判定為重復。 本文從技術排查角度出發,整理6個最易被忽視但直接影響收錄的實操問題。 頁面加載速度拖慢爬蟲抓取 例如&#xff0…