返回顶部
首页 > 资讯 > 操作系统 >怎么解析Linux-I/O模型
  • 665
分享到

怎么解析Linux-I/O模型

2023-06-16 00:06:44 665人浏览 八月长安
摘要

本篇文章为大家展示了怎么解析linux-I/O模型,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。I/O介绍I/O通常有内存io、网络I/O、磁盘I/O等,但我们通常说的是网络I/O以及磁盘I/O。网

本篇文章为大家展示了怎么解析linux-I/O模型,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

I/O介绍

I/O通常有内存io网络I/O、磁盘I/O等,但我们通常说的是网络I/O以及磁盘I/O。网络I/O:本质是Socket读取

每次I/O请求,都会有两个阶段组成: 第一步:等待数据,即数据从磁盘到内核内存;将数据从磁盘文件先加载到内核内存空间(缓冲区),等待数据准备完成,时间较长。第二步:复制数据,即数据内核内存到进程内存;将数据从内核缓冲复制到用户空间的进程内存中,时间较短。

Web请求处理过程

怎么解析Linux-I/O模型

客户端发起情况到服务器网卡

服务器网卡接受到请求后转交给内核处理

内核根据请求对应的套接字,将请求交给工作在用户空间的WEB服务器进程

Web服务器进程根据用户请求,向内核进行系统调用,申请获取相应资源(如:客户端获取图片)

内核发现Web服务器进程请求的是一个存放在本地硬盘上的资源,因此通过驱动程序连接磁盘

内核调用磁盘,获取需要的资源

内核将资源存放在自己的缓存区中,并通知Web服务器进程

Web服务器进程通过系统调用取得资源,并将其复制到进程自己的缓冲区中

Web服务器进程形成响应,通过系统调用再次发给内核以响应请求

内核将响应发送至网卡

网卡发送响应给用户

通过这样的一个复杂过程,一次请求就完成了

简单来说就是:

用户请求——》送达用户空间——〉系统调用——》内核空间——〉内核到磁盘上读取图片资源——》返回到用户空间——〉响应给用户

上述简单的说明了一下,客户端向Web服务器请求过程,在这个过程中,有两个I/O过程:一是客户端请求的网络I/O,二个是Web服务器请求图片磁盘I/O。

I/O模型名词介绍

说到I/O模型,都会牵扯到同步、异步、阻塞、非阻塞这几个词,以下讲解这几个词的概念。

阻塞和非阻塞

阻塞和非阻塞指的是执行一个操作时等操作结束再返回结果,还是马上返回结果。

阻塞(blocking):指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起(当前线程进入非可执行状态,在这个状态,CPU不会分配时间片,线程暂停运行)只有到到结果才进入活动状态;

阻塞例子:海底捞的服务器为你点菜,当你点完菜后,服务员把消息传到后厨,这时你就在餐桌上等待,直到厨师把汤锅和配菜都准备好以后送到你桌上,你才能开吃。在上菜的过程中你还不能离开,因为你离开了之后服务员上菜了却找不到你人,所以你就是能等待,这个时候你处于阻塞等待状态,就是前面说的,你是调用者,你被挂起了,进入了非可执行状态。

非阻塞(nonblocking):指I/O操作被调用后立即返回给用户一个状态值,无需等到I/O操作彻底完成,最终的调用结果返回之前,调用者不会被挂起;

非阻塞例子:海底捞的服务器为你点菜,当你点完菜后,服务员把消息传到后厨,过了三分钟,你跑到后厨问,我的锅底或者肥牛卷好了没有?后厨说没好,然后你去处理其它事情,然后又过了五分钟,你又跑到后厨问,我的某个菜好了没有,如果没有,你还是继续做其他事情,然后等会再问一次,这个时候就是在I/O操作的同时,你没有被挂起,可以操作其他事情,但是如果I/O操作完成,你需要立马接受。

同步和异步

同步/异步关注的是消息通信机制

同步(synchronous):调用者等待被调用者返回消息,才能继续执行。同步阻塞例子:去餐馆吃饭,点了一个盖浇饭,然后在餐桌上一直等到盖浇饭做好,自己端到餐桌就餐。这就是典型的同步阻塞。当厨师给你做饭的时候,你需要一直在那里等着。

同步非阻塞例子:去餐馆吃饭,点了一个盖浇饭,你点完饭之后,过了几分钟感觉时间差不多了,就去问老板饭做好了没有,如果好了就去端,如果没好等一会再去问,实时同步做饭进度,依次循环去问直到饭做好,这就是同步非阻塞。 异步(asynchronous):被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态。

I/O模型类型

IO模型分为以下五类

阻塞型:所有过程全阻塞

非阻塞型:如果没有数据buffer,则立即返回EWOULDBLOCK

