IO多路复用的三种常用方法:select,poll和epoll

IO事件的特点是当不满足某些条件时会阻塞,当程序运行碰到阻塞IO时,会等待阻塞结束再继续运行。如果有很多IO事件,当前事件是阻塞状态,但是第二个IO事件是非阻塞状态可以直接执行的,程序还是会等第一个IO事件运行结束再执行第二个IO事件。要是此时第二个IO事件又变成阻塞状态了,程序又要等待它阻塞结束,这样是很浪费时间的,明明可以先执行不阻塞的IO事件效率最高。

IO多路复用有效地解决了这一尴尬的难题,其基本原理是应用程序把所有待执行的IO事件交给操作系统内核,然后由内核轮询这些IO事件,碰到准备就绪的再返给应用程序执行。通常使用select,poll和epoll这三种方法实现IO多路复用,其中select方法跨平台性最强,Windows、Unix、Linux都能使用。poll方法在Unix、Linux都能使用。epoll只能在Linux环境下使用。

其中epoll效率是最高的,因为select和poll都是把待执行IO事件先放在应用程序的一个列表里,再一起映射给内核,内核轮询完以后,返回给应用的也是整个列表,而epoll是直接把待执行IO事件交给内核处理,内核处理完返回的只有其中准备就绪的IO事件,所以效率极高。而且epoll是支持边缘触发的,而其它两种方法只支持水平触发。边缘触发指的是当内核把准备就绪的IO事件返给应用时,如果下次轮询到此事件时该事件没有发生任何的变化(说明应用还没有做任何处理),即使该事件还是准备就绪也不会返回给应用。而水平触发是内核每次轮询到准备就绪的IO事件都会返给应用,无论应用是否处理过(也许来不及处理,也许不想处理)。

猜你喜欢

转载自blog.csdn.net/qq_43435274/article/details/103554436
今日推荐