BIO一个线程对应一个连接,读取时阻塞,直到有数据返回。NIOselectApplication知道发生了I/O时间,但不知道是哪些流,所以只能轮询所有Stream读取的数据,时间复杂度O(n),同时处理的流越多,时间越长,有一个最大连接数限制pollapplication将文件描述符数组复制到内核空间,内核轮询每个fd对应的设备状态,时间复杂度O(n),不限制最大连接数,基于链表存储文件描述符fdepoll事件驱动,epoll会通知我们发生了哪个stream和什么I/O事件,首先通过create函数实例创建一个epoll,然后使用ctladd/delete函数添加删除事件类型为在epoll实例上监听,调用wait函数等待事件发生,当事件发生时,内核会通知应用程序处理该事件,应用程序使用mmap文件读取流epoll,映射可以实现零在应用程序和内核空间中复制消息,减少复制开销。select、poll、epoll的区别一个进程的最大连接数:select:是,受linux最大连接数影响poll:否,基于链表存储epoll:有连接限制,但是数量非常大。1G内存的机器可以打开10万个连接,fd的IO效率大幅提升。选择:线性遍历,不管链接是否激活。调用回调,当活跃连接很少时,性能很好,但是当所有连接都活跃时,就会出现性能问题消息传递方式选择:内核和用户空间需要相互复制poll:同上epoll上面:通过mmap共享内存
