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

这篇具有很好参考价值的文章主要介绍了面试题:简单说一下阻塞IO、非阻塞IO、IO复用的区别 ?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

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


一、什么是IO

计算机视角理解IO:

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

  • IO 设备:比如我们最常见的打印机、鼠标、键盘。
  • 对IO设备的数据读写。

程序视角理解IO:

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

  • 用户空间:非内核应用程序则运行在用户空间。用户空间中的代码运行在较低的特权级别上,不能直接访问内核空间和硬件设备。
  • 内核空间:操作系统的核心,是操作系统工作的基础,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。

面试题:简单说一下阻塞IO、非阻塞IO、IO复用的区别 ?,面试题,java,面试题,阻塞IO,非阻塞IO,IO复用

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

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

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

  1. IO调用阶段:应用程序向内核发起系统调用。
  2. IO执行阶段:内核执行IO操作并返回。
  • 数据准备阶段:内核等待IO设备准备好数据
  • 数据拷贝阶段:将数据从内核缓冲区拷贝到用户空间缓冲区
    面试题:简单说一下阻塞IO、非阻塞IO、IO复用的区别 ?,面试题,java,面试题,阻塞IO,非阻塞IO,IO复用

二、阻塞IO模型

阻塞I/O模型是最常见的IO模型,其流程图如下所示。
面试题:简单说一下阻塞IO、非阻塞IO、IO复用的区别 ?,面试题,java,面试题,阻塞IO,非阻塞IO,IO复用

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

  • 优点:模型简单,实现难度低,适用于并发量较小的应用开发。
  • 缺点:IO调用阶段和IO执行阶段都会阻塞。

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

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

三、非阻塞 IO模型

在非阻塞IO模型中,应用进程需要不断询问内核数据是否就绪,在内核数据还未就绪时,应用进程还可以做其他事情。
面试题:简单说一下阻塞IO、非阻塞IO、IO复用的区别 ?,面试题,java,面试题,阻塞IO,非阻塞IO,IO复用

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

  • 优点:模型简单,实现难度低;与阻塞IO模型对比,它在等待数据报的过程中,进程并没有阻塞,它可以做其他的事情。
  • 缺点:轮询发送 recvform,消耗CPU 资源。

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

四、IO复用模型

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

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

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

IO复用模型如下所示:

面试题:简单说一下阻塞IO、非阻塞IO、IO复用的区别 ?,面试题,java,面试题,阻塞IO,非阻塞IO,IO复用

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

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

  • 优点:适用于高并发应用程序。
  • 缺点:模型复杂,实现、开发难度较大。

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

面试题:简单说一下阻塞IO、非阻塞IO、IO复用的区别 ?,面试题,java,面试题,阻塞IO,非阻塞IO,IO复用


总结

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

到了这里,关于面试题:简单说一下阻塞IO、非阻塞IO、IO复用的区别 ?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • BIO、NIO、IO多路复用模型详细介绍&Java NIO 网络编程

    上文介绍了网络编程的基础知识,并基于 Java 编写了 BIO 的网络编程。我们知道 BIO 模型是存在巨大问题的,比如 C10K 问题,其本质就是因其阻塞原因,导致如果想要承受更多的请求就必须有足够多的线程,但是足够多的线程会带来内存占用问题、CPU上下文切换带来的性能问题

    2024年02月14日
    浏览(35)
  • 前端面试官:介绍一下less和scss,以及他们的区别

    Less是一种CSS预处理器,它扩展了纯CSS的功能,提供了更多的功能和灵活性。Less语法与常规CSS语法非常相似,但引入了一些新的特性和语法规则,使得样式表的编写更加简洁和可维护。 以下是一些Less语法的特点和用法: 变量(Variables):你可以使用 @ 符号来定义和引用变量

    2024年02月08日
    浏览(40)
  • 面试官:请说一下Mysql中count(1)、count(*)以及count(列)的区别?

    近期在Review项目代码时,发现同事们在查询MySQL行数时存在多样的方式,有的使用 COUNT(1) , 有的用 COUNT(id) , 还有人选择了 COUNT(*) 。这混杂的选择引发了我的思考。当然这三种count的方式也是众说纷纭,其中最大的分歧点就是 COUNT(*) 和 COUNT(1) 查询性能上,有人觉得 COUNT(*) 需要

    2024年02月19日
    浏览(30)
  • 4年测试经验面试要20K,简单问了一下,连基础都不会,我也是醉了····

    现在招个合适的人可真难呀,不是这不会就是那不会,没有一个让我满意的··· 公司前段时间缺人,面试了不少的测试,结果居然没有一个符合要求的。一开始瞄准的就是中级测试工程师的水准,也没指望来技术大牛,提供的薪资在10-20k,面试的人很多,但平均水平很让人失

    2024年02月08日
    浏览(47)
  • 详细说明一下Java中进程和线程的区别和联系

    Java中的进程和线程都是操作系统中执行代码的概念,但它们有以下区别: 进程是资源分配的最小单位,而线程是程序执行的最小单位。每个进程都有自己独立的内存空间、文件句柄等资源,而线程共享进程的资源。 进程之间相互独立,一个进程崩溃不会影响其他进程,而线

    2024年02月09日
    浏览(46)
  • IO、NIO、IO多路复用

    IO是什么? 网络IO是如何连接的? 下面是一次网络读取内容的I/O示意图,数据先从外设(网卡)到内核空间,再到用户空间(JVM),最后到应用程序的一个过程。 上述一次I/O读取,所谓的阻塞和非阻塞体现在哪里呢? Java最早期的版本的I/O就是这样实现的。当程序调用到读取

    2024年01月20日
    浏览(32)
  • java面试题 --- IO

    1. IO流的分类有哪些? 按照流向分为输入流和输出流; 按照实现功能分为节点流和处理流。节点就是从一个特定的地方读写数据,包括数组操作,管道操作和文件操作;处理流对已存在的流进行封装和处理,包括缓冲操作,打印操作和转化操作等; 按照处理数据的单位分为

    2024年02月10日
    浏览(32)
  • 非阻塞IO

    本文分享的是非阻塞IO,其中包括fcntl函数,然后简单代码实现轮询标志输入输出。 fcntl函数是一个用于控制文件描述符的系统调用,一个文件描述符, 默认都是阻塞IO。它能够实现文件描述符的各种操作,如复制文件描述符、修改文件状态标志、获取文件状态标志等。 函数原

    2024年02月07日
    浏览(19)
  • 【面试】线上Java程序占用 CPU 过高请说一下排查方法?

    这个问题可以说是 Java 面试的高频面试题了,有很多面试官都喜欢问这个问题,问题可能是下面这样的。 线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因? 这就是一个套路题,所谓套路题就是有标准的套路解法的,掌握了套路,不仅能解

    2024年02月09日
    浏览(31)
  • 【Linux驱动】Linux阻塞IO —— 阻塞读取按键状态(等待队列实现)

    上一节获取按键状态时,是在应用层以循环的方式不断读取按键状态,但是我们实际关注的只是当按键被按下时发生的情况,所以大多数时间拿到的状态都是我们不需要的结果。 对此,当按键被释放时,让 read 接口处于阻塞状态,等按键被按下再解除阻塞。 要使用等待队列

    2024年02月02日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包