当前位置: 首页 > news >正文

【多路IO复用】select

select:

1.select:当被监听的 fd(文件描述符)就绪后会返回,但是我们无法知道具体是哪些 fd 就绪了,只能遍历所有的 fd。通常来说某一时刻,就绪的 fd 并不会很多,但是使用 select 必须要遍历所有的 fd,这就造成了一定程度上的性能损失。select 最多可监听的 fd 是有限制的,32位操作系统默认1024个,64位默认2048

select函数的API:

select函数的API
#include <sys/select.h>
 /* According to earlier standards */
       #include <sys/time.h>
       #include <sys/types.h>
       #include <unistd.h>

       int select(int nfds, fd_set *readfds, fd_set *writefds,
                  fd_set *exceptfds, struct timeval *timeout);
功能: 监听多个文件描述符的属性变化(读,写,异常)
       void FD_CLR(int fd, fd_set *set);
       int  FD_ISSET(int fd, fd_set *set);
       void FD_SET(int fd, fd_set *set);
       void FD_ZERO(fd_set *set);

参数:
    nfds  : 最大文件描述符+1
    readfds : 需要监听的读的文件描述符存放集合
    writefds :需要监听的写的文件描述符存放集合   NULL
    exceptfds : 需要监听的异常的文件描述符存放集合  NULL
    timeout: 多长时间监听一次   固定的时间,限时等待   NULL 永久监听
    struct timeval {
               long    tv_sec;         /* seconds */ 秒
               long    tv_usec;        /* microseconds */微妙
           };

  返回值: 返回的是变化的文件描述符的个数



注意: 变化的文件描述符会存在监听的集合中,未变化的文件描述符会从集合中删除

select实现原理:

应用层中父进程通过内核的selsect监听文件描述符缓冲区的变化,内核就会返回给父进程

以fd_set为例,每次都要从用户态拷贝至内核态,同时还要在内核态进行循环遍历,然后把有事件的响应的文件描述符fd_set返回,又要从内核态拷贝至用户态。用户态拿到这个有事件的文件描述符返回,还要针对返回的描述符进行遍历,才能知道哪个文件描述符对应的Socket可写可读,总共经历了两次遍历,两次拷贝,所以说为什么Select在文件描述符比较多的情况,效率为什么是低下的原因。

select 的优缺点:

优点: 跨平台

缺点:

文件描述符1024的限制 由于 FD_SETSIZE的限制

只是返回变化的文件描述符的个数,具体哪个那个变化需要遍历

每次都需要将需要监听的文件描述集合由应用层符拷贝到内核

大量并发,少了活跃,select效率低

 

http://www.lryc.cn/news/89945.html

相关文章:

  • cuda编程学习——基础知识介绍!干货向(三)
  • 30 VueComponent 事件的绑定
  • 作用域及作用域链
  • 深入解析Linux C/C++ 编程中的内存泄漏问题
  • 【爬虫第三章】 Python基础
  • 电力系统的虚假数据注入攻击和MTD系统研究(Matlab代码实现)
  • 【阿里云】阿里云OSS对象存储— 开通OSS服务、搭建OSS环境、快速入门
  • 代理对象Proxy是什么
  • 会话跟踪cookie和session
  • ACS Cent. Sci 2018 | 数据驱动的分子连续表征的自动化学设计
  • 安卓Termux搭建web服务器【公网远程手机Android服务器】
  • 【大数据之Hive】二、Hive安装
  • 三大特性之多态
  • 单调队列优化dp
  • 【低压配电漏电继电器660V/LLJ-100H/AC220V 中性点漏电保护 JOSEF】
  • [数据结构习题]栈——中心对称链
  • AMD Software Adrenalin Edition 23.5.1驱动发布,快速获取驱动
  • Visual Studio内引用Lua解释器,编译Lua源码,执行Lua脚本
  • 【赏】C语言迷宫游戏设计如何解决屏幕严重刷屏问题同时实现运行时间的显示
  • Spring Boot如何实现接口文档自动生成
  • 二进制概述-0day漏洞利用原理(1)
  • 加密与解密 调试篇 动态调试技术 (二)-常见断点
  • 【JavaScript】拾遗(5.25)
  • QMI8658 - 姿态传感器学习笔记 - Ⅲ
  • PHP+vue二手车交易信息网站系统
  • NTM中attr的用法
  • 【python资料】pandas的条件查询
  • 中间件(三)- Kafka(二)
  • DAY01_MySQL基础数据类型navicat使用DDL\DML\DQL语句练习
  • 数据安全复合治理框架和模型解读(0)