IO多路复用模型原理

news2024/12/23 8:40:08

在linux没有实现epoll事件驱动机制之前,常规的手段是选择select和poll等IO多路复用的方法来实现并发服务程序。但是在大数据、高并发、集群情况下,select和poll的性能瓶颈就出现了,于是epoll就诞生了

Select

select函数监视的文件描述符分三类:writefds、readfds和exceptfds

调用select后会产生阻塞,直到文件描述符就绪或超时,函数才会返回。

select函数返回后,可以通过遍历fd_set,来找到就绪的文件描述符

int select(int nfds, fd_set *restrict readfds, fd_set *restrict writefds, fd_set *restrict errorfds, struct timeval *restrict timeout);

select执行步骤如下:

在这里插入图片描述

  1. 使用copy_from_user从用户空间拷贝fd_set到内核空间

  2. 注册回调函数_pollwait();

  3. 遍历所有FD,调用其对应的poll方法

  4. 以tcp_poll为例,其核心实现就是_pollwait(),也就是注册回调函数

  5. _pollwait()的主要工作就是把当前进程挂到设备的等待队列中,不同的设备有不同的等待队列,对于tcp_poll来说,其等待队列是sk→sk_sleep。在设备收到一条消息或填写完文件数据后会唤醒设备等待队列上睡眠的进程,这时当前进程便被唤醒了

  6. poll方法返回时会返回一个描述读写操作是否就绪的mask掩码,根据这个mask掩码给fd_set赋值

  7. 如果遍历完所有的fd,还没有返回一个可读写的mask掩码,则会调用schedule_timeout让调用select的当前进程进入睡眠

  8. 当设备驱动发生自身资源可读写后,会唤醒其等待队列上睡眠的进程。如果超过设定的超时时间,还是没被唤醒,则调用select的进程重新被唤醒,从而获得CPU资源,然后重新遍历fd,判断有没有就绪的fd

  9. 把fd_set从内核空间拷贝到用户空间

  10. select的触发方式是水平触发,应用程序如果没有完全对一个已经就绪的文件扫描夫进行IO操作,那么之后每次selec

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国内首个智能体生态大会!2024百度万象大会定档5月30日

最近,百度悄悄「上新」了几个AI神器。 百度搜索上线「互动」功能,可以实时问答,查询信息就像聊天一样简单,还可以艾特相关智能体,更细致精确地满足个性化需求,比如去新加坡旅游,可以让新加坡旅…

【源码】2024心悦搜剧源码百万级网盘资源

1、一键转存他人链接:就是将别人的分享链接转为你自己的 2、转存心悦搜剧资源:就是将心悦搜剧平台上的所有资源都转成你自己的 3、每日自动更新:自动转存每天的资源并入库 前端uin-app,后端PHP,兼容微信小程序

必看!企业数字化转型的组织架构与人员配置方案!

数字化浪潮汹涌而来,企业如何在这波大潮中破浪前行?关键在于构建合理的组织架构和配备合适的人员!今天,我们就为大家带来蚓链实践经验总结的方案,让你的企业数字化转型之路更加顺畅! 组织架构: …

【数学建模】碎纸片的拼接复原

2013高教社杯全国大学生数学建模竞赛B题 问题一模型一模型二条件设立思路 问题求解 问题一 已知 d i d_i di​为第 i i i张图片图片的像素矩阵 已知 d i d_i di​都是 n ∗ m n*m n∗m二维矩阵 假设有 N N N张图片 模型一 我们认为对应位置像素匹配为 d i [ j ] [ 1 ] d k…

引入安全生产培训云平台,实现“人人讲安全、个个会应急”

引入安全生产培训云平台,旨在全面提升企业及员工的安全意识与应急处理能力,通过数字化手段实现“人人讲安全、个个会应急”的目标。这一平台的构建和应用,不仅促进了安全知识的普及,还极大提高了培训的效率与效果。以下是该平台几…

【赠书第24期】Java项目开发实战(微视频版)

文章目录 前言 1 项目选择与需求分析 1.1 项目选择 1.2 需求分析 2 系统设计 2.1 系统架构设计 2.2 数据库设计 2.3 接口设计 3 编码实现 3.1 环境搭建 3.2 编码规范 3.3 编码实现 4 测试与部署 4.1 单元测试 4.2 系统测试 4.3 部署与上线 5 总结与展望 6 推…

挖矿宝藏之系统日志

什么是日志? 日志是指系统或应用程序在运行过程中产生的记录文件,这些文件记录了系统或应用程序的运行情况、错误信息、用户操作等。 日志的主要作用 记录信息:日志可以记录系统或应用程序的启动、运行、停止等状态信息,以及用户的…

