网络编程-五种IO模型(一)

简介: 网络编程-五种IO模型

前言


本文主要介绍网络编程中的五种IO模型


 本专栏知识点是通过零声教育的线上课学习,进行梳理总结写下文章,对c/c++linux课程感兴趣的读者,可以点击链接 C/C++后台高级服务器课程介绍 详细查看课程的服务。


提示:以下是本篇文章正文内容,下面案例可供参考


一、网络模块要处理哪些事情


在熟悉IO模型前首先需要明确网络模块(IO)的整个流程,也就是在一个完整的网络IO中网络模块要处理哪些事情,其实总的可以概括为五个步骤


       建立连接: 创建socket,监听端口(bind&listen)  


       接收连接: 当连接到达时,调用accept接收客户端的连接请求,生成一个新的socket(后面以clientfd表示), 这里需要注意的是 clientfd 有两个作用,一个是可以用来检测 IO 是否就绪,一个是用来进行IO操作


       连接断开: 监听两种断开状态(主动断开: 服务端读端关闭) (被动断开: 服务端读写端都关闭)


       消息到达: 监听clientfd的读事件,当有消息时 从 内核空间(read buff) 把数据 拷贝到 用户空间(变量)


       消息发送: 监听clientfd的写事件,把 用户空间 数据拷贝到 内核空间(write buff)


网络编程中主要关注 IO读写(内核空间拷贝到用户空间 or 用户空间拷贝到内核空间)的过程, 至于数据什么时候到达对端取决于网络协议栈(传输层, 网络层)


一、阻塞IO(blocking IO)

在linux中, socket默认是阻塞的,一个默认的IO阻塞操作步骤是这样的:



当用户进程调用了read方法, 如果这个时候网络数据还未到达,read buff中的数据还没准备就绪,这个时候用户进程将被阻塞等待,等待数据准备就绪后,用户进程再把数据从read buff 拷贝到 用户变量中返回,返回成功后用户进程才会被从阻塞等待数据的状态中解放出来,这边可以认为 等待数据就绪以及拷贝数据的过程 都是阻塞的


实际上send() recv() 等IO函数接口都是阻塞型的,在等待接口返回的过程中都是阻塞状态的。


这种模式就会导致一个IO阻塞 影响到 后续系统的网络连接请求以及进程IO无法被执行


二、非阻塞IO

        linux下可以通过设置 socket 让他成为非阻塞IO 调用read流程如下



图中的流程是 当用户进程调用read 要读取数据时, 如果read buff中没有数据, 程序就直接返回-1,不会阻塞等待, 而用户进程知道此时还没有数据包,可以再次调用read 读取, 直到有数据进行内存拷贝返回给用户进程(注意: 此时read 具备了 IO检测的功能)


使用以下的函数接口可将IO设置成非阻塞状态

fcntl( fd, F_SETFL, O_NONBLOCK );


相关文章
|
1天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于BP神经网络的苦瓜生长含水量预测模型matlab仿真
本项目展示了基于BP神经网络的苦瓜生长含水量预测模型,通过温度(T)、风速(v)、模型厚度(h)等输入特征,预测苦瓜的含水量。采用Matlab2022a开发,核心代码附带中文注释及操作视频。模型利用BP神经网络的非线性映射能力,对试验数据进行训练,实现对未知样本含水量变化规律的预测,为干燥过程的理论研究提供支持。
|
2天前
|
开发者
什么是面向网络的IO模型?
【10月更文挑战第6天】什么是面向网络的IO模型?
12 3
|
2天前
|
数据挖掘 开发者
网络IO模型
【10月更文挑战第6天】网络IO模型
11 3
|
23小时前
|
网络协议 前端开发 Java
网络协议与IO模型
网络协议与IO模型
网络协议与IO模型
|
2天前
|
缓存 Java Linux
硬核图解网络IO模型!
硬核图解网络IO模型!
|
2月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
3月前
|
Java 大数据
解析Java中的NIO与传统IO的区别与应用
解析Java中的NIO与传统IO的区别与应用
|
27天前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
|
2月前
|
Java 数据处理
Java IO 接口(Input)究竟隐藏着怎样的神秘用法?快来一探究竟,解锁高效编程新境界!
【8月更文挑战第22天】Java的输入输出(IO)操作至关重要,它支持从多种来源读取数据,如文件、网络等。常用输入流包括`FileInputStream`,适用于按字节读取文件;结合`BufferedInputStream`可提升读取效率。此外,通过`Socket`和相关输入流,还能实现网络数据读取。合理选用这些流能有效支持程序的数据处理需求。
31 2
|
2月前
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。