0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

简单说一下阻塞IO、非阻塞IO、IO复用的区别?

Linux爱好者 来源:Linux爱好者 2024-03-04 15:14 次阅读

前言

在《Unix网络编程》一书中提到了五种IO模型,分别是:阻塞IO、非阻塞IO、IO复用、信号驱动IO以及异步IO。本篇文章主要介绍IO的基本概念以及阻塞IO、非阻塞IO、IO复用三种模型,供大家参考学习。

一、什么是IO

计算机视角理解IO:

对于计算机而言,任何涉及到计算机核心(CPU和内存)与其他设备间的数据转移的过程就是IO。IO对于计算机而言有两层意思:

IO 设备:比如我们最常见的打印机、鼠标、键盘。

对IO设备的数据读写。

程序视角理解IO:

现代操作系统将空间划分为用户空间和内核空间。

用户空间:非内核应用程序则运行在用户空间。用户空间中的代码运行在较低的特权级别上,不能直接访问内核空间和硬件设备。

内核空间:操作系统的核心,是操作系统工作的基础,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。

569dc566-d9de-11ee-a297-92fbcf53809c.png

操作系统为了能够正常平稳地运行下去,它是不会允许应用程序随意访问计算机硬件部分,如内存、硬盘、网卡,应用程序必须通过操作系统提供的API来访问,以达到安全的访问控制。

总结:IO对于应用程序而言,强调的是通过向内核发起系统调用完成对I/O的间接访问。

应用程序发起一次IO访问分为两个阶段:

IO调用阶段:应用程序向内核发起系统调用。

IO执行阶段:内核执行IO操作并返回。

数据准备阶段:内核等待IO设备准备好数据

数据拷贝阶段:将数据从内核缓冲区拷贝到用户空间缓冲区

56a516cc-d9de-11ee-a297-92fbcf53809c.png

二、阻塞IO模型

阻塞I/O模型是最常见的IO模型,其流程图如下所示。

56b1b71a-d9de-11ee-a297-92fbcf53809c.png

应用程序发起一个系统调用(recvform),这个时候应用程序会一直阻塞下去,直到内核把数据准备好,并将其从内核复制到用户空间,复制完成后返回成功提示,这个时候应用程序才会继续处理数据。

优点:模型简单,实现难度低,适用于并发量较小的应用开发。

缺点:IO调用阶段和IO执行阶段都会阻塞。

典型的阻塞I/0模型的例子为data=socket.read(),如果内核数据没有准备就绪,Socket线程就会一直阻塞在read()中等待内核数据就绪。

生活场景:某天,你跟你女朋友去奶茶店买奶茶,点完奶茶后后,由于你们不知道奶茶什么时候才能做好,所以你们就只能一直等着,其他什么事情也不能干。

三、非阻塞 IO模型

在非阻塞IO模型中,应用进程需要不断询问内核数据是否就绪,在内核数据还未就绪时,应用进程还可以做其他事情。

56b53cfa-d9de-11ee-a297-92fbcf53809c.png

从上图可以看出, 非阻塞IO模型需要应用进程不断地主动询问内核数据是否已准备好了。

优点:模型简单,实现难度低;与阻塞IO模型对比,它在等待数据报的过程中,进程并没有阻塞,它可以做其他的事情。

缺点:轮询发送 recvform,消耗CPU 资源。

生活场景:你和你女朋友去奶茶店买奶茶,吸取了上一次的教训,点完奶茶后顺便去逛了逛商场。由于你们担心会错过取餐,所以你们就每隔一段时间就来问下服务员,你们的奶茶做好了没有,来来回回好多回,若干次后,终于问到奶茶已经准备好了,然后你们就开心的喝了起来。

四、IO复用模型

非阻塞IO模型需要进程不断地轮询发起recvform系统调用,就会有很多的线程不断调用recvfrom 请求数据,先不说服务器能不能扛得住这么多线程,就算扛得住那么很明显这种方式是不是太浪费资源了,线程是我们操作系统的宝贵资源,大量的线程用来去读取数据了,那么就意味着能做其它事情的线程就会少。

