IO实现方式(同步阻塞、同步非阻塞、IO多路复用)

news2024/11/14 12:09:13

1. 同步阻塞IO

同步阻塞io在数据在数据拷贝到两个阶段都是阻塞的,即把socket的数据拷贝到内核缓冲区和把内核缓冲区的数据拷贝到用户态到应用程序缓冲区都是阻塞的。用户线程在这个期间不能处理其他任务。
在这里插入图片描述

优点:简单易用
缺点:为每一次io请求都要分配一个线程,如果获取不到数据会一直阻塞

2. 同步非阻塞

同步非阻塞不会像同步阻塞那样两个阶段都阻塞,它在第一个阶段中向内核请求数据时如果此时内核还没准备好数据,那么它会直接返回一个错误,不会一直等待下次。等待一定时间后会继续发起io请求。
在这里插入图片描述

优点:允许单个线程处理多个io请求,线程可以执行其他任务
缺点:频繁的轮询请求会消耗cpu资源

3. IO多路复用

io多路复用本质上和同步非阻塞模式一样,它解决了同步非阻塞中用户线程不断轮询请求而消耗cpu资源的问题。io多路复用增加了一个select / poll / eoll 系统调用,由内核来实现请求线程本来该做的轮询操作。具体来说,执行系统调用时,会将已经建立连接的socket放在一个文件描述符的集合中,然后把这个fd集合拷贝到内核态,让内核来检查是否有io事件已经准备好了。再把检查好的fd集合拷贝到用户态到缓冲区中。

3.1 select实现方式

它采用位数组BitsMap来存储已建立连接到socket请求,构成fd集合,把fd集合拷贝到内核态,内核态遍历整个fd集合,若数据准备就绪,则对应标志位设置为1。遍历完成后,再把fd集合拷贝到用户缓冲区。
缺点:监听的 socket 集合 数量受位数组大小的限制,每次拷贝要拷贝全部fd集合,检查时要从头到尾遍历所有的 fd 集合

3.2 poll的实现方式

poll针对select监听fd集合的数量限制进行了改进,采用了结构体 + 链表的形式来组织fd集合,与select没有太大区别

3.3 epoll的实现方式

● select和poll的实现存在以下问题:
a. 每次io请求需要把整个fd集合拷贝进内核态或者从内核态拷贝到用户态
b. 要遍历全部fd集合才能得到需要处理的数据集合
select 需要遍历所有注册的I/O事件,找出准备好的的I/O事件。 而 epoll 则是由内核主动通知哪些I/O事件需要处理,不需要用户线程主动去反复查询,因此大大提高了事件处理的效率。
它的实现主要通过在内核维护一个红黑树和就绪链表,红黑树用于记录所有待处理的fd集合,而就绪链表用于记录准备好的就绪事件。当有fd请求需要监听是,调用epoll_ctl ( )来添加监听,不要传递整个 fd 集合,传递要监听的 fd 即可 。当 epoll_wait() 调用发生并且检测到一个或多个事件就绪时,内核将这些就绪事件的数据从内核的事件列表拷贝到用户提供的 events 数组中。

3.3.1事件触发模式

● 水平触发(LT):默认工作模式,表示当epoll_wait检测到某描述符事件就绪并通知应用程序时,应用程序可以不立即处理该事件;下次调用epoll_wait时,会再次通知此事件。
● 边缘触发(ET): 当epoll_wait检测到事件就绪并通知应用程序时,应用程序必须立即处理该事件。如果不处理,下次调用epoll_wait时,不会再次通知此事件。边缘触发只在状态由未就绪变为就绪时只通知一次。
LT模式和ET模式各有优缺点,无所谓孰优孰劣。使用 LT 模式,我们可以自由决定每次收取多少字节(对于普通 socket)或何时接收连接(对于侦听 socket),但是可能会导致多次触发;使用ET模式,我们必须每次都要将数据收完(对于普通socket)或必须理解调用accept接收连接(对于侦听socket),其优点是触发次数少。

