Linux 网络I/O模型

Linux 网络 I/O 模型简介(图文) 1、介绍 Linux 的内核将所有外部设备都看做一个文件来操作(一切皆文件),对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符)。而对一个socket的读写也会有响应的描述符,称为socket fd(socket文件描述符),描述符就是一个数字,指向内核中的一个结构体(文件路径,数据区等一些属性)。 根据UNIX网络编程对I/O模型的分类,UNIX提供了5种I/O模型。 1.1、阻塞I/O模型 最常用的I/O模型,默认 阅读详情

一、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操作

Linux 系统应用编程——网络编程(I/O模型) Unix下可用的5种I/O模型: 阻塞I/O 非阻塞I/O I/O复用(select和poll) 信号驱动I/O(SIGIO) 异步I/O(POSIX的aio_系列函数) 前四种都是同步,只有最后一种才是异步IO。   一个输入操作通常包括两个不同的阶段: 1)等待数据准备好; 2)从内核向进程复制数据;   对于一个套接字的输入操作,第一步通常涉及等待数据从网络中 阅读详情

相关推荐

晶圆表面缺陷检测现状概述

凹坑,凸起,尖角,沟槽),使用光束对晶圆进行照射,收集反射光和散射光信息进行缺陷判断,进一步可分为无图案晶圆表面检测和宏观缺陷检测设备。KLA使用SR-DUV光,检测精度在10nm以下。扫描电子显微(电子束和晶圆表面产生二次电子,X射线等)获取高分辨率的图像,然后用图像处理表面缺陷(凹坑,凸起,尖角,沟槽等)表面容貌和材料信息,分辨率可达5-10nm。晶圆表面缺陷检测设备主要检测晶圆外观呈现出来的缺陷,损伤、毛刺等缺陷,主要设备供应商KLA,AMAT,日立等,其中KLA在晶圆表面检测设备占有市场52%左右。

qq_36786800的博客 1万+

【Linux | 网络I/O模型】五种网络I/O模型详解

模型发起 I/O 请求等待 I/O 操作处理结果特点阻塞 I/O发起请求阻塞等待完成处理结果简单易懂,但效率低非阻塞 I/O发起请求立即返回(检查状态)处理结果轮询方式,效率较高I/O 多路复用发起请求等待事件发生处理已就绪事件高效处理多个 I/O 操作信号驱动式 I/O发起请求等待信号处理信号避免轮询,编程复杂异步 I/O发起请求继续执行其他任务处理结果(回调或通知)高效处理大量并发操作。

qq_42037383的博客 1594

VS2022 中 std::mutex 静态初始化陷阱:一次诡异崩溃的排查记录

VS2022中使用std::mutex时遇到的静态初始化陷阱问题。该问题源于VS2022 17.4版本为std::mutex添加constexpr支持后,全局静态初始化可能导致系统资源未就绪时锁失效或崩溃。文章分析了问题现象、影响范围,并提供了解决方案。最后给出了排查清单和核心建议

qq_34552942的博客 952

Linux网络I/O模型

在学习java bio/nio/aio之前,首先需要了解Linux网络I/O模型。 Linux内核把所有外部设备都看做一个文件来操作,对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符)。而对一个socket的读写也会有相应的描述符,返回socketfd(socket描述符),描述符就是一个数字,指向内核中的一个结构体(文件路径,数据区等一些属性)

懒羊羊1991的专栏 582

鲁棒优化入门(一)——工具箱Xprog和RSOME的安装与使用

Xprog是由新加坡国立大学的Peng Xiong于2016年发布的一款matlab工具箱,可以用于求解确定性优化、随机优化、鲁棒优化和分布式鲁棒优化问题。 还有一个针对鲁棒随机优化设计的matlab工具箱——RSOME(Robust Stochastic Optimization Made Easy),也可以用来解决一般的线性规划、随机规划、鲁棒优化和数据驱动的分布式鲁棒优化问题。...............

配电网和matlab的博客 1万+

CRaxsRat v7.6 安装与使用教程(附工具下载)