262 基于matlab的一级倒立摆仿真

基于matlab的一级倒立摆仿真,在对一级倒立摆进行数学建模的基础上,对模型进行线性化,得到其状态空间模型,利用二次型最优控制方法得出控制率。输出角度和位置优化曲线。程序已调通,可直接运行。 262 一级倒立摆仿真 状…

adb环境搭建

1.安装jdk adb正常使用的前提条件:安装jdk,网上很多可以找找,或者翻翻之前记录的。 2.安装adb 2.1.下载Android_sdk 通过网盘下载,网盘链接:https://pan.baidu.com/s/1r4Y_2-nkKs2a2h9mdrueWg,e5wv。下载成…

关系代数、函数依赖、Armstrong公理及软考试题解析

注:本文面向于软考高级—系统架构设计师,具体来说是数据库部分,知识点偏零碎化。想要系统学习数据库原理的,可考虑去看《数据库原理》,清华大学出版社或其他出版社皆可。 概述 概念 关系,就是二维表。特…

2024年上半年软件设计师试题及答案(回忆版)

目录 基础知识选择题案例题1.缺陷识别的数据流图2.球队、球员、比赛记录的数据库题3.用户、老师、学生、课程用例图4.算法题5.程序设计题 基础知识选择题 树的节点,度为4的有4个,度为3的有8个,度为2个有6个,度为1的有10个&#x…

spring boot整合j2cache 配置项目全局键标识 帮助定位是哪个项目产生的缓存

我们利用 j2cache 存进 redis的缓存 key 可以加个全局标识 这样 到时看缓存 方便别人看是哪个项目存进去的 例如 这里 我们存入的 book 我们 keys * 查看 就知道是个book 但不知道具体来自那套系统 我们在 j2cache.properties 中加上 redis.namespace 项目全局键标识 我们…

【方法】ZIP压缩文件的密码如何设置和取消?

ZIP是一种常见的压缩文件格式,今天来分享一下,ZIP压缩文件如何设置密码保护,以及如何取消密码,不清楚的小伙伴一起来看看吧! 设置ZIP文件密码: 想要给ZIP压缩包设置密码,需要用到支持ZIP格式的…

移动云主机ECS搭建Kubernetes集群:详细步骤与指南

目录 云主机 ECS:云计算的强大引擎什么是云主机ECS?为何选择云主机ECS? 使用移动云ECS进行Kubernetes集群搭建1. 环境准备2. 安装步骤2.1 在每一个节点上执行的操作2.1.1 系统准备2.1.2 安装Docker2.1.3 安装Kubernetes的安装组件 2.2 在Mast…

一篇文章讲透排序算法之堆排序

1.前言 在学习这篇文章之前,请大家先学习堆这一数据结构中堆的概念,向下调整算法,向下调整建堆。 有关堆的实现方式请参考:堆的实现 堆排序就是利用堆里面学习过的知识点进行排序,如何进行排序呢? 2.堆…

linux centos nginx配置浏览器访问后端(tomcat日志)

1、配置nginx访问tomcat日志路径 vim /usr/local/nginx/conf/nginx,conflocation ^~ /logs {autoindex on;autoindex_exact_size on;autoindex_localtime on;alias /home/tomcat/apache-tomcat-9.0.89-1/logs;}###配置讲解### 1、location ^~ /logs { … }: location&#xf…

抖音IP地址频繁变动:背后的原因与解读

在抖音这个短视频平台的日常使用中,不少用户可能注意到了自己的IP地址有时会频繁变动。这种现象不仅引起了用户的好奇,也引发了关于个人隐私、账号安全以及平台政策的一系列讨论。那么,抖音IP地址换来换去什么意思?这背后又隐藏着…

最新ETF市场全景画像

根据天软指数基金因子库,分析宽基、行业和主题ETF表现,目前已全部上线公众号,更多内容可关注天软公众号!

2024年上半年系统架构设计师——案例第二题——UML相关

这个只记到一个大概了 主题干,说明人员访客系统 题目1 9分 问序列图信息类型和特点 题目2 序列图填空 好像是10分吧 访客系统的序列图 题目3 6分 说明软件分析和设计时的和UML图有关原则?

RocketMq源码解析四:生产者Producer启动

一、主要接口和类 生产者服务核心接口和类的关系如下图所示: MQProducer是生产者解耦,这里找几个有代表性的方法 // 同步发送消息 SendResult send(final Message msg) throws MQClientException, RemotingException, MQBrokerException,InterruptedExce…