I/0模型

同步I/O、异步I/O、阻塞I/0、非阻塞I/O、五种I/O模型、高性能网络模型 面试最常问问题之二:五种I/O模型及区别 ​ 阅读详情
     UNIX下有5种可用的I/0模型:
     •阻塞式I/0;
     •非阻塞式I/0;
     •I/0复用(select和poll);
     •信号驱动式I/0(SIGIO);
     •异步I/0(POSIX的aio_系列函数)。
     一个输入操作通常包括两个不同的阶段:
     (1)等待数据准备好;
     (2)从内核向进程复制数据。
     对于一个套接字上的输入操作,第一步通常涉及等待数据从网络中到达。当所等待分组到达时,它被复制到内核中的某个缓冲区(套接字接收缓冲区)。第二步就是把数据从内核缓冲区复制到应用进程缓冲区。
1 阻塞式I/0模型
     最流行的I/0模型是阻塞式I/0(blocking I/0)模型。默认情况下,所有套接字都是阻塞的。以数据报套接字作为例子,我们有如图1所示的情形。
                                        图1  阻塞式I/0模型
     我们使用UDP而不是TCP作为例子的原因在于就UDP而言,数据准备好读取的概念比较简单:要么整个数据报已经收到,要么还没有。然而对于TCP来说,诸如套接字低水位标记(low-water-mark)等额外变量起作用,导致这个概念变得复杂。
     在图1中,进程调用recvfrom,其系统调用直到数据报到达且被复制到应用进程的缓冲区中或者发生错误才返回。最常见的错误是系统调用被信号中断。我们说进程在从调用recvfrom开始到它返回的整段时间内是被阻塞的。recvfrom成功返回后,应用进程开始处理数据报。
2 非阻塞式I/0模型
     进程把一个套接字设置成非阻塞是在通知内核:当所请求的I/0操作非得把本进程投入睡眠才能完成时,不要把本进程投入睡眠,而是返回一个错误。图2概要展示了非阻塞式I/0(nonblocking I/0)模型。
                                        图2   非阻塞式I/0模型
     前三次调用recvfrom时没有数据可返回,因此内核转而立即返回一个EWOULDBLOCK错误。第四次调用recvfrom时已有一个数据包准备好,被复制到应用进程缓冲区,于是recvfrom成功返回。我们接着处理数据。
     当一个应用进程像这样对一个非阻塞描述符循环调用recvfrom时,我们称之为轮询(polling)。应用进程持续轮询内核,以查看某个操作是否就绪。这么做往往耗费大量CPU时间,不过这种模型偶尔也会遇到,通常是在专门提供某一种功能的系统中才有。
3 I/0复用模型
     有了I/0复用(I/0 multiplexing),我们就可以调用select或poll,阻塞在这两个系统调用中的某个之上,而不是阻塞在真正的I/0系统调用上。图3概括展示了I/0复用模型。
                                        图3 I/0复用模型
     我们阻塞于select调用,等待数据报套接字变为可读。当select返回套接字可读这一条件时,我们调用recvfrom把所读数据报复制到应用进程缓冲区。
     比较图3和图1,I/0复用并不显得有什么优势,事实上由于使用select需要两个而不是单个系统调用,I/0复用还稍有劣势。不过,使用select的优势在于我们可以等待多个描述符就绪。
     与I/0复用密切相关的另一种I/0模型是在多线程中使用阻塞式I/0。这种模型与上述模型极为相似,但它没有使用select阻塞在多个文件描述符上,而是使用多线程(每个文件描述符一个线程),这样每个线程都可以自由地调用诸如recvfrom之类的阻塞式I/0系统调用了。
