【网络编程】Unix下IO模型及他们之间的区别

简介: Unix下5种IO模型他们之间的区别

 目录

一:Unix下5种IO模型

二:他们之间的区别


一:Unix下5种IO模型

    • 阻塞式IO
    • 非阻塞式IO
    • IO多路复用(select和poll)
    • 信号驱动式IO(SIGIO)
    • 异步IO

    对于一个套接字上的输入操作,两个阶段:

    1)等待数据从网络中到达,被复制到内核中的某个缓冲区;

    2)将数据从内核缓冲区复制到应用进程缓冲区;

      1. 阻塞式IO模型
        网络异常,图片无法展示
        |
        image.gif编辑

        进程调用recvfrom,其系统调用直到数据报到达且被拷贝到应用进程的缓冲区中或者发生错误才返回。最常见的错误是系统调用被信号中断。我们说进程在从调用recvfrom开始到它返回的整段时间内是被阻塞的。recvfrom成功返回后,应用进程开始处理数据。
      2. 非阻塞式IO
        进程把一个套接口设置成非阻塞是在通知内核:当所请求的I/O操作非得把本进程投入睡眠才能完成时,不要把本进程投入睡眠,而是返回一个错误。下图展示了非阻塞I/O模型。
        image.gif编辑
        前三次调用recvfrom时没有数据可返回,因此内核转而立即返回一个EWOULDBLOCK错误。第四次调用 recvfrom时已有数据报准备好,它被拷贝到应用进程缓冲区,recvfrom于是成功返回。我们接着处理数据。
        当一个应用进程像这样对一个非阻塞描述字循环调用recvfrom时,我们称之为轮询(polling)。应用进程持续轮询内核,以查看某个操作是否就绪。这么做往往耗费大量CPU时间,不过这种模型偶尔也会遇到,通常是在只专门提供某种功能的系统中才有。
      3. IO多路复用
        有了I/O复用(I/O multiplexing),我们就可以调用select或poll,阻塞在这两个系统调用中的某一个之上,而不是阻塞在真正的I/O系统调用上。下图展示了I/O复用模型。
        我们阻塞于select调用,等待数据报套接口变为可读。当select返回套接口可读这一条件时,我们调用recvfrom把所读数据报拷贝到应用进程缓冲区。

      与I/O复用密切相关的另一种I/O模型是在多线程中使用阻塞I/O。这种模型与I/O复用模型极为相似,代替使用select阻塞在多个文件描述字上的是,使用多个线程(每个文件描述字一个线程),这样每个线程都可以自由地调用诸如recvfrom之类的阻塞式I/O系统调用了。

      1. 信号驱动式IO(SIGIO)
        我们也可以用信号,让内核在描述字就绪时发送SIGIO信号通知我们。
        我们首先开启套接口的信号驱动I/O功能,并通过sigaction系统调用安装一个信号处理函数。该系统调用立即返回,我们的进程继续工作,也就是说它没有被阻塞。当数据报准备好读取时,内核就为该进程产生一个SIGIO信号。我们随后既可以在信号处理函数中调用recvfrom读取数据报,并通知主循环数据已准备好待处理,也可以立即通知主循环,让它读取数据报
        网络异常,图片无法展示
        |
        image.gif编辑

      2. 异步IO
        一般地说,这些函数的工作机制是:告知内核启动某个操作,并让内核在整个操作(包括将数据从内核拷贝到我们自己的缓冲区)完成后通知我们。
        这种模型与信号驱动模型的主要区别在于:信号驱动I/O是由内核通知我们何时启动一个I/O操作,而异步I/O模型是由内核通知我们I/O操作何时完成。

      网络异常,图片无法展示
      |
      image.gif 编辑

      二 :IO模型的比较

      网络异常,图片无法展示
      |
      image.gif 编辑


      相关文章
      |
      27天前
      |
      机器学习/深度学习 算法 数据安全/隐私保护
      基于BP神经网络的苦瓜生长含水量预测模型matlab仿真
      本项目展示了基于BP神经网络的苦瓜生长含水量预测模型,通过温度(T)、风速(v)、模型厚度(h)等输入特征,预测苦瓜的含水量。采用Matlab2022a开发,核心代码附带中文注释及操作视频。模型利用BP神经网络的非线性映射能力,对试验数据进行训练,实现对未知样本含水量变化规律的预测,为干燥过程的理论研究提供支持。
      |
      26天前
      |
      网络协议 前端开发 Java
      网络协议与IO模型
      网络协议与IO模型
      网络协议与IO模型
      |
      26天前
      |
      机器学习/深度学习 网络架构 计算机视觉
      目标检测笔记(一):不同模型的网络架构介绍和代码
      这篇文章介绍了ShuffleNetV2网络架构及其代码实现,包括模型结构、代码细节和不同版本的模型。ShuffleNetV2是一个高效的卷积神经网络,适用于深度学习中的目标检测任务。
      61 1
      目标检测笔记(一):不同模型的网络架构介绍和代码
      |
      6天前
      |
      网络协议 算法 网络性能优化
      计算机网络常见面试题(一):TCP/IP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议
      计算机网络常见面试题(一):TCP/IP五层模型、应用层常见的协议、TCP与UDP的区别,TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议、ARP协议
      |
      7天前
      |
      网络协议 物联网 API
      Python网络编程:Twisted框架的异步IO处理与实战
      【10月更文挑战第26天】Python 是一门功能强大且易于学习的编程语言,Twisted 框架以其事件驱动和异步IO处理能力,在网络编程领域独树一帜。本文深入探讨 Twisted 的异步IO机制,并通过实战示例展示其强大功能。示例包括创建简单HTTP服务器,展示如何高效处理大量并发连接。
      24 1
      |
      11天前
      |
      机器学习/深度学习 人工智能 算法
      【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
      车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
      33 0
      【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
      |
      20天前
      |
      机器学习/深度学习 算法 数据挖掘
      【深度学习】经典的深度学习模型-02 ImageNet夺冠之作: 神经网络AlexNet
      【深度学习】经典的深度学习模型-02 ImageNet夺冠之作: 神经网络AlexNet
      25 2
      |
      27天前
      |
      缓存 Java Linux
      硬核图解网络IO模型!
      硬核图解网络IO模型!
      |
      6天前
      |
      网络协议 调度 开发者
      Python网络编程:Twisted框架的异步IO处理与实战
      【10月更文挑战第27天】本文介绍了Python网络编程中的Twisted框架,重点讲解了其异步IO处理机制。通过反应器模式,Twisted能够在单线程中高效处理多个网络连接。文章提供了两个实战示例:一个简单的Echo服务器和一个HTTP服务器,展示了Twisted的强大功能和灵活性。
      18 0
      |
      20天前
      |
      机器学习/深度学习 编解码 算法
      【深度学习】经典的深度学习模型-01 开山之作:CNN卷积神经网络LeNet-5
      【深度学习】经典的深度学习模型-01 开山之作:CNN卷积神经网络LeNet-5
      28 0