多路复用I/O
- 与客户端建立连接后,内核会为客户端分配一个fd(文件描述符,能标志一个客户端)
- 多路复用IO指内核监控客户端(fd)是否有数据到来,当我们知道有数据到来时,只需要调用多路复用的select/poll/epoll提供系统调用即可,将我们想知道的客户端(fd)传入,内核就会返回哪些客户端的数据准备好了。
- 原先是有几个fd,就进行几次系统调用,一次只能判断一个客户端(fd)是否有数据传输,频繁的从用户态和内核态中切换。现在允许传入多个fd,根据fd进行一次系统调用即可,大大降低了系统的开销。其中epoll效率最高。
- I/O多路复用通过一种机制,可以监视多个描述符,一旦某个描述符就绪,能通知程序进行相应的读写操作。
select
- 一次调用传入的fd数量有限(最多1024个,不同内核参数可能不同)
- 实现过程:每次调用select,都需要把fd集合从用户态拷贝到内核态,然后在内核中遍历传进来的所有fd,检查是否有数据可读,然后调用对应的系统调用,获得有数据达到的fd。最后将有数据到达的fd中的数据从内核态传到用户态做业务处理。
- 缺点:仅仅知道有IO发生了,但不知道是哪些fd,只能无差别的轮询当前所有fd,找出有IO的fd进行操作,因此时间复杂度O(n)。同时需要维护一个用来存放大量fd的数据结构,在用户态向内核态传递存放fd的