IO多路复用模型原理

在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.mzph.cn/news/842040.shtml

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

相关文章

日历管理软件:桌面日历保姆级安装

一、简介 1、日常管理是当代社会人常用的工具或者是说经常遗漏的工具,今天我推荐的这个软件,相信会让你一见衷心:桌面日历 通常用于记录时间、日期和重要事件。它可以是传统的纸质日历,也可以是电子版的桌面应用程序&#xff0c…

电脑录屏功能全攻略,这3个方法让你轻松掌握

现如今,电脑录屏功能已成为我们日常工作和学习的得力助手。无论是演示软件操作、记录会议内容,还是制作教学视频,电脑录屏都能帮助我们轻松捕捉屏幕上的每一帧画面。本文将详细介绍三种常用的电脑录屏方法,帮助您快速掌握录屏技巧…

一篇文章带你快速搞定Kafka术语no.2

在Kafka的世界中有很多概念和术语是需要你提前理解并熟练掌握的,这对于后面你深入学习Kafka各种功能和特性将大有裨益。下面我来盘点一下Kafka的各种术语。 在专栏的第一期我说过Kafka属于分布式的消息引擎系统,它的主要功能是提供一套完备的消息发布与…

2024新数据库入门教程

1.官网下载MySQL 下载Mysql链接: 点击下载mysql 下载完成后解压到某一个文件夹(记住这个路径,一会要用到) 2.配置初始化文件my.ini 在根目录下创建一个txt文件,名字叫my,文件后缀为ini 以下代码除安装目录和数…

Android消息机制回顾(Handler、Looper、MessageQueue源码解析)

回顾: Android消息机制 Android消息机制主要指的是Handler的运行机制以及Handler所附带的MessageQueue和Looper的工作机制。 介绍 通过Handler 消息机制来解决线程之间通信问题,或者用来切换线程。特别是在更新UI界面时,确保了线程间的数…

微信小程序中使用vantUI步骤

第一步,配置project.config.json 在setting中新增如下: "packNpmManually": true,"packNpmRelationList": [{"packageJsonPath": "./package.json","miniprogramNpmDistDir": "./"}], 第…

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

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

这方法真牛B!论文降重从81%直降1.9%

目录 一、万字论文,从0到1,只需1小时二、获取途径三、论文从81%降到1.9%四、内容是别人的,话是自己的五、AI工具 --> 中文论文降重六、论文降重小技巧 一、万字论文,从0到1,只需1小时 通过O…

Python-3.12.0文档解读-内置函数map()详细说明+记忆策略+常用场景+巧妙用法+综合技巧

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 详细说明 map(function, iterable, *iterables) 参数 返回值 示例 注意事项 参考…

如何让大模型更聪明?提升AI智能的关键策略

如何让大模型更聪明?提升AI智能的关键策略 🤖 如何让大模型更聪明?提升AI智能的关键策略摘要引言方向一:算法创新🚀1.1 自监督学习的崛起1.2 强化学习的应用 方向二:数据质量与多样性📊2.1 数据…

乡村振兴的乡村公共服务提升:提升乡村公共服务水平,满足农民多样化需求,构建幸福美好的美丽乡村

目录 一、引言 二、乡村公共服务提升的必要性 (一)满足农民多样化需求 (二)促进乡村经济发展 (三)构建幸福美好的美丽乡村 三、乡村公共服务面临的挑战 (一)基础设施薄弱 &a…

粘土滤镜特效怎么弄?5个简易制作粘土软件一学就会

#是谁把夏天的氛围感拿捏了#,哦~原来是AI粘土特效。 这玩意儿最近在社交媒体上可是火得一塌糊涂,大家都在用它给自己的照片来个大变身,变成那种丑萌丑萌的粘土小人儿。 如果大家也想尝试一下,那就跟着我来看看几款超好用的粘土滤…

基于Django框架的项目搭建后台首页

(1). 创建数据库 osdb 进入MySQL数据库中,创建一个数据库名为:osdb 通过数据表结构来创建数据表: -- 员工信息表 CREATE TABLE user (id int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 员工账号id,username varchar(50) DEFAULT NULL C…

MySQL:图文超详细教程MySQL5.7下载与安装

一、前言 MySQL 5.7 是一个重要的数据库管理系统版本,它带来了多项改进和新特性,本文将超详细的带大家手动安装一下MySQL5.7。 二、下载MySQL5.7版本 MySQL5.7安装包 链接:https://pan.baidu.com/s/1lz5rp9PwfyeHzkEfI_lW6A 提取码&#…

图卷积神经网络的简史 及其与卷积神经网络的异同

图卷积神经网络(GCN)已经在处理图结构数据方面取得了巨大的成功。在本小节中,我们将深入探讨图卷积神经网络的起源、发展历程,并提供一个简单的Python代码实现示例,以帮助读者更好地理解这一概念。 图卷积神经网络的简…

c# 贪心算法(Greedy Algo)

贪婪是一种算法范式,它逐步构建解决方案,始终选择提供最明显和直接收益的下一个部分。贪婪算法用于解决优化问题。 如果问题具有以下属性,则可以使用贪心法解决优化问题: 每一步,我们都可以做出当前看来最好的选择&…

IDEA 2024.1安装与破解

一、下载 官网地址:https://www.jetbrains.com/idea/download/other.html 二、安装 傻瓜式安装即可 三、破解 3.1 破解程序 网站:https://3.jetbra.in/ 3.2 获取激活码 点击*号部分即可复制成功

Vue——开发前的准备和创建一个vue的工程

文章目录 前言安装 Node js1、下载node.js2、安装node.js3、查看是否安装成功 创建 vue 工程Visual Studio Code 配置目录结构 前言 本篇博客主要讲解Vue开发前的环境配置与一些说明。 安装 Node js 环境需要安装配置一个nodejs 的环境。 vue3 最低nodejs 版本要求为 15.0 1…

[图解]产品经理创新模式01物流变成信息流

1 00:00:01,570 --> 00:00:04,120 有了现状的业务序列图 2 00:00:04,960 --> 00:00:08,490 我们就来改进我们的业务序列图了 3 00:00:08,580 --> 00:00:11,010 把我们要做的系统放进去,改进它 4 00:00:13,470 --> 00:00:15,260 怎么改进?…