Linux 网络I/O模型

news2024/10/7 18:28:00

一、Linux下面的I/O模型

Linux下面一共有五种可以使用的I/O模型,如下:
1)阻塞式I/O
2)非阻塞式I/O
3)I/O多路复用(select与epoll)
4)信号驱动式I/O
5)异步I/O
下面重点介绍前三种I/O模型

1、阻塞式I/O

对一个网络套接字上的read操作,第一步通常涉及等待数据从网络中到达。当等待的数据到达时,它被复制到内核的某个缓冲区。第二步就是把数据从内核缓冲区拷贝到进程缓冲区。默认情况下所有的套接字都是阻塞的,如下:

在这里插入图片描述

2、非阻塞I/O

套接字默认是阻塞的,可以设置成非阻塞。当把一个套接字设置成非阻塞时,是在通知内核:当所请求的I/O操作非得把线程置于休眠状态才能完成时,不要把线程置于休眠状态(即:如果数据没有准备好不要阻塞当前线程),而是返回一个错误码EAGIN。这样 read/write 的时候,如果数据没准备好,返回 EAGAIN 的错误即可,不会卡住线程,从而整个系统就运转起来了。当一个应用程序对一个非阻塞文件描述符循环调用read操作时,称之为轮询。应用程序持续轮询内核,以看某个操作是否就绪,这样做的缺点是浪费大量CPU时间。下面是非阻塞的I/O模型,如下:

在这里插入图片描述

关键问题

问:阻塞具体阻塞在什么地方?
答:阻塞在网络线程
问:由什么来决定I/O是阻塞或非阻塞的?
答:由套接字来决定I/O是阻塞还是非阻塞的
问:阻塞与非阻塞的具体差异点?
答:I/O函数在数据未到达时是否立即返回,如果立即返回则是非阻塞I/O,否则就是阻塞I/O

3、I/O多路复用

有了I/O复用模型,可以使用select/poll/epoll等系统调用,应用阻塞在这几个系统调用上面而不是直接阻塞在I/O调用上。如下:

在这里插入图片描述

注意:epoll是作用在数据等待阶段

4、同步I/O与异步I/O对比

1)同步I/O操作:导致请求线程阻塞,直到I/O操作完成
2)异步I/O操作:不导致请求线程阻塞
阻塞I/O模型、非阻塞I/O模型、I/O复用模型和信号驱动式I/O模型都是同步I/O模型,以为其中真正的I/O操作将导致线程阻塞。只有异步I/O模型与POSIX定义的异步I/O相匹配。

二、I/O多路复用

1、传统的网络模型

传统的网络模型是基于阻塞I/O模型 + 多线程在实现服务端,如下:

在这里插入图片描述

优点:处理及时,响应速度快
缺点:线程利用率低,并且线程的数量是有限的

问:为什么传统的网络模型线程利用率低?

传统的网络模型是基于阻塞I/O来实现的,如果没有数据到来线程会一直阻塞在read操作,导致线程资源浪费。如果把阻塞I/O换成非阻塞I/O,此时没有数据到来,调用完read直接返回,浪费CPU资源一直检测是否有数据可读(类似于在一个死循环里面调用read操作)

2,I/O多路复用模型

2.1、什么是I/O多路复用?

1)I/O多路:多个网络连接(或多个fd句柄)
2)复用:服务端使用一个线程来处理所有客户端的I/O请求。select,poll,epoll都是IO多路复用的机制。I/O多路复用就是通过一种机制,一个进程可以监视多个描述符(socket),一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。I/O 多路复用是一种同步IO模型,事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的。
注意:高并发的核心解决方案是1个线程处理所有连接的“等待消息准备好”

2.2、为什么要使用I/O多路复用机制?

I/O多路复用指的是这样一个过程:
1)拿到了一堆文件描述符
2)调用某个系统函数告诉内核:“这个函数你先不要返回,你替我监视着这些描述符,当这堆文件描述符中有可以进行I/O读写操作的时候你再返回”
3)当调用的这个函数返回后就能知道哪些文件描述符可以进行I/O操作

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

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

相关文章

知识图谱-实体抽取

命名实体识别(Named Entity Recognition,简称NER)是信息抽取、问答系统、句法分析、机器翻译等应用领域的重要基础工具,在自然语言处理技术走向实用化的过程中占有重要地位。一般来说,命名实体识别的任务就是识别出待处…

【产品设计】电商后台系统设计--库存

电商后台产品,涉及众多模块,而以商品、订单、库存为核心模块,模块间存在大量交互。库存决定商品是否可售卖,下单是否能成功。 电商中的库存管理是为了保证前台商品的正常售卖,库存的管理和仓库密不可分,而仓…

Midjourney详细注册和使用教程

来源:Midjoureny详细注册使用教程【探索ChatGPT】 Midjourney,用户只需要输入一段图片的文字描述,即可生成精美的绘画,相信了解Midjourey的小伙伴已经对它强大之处而赞叹! 下面是用通俗易懂的步骤教会大家如何注册和…

【严蔚敏版数据结构】你分得清顺序栈和链栈吗

【严蔚敏版数据结构】顺序栈和链栈的剖析和对比一、顺序栈和链栈的存储结构二、顺序栈和链栈的初始化三、顺序栈和链栈的判断是否栈空四、顺序栈和链栈的入栈五、顺序栈和链栈的弹栈六、顺序栈和链栈的取栈顶元素一、顺序栈和链栈的存储结构 顺序栈的存储结构图如下&#xff1…

Windows 10系统,JDK安装与环境变量配置

引言 随着互联网的日益发展, 越来越多的小伙伴加入了程序员这个行列, 也有很多小伙伴正计划学习编程, 学习Java 那么对于新手来说, 第一件事就是下载安装Java开发工具包, 也就是JDK, 今天我们就来一起详细的说说怎么操作 JDK版本描述 学习环境中, 我们通常使用较新版本的JD…