I/O复用型(select和poll):在wait和copy阶段分别阻塞

信号驱动型I/O(SIGIO):在wait阶段不阻塞,但copy阶段阻塞(信号驱动I/O),即通知

异步I/O(AIO):完全无阻塞方式,当I/O完成时提供信号

阻塞I/O

怎么解析Linux-I/O模型

说明:应用程序调用一个IO的recvfrom函数,会导致应用程序阻塞,进入阻塞状态后直到I/O操作结束才会返回;如果系统内核数据没有准备好,那就一直等待数据准备,因为是调用了recvfrom函数导致了应用程序阻塞,所以一直在等,做不了任何事情,内核数据准备好之后把数据从内核拷贝到用户空间,拷贝结束后,I/O函数返回成功指示。注:其阻塞时在I/O操作阶段

非阻塞I/O

怎么解析Linux-I/O模型

说明:用户线程发起IO请求时立即返回。但并未读取到任何数据,则返回字段为“EWOULDBLOCK”,用户线程需要不断地发起IO请求,直到数据到达后,才真正读取到数据,继续执行。即“轮询”机制。整个IO请求过程中,虽然用户线程每次发起IO请求后可以立即返回,但是为了等到数据。仍需要不断地轮询、重复请求、消耗了大量的CPU资源;是比较浪费CPU的方式,一般很少用这种模型,而是在其他模型中使用非阻塞IO这一特性。

I/O复用(select和poll)

怎么解析Linux-I/O模型

说明:I/O复用模型会用到select或poll函数,在I/O复用模型中,并不是阻塞到I/O操作过程中,而是阻塞到select或者poll函数中;以select为例:进程在select处阻塞,等待几个描述符中的一个变为可操作,如果没等待到就继续阻塞在第一阶段,如果等到了一个描述符变为了可操作,则调用recvfrom函数将数据拷贝到应用缓冲区。

信号驱动I/O(SIGIO)

怎么解析Linux-I/O模型

说明:首先,我们允许套接口进行信号驱动I/O,并安装一个信号处理函数SIGIO,如果数据没有准备好,则立即返回结果,进程继续工作并不阻塞。当数据准备好时,系统内核会主动发送一个SIGIO信号给应用程序,应用程序收到信号后,可以在信号处理函数中调用I/O操作函数recvfrom进行数据处理。信号驱动I/O模型的优点是当数据报到达时,可以不阻塞,主循环可以继续执行,只是等待处理程序的通知,或者数据已经准备好被处理,或者数据报已经准备好被读了。

异步I/O(AIO)

怎么解析Linux-I/O模型

说明:当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态通知和回调通知来告诉调用者的输入输出操作。用户可以直接对I/O执行读写操作,这些操作告诉内核用户读写缓冲区的位置,以及I/O操作完成之后内核通知应用程序的方式,就是上面讲的通过状态通知或者回调通知来告诉调用者。异步I/O的读写操作总是立即返回,但没有返回结果说是否阻塞,因为异步I/O操作真正的读写操作已由内核接管,内核自己对数据处理完成后生成一个信号,然后通知用户刚才交给自己的事件已经处理完成。

五种I/O模型的总结及比较

中文图示如下:

怎么解析Linux-I/O模型

英文图示如下:

怎么解析Linux-I/O模型

从两张图中我们可以看到,越往后,阻塞越少,理论上效率也是最优。其中五种I/O模型中,前三种属于同步I/O,后两者属于异步I/O。

同步I/O

阻塞I/O 非阻塞I/O I/O复用(select和poll)

异步I/O

信号驱动I/O(SIGIO) 半异步 异步I/O(AIO) 全异步

异步I/O和信号驱动I/O的区别

信号驱动I/O模式下,内核可以复制的时候通知给我们应用程序发送SIGIO信号。异步I/O模式下,内核在所有的操作由内核操作完成后才会通知我们的应用程序。

上述内容就是怎么解析Linux-I/O模型,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网操作系统频道。

--结束END--

本文标题: 怎么解析Linux-I/O模型

