Linux IO同步復用

2021-10-10 01:21:00 字數 1570 閱讀 1225

io復用通過時分復用的形式,多個socket連線使用同乙個io執行緒,io執行緒通過系統呼叫的方式獲知被監視的檔案識別符號列表中就緒的檔案,執行io操作。這裡的同步指代在執行io操作時,會等待動作完成再繼續執行,復用是採取乙個執行緒完成對多個io流的處理。

linux中poll方式是對select的改進,select存在乙個檔案描述符監視數量上限,即1024  而改進的poll去除了該上限。

poll方式維護乙個監聽陣列,陣列中的元素是乙個結構體,結構體形式如下:

struct pollfd

通過判斷events 與 revents是否相同即可確認是否有監聽的事件發生。

系統呼叫poll函式

int poll(pollfd* fds,nfds_t size,int timeout)  fds即為監聽陣列
伺服器**:

create_server建立監聽socket部分邏輯相同

處理poll陣列邏輯:

int poll_operator(struct pollfd* pfd,int* index,int maxnum)

; struct sockaddr_in addr;

//pfd[0] 即為監聽socket的檔案描述符

if(pfd[0].revents & pollin) //這裡每次進來都檢視 監聽fd是否有新連線訊息

;struct epoll_event event;

memset(str,0,sizeof(str));

ret=recv(clientfd,str,size-1,0);

if(ret<=0)

{cout<

int main()

{ int ret=0;

int sock_fd=0;

int epollfd=0;//指向核心檔案監視鍊錶符號

sock_fd=create_server(addr,sport);//建立伺服器 監聽fd

if(0>sock_fd)

{cout<

{for(int i=0;i執行演示:

另外 epoll在註冊事件event時,可以設定其觸發模式:

由此可見:

epoll是通過建立乙個核心監視檔案鍊錶,同時向監視檔案鍊錶中新增或者刪除我們需要監視的檔案。每當執行epoll_wait系統呼叫時,將僅僅返回那些就緒的檔案事件,下一步就可以基於此進行io操作,另外還可以指定邊緣觸發或者水平觸發,它們代表著當檔案io沒有執行完全後下一次呼叫是否會通知。相比較與select epoll有以下優勢:

io復用基於乙個io處理執行緒,同時管控著多個網路連線,在大大提高伺服器吞吐能力,同時linux的epoll基於之前的select poll基礎上進一步改進,大大提高了使用者執行緒獲知就緒網路檔案的速度

Linux IO同步復用

關於同步與非同步 同步 呼叫者在執行乙個呼叫時,一直等待呼叫完成返回後才進行後續操作。非同步 呼叫者執行乙個呼叫時,立即返回,繼續進行後續操作而不關心呼叫是否完成。非同步與同步是對通訊機制的描述,而阻塞 非阻塞關心的是呼叫者的狀態 阻塞 當執行乙個呼叫時,呼叫者執行緒一直被掛起 cpu時間片切換給其...

Linux IO多路復用

一.select 函式 include include include int select int n,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout fd clr int fd,fd set set f...

Linux I O復用技術 poll

1.介紹 poll函式的作用是檢測一組 socket 中某個或某幾個是否有 事件 就緒,即可讀 可寫。在linux平台下的poll定義如下 include int poll struct pollfd fds,nfds t nfds,int timeout 引數 struct pollfd 對於st...