IO多路复用
2025/12/22...大约 2 分钟
BIO、NIO、IO多路复用
BIO:即Blocking IO,同步阻塞通信,每次有新的链接与服务端链接后,服务端链接的线程会阻塞住,一直到通信完后才进行其他线程。
NIO:即Non-Blocking IO,同步非阻塞通信。
- 初始创建
Selector selector = Selector.open(),这个会一直调用操作系统底层epoll_create创建数组并返回epfd(供·调用epoll_ctl时在操作系统查找数组),然后将服务端服务注册到selector里面去并设置监听服务端服务的链接事件(epoll_ctl,操作系统实现,根据epfd找到list,监听对应链接的队友事件,若有事件了,将对应链接移动到就绪事件列表)。 - 每次有新的链接,会把链接(fd:链接的文件描述符)注册到selecor中的List(根据epfd去操作系统找)。
- 在步骤1将服务端注册到epoll中并监听链接建立事件后,就会
selector.slect()阻塞等待有链接、读等事件发生(不会循环消耗CPU)。什么时候能停止阻塞,读取有事件的链接?- 在监听到事件后,selector会停止阻塞,取出有事件发生的链接,进行循环处理。若是链接事件,将此链接注册回去并监听此链接的读事件。若是读事件,就直接进行读取操作。
1、什么时候能停止阻塞,读取有事件的链接? 操作系统的
epoll_wait会一直等到就绪事件列表有链接后。2、selector是基于epoll实现多路复用的,epoll是操作系统的。
最终实现服务端一个线程实现多个客户端链接,复用一个线程,底层就靠操作系统的epoll函数。