非同步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.根據檔名稱讀取檔案資訊 多埠監...