网络 IO 模式

同步 IO 与异步 IO

同步 IO 和异步 IO 是关于数据读写方式的两种不同模式。
同步 IO 是指在程序读写数据时,需要等待操作完成后才能继续执行后面的程序。这种模式下,当程序使用阻塞式 IO 时,会一直等待IO操作完成,程序会暂停执行,直至IO操作完成,这样会导致程序的执行效率降低。同步 IO 主要用于小型程序,如批处理作业,简单计算和查询程序等。

同步IO的特点:
1.同步IO指的是用户进程触发I/O操作并等待或者轮询的去查看I/O操作是否就绪。
2.同步IO的执行者是IO操作的发起者。
3.同步IO需要发起者进行内核态到用户态的数据拷贝过程,所以这里必须阻塞。

异步 IO 是指在进行数据读写操作时,程序无需等待 IO 操作完成。异步 IO 使得程序可以在 IO 操作的同时执行其他操作,提高了程序的执行效率。异步 IO 主要用于高并发场景,如 Web 服务器、数据库访问等。

异步IO的特点:
1.异步IO是指用户进程触发I/O操作以后就立即返回,继续开始做自己的事情,而当I/O操作已经完成的时候会得到I/O完成的通知。
2.异步IO的执行者是内核线程,内核线程将数据从内核态拷贝到用户态,所以这里没有阻塞。

在这里插入图片描述


五种网络IO模式

对于一次IO访问(以read为例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。所以说,当一个read操作发生时,会经历两个阶段:
1、等待数据准备
2、将数据从内核拷贝到进程中

linux系统产生了下面五种网络模式的方案:
1、阻塞IO(blocking IO)
2、非阻塞IO(nonblocking IO)
3、IO多路复用(IO multiplexing)
4、信号驱动IO(signal driven IO)不常用
5、异步IO (asynchronous IO)

阻塞 IO

阻塞:当某个事件或者任务在执行过程中,它发出一个请求操作,但是由于该请求操作需要的条件不满足,那么就会一直在那等待,直至条件满足;

同步和异步着重点在于多个任务的执行过程中,一个任务的执行是否会导致整个流程的暂时等待;
而阻塞和非阻塞着重点在于发出一个请求操作时,如果进行操作的条件不满足是否会返会一个标志信息告知条件不满足。

在linux 中,默认情况下所有的 socket 都是 blocking IO, 一个典型的读操作流程:
在这里插入图片描述

非阻塞 IO

非阻塞:当某个事件或者任务在执行过程中,它发出一个请求操作,如果该请求操作需要的条件不满足,会立即返回一个标志信息告知条件不满足,不会一直在那等待。

阻塞和非阻塞的区别关键在于当发出请求一个操作时,如果条件不满足,是会一直等待还是返回一个标志信息。

当用户线程发起一个 read 操作后,并不需要等待,而是马上就得到了一个结果。如果结果是一个error时,它就知道数据还没有准备好,于是它可以再次发送 read 操作。一旦内核中的数据准备好了,并且又再次收到了用户线程的请求,那么它马上就将数据拷贝到了用户线程,然后返回。
所以事实上,在非阻塞IO模型中,用户线程需要不断地询问内核数据是否就绪,也就说非阻塞IO不会交出CPU,而会一直占用CPU。

在这里插入图片描述

设置非阻塞常用方式:
方式一: 创建socket 时指定

int s = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, IPPROTO_TCP);

方式二: 在使用前通过如下方式设定

fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFL, 0) | O_NONBLOCK);

IO 多路复用

在多路复用 IO 模型中,会有一个线程不断去轮询多个 socket 的状态,只有当 socket 真正有读写事件时,才真正调用实际的 IO 读写操作。因为在多路复用IO模型中,只需要使用一个线程就可以管理多个 socket,系统不需要建立新的进程或者线程,也不必维护这些线程和进程,并且只有在真正有socket读写事件进行时,才会使用 IO 资源,所以它大大减少了资源占用。

多路复用IO为何比非阻塞IO模型的效率高 是因为在非阻塞 IO 中,不断地询问 socket 状态是通过用户线程去进行的,而在多路复用 IO 中,轮询每个 socket 状态是内核在进行的,这个效率要比用户线程要高的多。

不过要注意的是,多路复用IO模型是通过轮询的方式来检测是否有事件到达,并且对到达的事件逐一进行响应。因此对于多路复用IO模型来说,一旦事件响应体很大,那么就会导致后续的事件迟迟得不到处理,并且会影响新的事件轮询。