4 信号驱动式I/0模型
     我们也可以用信号,让内核在描述符就绪时发送SIGIO信号通知我们。我们称这种模型为信号驱动式I/0(signal-driven I/0),图4是它的概要展示。
                                        图4 信号驱动式I/0模型
     我们首先开启套接字的信号驱动式I/0功能,并通过sigaction系统调用安装一个信号处理函数。该系统调用将立即返回,我们的进程继续工作,也就是说它没有被阻塞。当数据报准备好读取时,内核就为该进程产生一个SIGIO信号。我们随后既可以在信号处理函数中调用recvfrom读取数据报,并通知主循环数据已准备好待处理,也可以立即通知主循环,让它读取数据报。
     无论如何处理SIGIO信号,这种模型的优势在于等待数据报到达期间进程不被阻塞。主循环可以继续执行,只要等待来自信号处理函数的通知:即可以是数据已准备好被处理,也可以是数据报已准备好被读取。
5 异步I/0模型
     异步I/0(asynchronous I/0)由POSIX规范定义。演变成当前POSIX规范的各种早期标准所定义的实时函数中存在的差异已经取得一致。一般地说,这些函数的工作机制是:告知内核启动某个操作,并让内核在整个操作(包括将数据从内核复制到我们自己的缓冲区)完成后通知我们。这种模型与前一节介绍的信号驱动模型的主要区别在于:信号驱动式I/0是由内核通知我们何时可以启动一个I/0操作,而异步I/0模型是由内核通知我们I/0操作何时完成。图5给出了一个例子。
                                        图5 异步I/0模型
     我们调用aio_read函数,给内核传递描述符、缓冲区指针、缓冲区大小(与read相同的三个参数)和文件偏移(与lseek类似),并告诉内核当整个操作完成时如何通知我们。该系统调用立即返回,而且在等待I/0完成期间,我们的进程不被阻塞。本例子中我们假设要求内核在操作完成时产生某个信号。该信号直到数据已复制到应用进程缓冲区才产生,这一点不同于信号驱动式I/0模型。
6 各种I/0模型的比较
     图6对比了上述5种不同的I/0模型。可以看出,前4种模型的主要区别在于第一阶段,因为它们的第二阶段是一样的:在数据从内核复制到调用者的缓冲区期间,进程阻塞于recvfrom调用。相反,异步I/0模型在这两个阶段都要处理,从而不同于其他4种模型。
                                        图6 5种I/0模型的比较
7 同步I/0和异步I/0对比
     POSIX把这两个术语定义如下:
     •同步I/0操作(synchronous I/0 operation)导致请求进程阻塞,直到I/0操作完成;
     •异步I/0操作(asynchronous I/0 operation)不导致请求进程阻塞。
     根据上述定义,我们的前4种模型--阻塞式I/0模型、非阻塞式I/0模型、I/0复用模型和信号驱动式I/0模型都是同步I/0模型,因为其中真正的I/0操作(recvfrom)将阻塞进程。只有异步I/0模型与POSIX定义的异步I/0相匹配。
【OpenArm|Control】openarm机械臂ROS2仿真控制 openarm_ros2 存储库包含用于 ros2_control 的包集合。 它抽象化了硬件控制,将手臂公开为接收位置、速度和扭矩命令并输出关节状态的接口。 openarm_bringup 包提供了通过包与 ROS2 控制框架集成的启动文件。该软件包提供启动文件和配置,用于启动硬件接口、加载控制器以及将物理臂连接到 ROS2 生态系统。启动后,您可以使用标准 ROS2 控制工具和接口来命令手臂并接收反馈。openarm_bringup bringup 包支持模拟硬件(用于模拟/测试)和通过硬件插件的真实 阅读详情

相关推荐

qemu-system-aarch64参数详解与实战配置指南

本文详细解析了qemu-system-aarch64的核心参数,包括-machine、cpu、smp、m、drive和netdev等关键配置。通过嵌入式内核调试、完整系统运行和外设模拟三大实战场景,提供可直接使用的配置示例与性能优化技巧,帮助开发者在x86主机上高效构建和调试ARM64虚拟环境。

weixin_29197051的博客 353

I/0系统基本概念

输入设备、输出设备、外存设备、I/O接口(I/O控制器)

码明的博客 1340

单细胞RNA测序数据分析与可视化:从基础原理到高级应用