参考:参考1
参考:参考2

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

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

相关文章

基于Springboot+Vue的Java项目-网上超市系统开发实战(附演示视频+源码+LW)

大家好!我是程序员一帆,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &am…

腾讯后端一面:如果需要实现一个分布式锁,你该如何实现?

更多大厂面试内容可见 -> http://11come.cn 腾讯后端一面:如果需要实现一个分布式锁,你该如何实现? 分布式锁 如果让你来实现一个分布式锁,该如何实现? 实现分布式锁的话,肯定需要一个地方去存储锁的…

Python | Leetcode Python题解之第35题搜索插入位置

题目&#xff1a; 题解&#xff1a; class Solution:def searchInsert(self, nums: List[int], target: int) -> int:left, right 0, len(nums) #采用左闭右开区间[left,right)while left < right: # 右开所以不能有,区间不存在mid left (right - left)//2 # 防止溢出…

java线程-线程池

简介 工作原理 如何获取线程池对象 构造器的参数含义 注意事项 构造器-ThreadPoolExecutor // ArrayBlockingQueue 是一个有界的阻塞队列&#xff0c;它的内部实现是一个数组。有界的意思是它的容量是有限的&#xff0c;我们必须在创建 ArrayBlockingQueue 实例的时候指定容量…

IMUGNSS的误差状态卡尔曼滤波器(ESKF)---更新过程

IMU&GNSS的误差状态卡尔曼滤波器&#xff08;ESKF&#xff09;---更新过程 ESKF的更新过程 ESKF的更新过程 前面介绍的是ESKF的运动过程&#xff0c;现在考虑更新过程。假设一个抽象的传感器能够对状态变量产生观测&#xff0c;其观测方程为抽象的h,那么可以写为 其中z为…

科研基础与工具(论文搜索)

免责申明&#xff1a; 本文内容只是学习笔记&#xff0c;不代表个人观点&#xff0c;希望各位看官自行甄别 参考文献 科研基础与工具&#xff08;YouTube&#xff09; 搜索论文 Google Scholar 谷歌学术 涵盖面太全了&#xff0c;都收录&#xff0c;就会有很多低质量的论文…

NodeRed节点编辑用于边缘计算和规则引擎,能做带UI界面和业务逻辑的上位机或前端应用吗?

先说结论&#xff0c;可以&#xff0c;但是需要有页面嵌套继承类似的技术&#xff0c;实现页面模块化封装&#xff0c;否则难以实现复杂应用。 相信目光敏锐的人都在关注节点编辑在自身行业的应用&#xff01; NodeRed在边缘计算做数据协议解析、以及物联网平台中作为规则链引…

算法训练营day13

一、SlidingWindowMaximum(滑动窗口最大值) 前置题&#xff0c;155.最小栈 参考K神155. 最小栈 - 力扣&#xff08;LeetCode&#xff09; 做完最小栈的题能更好的理解这道题 鄙人想到了开辟空间来保存最小值&#xff0c;使用的HashMap&#xff1b;K神用的是栈逻辑优化 cla…

网盘_游戏_博客自动化部署(Nginx多项目部署)

目录 一.前提介绍 二.环境介绍 三.自述&#xff08;脚本&#xff09; 四.关于Nginx多项目部署 一.前提介绍 在我之前的博客里详细介绍了上述项目的部署&#xff0c;那么如何使用简单脚本自动部署和使用Nginx多项目部署是本文来介绍的基础篇章。 二.环境介绍 CentOS Linux…

吴恩达深度学习 (week5,6)

文章目录 一、训练开发测试集二、机器学习基础三、 正则化初步介绍四、Dropout 正则化五、其他正则化方法六、归一化输入介绍七、梯度消失与梯度爆炸八、神经网络的权重初始化九、梯度数值逼近和检验十、上述学习总结第一题 划分训练/开发/测试集第二题 开发和测试集分布第三题…

