I/O多路复用学习(一)select

前言

本文主要是简单讨论select的特点并梳理一下select的调用链,不涉及具体的使用方法。
本文中涉及的源码均出自Linux内核5.4.0版本

简介

select 是一种 IO 多路复用的技术,它允许单个进程或线程高效地管理多个输入/输出流,从而提高程序的性能和响应速度。

调用过程

do_select

select调用链

select的核心功能都在do_select中,里面的关键操作有:
1、poll_initwait:初始化轮询等待队列结构体 (poll_wqueues) 的所有字段,包括函数指针的初始化,后面用于驱动中回调__pollwait
2、for循环:遍历每个fd并调用vfs_pollvfs_poll针对传入的fd,调用其各自的poll函数(由设备驱动程序实现,比如sock_poll)。之后若满足一定条件则跳出循环。
3、poll_freewait:清理等待队列。

后面出一篇文章详细讨论do_select()
I/O多路复用学习(二)do_select分析

__pollwait

__pollwait调用链

__pollwait的作用是在等待队列上注册一个新的节点(),并初始化poll_table_entry的成员。
1、poll_get_entry:从轮询等待队列结构体 (poll_wqueues) 中获取一个空闲的poll_table_entry结构体实例
2、init_waitqueue_func_entry:初始化poll_table_entry结构体实例,包括函数指针的初始化,后面用于驱动中回调pollwake。
3、add_wait_queue:向等待队列添加一个节点

pollwake

当监视的文件描述符上发生了感兴趣的事件时(如可读,可写等),设备驱动将触发回调函数pollwake。pollwake会将进程或线程从睡眠状态唤醒。

select缺点

1、select默认支持的描述符有限,为1024(可以通过命令ulimit -n 2048临时修改,也可以修改Linux内核头文件posix_types.h修改__FD_SETSIZE的值,但是要重新编译内核);
2、每次调用需要把fd集合在内核态和用户态间拷贝传递两次,在fdset很大时效率低;
3、select内部监视fd是通过轮询的方式,时间复杂度高,效率低;
4、每次调用后需要重新设置fdset,麻烦。

参考文章

1.select 机制 - 访问方式(三)

  • 21
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值