信号驱动 IO

在信号驱动 IO 模型中,当用户线程发起一个 IO 请求操作,会给对应的 socket 注册一个信号函数,然后用户线程会继续执行,当内核数据就绪时会发送一个信号给用户线程,用户线程接收到信号之后,便在信号函数中调用 IO 读写操作来进行实际的 IO 请求操作。

使用信号驱动 I/O 时,当网络套接字可读后,内核通过发送 SIGIO 信号通知应用进程,于是应用可以开 始读取数据。该方式并不是异步 I/O,因为实际读取数据到应用进程缓存的工作仍然是由应用自己负责的。

在这里插入图片描述

异步 IO

在异步IO模型中,当用户线程发起 read 操作之后,立刻就可以开始去做其它的事。而另一方面,从内核的角度,当它收到一个 asynchronous read 之后,它会立刻返回,说明 read 请求已经成功发起了,因此不会对用户线程产生任何 block。然后,内核会等待数据准备完成,然后将数据拷贝到用户线程,当这一切都完成之后,内核会给用户线程发送一个信号,告诉它 read 操作完成了。
也就说用户线程完全不需要知道实际的整个IO操作是如何进行的,只需要先发起一个请求,当接收内核返回的成功信号时表示IO操作已经完成,可以直接去使用数据了。

也就说在异步IO模型中,IO操作的两个阶段都不会阻塞用户线程,这两个阶段都是由内核自动完成,然后发送一个信号告知用户线程操作已完成。

在这里插入图片描述

前面四种IO模型实际上都属于同步IO,只有最后一种是真正的异步IO,因为无论是多路复用IO还是信号驱动模型,IO操作的第2个阶段都会引起用户线程阻塞,也就是内核进行数据拷贝的过程都会让用户线程阻塞。

https://www.cnblogs.com/xiaoxi/p/6525396.html

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

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

相关文章

HarmonyOS实战开发-如何实现查询当前城市实时天气功能

先来看一下效果 本项目界面搭建基于ArkUI中TS扩展的声明式开发范式, 数据接口是和风(天气预报), 使用ArkUI自带的网络请求调用接口。 我想要实现的一个功能是,查询当前城市的实时天气, 目前已实现的功能…

后仿真中的关于延时问题(物理特性角度)

大家都知道,后仿真讲究仿真时序。那么,在网表阶段,接触到后仿延时问题。今天总结一下。 一 延时概念和分类 1.1 分布式延迟(Distributed Delays) 一般用来指定模块内部信号通过逻辑单元或者线网耗费的时间。 1.2 模…

Python运维-日志记录、FTP、邮件提醒

本章目录如下: 五、日志记录 5.1、日志模块简介 5.2、logging模块的配置与使用 六、搭建FTP服务器与客户端 6.1、FTP服务器模式 6.2、搭建服务器 6.3、编写FTP客户端程序 七、邮件提醒 7.1、发送邮件 7.2、接收邮件 7.3、实例:将报警信息实时…

一、Redis五种常用数据类型

Redis优势: 1、性能高—基于内存实现数据的存储 2、丰富的数据类型 5种常用,3种高级 3、原子—redis的所有单个操作都是原子性,即要么成功,要么失败。其多个操作也支持采用事务的方式实现原子性。 Redis特点: 1、支持…

Vscode 实现代码跳转功能

随笔 目录 1. 安装Python 2. 安装Pylance 3. 选择解释器 1. 安装Python 2. 安装Pylance 3. 选择解释器 到此即可实现跳转功能

鸿蒙开发接口Ability框架:【@ohos.application.missionManager (missionManager)】

missionManager missionManager模块提供系统任务管理能力,包括对系统任务执行锁定、解锁、清理、切换到前台等操作。 说明: 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 impo…

W801学习笔记二十二:英语背单词学习应用——下

续上篇: W801学习笔记二十一:英语背单词学习应用——上 五、处理用户交互 由于英语也是采用了和唐诗一样的《三分钟限时挑战》《五十题竞速挑战》《零错误闯关挑战》,所以用户交互的逻辑和唐诗是一样的。所以,我们抽一个基类&a…

关于2024年东北教育装备展示会(沈阳)参展通知

2024年东北教育装备展示会 邀请函 数字赋能新时代 共创教育新未来 时间:2024年6月28-30日 地点:沈阳国际展览中心(沈阳市苏家屯-会展路9号) 展览面积:30000平方米 参展商数:260家 预计观众&#xff1…

