多路Io复用是利用select、poll、epoll可以同时监察多个流的IO事件的能力,在空闲的时候会把当前线程阻塞,当有一个或多个流由IO事件发生时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll只是轮询那些真正发出了时间的流),并且一次顺序的处理就绪的流。
select:服务端一直在轮询、监听如果有客户端链接上来就创建一个连接放到数组A中,继续轮询这个数组,如果在轮询的过程中有客户端发生IO事件就去处理;select只能监视1024个连接(一个进程只能创建1024个文件);而且存在线程安全问题;
poll:在select的基础上做了许多修复,比如不限制监测的连接数;但是也有线程安全问题;
epoll:也是监测IO事件,但是如果发生IO事件,它会告诉你是哪个连接发生了事件,就不用再轮询访问。而且它是线程安全的,但是只有linux平台支持;
select
#include <sys/select.h>
int select (int maxfd + 1,fd_set *readset,fd_set *writeset,fd_set *exceptset,const struct timeval * timeout);
select()函数用于监视文件描述符的变化情况——读写或是异常,使用select可以完成非阻塞的IO操作。(select本身是阻塞的)
关键:利用select把文件描述符的监视工作交给内核态进行处理。