摘要:本文介绍远程管理工具CRaxsRat v7.6的合法应用与基本操作,强调仅限授权环境使用。该工具支持多客户端管理、TLS加密及文件/进程控制等功能,适用于内网维护与安全测试。安装需Windows 10/11系统及.NET 4.8,步骤包括解压运行、配置监听端口及生成客户端。文中提醒防火墙设置与杀软误报问题,并重申禁止非法用途,建议在虚拟机或隔离环境学习使用。

lzj781210的博客 3790

Netty入门笔记-Linux网络I/O模型介绍

在之前的博客中并没有将关于Netty的知识系统的总结起来。从这篇博客开始就将关于Netty的有关知识点总结起来顺便提升自己的分析问题的能力,通过博客分享的形式将学习的知识点形成体系,希望也可以帮助大家一起学习提高。 引言   在之前老版本的JDK中,对于IO性能问题支持的并不是太好,很多的情况下并不能正常的完成对于IO性能的要求。对于IO的操作问题主要体现在以下的几个方面。 1、没有很好的数...

初学者 2782

STM32F407单一定时器输出4路不同频率及占空比的PWM波

STM32F407单一定时器输出4路不同频率及占空比的PWM波

qq_43868701的博客 4918

【Linux网络】I/O 世界的技术之旅:探索五种模型与 fcntl 函数的魅力

1.获取,设置文件状态信息:cmd=F_GETFL,F_SETFL。 2.复制现有的描述符,cmd=F_DUPFD。 3.获取,设置文件描述符标识,cmd=F_GETFD,F_SETFD。 4.获取,设置异步IO所有权,cmd=F_GETOWN,F_SETOWN。 5.获取、设置记录锁,cmd=F_GETLK,F_SETLK,F_SETLKW。

路虽远,行则将至!事虽难,做则必成! 3433

MTK-AWB 小结 (二)

调试总结:可以将offset 对应的ratio加大,保留更多的喜好色(偏色),影响WF statistic gain,从而影响最终的awb gain。这一部分前期CCT校准的时候就会算出一组默认值,当然这个offset offse 值用于优化T,S,wf 光下的偏色喜好度. offset。后面遇到 A H Shad 光收白或者偏色,还可以优化 A 的offset ,H offset,shad offset.new offset 计算过程(Day locus offset 和M/G offset )

qq_46056347的博客 1167

【主力资金密码】副图指标升级版使用技术图文案例分解,通达信软件炒股指标公式代码

(1)主力资金线在低位时,对应的副图指标显示柱线是绿色,这个阶段主力资金参与小,行情处于下跌趋势或弱势震荡。当然,如果结合主图指标【翻倍密码系统】操作,主图的两个买卖点以及K线均线变色跟踪功能,更多的技术支撑,多空更加清晰,共振做多或多头更加确定和安全。如上图标记,中档虚线是参考安全操作的一个区间划分,粉色阶段做多或持股为主,为操作增加一道安全保护。如上图,副图指标【主力资金密码】更新叠加操作区间背景,绿色阶段持币或做空,粉色阶段做多或持股。如上图,副图指标,标记的两个区间,绿色区间时做空或持币。

weixin_69760830的博客 2553

Linux中的网络I/O模型

对于这几种I/O模型,生活中其实存在很多例子,我们以去售票窗口买车票为例,说明这几种I/O模型的区别。堵塞型I/O:到窗口去买票,如果此时没有票,你一直等在窗口前(堵塞),直到该窗口有车票准备好,你从窗口取票离开。非堵塞型I/O:如果窗口没有票,你就去做别的事情,你每隔一段时间来看一下有没有票(轮询),直到有票你取票离开。多路复用型I/O:买票的时候由专人负责维护所有排队买票的人,并且收集每个人的买票需求,当窗口有票的时候,专人负责通知需要车票的人去窗口取票。...

TankyZhang的博客 475

A2A 协议详解:Agent Card 的设计与实现

