- 1、本文档共12页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
linux下的常见多路复用技术
HYPERLINK /?sort=6 [C语言]post by HYPERLINK /?author=12 陈俊生 / 2012-1-4 9:25 Wednesday
要实现I/O多路复用有很多的方式,其中可以用进程或者是线程等来实现,也可以用select/poll /epoll/port等来实现。在相比两者之间,利用select/poll /epoll/port等来实现复用效率更快,实现更容易,在底层的需要的资源更少,效率更快。
下面就介绍一下select/poll /epoll/port等的具体用法。
Select的用法。
select原型:
int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
其中参数n表示监控的所有fd中最大值+1。和select模型紧密结合的四个宏,含义不解释了:
FD_CLR(int fd, fd_set *set);FD_ISSET(int fd, fd_set *set);FD_SET(int fd, fd_set *set);FD_ZERO(fd_set *set);
理解select模型的关键在于理解fd_set,为说明方便,取fd_set长度为1字节,fd_set中的每一bit可以对应一个文件描述符fd。则 1字节长的fd_set最大可以对应8个fd。(1)执行fd_set set; FD_ZERO(set);则set用位表示是0000,0000。(2)若fd=5,执行FD_SET(fd,set);后set变为0001,0000(第5位置为1)(3)若再加入fd=2,fd=1,则set变为0001,0011(4)执行select(6,set,0,0,0)阻塞等待(5)若fd=1,fd=2上都发生可读事件,则select返回,此时set变为0000,0011。注意:没有事件发生的fd=5被清空。
基于上面的讨论,可以轻松得出select模型的特点:(1)可监控的文件描述符个数取决与sizeof(fd_set)的值。我这边服务器上sizeof(fd_set)=512,每bit表示一个文件描述 符,则我服务器上支持的最大文件描述符是512*8=4096。据说可调,另有说虽然可调,但调整上限受于编译内核时的变量值。(2)将fd加入select监控集的同时,还要再使用一个数据结构array保存放到select监控集中的fd,一是用于再select返回 后,array作为源数据和fd_set进行FD_ISSET判断。二是select返回后会把以前加入的但并无事件发生的fd清空,则每次开始 select前都要重新从array取得fd逐一加入(FD_ZERO最先),扫描array的同时取得fd最大值maxfd,用于select的第一个 参数。(3)可见select模型必须在select前循环array(加fd,取maxfd),select返回后循环array(FD_ISSET判断是否 有时间发生)。
下面给一个伪码说明基本select模型的服务器模型:
array[slect_len];nSock=0;array[nSock++]=listen_fd;(之前listen port已绑定并listen)maxfd=listen_fd;while {FD_ZERO(set);foreach (fd in array) {fd大于maxfd,则maxfd=fdFD_SET(fd,set)}res=select(maxfd+1,set,0,0,0);if(FD_ISSET(listen_fd,set)){newfd=accept(listen_fd);array[nsock++]=newfd;if(--res=0) continue}foreach 下标1开始 (fd in array) {if(FD_ISSET(fd,set))执行读等相关操作如果错误或者关闭,则要删 除该fd,将array中相应位置和最后一个元素互换就好,nsock减一if(--res=0) continue}}
poll模型poll()系统调用是System V的多元I/O解决方案。它解决了select()的几个不足,尽管select()仍然经常使用(多数还是出于习惯,或者打着可移植的名义):poll的原型#include sys/poll.hint poll (struct pollfd *fds, unsigned int nfds, int timeout
文档评论(0)