IO multiplexing 與 非阻塞網路程式設計

2022-07-03 16:39:14 字數 2249 閱讀 2606

使用i/o multipexing 的網路程式設計中,一般需要採用非阻塞網路程式設計的風格,防止服務端在處理高連線量大時候阻塞在某個檔案描述符上面,比如某個socket 有大量的資料需要寫,但是核心傳送緩衝區已經填滿,無法在一次write中將需要傳送到資料傳送出去,程式就會阻塞在該處,導致select/poll/epoll_wait() 此時不能處理其它到來的請求,同樣read或者accept也可能出現阻塞的情況,比如當客戶端發起connect,之後立刻關閉該鏈結,在服務端尚未呼叫accept之前就關閉了該連線,當後來服務端accept得以呼叫此時完成佇列中又沒有完成的三次握手的連線,accept就會導致程序睡眠(詳細情況可以參見unpv1非阻塞accept的描述)。因此i/o multiplexing 一般採用非阻塞網路程式設計的風格。

對於read/wirte 操作來說,如果採用了非阻塞程式設計則需要為每個connection配備應用層緩衝區,read端主要防止一次來到資料太多,write主要防止出現阻塞,可以把沒有傳送完成的資料寫入緩衝區,等到socket 可寫之後繼續傳送。如果在新一次write請求到來的時候,應用層寫緩衝區中還有之前未傳送完的資料,則應該先將上次未寫入核心的資料寫入核心緩衝區,保證傳送到順序性。此處給乙個簡單的例子。

#include #include 

#include

in.h>#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

select.h>

#define sever_port 1314

#define max_line_len 1024

using

namespace

std;

int accept(int fd, struct sockaddr_in *addr)

}return

connfd;

}int read(int fd, map &bufmap)

else

if( nrcv > 0

)

else

return

nrcv;

}int getsocketerror(int

fd)

else

}int

main()

listen(listenfd,

10);

fd_zero(&rset);

fd_zero(&wrset);

fd_zero(&allset);

fd_set(listenfd,&allset);

maxfd =listenfd;

maxid = -1

;

while(1

)

if(fd_isset(listenfd, &rset))

}printf(

"client[%d] = %d\n

",ix,connfd);

if( fd_setsize ==ix)

if( connfd >maxfd)

fd_set(connfd, &allset);

accepted++;

printf(

"accepted: %d\n

",accepted);

if(ix >maxid)

if(--nready == 0

)

}for(ix = 0; ix <= maxid; ix++)

if(fd_isset(sockfd,&rset))

else

if ( nrcv > 0

)

}printf(

"nwrt = %d \n

",nwrt);

if(nwrt == nrcv) //

全部寫到了核心緩衝區

}else

//還有剩餘

}else

}if(fd_isset(sockfd,&wrset))

printf(

"write complete! \n");

}else

}if(--nready == 0

) }}

return0;

}

SQL與NoSQL MySQL與NoSQL的融合

寫這一篇內容的原因是mysql5.6.2突然推出了memcached的功能。nosql to innodb with memcached的出現,可以看出nosql對關聯式資料庫的確產生了巨大的影響,個人覺得這是乙個非常大的進步,可以讓開發人員更加方便的使用nosql和關聯式資料庫。nosql一般被認...

指標與陣列 a與 a區別

假設宣告了乙個陣列a,則 a表示陣列a的首位址,a與 a 0 表示陣列a首元素的首位址,那麼 a 1與a 1有哪些區別呢?通過下面的實驗來說明。int i 0 int a 5 int p int a 1 for i 0 i 5 i printf a 0x p,a 0x p,a 1 0x p n a,...

apache與tomcat與weblogic對比

apache,tomcat,weblogic都是常用的中介軟體,發布 等應用都離不開這些好東東。強大程度對比apache 新手容易將apache與tomcat混亂。apache與tomcat都是同乙個公司生產的,apache是輕量級的,tomcat是企業級的。apache一般與php mysql等整...