例如:你是奶茶店的服务员,每个人点好奶茶后,每隔几分钟就来问你一次好了没有,随着问的人越来越多,你可能会开始怀疑人生。那么有没有什么好的解决办法呢?

答案:不需要所有进程轮询来发起recvform来查询数据是否已经准备好了,而是有人帮忙来询问,这个帮忙的人就是select。

IO复用模型如下所示:

56ca0220-d9de-11ee-a297-92fbcf53809c.png

多个进程的IO注册到一个复用器(select)上,select 会监听所有注册进来的IO。如果内核的数据报没有准备好,调用select 的进程将会被阻塞,而当任一IO在内核缓冲区中有数据,select调用就会返回可读条件,然后进程再进行recvform系统调用,内核将数据拷贝到用户空间,注意这个过程是阻塞的。

注意:IO 复用模型在第一个阶段和第二个阶段其实都有阻塞,第一个阶段阻塞于 select 调用,第二个阶段阻塞于数据复制。

优点:适用于高并发应用程序。

缺点:模型复杂,实现、开发难度较大。

生活场景:如果每个人都过一会就来问一下奶茶好了没有,奶茶店的压力也太大了。于是奶茶店想到了一个办法,找一个中间人(select)挡在奶茶店前面,顾客(应用进程)询问那个中间人奶茶好了没有(对应多个进程的IO注册到一个复用器(select)上),如果没有好就让顾客等待(应用进程阻塞于 select 调用)。中间人持续查看顾客的奶茶是否准备好,如果有一个人的奶茶准备好了就会去通知那个人可以取了(而当任一IO在内核缓冲区中有数据,select调用就会返回可读条件,然后进程再进行recvform系统调用)。

56cdf966-d9de-11ee-a297-92fbcf53809c.png

总结

学习IO模型时,必须要把每个模型联系起来看,比如阻塞IO模型会阻塞较长时间,而非阻塞IO在等待数据报的过程中,进程并没有阻塞,它可以做其他的事情。IO复用模型可以很好的降低服务器的压力,且在连接数众多且消息体不大的情况下有很大的优势。


审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 计算机
    +关注

    关注

    19

    文章

    6649

    浏览量

    84526
  • 操作系统
    +关注

    关注

    37

    文章

    6284

    浏览量

    121876
  • 复用器
    +关注

    关注

    1

    文章

    639

    浏览量

    27975