本文链接: https://lsjlt.com/news/281937.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么解析Linux-I/O模型
    本篇文章为大家展示了怎么解析Linux-I/O模型,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。I/O介绍I/O通常有内存IO、网络I/O、磁盘I/O等,但我们通常说的是网络I/O以及磁盘I/O。网...
    99+
    2023-06-16
  • Linux网络I/O+Reactor模型是怎么样的
    本篇文章给大家分享的是有关Linux网络I/O+Reactor模型是怎么样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。前言网络I/O,可以理解为网络上的数据流。通常我们会基...
    99+
    2023-06-15
  • Python教程:精简概述I/O模型与I/O操作
    Python教程:精简概述I/O模型与I/O操作一. I/O 模型1. 特指 Linux 下的网络 IO,一般分类:阻塞IO(blocking IO)非阻塞IO(non-blocking IO)IO多路复用(IO multiplexing)...
    99+
    2023-06-01
  • Linux的I/O机制怎么理解
    本篇内容主要讲解“Linux的I/O机制怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux的I/O机制怎么理解”吧!你真的了解多线程吗如果问你“为什么多线程可以提高程序运行效率”,...
    99+
    2023-06-15
  • 浅谈Python基础之I/O模型
    一、I/O模型 IO在计算机中指Input/Output,也就是输入和输出。由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘、网络等,就需要IO接口。 ...
    99+
    2022-06-04
    浅谈 模型 基础
  • Node中的I/O模型有哪些
    这篇文章主要为大家展示了“Node中的I/O模型有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Node中的I/O模型有哪些”这篇文章吧。我们以网络请求IO...
    99+
    2024-04-02
  • JAVA中I/O模型的详细讲解(附实例)
    也许很多朋友在学习NIO的时候都会感觉有点吃力,对里面的很多概念都感觉不是那么明朗。在进入Java NIO编程之前,我们今天先来讨论一些比较基础的知识:I/O模型。下面本文先从同步和异步的概念 说起,然后接着阐述了阻塞和非阻塞的区别,接着介...
    99+
    2020-06-20
    java教程 I/O
  • 怎么理解I/O性能
    本篇内容主要讲解“怎么理解I/O性能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解I/O性能”吧!为了理解I/O性能,你必须要详细了解存储文件的存储层次...
    99+
    2024-04-02
  • Netty支持什么I/O模式
    本篇内容主要讲解“Netty支持什么I/O模式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Netty支持什么I/O模式”吧! 1 经典I/O模式BI...
    99+
    2024-04-02
  • Linux I/O多路复用实例分析
    本篇内容主要讲解“Linux I/O多路复用实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux I/O多路复用实例分析”吧!I/O多路复用通过一种机制,可以监视多个描述符,一旦某个...
    99+
    2023-06-27
  • 怎么理解I/O的原理
    这期内容当中小编将会给大家带来有关 怎么理解I/O的原理,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1.IO 软件原理I/O 软件目标设备独立性现在让我们转向对 I/O 软件的研究,I/O 软件设计一个...
    99+
    2023-06-16
  • JAVA NIO怎么构建I/O多路复用的请求模型
    这篇文章主要介绍“JAVA NIO怎么构建I/O多路复用的请求模型”,在日常操作中,相信很多人在JAVA NIO怎么构建I/O多路复用的请求模型问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JAVA NIO怎...
    99+
    2023-06-02
  • 解析NodeJS异步I/O的实现
    在现在的项目开发中,任何一个大型项目绝对不是简简单单的采用一个种语言和一种框架,因为每种语言和框架各有优势,与其死守一个,不与取各家之所长,依次得到一个高性能、搞扩展的产品。 对于一个.NET开发者,尤其是...
    99+
    2022-06-04
    NodeJS
  • Linux I/O调度器是什么
    这篇文章主要介绍Linux I/O调度器是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Linux I/O 调度器是Linux内核中的一个组成部分,用户可以通过调整这个调度器来优化系统性能。Linux I/O 系...
    99+
    2023-06-16
  • Mysql Innodb中的Linux native异步I/O分析
    本篇内容主要讲解“Mysql Innodb中的Linux native异步I/O分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Mysql Innodb中的L...
    99+
    2024-04-02
  • Linux的直接I/O机制怎么实现
    这篇文章主要介绍了Linux的直接I/O机制怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Linux的直接I/O机制怎么实现文章都会有所收获,下面我们一起来看看吧。直接 I/O 的动机在介绍直接 I/O...
    99+
    2023-06-16
  • Linux I/O的重定向基础讲解
    这篇文章主要介绍“Linux I/O的重定向基础讲解”,在日常操作中,相信很多人在Linux I/O的重定向基础讲解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux I/O的重定向基础讲解”的疑惑有所...
    99+
    2023-06-16
  • linux系统中文件I/O的示例分析
    小编给大家分享一下linux系统中文件I/O的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!linux 文件I/O一,文件描述符对内核而言,所以打开的文件...
    99+
    2023-06-13
  • 怎么查看Linux系统的I/O调度器
    这篇文章主要介绍“怎么查看Linux系统的I/O调度器”,在日常操作中,相信很多人在怎么查看Linux系统的I/O调度器问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么查看Linux系统的I/O调度器”的疑...
    99+
    2023-06-16
  • Linux高性能I/O框架库Libevent怎么用
    本文小编为大家详细介绍“Linux高性能I/O框架库Libevent怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Linux高性能I/O框架库Libevent怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作