網路IO之IO管理

2021-10-12 05:15:25 字數 2302 閱讀 4998

非同步io (asynchronous i/o)

訊號驅動io (signal driven i/o)

其他記錄在零聲學院所學的點點滴滴,方便後續檢視。歡迎提出問題!相互**

客戶端連線伺服器所產生的fd

當多個客戶端連線在伺服器時,如何判斷哪個有資料。

傳統做法:

1、開多執行緒

缺點:fd 做的不多

2、while迴圈receive所有io

缺點:當網路io成千上萬時,大量的時候是沒有資料的。

因此,專門用個元件(類似於select等多路復用),判別io裡面有沒有資料。

select

其實select就是利用位圖進行操作

主要**

// fd_set: 位圖。儲存所有fd的狀態,0和1

fd_set rfds, rest;

// 將所有的fd置0

fd_zero(&rfds);

// 將位圖上sockfd對應的狀態置1

fd_set(sockfd, &rfds);

int maxfd = sockfd + 1;

// 不斷檢測io裡面有沒有資料

while (1)

for (i = sockfd +1; i <= max_fd; i++) ;

int ret = recv(i, buffer, buffer_length,0);

if (ret < 0)

fd_clr (i, &rfds);

close(i);

} else if(ret == 0) else

if (-- nready == 0) break;

}}

總結:

epoll

概述:

類似於蜂巢快遞櫃, 快遞員往快遞櫃存快遞, 小區的人在快遞櫃拿快遞

重要函式

epoll_create(int size): 為小區請快遞員。建立跟節點

size :只有大於0和等於0的區別。傳一和十萬是一樣的。最初實現的時候是有意義的,為就緒佇列的長度
epoll_ctl(): 資訊的修改。 紅黑樹新增修改節點

epoll_wait(): 快遞員多長時間跑一下小區。多長時間抓就緒佇列裡的節點

實質

由紅黑樹和佇列組成。紅黑樹包含所有的fd, 佇列裡面包含的是有資料的fd, 也叫做就緒佇列。

紅黑樹和就緒佇列共享節點。當有資料時, fd加入就緒佇列。

et:邊沿觸發。無資料到有資料則觸發

lt:水平觸發。recvbuff裡面有資料就一直觸發

大塊資料(傳送資料大於recvbuff)建議用lt, 小塊資料建議et。

listen 的時候 建議用et。避免丟失少許客戶端的連線。用lt的話,accpect可能會丟。

總結:

poll

僅僅是把select函式裡的param2,param3,param4合在了一起。

訊號量與訊號

訊號量: pv操作

訊號: 給每個程序通知的訊號

舉例說明

kill -9 程序名字: 向程序傳送訊號

使用場景

當程序初始化連線資料庫,不可控條件退出時,可以用訊號函式捕獲或清空網路

其他

訊號處理函式具體是在核心態使用者態切換時呼叫的

相關函式

// 訊號與程序繫結

sigaction(sigio, &sigio_action, null);

// 給fd設定相關的引數,比如阻塞和非阻塞

fcntl(sockfd, f_setown, getpis());

檢測io是否有資料與讀寫資料這兩步操作不在乙個流程裡面

非阻塞:有沒有資料都返回

阻塞:有資料就讀取,沒有資料則不讀

網路程式設計學習 io模型之io多路復用

簡而言之,就是將準備要用的檔案描述符新增到一張表裡,然後讓select等待表裡的任一描述符準備就緒 就是可以執行了 然後執行那個已經準備就緒的檔案描述符,然後把其他的沒有準備好的檔案描述符全都刪除 援引知乎上的乙個解釋 int select int maxfdpl,fd set readset,fd...

網路IO控制

zlan6002 概述 zlan6002主要為rs485進行遠端數字量 模擬量的輸入輸出設計的。裝置相容modbus rtu協議,可以和組態軟體 plc等無縫連線。4路繼電器具有5a ac250v dc30v特性,可以驅動大電流裝置 4路di數字量輸入可以為幹接點或者溼節點 2路ai輸入可以為電流量...

網路IO 十八

route解析過程 1.獲取請求的url,2.根據請求方式獲取路由,3.在根據請求位址匹配相應的路由,並返回action,4.判斷執行的方法的型別 閉包 控制器 5.執行閉包 執行控制器 載入配置檔案 1.sa ir 根據指定目錄讀取目錄下面的檔案 2.獲取檔名稱 3.根據檔名稱讀取檔案資訊 多埠監...