NIO核心依赖多路复用小记

本文介绍了NIO如何利用操作系统的多路复用机制,如select、poll和epoll,实现一个线程同时处理多个网络连接,避免了单个连接阻塞导致的影响。文章详细阐述了网络请求流程,涉及用户态和内核态的协同工作,以及文件描述符在其中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NIO允许一个线程同时处理多个连接,而不会因为一个连接的阻塞而导致其他连接被阻塞。核心是依赖操作系统的多路复用机制。

操作系统的多路复用机制

多路复用是一种操作系统的 I/O 处理机制,允许单个进程(或线程)同时监视多个输入或输出流的就绪状态。这样,一个进程就能够通过一个系统调用来等待多个事件,而不是为每个事件创建一个独立的进程或线程。

多路复用常见机制

  1. select: select 是一个系统调用,通过它可以同时监视多个文件描述符(通常是套接字)。当其中任何一个文件描述符准备好进行读取或写入时,select 就会返回,并告诉程序哪些文件描述符处于就绪状态。

  2. poll: poll 也是一个系统调用,它和 select 类似,但是对文件描述符的管理更加灵活,而且没有文件描述符数目的限制。

  3. epoll: epoll 是 Linux 中引入的一种多路复用机制,相对于 selectpoll 具有更好的性能。epoll 使用事件通知的方式,只关心那些发生了变化的文件描述符,减少了遍历全部文件描述符的开销。

网络请求的流程

当客户端请求到达服务器时,整个流程可以分为以下几个步骤,涉及用户态和内核态的协同工作:

  1. 服务器启动: 服务器程序在用户态中启动,并创建一个监听 socket。这个监听 socket 负责接收客户端的连接请求。

  2. 监听连接: 服务器使用 select 或其他多路复用的系统调用,将监听 socket 添加到文件描述符集合中,然后阻塞等待事件发生。这时用户程序告诉内核要监听哪些文件描述符,而这些文件描述符通常是由 accept 等系统调用返回的新连接。

  3. 客户端连接: 当有客户端发起连接请求时,内核接收到连接请求,然后将新的连接 socket(客户端连接的文件描述符)添加到文件描述符集合中。此时内核通知用户程序,有文件描述符就绪。

  4. 处理连接: 用户程序从 select 返回后,检查文件描述符集合,确定哪些连接处于就绪状态。然后,用户程序可以通过 accept 接受新的连接,获得新的文件描述符,并处理与客户端的通信。

下面是一个简化的伪代码示例:

// 服务器启动
int listen_fd = create_and_bind_socket(port);
listen(listen_fd, SOMAXCONN);

// 设置监听 socket 到文件描述符集合
fd_set master_fds;
FD_ZERO(&master_fds);
FD_SET(listen_fd, &master_fds);
int max_fd = listen_fd;

while (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摸魚散人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值