SpringBoot+Vue+Element-UI实现医患档案管理系统

目录 前言介绍 系统展示 管理员页面 患者管理 诊疗信息管理 病历信息管理 处方信息管理 患者页面 医生页面 部分核心代码 病历信息 上传文件 数据库配置 前言介绍 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技…

【Toritoise SVN】SVN 怎么忽略文件夹下的所有文件但是不忽略文件夹本身

比如:忽略 Assets\StreamingAssets\LocalAsset文件夹下的所有文件但是不忽略LocalAsset这个文件夹 在TortoiseSVN中,你可以通过以下步骤来修改文件夹的svn:ignore属性: 打开Windows资源管理器,导航到你的工作副本中的Assets\Stre…

TCN合集(TCN、TCN-GRU、TCN--GRU--Attention、TCN-Bigru、TCN-BiGRU-Attention)

TCN、TCN-GRU、TCN-GRU-Attention、TCN-BiGRU、TCN-BiGRU-Attention)在结构原理上既有相似之处,也存在一些关键的不同点。以下是对这些模型的异同点以及它们之间优劣性的对比: TCN合集(TCN-GRU、TCN--GRU--Attention、TCN-Bigru等…

TinyXML-2介绍

1.简介 TinyXML-2 是一个简单、小巧的 C XML 解析库,它是 TinyXML 的一个改进版本,专注于易用性和性能。TinyXML-2 用于读取、修改和创建 XML 文档。它不依赖于外部库,并且可以很容易地集成到项目中。 tinyXML-2 的主要特点包括&#xff1a…

设置多用户远程登录windows server服务器

##设置多用户远程登录windows server服务器 ###1、远程登录windows server 2016 运行—>mstsc—>远程IP地址—>用户和密码 2、远程windows服务器设置多用户策略 运行—>gpedit.msc->计算机配置—管理模板—windows组件—远程桌面服务—远程桌面会话主机----连…

计算机考研|今年这么多高校改考408,该怎么择校呢?

25年改考408院校名单 考研第一重要的事情并不是分要多高,而是要能考得上! 尤其是408,绝对是选择大于努力的典范。方向不对,努力作废! 就看我22年的分数线吧,最炸的就属上海交大了,大旱区结果…

二进制,八进制,十六进制转十进制 c++

紧接着十进制转二进制,八进制,十六进制-CSDN博客这篇文章 输入一个二进制,八进制的数,怎样能转化为十进制呢? 原理如下: K进制转十进制 按权相加法展开成一个多项式,每项是该位的数码与相应…

抖音小店怎么快速出体验分?分享三种不花一分钱,就能出分的技巧

哈喽~我是电商月月 才做抖音小店,新开的店铺是没有体验分的 没有体验分就没法用猜你喜欢和搜索流量,也没法持续做精选联盟,没体验分店铺就不好出单 于是很多朋友就去网上选择找S分机构,想快速出体验分,但这种方式我…

2019年CSP-J入门级第一轮初赛真题

一.单项选择题(共 15 题,每题 2 分,共计 30 分;每题有且仅有一个正确选项) 中国的国家顶级域名是( ) A. .cnB. .chC. .chnD. .china 二进制数 11 1011 1001 0111 和 01 0110 1110 1011 进行逻辑与运算的结果…

搭建父模块和工具子模块

第一章 项目父模块搭建 1.1 nancal-idsa 作为所有工程的父工程&#xff0c;用于管理项目的所有依赖版本。 1.2 指定 pom 类型模块&#xff0c;删除 src 目录&#xff0c;点击Reload project 1.3 添加依赖 pom.xml <parent> <groupId>org.springframework.…

TitanIDE安装常见问题解答

在软件开发和编程的世界里&#xff0c;集成开发环境&#xff08;IDE&#xff09;扮演着至关重要的角色。TitanIDE作为一款功能强大的开发工具&#xff0c;深受广大开发者的喜爱。然而&#xff0c;在安装和使用TitanIDE的过程中&#xff0c;开发者们往往会遇到一些问题和挑战。针…

phpstudy靶场访问显示404 Not Found

涉及靶场 upload-labd sqli-labs pikachu dvwa 以及所有部署在phpstudy中的靶场 一、检查phpstduy设置 localhost——管理——修改 1、根目录&#xff08;默认设置&#xff0c;不要改&#xff09; localhost这个域名必须保留&#xff0c;并且把根目录设置为phpstudy的WWW文…