1. BIO
阻塞式IO,一个线程处理一个请求。
2. NIO
NIO模型.png
轮询器只需要一个线程就可以管理多个请求
轮询器有select和poll,select和poll的区别是fds的数量限制,select是有限制的,poll没有限制,其他的没有区别
遍历channel的状态由内核做,不需要来回切换用户态和内核态的上下文
只需要一次告诉内核我们需要遍历的所有通道的fds(文件描述符)就行,内核会一次性将已经准备就绪的文件描述符返回
只会发生1次系统调用,2次用户态和内核态的上下文切换
select基于轮询查看事件是否准备就绪
epoll基于事件通知
怎么理解多路复用?
一次调用可以查询到多个路通道的状态,多个路通道被一次调用复用了,称为IO多路复用。
说一下epoll
epoll.png
epoll涉及到3个方法
1.epoll_create 会在内核开辟两块空间,一个是红黑树,一个是双向链表
2.epoll_ctl 会将要监听的fd及需要监听的事件放到红黑树的中
3.epoll_wait 遍历双向链表中准备就绪的fd
双向链表中的数据是怎么来的?
场景示例:当网卡接收到数据时,内核就会检测到网络套接字的状态变化,此时网络设备驱动程序会通过内核将数据放入到对应的fd中的接收缓冲区,并修改相应的文件描述符状态,内核就会检查红黑树中注册的文件描述符发现对应的fd现在是准备就绪状态,内核就会把fd放到双向链表中。表示这个文件描述符已经准备好被处理了