Agent Card 是 Agent2Agent (A2A) 协议中实现智能体发现与互操作性的核心组件。本文将深入剖析 Agent Card 的设计理念、关键字段及其在智能体生态系统中的作用。我们将通过详细的 JSON Schema 解析和 Python SDK 示例,帮助您理解如何精确地定义和发布智能体能力,为构建可发现、可协作的 AI 智能体奠定基础。当您使用a2a.Agent类初始化一个智能体时,SDK 会根据您提供的参数(nameversion等)自动构建内部的 Agent Card 表示。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 1476

【Linux网络编程】I/O模型

Linux网络编程 IO模型

lyh030105的博客 900

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

linux 网络i o 查看,Linux下的网络I/O模型

笔者最近在工作的过程中,涉及到了对Netty的理解,由此展开成对网络I/O模型的归纳,这也是这篇文章的缘由。网络I/O模型指的是什么首先,我们来明确一下,当我们在说网络I/O模型的时候,指的是linux系统的I/O模式。大的层面来分,I/O模型可以分为:同步IO (sync IO) 和异步IO (async IO)。sync v.s. async(个人理解:sync和async是处理方式,而不单单...

weixin_29421565的博客 333

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Linux系统网络I/O模型

Linux系统网络I/O模型 几个概念: 阻塞 非组赛 同步 异步

pengshengli的博客 181

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

linux的i o模型,浅谈Linux 网络 I/O 模型简介(图文)

1、介绍Linux 的内核将所有外部设备都看做一个文件来操作(一切皆文件),对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符)。而对一个socket的读写也会有响应的描述符,称为socket fd(socket文件描述符),描述符就是一个数字,指向内核中的一个结构体(文件路径,数据区等一些属性)。根据UNIX网络编程对I/O模型的分类,UNIX...

weixin_30884455的博客 135

Linux网络编程之I/O模型(详解)

本博客参考《Linux C/C++ 服务器开发实践》——朱文伟 李建英。

weixin_61503529的博客 960

框架篇:linux网络I/O+Reactor模型

1)linux下的五种网络I/O模型 2)多路复用I/O深入理解一波 3)Reactor模型 4)Proacotr模型

潜行前行的专栏 901

Linux 系统应用网络编程五(I/O模型)

Linux 系统应用网络编程五(I/O模型)

ListQ的博客 146

linux lv属性 w i,Linux 网络 I/O 模型简介(图文)

1、介绍Linux 的内核将所有外部设备都看做一个文件来操作(一切皆文件),对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符)。而对一个socket的读写也会有响应的描述符,称为socket fd(socket文件描述符),描述符就是一个数字,指向内核中的一个结构体(文件路径,数据区等一些属性)。根据UNIX网络编程对I/O模型的分类,UNIX...

weixin_42099070的博客 262

linux网卡IO,浅谈Linux 网络 I/O 模型简介(图文)

1、介绍Linux 的内核将所有外部设备都看做一个文件来操作(一切皆文件),对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符)。而对一个socket的读写也会有响应的描述符,称为socket fd(socket文件描述符),描述符就是一个数字,指向内核中的一个结构体(文件路径,数据区等一些属性)。根据UNIX网络编程对I/O模型的分类,UNIX...

weixin_28933179的博客 417

网络编程之 Socket的模式(二) --- “Linux网络I/O模型”

1. Linux下网络I/O模型          对于Linux系统,Richard Stevens在中提到了5种网络I/O模型(下面的图也来自于这本书),分别是:          1. 阻塞式I/O模型          2. 非阻塞I/O模型          3. I/O复用模型          4. 信号驱动I/O模型          5. 异步I/O模型 2

理性的幻想 2838

linux编程下的五种网络I/O模型

在linux下编程,我们常见有四种调试模式,分别是同步(Sync),异步(Async),阻塞(block)和非阻塞(Unblock). 同步和异步的概念描述的是用户的线程与内核IO操作的方式:同步是指用户线程发起IO请求后需要等待内核IO操作完成后才能继续执行;而异步是指用户线程发起IO请求后任然继续不断的执行,当内核IO操作完成后会通知用户线程,或者调用用户线程注册的回调函数。 linux下编程...

qq_44041062的博客 225
上一篇: socket简介
下一篇: tcp三次握手与四次分手
一个不务正业的程序猿
博客等级 码龄11年 1879粉丝 563原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值