单细胞RNA测序(scRNA-seq)技术通过解析单个细胞的基因表达谱,显著提升了我们对细胞异质性的理解。本文详细介绍了scRNA-seq数据分析的完整流程,包括数据预处理、质量控制、降维、聚类、差异表达分析、细胞类型注释、细胞周期分析、轨迹分析、RNA速率分析、基因集富集分析、细胞通讯分析、批次效应校正以及空间转录组学整合。文章还展示了scrna_toolkit包在简化分析流程和增强数据可视化方面的应用。通过这一工具,研究者可以更高效地处理单细胞数据,揭示复杂的生物学信息。未来,该工具将进一步整合多组学分

2301_80338712的博客 4131

什么是I/O?

计算机有输入设备(键盘等)和输出设备(显示屏等),(网卡和硬盘既可以作为输入也可以作为输出)。所以从计算机结构角度来看,I/O描述的是。为了保证操作系统的安全性和稳定性,一个进程的地址空间被分为和。我们平时的应用程序都是运行在用户空间,而像等都是需要依赖内核空间来完成的。而我们要执行I/O操作时,由于我们没有权限,所以只有,让操作系统来帮我们完成。而我们一般开发常见的就是。所以从应用程序来看,I/O是指我们的应用程序,将我们需要的数据从内核空间拷贝到用户空间。

m0_51808048的博客 6725

【华为OD技术面】 - 考到的Lettcode手撕算法代码真题目录

【华为OD技术面 - 考到的Lettcode手撕算法代码真题目录

算法大师! 7817

基于Java+SpringBoot+微信小程序实现奶茶点单系统

再不用担心逢年过节的第一杯奶茶有没有人送了,制作一个奶茶点单系统自己当店主,开怀畅饮,一劳永逸。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 1万+

什么是I/O?

I/O 是输入/输出(Input/Output)的缩写,在计算机科学和信息技术中,指的是计算机系统与外部世界(包括用户、其他计算机系统或外部设备)之间的数据交换过程。I/O 操作涉及到数据的接收和发送,涵盖了计算机系统中的各种输入和输出设备。为了提高 I/O 操作的效率,数据通常会被临时存储在缓冲区中,特别是在处理速度不一致的设备之间。它们将操作系统的命令转换为设备能理解的指令,并处理来自设备的响应。控制和监控:通过 I/O 操作来控制设备(如打开/关闭设备)和监控设备状态(如读取传感器数据)。

Jesse0257的博客 1639

【知识点讲解】大模型参数量与计算量(FLOPs)估算方法

指标参数量 (Params)计算量 (FLOPs)含义模型的大小,静态模型的计算复杂度,动态决定因素模型结构(宽度、深度)模型结构 +输入数据(B, S)影响内存占用、磁盘空间运行速度、能耗单位M (百万), B (十亿)工具thopptflopstorchinfothopptflopsfvcore重要提示FLOPs ≠ 速度:FLOPs 是理论计算量。实际速度还受内存带宽 (Memory Bandwidth)并行度硬件架构等因素严重影响。

AI浩 2096

100条经典C++笔试题目及答案分享