gradle安装和部署

准备工作 下载地址&#xff1a;https://gradle.org/releases/ 安装和配置环境变量 将压缩包解压到/usr/local/目录下 unzip gradle-8.7-bin.zip -d /usr/local/找到gradle的安装目录/usr/local/gradle-8.7 编辑/etc/vi /etc/profileprofile配置环境变量&#xff08;这是ce…

duke liver datasets数据处理

Duke liver datasets 如果大家是做医学图像处理的&#xff0c;刚好又是做肝脏那边的&#xff0c;对这个数据集应该不会陌生 我发现网上现有的资料很少有说怎么读取这个数据集的&#xff0c;由于我之前一直都是做的nii格式的数据集&#xff0c;现在碰到了dicom格式的数据集页研…

SQLite导出数据库至sql文件

SQLite是一款实现了自包含、无服务器、零配置、事务性SQL数据库引擎的软件库。SQLite是世界上部署最广泛的SQL数据库引擎。 SQLite 是非常小的&#xff0c;是轻量级的&#xff0c;完全配置时小于 400KiB&#xff0c;省略可选功能配置时小于250KiB。 SQLite 源代码不受版权限制。…

分类神经网络3:DenseNet模型复现

目录 DenseNet网络架构 DenseNet部分实现代码 DenseNet网络架构 论文原址&#xff1a;https://arxiv.org/pdf/1608.06993.pdf 稠密连接神经网络&#xff08;DenseNet&#xff09;实质上是ResNet的进阶模型&#xff08;了解ResNet模型请点击&#xff09;&#xff0c;二者均是…

数字阅览室解决方案

一、方案概述 “数字阅览室”概念一经提出&#xff0c;就得到了广泛的关注&#xff0c;纷纷组织力量进行探讨、研究和开发&#xff0c;进行各种模型的试验。随着数字地球概念、技术、应用领域的发展&#xff0c;数字阅览室已成为数字地球家庭的成员&#xff0c;为信息高速公路…

Flowable 基本用法

一. 什么是Flowable Flowable 是一个基于 Java 的开源工作流引擎&#xff0c;用于实现和管理业务流程。它提供了强大的工作流引擎和一套丰富的工具&#xff0c;使开发人员能够轻松地建模、部署、执行和监控各种类型的业务流程。Flowable 是 Activiti 工作流引擎的一个分支&am…

LeetCode-电话号码的字母组合(回溯)

每日一题 今天刷到的是一道利用回溯来解决的题&#xff0c;不过稍微有点复杂&#xff0c;并且我也有一段时间没有做回溯了&#xff0c;所有在解题时也是思考了一段时间。 题目要求 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意…

常见现代卷积神经网络(ResNet, DenseNet)(Pytorch 11)

一 批量规范化&#xff08;batch normalization&#xff09; 训练深层神经网络是十分困难的&#xff0c;特别是在较短的时间内使他们收敛更加棘手。批量规范化&#xff08;batch normalization&#xff09;是一种流行且有效的技术&#xff0c;可持续加速深层网络的收敛速度。 …

网络原理-UDP和TCP

在传输层中有两个非常重要的协议&#xff0c;UDP和TCP&#xff0c;现在就来研究一下这两个协议。 UDP 报文格式 我们观察可以发现&#xff0c;里面UDP报文长度为2个字节&#xff0c;那么是多少呢&#xff1f;我们需要快速反应如下固定字节数据类型的取值范围&#xff1a; 字…

【融合ChatGPT等AI模型】Python-GEE遥感云大数据分析、管理与可视化及多领域应用

随着航空、航天、近地空间遥感平台的持续发展&#xff0c;遥感技术近年来取得显著进步。遥感数据的空间、时间、光谱分辨率及数据量均大幅提升&#xff0c;呈现出大数据特征。这为相关研究带来了新机遇&#xff0c;但同时也带来巨大挑战。传统的工作站和服务器已无法满足大区域…