原文标题:面试官:简单说一下阻塞IO、非阻塞IO、IO复用的区别 ?

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    IO与NIO有何区别

    或NON-blocking IO。 那么这套新的IO库与之前的有何区别?为什么需要提供这样一套IO库呢? IO与NIO Java NIO相比
    的头像 发表于 09-25 11:00 410次阅读
    <b class='flag-5'>IO</b>与NIO有何<b class='flag-5'>区别</b>

    linuxIO模型详解

      开门见山,Linux的如中IO模型:阻塞IO模型,阻塞
    发表于 10-09 16:12

    「正点原子Linux连载」第五十二章Linux阻塞阻塞IO实验

    是Linux驱动开发里面很常见的两种设备访问模式,在编写驱动的时候定要考虑到阻塞阻塞。本章我们就来学习一下
    发表于 03-20 16:15

    同步与异步,阻塞阻塞区别是什么

    同步与异步,阻塞阻塞区别
    发表于 01-26 06:12

    如何使用普通IO模拟串口实现阻塞全双工通讯功能?

    如何使用普通IO模拟串口实现阻塞全双工通讯功能?
    发表于 12-03 06:14

    《Linux设备驱动开发详解》第8章、Linux设备驱动中的阻塞与非阻塞IO

    《Linux设备驱动开发详解》第8章、Linux设备驱动中的阻塞与非阻塞IO
    发表于 10-27 11:35 9次下载
    《Linux设备驱动开发详解》第8章、Linux设备驱动中的<b class='flag-5'>阻塞</b>与非<b class='flag-5'>阻塞</b><b class='flag-5'>IO</b>

    网络IO套路分享

    转自:我是程序员小贱-L的存在 1 阻塞与非阻塞--开胃菜 阻塞 我们知道在调用某个函数的时候无非就是两种情况,要么马上返回,然后根据返回值进行接下来的业务处理。当在使用阻塞
    的头像 发表于 10-13 14:52 1689次阅读
    网络<b class='flag-5'>IO</b>套路分享

    深入分析同步阻塞网络IO的内部实现详解

    在网络开发模型中,有一种非常易于开发同学使用的方式,那就是同步阻塞的网络 IO(在 Java 中习惯叫 BIO)。
    的头像 发表于 04-03 14:10 1799次阅读
    深入分析同步<b class='flag-5'>阻塞</b>网络<b class='flag-5'>IO</b>的内部实现详解

    网络IO的弊端以及多路复用IO的优势

    为了讲多路复用,当然还是要跟风,采用鞭尸的思路,先讲讲传统的网络 IO 的弊端,用拉踩的方式捧起多路复用 IO 的优势。 为了方便理解,以下所有代码都是伪代码,知道其表达的意思即可。
    的头像 发表于 08-25 18:01 2352次阅读
    网络<b class='flag-5'>IO</b>的弊端以及多路<b class='flag-5'>复用</b><b class='flag-5'>IO</b>的优势

    一文详细了解五种IO模型

    五种IO模型包括:阻塞IO、非阻塞IOIO多路复用
    的头像 发表于 02-14 14:38 5558次阅读
    一文详细了解五种<b class='flag-5'>IO</b>模型

    简要叙述分布式IO和远程IO区别

    远程IO与分布式IO区别是什么?让很多人糊涂,到底什么是远程IO,什么是分布式IO,网上包括各种声音,连行内有经验的老师们也可能把分布式
    的头像 发表于 12-29 11:59 9660次阅读
    简要叙述分布式<b class='flag-5'>IO</b>和远程<b class='flag-5'>IO</b>的<b class='flag-5'>区别</b>

    网络IO模型:阻塞与非阻塞

    阻塞 IO 模型 在Linux ,默认情况下所有的 socket 都是阻塞的,一个典型的读操作流程如图所示。 阻塞和非阻塞的概念描述的是用户
    的头像 发表于 10-08 17:16 484次阅读
    网络<b class='flag-5'>IO</b>模型:<b class='flag-5'>阻塞</b>与非<b class='flag-5'>阻塞</b>

    多路IO复用模型和异步IO模型介绍

    多路 IO 复用模型 多路 IO 复用,有时也称为事件驱动 IO。它的基本原理就是有个函数会不断地轮询所负责的所有 socket ,当某个
    的头像 发表于 10-08 17:21 507次阅读
    多路<b class='flag-5'>IO</b><b class='flag-5'>复用</b>模型和异步<b class='flag-5'>IO</b>模型介绍

    信号驱动IO与异步IO区别

    , 是开始处理IO, 这个时候还是存在阻塞的,将数据从内核态拷贝进入到用户态的过程至少是阻塞住的 (应用程序将数据从内核态拷贝到用户态的过程是阻塞等待的, 和异步
    的头像 发表于 11-08 15:32 388次阅读
    信号驱动<b class='flag-5'>IO</b>与异步<b class='flag-5'>IO</b>的<b class='flag-5'>区别</b>

    什么是io多路复用IO多路复用的优缺点

    IO多路复用是一种同步IO模型,它允许单个进程/线程同时处理多个IO请求。具体来说,一个进程/线程可以监视多个文件句柄,一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作。在没
    的头像 发表于 01-18 15:48 797次阅读