100条经典C++笔试题目分享一、C++与C差异(1-18)二、数据类型、关键字(19-37)三、C++面向对象的特性(38-61)四、程序阅读题(62-90)五、编程练习(91-100) 看到好用的经典C++题目,对机试和笔试,甚至面试都有帮助,特意分享,自己也复习一遍,互勉。 题目来源: 1、中兴、华为、慧通、英华达、微软亚洲技术中心等中外企业面试题目; 2、C++面试宝典(林锐《高质量编程第...

Penn Li的博客 8万+

基于STM32L4XX、HAL库的ICM-42607-P姿态传感器驱动程序设计

/ 转换为dps(±1000dps量程)float accel_x = sensor_data.accel_x * (8.0f / 32768.0f);// 转换为g值(±8g量程)#define ICM42607_I2C_ADDR 0x68 << 1 // I2C地址(SA0=0)= 0x40) { // ICM-42607的WHO_AM_I值为0x40。// 读取传感器数据。

zhusl6688的博客 835

材料仿真软件:Materials Studio_(14).电学性质计算

设置计算参数,包括 k 点网格、交换相关泛函等。

kkchenjj的博客 1863

操作系统:I/O控制方式 详细汇总+形象举例

目录: 程序直接控制方式 中断驱动方式 DMA方式 通道控制方式 举个栗子 一、程序直接控制方式 思想:计算机从外部设备读取数据到存储器,每次读一个字的数据。对读入的每个字,CPU 需要对外设状态进行循环检查(轮询),直到确定该字已经在I/0 控制器的数据寄存器中。在程序直接控制方式中,由于CPU 的高速性和I/0设备的低速性,致使CPU 的绝大部分时间都处于等待I/0 设备完成数据I/0 的循环测试中,造成了CPU 资源的极大浪费。在该方式中, CPU 之所以要不断地测试I/0 设备的状态,就是因为在

hhhhxxn的博客 2904

无人机视角下基于YOLOv5/v8/v10的车辆检测系统:从算法原理到UI界面实战

随着无人机技术的普及和智慧城市的发展,无人机视角下的车辆检测在交通监控、战场侦察、灾害救援等领域展现出巨大的应用价值。然而,无人机航拍图像存在目标尺度小、视角多变、背景复杂等挑战。本文深入探讨了如何利用YOLOv5、YOLOv8、YOLOv10三个代表性目标检测算法,构建一套完整的无人机车辆检测系统。文章不仅详细解析了各版本YOLO的核心技术演进,还提供了从数据集准备、模型训练、性能评估到基于PyQt5/PySide6的图形界面开发的完整代码实现。通过本文,读者将能够掌握构建无人机实时车辆检测系统的全流程技

YOLO 172

Netty从0到1系列之I/O模型

摘要 本文从操作系统设计角度,深入解析了内核态与用户态的核心概念及其交互机制。文章通过公司管理层的类比,形象阐述了两种状态的权限差异:用户态如普通员工受限操作,内核态则拥有最高权限。系统调用是用户程序请求内核服务的唯一通道,文中以文件写入为例展示了完整的调用流程。 第二部分聚焦缓冲区技术,分析了其在解决CPU与I/O设备速度差异中的关键作用。详细对比了应用程序缓冲区(用户空间)与内核缓冲区(内核空间)的不同职责,并通过文件读写场景演示了数据在多层缓冲区间的流动过程。

编程技术圈 1584

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

小红书抗住高并发的背后:Redis 7.0 性能必杀技之 I/O 多线程模型

大家好,我是码哥,《Redis 高手心法》作者。本书获得前阿里 P9 级资深技术专家李运华的推荐。进入正文......在《Redis 为什么这么快》这篇文章中,我们已经知道 Redis 使用全局 dict 字典表 + 内存数据库 + 丰富高效的数据结构 + 单线程模型 + I/O 多路复用事件驱动框架使得 Redis 快到飞起。Redis 的网络 I/O 以及键值对指令读写是由单个线程来执行的,避...

码哥字节 813

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Redis 6.0 多线程网络 I/O 模型

Redis 6.0 引入多线程架构,主要优化网络I/O处理,同时保持核心命令执行的单线程特性。通过将耗时的网络数据读写操作分配给多个I/O线程并行执行,充分利用多核CPU能力,显著提升吞吐量。关键设计在于:1)I/O线程并行处理网络数据拷贝;2)主线程仍串行执行内存操作,避免锁竞争;3)严格的任务同步机制确保执行顺序一致性。该架构在保持Redis高性能和简单性的同时,有效突破了单核CPU处理网络I/O的瓶颈。配置时需注意多线程功能默认关闭,仅在高并发场景下按需开启。

love___me的博客 494

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

关于I/0模型的简略概述[英文]

原网址:http://blogs.msdn.com/b/csliu/archive/2009/08/18/winsock-i-o-model-part-ii-implementation.aspx In the previous post[6], I summarized several scalable network I/O models in theory. In this a

Sunshine 807

Redis 6.0 多线程网络I/O模型详解:从单线程瓶颈到高效演进

