IO复用技术
(1) select : 知道有I/O事件发生,但不知道是那个流,要无差别轮询所有流,所以时间复杂度为O(n)
(2) poll : 和select类似,没有最大连接数的限制,因为是他是基于链表存储的,O(n)
(3) epoll : epoll会把那个流发生什么I/O事件通知我们,时间复杂度为O(1)
当进程调用epoll_create方法的时候,会在linux内核创建一个epoll对象(epoll就是一个结构体)结构体中有一个红黑树和一个链表,用来存储epoll_ctl向epoll对象中添加的事件,这些事件都会挂到红黑树上,添加到epoll中的事件会和设备驱动程序建立回调关系,当事件发生时,将它存在链表中,当调用epoll_wait时,如果链表不为空,返回给用户。