文章目录

  • 1.kern_select 参数验证和初始化流程
  • 2. do_select() 详细实现流程
  • 3. 位图数据结构详解
  • 4. 文件描述符处理详细流程
  • 5. Poll方法调用链
  • 6. 等待机制实现
  • 7. 用户态处理就绪事件
  • 8. 性能瓶颈分析
  • 9. 与其他I/O多路复用对比

  • Select 整体调用流程:
用户空间调用select方法
系统调用入口 SYSCALL_DEFINE5
kern_select 参数验证和初始化
do_select 核心实现
遍历文件描述符位图
对每个fd调用poll方法
检查事件状态
更新结果位图
有事件就绪?
返回结果到用户空间
用户空间轮询处理相应事件
等待事件或超时
被唤醒后重新检查

1.kern_select 参数验证和初始化流程

kern_select开始
声明数据结构
参数验证
n < 0 或 n > FD_SETSIZE?
返回 -EINVAL
初始化poll_wqueues
设置select_table
调用do_select
清理资源
返回结果
结束
  • poll_wqueues: Linux 内核中用于管理 poll/select 等待队列的核心数据结构。
  • select_table: Select 系统调用中连接用户空间和内核空间 poll 机制的桥梁数据结构。

2. do_select() 详细实现流程

全为0
有设置位
do_select开始
拷贝fd_set到内核空间
初始化变量和指针
遍历每个unsigned long 64位组
检查当前64位组
跳过整个64位组
下一个64位组
遍历当前64位组的每一位
当前位是否设置?
下一位
获取文件描述符fdget_i
文件描述符有效?
释放文件描述符
调用文件的poll方法
检查事件状态
设置结果位
遍历完当前64位组?
更新结果位图到用户空间
有事件就绪?
返回事件数量
调用poll_schedule_timeout等待
被唤醒或超时
重新检查事件状态
结束
  • fd_set: 表示文件描述符集合的位图数据结构
    • 固定大小:__FD_SETSIZE = 1024
    • 在64位系统上:1024 / 64 = 16 个 unsigned long、
    • 总共可以表示 1024 个文件描述符

3. 位图数据结构详解

位值含义
位图含义
fd_set 位图结构
1: 监控
0: 不监控
位1: 文件描述符1
位0: 文件描述符0
位2: 文件描述符2
...
位1023: 文件描述符1023
bits_1 64位
bits_0 64位
bits_2 64位
...
bits_15 64位

4. 文件描述符处理详细流程

用户空间 内核空间 文件系统 Socket层 select() 系统调用 从用户空间拷贝fd_set到内核 遍历位图 fdget(i) 获取文件描述符 返回文件对象 调用sock_poll() 检查socket状态 返回事件掩码 根据事件掩码设置结果位 fdput(f) 释放文件描述符 loop [对每个设置的文件描述符] 更新结果位图 返回结果到用户空间 用户空间 内核空间 文件系统 Socket层

5. Poll方法调用链

TCP
UDP
其他
do_select调用poll
sock_poll
检查socket类型
tcp_poll
udp_poll
默认poll
检查TCP连接状态
检查接收缓冲区
检查发送缓冲区
检查错误状态
检查UDP数据
返回默认事件
返回事件掩码
设置结果位

6. 等待机制实现

进程运行中
没有事件就绪
poll_schedule_timeout
文件描述符状态改变
超时时间到达
收到信号
重新检查事件
重新检查事件
重新检查事件
返回结果
Running
Interruptible
Waiting
Woken
Timeout
Signal

7. 用户态处理就绪事件

用户程序收到返回值后,会处理相应事件:

int ready = select(n, &readfds, &writefds, &exceptfds, &timeout);
if (ready > 0) {// 检查哪些文件描述符就绪for (int i = 0; i < n; i++) {if (FD_ISSET(i, &readfds)) {// 文件描述符 i 有数据可读read_data(i);}if (FD_ISSET(i, &writefds)) {// 文件描述符 i 可以写入数据write_data(i);}if (FD_ISSET(i, &exceptfds)) {// 文件描述符 i 发生异常handle_exception(i);}}
}

8. 性能瓶颈分析

Select性能瓶颈
遍历开销
内存拷贝
文件描述符限制
重复检查
O_n 时间复杂度
每次都要遍历所有fd
即使大部分fd没有事件
每次调用都拷贝fd_set
结果也要拷贝回用户空间
用户态内核态切换开销
最多1024个文件描述符
无法动态扩展
不适合高并发场景
每次重新检查所有fd状态
没有事件驱动机制
轮询方式效率低

