https://www.bilibili.com/video/BV1r54y1f7bU

Untitled

BIO

Untitled

NIO

使用数组存储多个fd,轮询fds集合,每次轮询的fd的系统调用都会触发用户态到内核态的切换

Untitled

Netty:一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。

IO多路复用

深入浅出理解select、poll、epoll的实现 - 知乎 (zhihu.com)

select

将已连接的 Socket 都放到一个文件描述符集合,然后调用 select 函数将文件描述符集合拷贝到内核里,让内核来检查是否有网络事件产生。

select将轮询交给内核处理,省去轮询时从用户态到内核态的上下文切换,将fdset拷贝到内核态后在内核态轮询是否有数据,如果有数据则返回,并i将fdset置位,如果没有则继续阻塞轮询,或超时返回。