IO多路复用:select/poll/epoll
select
int select (int maxfds,fd_set * readfds,fd_set * writefds,fd_set * errorfds,struct timeval* timeout)
返回值:有變化的描述符,返回值大于零,且為描述符個(gè)數(shù);等于零,超時(shí)或者沒(méi)有變化的描述符;-1出錯(cuò)。
timeout參數(shù)
1)null時(shí),select將會(huì)一直阻塞,直到有監(jiān)聽(tīng)的描述符集合里面描述符發(fā)生了變化;
2)0時(shí),select 會(huì)立即返回,有無(wú)描述符發(fā)生變化都會(huì)立即返回;
3)大于零的值,指定超時(shí)時(shí)間,超出時(shí)間就返回;
?
Poll
int poll (struct pollfd* fds , unsigned int nfds , int timeout)
struct pollfd{
? ? int fd;
? ? short events;
? ? short revents;
}
返回值:大于零,返回revents中不為0的文件描述符個(gè)數(shù);等于零,超時(shí)或者沒(méi)有描述符就緒;-1,調(diào)用出錯(cuò)。
timeout參數(shù):
?
1)負(fù)數(shù),無(wú)限超時(shí);一直等待,直到一個(gè)指定的事件發(fā)生;? ?相當(dāng)于selsect中的NULL;
2)0;表示立即返回;無(wú)論是否有已經(jīng)準(zhǔn)備好的描述符;
3)大于零,指定等待的超時(shí)時(shí)間;超時(shí)后返回
?
?
epoll
創(chuàng)建epoll句柄
int epoll_create (int size);
向內(nèi)核注冊(cè),修改或者刪除 一個(gè)描述符
int epoll_ctl (int epfd, int operator , int fd , struct epoll_events * event?);
等待事件的產(chǎn)生
int epoll_wait (int epfd, struct epoll_events*events , int maxevents , int timeout);
timeout參數(shù):0立即返回,-1將永久阻塞直到有一個(gè)描述符有事件產(chǎn)生;大于零,指定超時(shí)時(shí)間
?
select、poll、epoll的區(qū)別
1)select : 描述符集合有上限,一般是1024/2048;每次需要線性遍歷描述符集合獲得描述符的事件狀態(tài),對(duì)于分布的比較稀疏的比較少的描述符,效率會(huì)很低;每次fd_set在select返回之后都會(huì)發(fā)生變化;需要重新初始化;但移植性比較好,在某些unix系統(tǒng)上不支持poll,超時(shí)時(shí)間精度比較高!
2)poll相對(duì)于select而言,描述符數(shù)量遠(yuǎn)遠(yuǎn)大于select,是喲個(gè)特定大小的數(shù)組來(lái)保存監(jiān)控的描述符,從而不受描述符值大小的影響;poll將監(jiān)控的輸入事件和輸出事件分開(kāi),允許在每次返回后,被監(jiān)控的文件數(shù)組可以被復(fù)用而不需要重新初始化;
3)epoll 使用一個(gè)文件描述符管理多個(gè)描述符。支持一個(gè)進(jìn)程打開(kāi)大數(shù)目的描述符,也即是描述符數(shù)量不受限制,對(duì)于支持上萬(wàn)連接的IM服務(wù)器而言,較為實(shí)用!上限是最大可以打開(kāi)的文件數(shù)目;IO效率不隨描述符的數(shù)量的增加而減少。在每個(gè)注冊(cè)到內(nèi)核的fd上實(shí)現(xiàn)了回調(diào)函數(shù),只有當(dāng)當(dāng)前socket活躍的時(shí)候才會(huì)去調(diào)用回調(diào)函數(shù),所以epoll只會(huì)對(duì)活躍的socket進(jìn)行操作(即事件驅(qū)動(dòng))。而select/poll要線性掃描所有的集合,導(dǎo)致效率下降。epoll將用戶關(guān)系的文件描述符的事件存放到內(nèi)核的事件表中,避免了用戶空間和內(nèi)核空間數(shù)據(jù)的多次拷貝
總結(jié)
以上是生活随笔為你收集整理的IO多路复用:select/poll/epoll的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 网络:窗口控制下的重发机制、流量控制
- 下一篇: 二分查找2