select、poll、epoll都是IO多路复用。
I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。
select的缺点
每次调用select,都需要将进程加入到所有fd的等待队列,每次唤醒都需要从每个队列中移除; 每次都需要将fd集合从用户态传递给内核;进程被唤醒后,程序并不知道哪些fd就绪,还需要再比遍历一次;
因为遍历开销较大,默认只能监视1024个fd
poll
poll 和 select相似,只是fd集合的方式不同,但是解决了select文件描述符的最大上限
epoll(eventpoll)
功能分离, 将等待队列和阻塞进程分开。
create-创建结构体(eventpoll),ctl-增删fd, wait-唤醒
新增就绪队列
内核维护一个就绪列表,引用就绪的fd,就能避免一次遍历
epoll工作方式:创建eventpoll, 通过ctl增删fd,若fd就绪后,调用回到函数将就绪fd放入就绪列表中,并唤醒在wait中进入睡眠的进程(select 和poll 不断轮询是否有就绪fd) ,wait只需判定列表是否为空,不需要遍历整个fd。
select 和 poll 每次进行等待状态时,都需要将进程挂载在所有监视fd的等待列表里;fd就绪时再解挂
参考:
Epoll原理 https://blog.csdn.net/armlinuxww/article/details/92803381
select、poll、epoll优缺点 https://blog.csdn.net/qq_35433716/article/details/82588619
标签:遍历,epoll,fd,poll,就绪,select 来源: https://www.cnblogs.com/wangsong412/p/12019131.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。