9. 与其他I/O多路复用对比

Epoll
Poll
Select
时间复杂度: O_1
fd限制: 无限制
内存拷贝: 只在添加时
事件通知: 事件驱动
数据结构: 红黑树+链表
时间复杂度: O_n
fd限制: 无限制
内存拷贝: 每次调用
事件通知: 轮询
数据结构: 数组
时间复杂度: O_n
fd限制: 1024
内存拷贝: 每次调用
事件通知: 轮询
数据结构: 位图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/910638.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/910638.shtml
英文地址,请注明出处:http://en.pswp.cn/news/910638.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多光谱扫描技术在实物建模中的应用:如何实现1:1真实材质还原

在实物建模领域&#xff0c;传统方式常常陷入尴尬境地&#xff1a;耗费大量时间精力构建的模型&#xff0c;材质看起来却与真实物体相差甚远&#xff0c;塑料质感的 “金属”、模糊不清的纹理&#xff0c;让模型失去了应有的真实感。而在文物保护、产品设计等对真实材质还原要求…

Python复杂网络分析和建模库之networkx使用详解

概要 在当今信息爆炸的时代,复杂网络无处不在。NetworkX是一个用于创建、操作和研究复杂网络结构、动态和功能的Python库。它提供了丰富的数据结构来表示各种类型的网络,如无向图、有向图、加权图等,并支持大量的图算法,包括最短路径计算、中心性分析、社区发现等。 安装 …

前端依赖升级完全指南:npm、pnpm、yarn 实践总结

在前端项目开发过程中&#xff0c;定期升级依赖不仅能享受新特性、修复安全问题&#xff0c;还能保证工具链长期稳定运行。本文全面总结 npm、pnpm、yarn 三大主流包管理器在 依赖包升级 方面的实践方法&#xff0c;并补充版本符、依赖安装的基础知识&#xff0c;适合新手与有经…

[持续集成]

学习目标 能够使用 Git 代码托管平台管理代码能够实现 jenkinspostman 的持续集成能够实现 jenkins代码 的持续集成 持续集成 概念 : 将自己工作成果持续不断地把代码聚集在一起,成员可以每天集成一次或多次相关工具 : git : 代码管理工具,自带本地仓库gitee : 远程代码管理…

FSMC控制LCD(TFTLCD:Z350IT002)显示案例

显存不一定要擦除&#xff0c;只要来一个地址就可以对其进行读写&#xff0c;而且一般的需求是不停的写入&#xff08;不同的像素点给不同的值&#xff09;&#xff0c;所以是RAM&#xff08;flash和E2PROM要擦除才能写入&#xff09;&#xff0c;由于FSMC没有DRAM所以我们只能…

云原生周刊:Argo CD v3.1 正式发布

开源项目推荐 Kubewall Kubewall 是一个轻量级的开源 Kubernetes 仪表盘&#xff0c;支持多集群管理&#xff0c;主打单二进制部署和浏览器访问&#xff0c;提供实时资源监控、YAML 编辑、拓扑视图、日志查看等功能。它使用 Go 与 React 构建&#xff0c;支持通过 Docker、He…

Aerotech系列(3)开发库介绍

库对象模型 名空间列表 NamespaceDescriptionAerotech.A3200 The main namespace of the Aerotech A3200 .NET library Aerotech.A3200.Callbacks Contains the classes that allow interacting with callbacks Aerotech.A3200.Commands Contains the classes that allows …

Spring--IOC容器的一些扩展属性

一、BeanFactoryPostProcessor和BeanPostProcessor BeanFactoryPostProcessor的作用是在实例化前修改BeanDefinition的属性 BeanPostProcessor的作用是在bean完成创建实例、填充属性之后&#xff0c;初始化阶段的前后都会对bean进行操作&#xff0c;使用postProcessBeforeIni…

8w字:推荐系统技术体系深度解析:从理论基础到工业实践的完整指南

插话&#xff1a;刚接触推荐系统还是大一下作比赛&#xff0c;然后找资料&#xff0c;顺便在巧合下在“识典百科”&#xff08;现在叫快懂百科&#xff0c;抖音的&#xff0c;改好几回名了&#xff0c;还要一条条插入引用资料&#xff0c;现在看来&#xff0c;好像抖音也不在乎…

RA4M2开发IOT(8)----IIC驱动OLED

RA4M2开发IOT.8--IIC驱动OLED 概述视频教学样品申请硬件准备参考程序修改IIC驱动OLED属性配置移植SSD1306字符取模ASCII显示图片取模显示图片 概述 本章旨在通过 IC 接口驱动 OLED 显示屏&#xff08;常见型号如 SSD1306&#xff09;&#xff0c;实现图形和文本的显示功能。OL…

