select(2) IO多路复用

select(2)

  1. 为什么需要select
  2. select参数
  3. select流程

为什么需要select?

每个I/O操作(如网络请求)需要阻塞一个线程,当并发量高时(例如数万连接),线程数量爆炸式增长。通过操作系统内核提供的机制(如select/poll/epoll),单线程可以监听多个I/O描述符的状态变化,仅当某个I/O操作真正就绪时(如数据到达、缓冲区可写),才触发用户程序处理,避免无效等待。
幸运的是 现代OS大 部分支持IO多路复用

select

select流程

manual select(2)

  1. 初始化文件描述符集合
    • 使用 FD_ZEROFD_SET 将需要监听的 fd 添加到 readfds/writefds/exceptfds
    • 计算机硬件条件不同 set分为read_set write_set except_set
  2. 调用 select
    • 阻塞等待,直到至少一个 fd 就绪或超时。
  3. 检查就绪的 fd
    • 遍历所有被监听的 fd,通过 FD_ISSET 判断哪些 fd 触发了事件。
    • 一个进程管理多个资源 当进程阻塞时 内核轮询 arguments是非const的 要放在loop里面
  4. 处理事件
    • 对就绪的 fd 进行读/写/异常处理。

select 是 I/O 多路复用的一种经典实现,允许程序同时监视多个文件描述符(如套接字),并在其中任意一个就绪(可读、可写或异常)时触发操作。虽然它已被 epoll(Linux)和 kqueue(BSD)等更高效的机制取代,但其跨平台特性使其在特定场景下仍有价值。

核心特性

  1. 跨平台支持
    • 几乎所有操作系统(Linux、Windows、macOS 等)都支持 select
  2. 同步阻塞模型
    • 调用 select 时线程会阻塞,直到有文件描述符就绪或超时。
  3. 水平触发(LT)
    • 只要文件描述符处于就绪状态,每次调用 select 都会触发通知。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值