描述符集select函数基本原理select函数.pptVIP

描述符集select函数基本原理select函数.ppt

  1. 1、本文档共16页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
描述符集select函数基本原理select函数

select函数 select的缺点: (1)select支持的文件描述符上限较小,一般是1024(可以通过修改FD_SETSIZE宏来扩大) (2)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大 (3)同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大 poll函数 函数原型: # include poll.h int poll ( struct pollfd * fdarray, unsigned int nfds, int timeout); struct pollfd { int fd; /* 文件描述符 */ short events; /* 等待的事件,作为调用值 */ short revents; /* 实际发生了的事件 ,作为返回结果*/ } ; poll函数 poll的机制与select类似,与select在本质上没有多大差别。 管理多个描述符也是进行轮询,根据描述符的状态进行处理。 和select相比,poll的优点是: 1)不再局限于FD_SETSIZE个监听描述符; 2)监听描述符集合不再是值结果参数,而是event表示监听事 revents表示触发的事件; 3)poll的效率比select稍高(poll只遍历输入的监听数组中的描述符,如果数组中的fd0,则poll忽略fd,当监听的描述符离散时效率稍高于select,比如监听0和100两个描述符,则poll只需要遍历两个描述符,而select需要遍历101个描述符;当监听描述符连续时,poll和select效率相当,底层实现也是一致的)。 epoll epoll解决了select和poll的几个性能上的缺陷: ①不限制监听的描述符个数(poll也是),只受进程打开描述符总数的限制; ②监听性能不随着监听描述符数的增加而增加,不再是轮询描述符来探测事件,而是由描述符主动上报事件; ③返回参数中就是就绪事件的列表,不用再遍历输入事件表查询各个事件是否就绪; ④使用共享内存的方式,不在用户和内核之间反复传递监听的描述符信息。 epoll显著提高性能的前提是:监听大量描述符,并且每次触发事件的描述符文件非常少。 epoll的另外区别是:①epoll创建了描述符,需close;②支持水平触发和边沿触发。 epoll epoll操作过程需要三个接口,分别如下: #include sys/epoll.h int epoll_create(int size); int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout); epoll int epoll_create(int size); 创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大。 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); epoll的事件注册函数,它不同与select()是在监听事件时告诉内核要监听什么类型的事件,而是在这里先注册要监听的事件类型。第一个参数是epoll_create()的返回值,第二个参数表示动作,用三个宏来表示: EPOLL_CTL_ADD:注册新的fd到epfd中; EPOLL_CTL_MOD:修改已经注册的fd的监听事件; EPOLL_CTL_DEL:从epfd中删除一个fd; 第三个参数是需要监听的fd, 第四个参数是告诉内核需要监听什么事, struct epoll_event结构如下: struct epoll_event { __uint32_t events; /* Epoll events */ epoll_data_t data; /* User data variable */ }; 我们毕业啦 其实是答辩的标题地方 I/O复用机制及常见的几种API 嵌入式2班 江纯杰 基本概念   while(read(STDIN_FILENO,buf,BUFSIZE)0) if(write(STDOUT_FILENO,buf,n)!=n) printf(error) 基本概念   

文档评论(0)

zhuwo + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档