Redis 6.0引入多线程网络I/O模型,突破单线程瓶颈。本文通过高速公路收费站和餐厅运营的类比,解析Redis单线程模型的优势与局限,以及6.0版本如何通过"网络I/O多线程+核心命令单线程"的混合架构实现性能飞跃。文章详细拆解了多线程I/O的工作流程、线程职责划分,并给出关键配置参数说明,帮助开发者理解Redis如何平衡性能与简洁性,在高并发场景下充分利用多核CPU资源。

m0_65159391的博客 709

I/0模型(select模型)

select 模型 1)引入 为什么要引入select模型呢  同步阻塞问题我们可以利用多线程 或者把socket改成非阻塞 当我们要接受数据的时候我们要来回查看接受缓冲区有没有数据这样我们就要来回切换用户和内核浪费时间降低效率 所以我们让一个把所有的socket的有无数据都看了呢 这样我没就要引入select select 模型是Winsock中最常见的I/0模型,核心是利用selec...

qq_37163944的博客 4621

JAVA I/0模型

JAVA I/0模型

weixin_42548604的博客 237

Socket回顾与I/0模型

Socket,套接字就是两台主机之间逻辑连接的端点。TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。Socket是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息连接使用的协议、本地主机的IP地址、本地进程的协议端口、远程主机的IP地址、远程进程的协议端口。...

凉茶铺的博客 299

SOKET模型重叠I/0

四。     实现重叠模型的步骤 作了这么多的准备工作,费了这么多的笔墨,我们终于可以开始着手编码了。其实慢慢的你就会明白,要想透析重叠结构的内部原理也许是要费点功夫,但是只是学会如何来使用它,却是真的不难,唯一需要理清思路的地方就是和大量的客户端交互的情况下,我们得到事件通知

goodadult2012的专栏 1168

Redis 7.0 I/O多线程模型:小红书高并发性能的幕后推手

小红书在应对高并发场景时,采用了Redis 7.0版本中的I/O多线程模型以提升性能。此模型不同于传统的Multi-Reactors/Master-Workers架构,在I/O多线程模型中,线程专注于通过socket读取客户端请求命令、解析命令,并将执行结果回写到socket,而命令的实际执行则交由其他组件负责。通过引入Redis 7.0的I/O多线程模型,小红书成功应对了高并发场景下的性能挑战。

Xs_20240309的博客 1281

windows套接字I/0模型-WSAAsyncSelect 模型

其中,hwnd 是窗口句柄,WM_SOCKET 是自定义的消息类型,FD_READ 表示套接字上有可读数据,FD_WRITE 表示套接字可写,FD_CLOSE 表示套接字已关闭,FD_CONNECT 表示套接字连接已建立。WSAAsyncSelect 函数的第一个参数是套接字的句柄,第二个参数是窗口句柄,第三个参数是一个整数,表示需要监听的网络事件,第四个参数是错误代码。(2)回调函数的第一个参数是窗口句柄,第二个参数是消息类型,第三个参数是套接字句柄,第四个参数是网络事件类型,第五个参数是错误代码。

ai agent 1062

Redis 7.0 新特性助力:小红书利用 I/O 多线程模型应对高并发挑战

Redis 7.0的I/O多线程模型为小红书应对高并发挑战提供了有力的支持。通过充分利用Redis的高性能特性和不断优化的技术架构,小红书能够在保证数据一致性和可靠性的同时,提供极致的用户体验。未来,随着大数据和人工智能技术的广泛应用,Redis和其他数据库技术将不断发展和演变,为互联网企业应对高并发挑战提供更多更好的解决方案。

2408_88802129的博客 756

【Java 多线程编程 | 从0到1】线程I/O模型

线程I/O模型 2.1 线程与阻塞 I/O 2.1.1 单线程阻塞 I/O 模型 2.1.2 多线程阻塞 1/0 模型 2.2 线程与非阻塞 1/0 模型 2.3 Java 多线程非阻塞I/O 模型 2.4 多线程带来了什么

鱼干的博客 1516
上一篇: accept函数
下一篇: close和shutdown函数
sturdygrass
博客等级 码龄14年 3粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值