支持PHP运行环境和系统防火墙配置管理,1Panel开源面板v1.1.0发布

2023年4月17日,现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.1.0版本。 在这一版本中,1Panel新增支持PHP运行环境、系统防火墙配置管理以及同步本地应用等功能,并带来了40多项功能更新和问题修复,感谢各位社区用户的反…

回归预测 | MATLAB实现GA-LSTM遗传算法优化长短期记忆网络的数据多输入单输出回归预测

回归预测 | MATLAB实现GA-LSTM遗传算法优化长短期记忆网络的数据多输入单输出回归预测 目录回归预测 | MATLAB实现GA-LSTM遗传算法优化长短期记忆网络的数据多输入单输出回归预测效果一览基本介绍程序设计参考资料效果一览 基本介绍 MATLAB实现GA-LSTM遗传算法优化长短期记忆网…

nvm管理node

开发的时候node版本不兼容问题频频出现,就得安装多个版本node,nvm管理起来就很方便。 首先nvm是一个nodejs的版本管理工具。为了解决node.js各种版本存在不兼容现象可以通过它安装和切换不同版本的node.js。 打开CMD,输入命令 nvm &#xf…

密码基础知识——密码的概念与作用

密码基础知识——密码的概念与作用密码的概念与作用密码的概念密码的重要作用密码的功能密码应用技术框架密码应用中的安全性问题密码应用安全性评估的基本原理信息安全管理标准PDCA 管理循环信息安全风险评估定义信息安全风险评估的目的和用途信息安全风险评估的基本要素密码的…

Centos 7 安装系列(10):ElasticSearch 8.6.2

ElasticSearch 部署一、系统环境二、解压安装2.1 解压压缩包2.2 修改配置文件2.3 添加操作用户2.4 启动2.5 开放端口2.6 开机自启动配置2.7 设置用户名密码认证三、总结一、系统环境 操作系统:Centos 7 已配置环境:空 二、解压安装 2.1 解压压缩包 上…

基于ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域的数据分析能力与项目科研水平

【原文链接】:基于ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土壤、农业、大气等领域的数据分析https://mp.weixin.qq.com/s?__bizMzU5NTkyMzcxNw&mid2247537467&idx4&sn10c4c12897282daf5320efae05caf3a4&chksmfe689551…

黑马2023JavaScript笔记1

一、js知识点 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-widt…

LoRA 指南之 LyCORIS 模型使用

LoRA 指南之 LyCORIS 模型使用 在C站看到这个模型&#xff0c;一眼就非常喜欢 在经历几番挣扎之后终于成功安装 接下来&#xff0c;我们一起开始安装使用吧&#xff01; 1、根据原作大佬的提示&#xff0c;需要安装两个插件 https://github.com/KohakuBlueleaf/a1111-sd-web…

蓝桥杯之我见

前言 关于蓝桥杯&#xff0c;应该有很多人不知道这是一个什么样的比赛。但是作为一名合格的程序员&#xff0c;就算之前没有参加过蓝桥杯的比赛&#xff0c;或者没听说过蓝桥杯&#xff0c;读完本篇文章再说不知道蓝桥杯&#xff0c;就有点不合适了吧&#xff1f;&#xff01;那…

网络作业6【计算机网络】

网络作业6【计算机网络】前言推荐网络作业6一. 单选题&#xff08;共11题&#xff0c;33分&#xff09;二. 多选题&#xff08;共2题&#xff0c;10分&#xff09;三. 判断题&#xff08;共1题&#xff0c;1分&#xff09;四. 阅读理解&#xff08;共1题&#xff0c;56分&#…

DY-30型电压继电器DY-36

DY-30系列电压继电器 DY-32电压继电器&#xff1b;DY-36电压继电器&#xff1b; DY-33电压继电器&#xff1b;DY-37电压继电器&#xff1b; DY-34电压继电器&#xff1b;DY-38电压继电器&#xff1b; DY-31电压继电器&#xff1b;DY-35电压继电器&#xff1b; DY-32/60C电压继…

npm与node版本不匹配问题解决思路(一百五十八)

1.报错 npm WARN EBADENGINE Unsupported engine { npm WARN EBADENGINE package: ‘electron-packager17.1.1’, npm WARN EBADENGINE required: { node: ‘> 14.17.5’ }, npm WARN EBADENGINE current: { node: ‘v12.22.9’, npm: ‘8.5.1’ } npm WARN EBADENGINE } np…

软件测试【常见】62 道面试题,不背完这些你还想去面试?

01、您所熟悉的测试用例设计方法都有哪些&#xff1f;请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。 02、您认为做好测试用例设计工作的关键是什么&#xff1f; 03、您在从事性能测试工作时&#xff0c;是否使用过一些测试工具&#xff1f;如果有&#xff0…

中国人民大学与加拿大女王大学金融硕士——去发现、去尝试更多的可能

现实中很多人都曾信心满满地列出各种计划&#xff0c;学习、减肥、运动等等&#xff0c;但结果却是“晚上想想千条路&#xff0c;早上醒来走原路”。三毛说过&#xff1a;“我有一个想法&#xff0c;去做&#xff01;”我们要发现&#xff0c;更要去行动&#xff0c;去尝试更多…

python输入矩阵的方法

在 python中输入矩阵有多种方法&#xff0c;这里我主要介绍下面几种。 输入矩阵的第一种方法&#xff0c;用 shell命令来实现。这个方法可以用来将矩阵转化为字符串&#xff0c;然后进行输入。 另外一种方法是使用 list语句。这个语句也是可以用来把矩阵转换为字符串的&#xf…