数组题解——​轮转数组【LeetCode】

189. 轮转数组 通过三次反转操作&#xff0c;可以实现数组的轮转&#xff1a; 反转整个数组: 将数组完全反转&#xff0c;使得原数组的后 k 个元素移动到数组的前面。反转前 k 个元素: 将前 k 个元素反转&#xff0c;恢复它们的原始顺序。反转后 n - k 个元素: 将后 n - k 个元…

AR 眼镜之-条形码识别-实现方案

目录 &#x1f4c2; 前言 AR 眼镜系统版本 条形码识别 1. &#x1f531; 技术方案 1.1 技术方案概述 1.2 实现方案 1&#xff09;相机App显示模块 2&#xff09;算法so库JNI模块 3&#xff09;算法条形码识别模块 2. &#x1f4a0; 实现相机App显示模块 2.1 创建 Ba…

华为云 Flexus+DeepSeek 征文|基于 CCE 集群部署 Dify 平台工作流:科研论文翻译与 SEO 优化工具的全流程设计实践

华为云 FlexusDeepSeek 征文&#xff5c;基于 CCE 集群部署 Dify 平台工作流&#xff1a;科研论文翻译与 SEO 优化工具的全流程设计实践 背景 作为被科研论文折磨已久的大学生&#xff0c;希望研究成果能被更多人看到&#xff0c;尤其是在学术全球化的趋势下&#xff0c;论文翻…

C++对象继承详解:从入门到精通

继承是面向对象编程的三大特性之一&#xff0c;也是C中实现代码复用和多态的重要机制。本文将带你深入理解C继承的核心概念与应用。 一、继承的基本概念 1.1 什么是继承&#xff1f; 继承允许我们基于已有的类创建新类&#xff0c;新类&#xff08;派生类&#xff09;可以继…

Jenkins安装与配置全攻略:从入门到高级功能实战

在DevOps实践中,Jenkins作为最流行的持续集成工具之一,扮演着至关重要的角色。本文将全面介绍Jenkins的安装、配置及高级功能使用,帮助开发、运维和测试团队快速搭建高效的CI/CD流水线。 一、Jenkins安装 1.1 环境准备 Jenkins官网:https://jenkins.io 注意:Jenkins 2…

[OS_26] 计算机系统安全 | CIA原则 | 侧信道攻击

系统调用是唯一访问操作系统对象的途径 拒绝越权访问 →→ Confidentiality拒绝越权修改 →→ Integrity(再加上公平资源调度 →→ Availability) 在操作系统 API 上&#xff0c;我们可以构建命令行工具、编译器、数据库、浏览器等丰富的应用。 当越来越多用户开始共享计算机、…

Chromium 136 编译指南 macOS篇:编译优化技巧(六)

1. 引言 在现代软件开发的高效化进程中&#xff0c;编译优化已经从简单的性能调优发展为一门综合性的工程科学。对于Chromium 136这样一个包含超过2500万行代码的超大规模项目而言&#xff0c;编译时间往往成为制约开发效率的关键瓶颈。在典型的开发场景中&#xff0c;一次完整…

Spark教程6:Spark 底层执行原理详解

文章目录 一、整体架构概述二、核心组件详解1. SparkContext2. DAG Scheduler3. Task Scheduler4. Executor 三、作业执行流程1. DAG 生成与 Stage 划分2. Task 调度与执行3. 内存管理 四、Shuffle 机制详解1. Shuffle 过程2. Shuffle 优化 五、内存管理机制1. 统一内存管理&am…

xlsx-style 插件批量导出多个sheet表格excel中遇到的问题及解决

Vue2中 前端界面导出表格&#xff0c;使用XLSXS插件版本(^0.8.13)导出表格存在表格背景颜色无法正常展示&#xff0c;百分比数据没有正常展示 【有条件的尽量先升级高版本插件&#xff0c;此插件版本对样式支持度不够】 优先考虑插件版本升级 同样的使用方法在vue3中没有出现错…

Java后端与Vue前端项目部署全流程:从环境配置到Nginx反向代理

文章目录 1. 准备项目所需的环境2. 后端项目打包步骤 1&#xff1a;使用 Maven 打包步骤 2&#xff1a;定位生成的 JAR 包步骤 3&#xff1a;上传 JAR 包到 Linux 系统步骤 4&#xff1a;验证 Java 环境步骤 5&#xff1a;启动 JAR 包 3. 前端项目打包步骤 1&#xff1a;执行 B…