【网络编程】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 编辑


      相关文章
      |
      15天前
      |
      缓存 安全 Linux
      Linux 五种IO模型
      Linux 五种IO模型
      |
      29天前
      |
      消息中间件 网络协议 Java
      你不得不了解的网络IO模型知识
      该文章主要讲述了网络I/O模型的相关知识,包括不同的I/O模型以及它们的特点和应用场景。
      你不得不了解的网络IO模型知识
      |
      1月前
      五种IO模型基本概念
      正确选择与应用适合的I/O模型是提升程序性能,保证响应时间和处理能力的关键。选择时需要综合考虑程序的实际应用场景、性能要求以及开发和维护的复杂性。
      23 1
      |
      2月前
      |
      安全 Java Linux
      (七)Java网络编程-IO模型篇之从BIO、NIO、AIO到内核select、epoll剖析!
      IO(Input/Output)方面的基本知识,相信大家都不陌生,毕竟这也是在学习编程基础时就已经接触过的内容,但最初的IO教学大多数是停留在最基本的BIO,而并未对于NIO、AIO、多路复用等的高级内容进行详细讲述,但这些却是大部分高性能技术的底层核心,因此本文则准备围绕着IO知识进行展开。
      115 1
      |
      2月前
      |
      存储 Java Unix
      (八)Java网络编程之IO模型篇-内核Select、Poll、Epoll多路复用函数源码深度历险!
      select/poll、epoll这些词汇相信诸位都不陌生,因为在Redis/Nginx/Netty等一些高性能技术栈的底层原理中,大家应该都见过它们的身影,接下来重点讲解这块内容。
      |
      3天前
      |
      安全 网络安全 数据安全/隐私保护
      数字堡垒之下:网络安全漏洞与信息安全的守护之路
      在数字化浪潮中,网络安全成为保护个人隐私和企业数据的关键防线。本文将探讨网络漏洞的发现与利用,加密技术在信息保护中的作用,以及提升安全意识的重要性。我们将从基础概念出发,通过案例分析,深入了解网络攻防的动态平衡,并分享实用的安全策略,旨在为读者提供一条清晰的信息安全守护路径。
      11 2
      |
      2天前
      |
      安全 算法 网络安全
      网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
      【9月更文挑战第8天】本文将探讨网络安全与信息安全的重要性,以及如何保护个人和组织的信息资产。我们将讨论网络安全漏洞、加密技术、安全意识等方面的内容,并提供一些实用的建议和技巧来帮助读者提高他们的网络安全水平。无论你是个人用户还是企业管理员,都可以从本文中获得有关如何保护自己免受网络威胁的有用信息。
      179 89
      |
      2天前
      |
      存储 监控 安全
      网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
      【9月更文挑战第9天】在数字化时代,网络安全和信息安全已成为我们生活的重要组成部分。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的知识和技巧来保护您的个人信息和数据安全。我们将通过深入浅出的方式,帮助您了解网络威胁的来源,如何利用加密技术保护自己的数据,以及如何提高自己的安全意识。无论您是个人用户还是企业,这些知识都将对您有所帮助。让我们一起来学习如何保护自己的网络安全吧!
      |
      2天前
      |
      安全 网络协议 网络安全
      网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
      【9月更文挑战第9天】在数字时代,网络安全和信息安全成为了全球关注的焦点。本文将深入探讨网络安全漏洞、加密技术以及安全意识等方面的内容,帮助读者更好地了解这些概念,并提高自身的网络安全意识和技能。
      |
      2天前
      |
      SQL 安全 网络安全
      网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
      【9月更文挑战第9天】随着互联网的普及,网络安全问题日益严重。本文将介绍网络安全漏洞、加密技术以及安全意识等方面的内容,帮助读者了解网络安全的重要性,并提供一些实用的技巧和建议。
      23 12