返回顶部
首页 > 资讯 > 操作系统 >linux io是什么
  • 759
分享到

linux io是什么

linuxlinuxio 2023-03-24 17:03:35 759人浏览 安东尼
摘要

本篇内容主要讲解“linux io是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux io是什么”吧! linux io

本篇内容主要讲解“linux io是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux io是什么”吧!

linux io指的是一种文件操作;在Linux中,文件就是一串二进制流,那么在信息的交换过程中,我们都是对这些流进行数据收发操作,这些操作简称为I/O操作;由于Linux使用的是虚拟内存机制,所以必须通过系统调用请求内核来完成IO动作。

linux io指的是什么?

我们都知道在Linux的世界,一切皆文件。

而文件就是一串二进制流,不管Socket、FIFO、管道还是终端,对我们来说,一切都是流。

  • 在信息的交换过程中,我们都是对这些流进行数据收发操作,简称为I/O操作。

  • 往流中读取数据,系统调用Read,写入数据,系统调用Write。

通常用户进程的一个完整的IO分为两个阶段:

磁盘IO:

linux io是什么

网络IO:

linux io是什么

操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能使用指针传递数据,因为Linux使用的虚拟内存机制,必须通过系统调用请求内核来完成IO动作。

IO有内存IO、网络IO和磁盘IO三种,通常我们说的IO指的是后两者!

为什么需要IO模型

如果使用同步的方式来通信的话,所有的操作都在一个线程内顺序执行完成,这么做缺点是很明显的:

  • 因为同步的通信操作会阻塞同一个线程的其他任何操作,只有这个操作完成了之后,后续的操作才可以完成,所以出现了同步阻塞+多线程(每个Socket都创建一个线程对应),但是系统内线程数量是有限制的,同时线程切换很浪费时间,适合Socket少的情况。

因该需要出现IO模型。

Linux的IO模型

在描述Linux IO模型之前,我们先来了解一下Linux系统数据读取的过程:

linux io是什么

以用户请求index.html文件为例子说明

linux io是什么

基本概念

用户空间和内核空间

操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。

  • 为了保证内核的安全,用户进程不能直接操作内核,操作系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。

进程切换

为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。

这种行为被称为进程切换。

因此可以说,任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关的。

进程的阻塞

正在执行的进程,由于期待的某些事件未发生,如请求系统资源失败、等待某种操作的完成、新数据尚未到达或无新工作做等,则由系统自动执行阻塞原语(Block),使自己由运行状态变为阻塞状态。

可见,进程的阻塞是进程自身的一种主动行为,也因此只有处于运行态的进程(获得CPU),才可能将其转为阻塞状态。

当进程进入阻塞状态,是不占用CPU资源的。

文件描述符

文件描述符(File Descriptor)是计算机科学中的一个术语,是一个用于表述指向文件的引用的抽象化概念。

文件描述符在形式上是一个非负整数,实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。

  • 当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。

缓存IO

大多数文件系统的默认 IO 操作都是缓存 IO。

其读写过程如下:

  • 读操作:操作系统检查内核的缓冲区有没有需要的数据,如果已经缓存了,那么就直接从缓存中返回;否则从磁盘、网卡等中读取,然后缓存在操作系统的缓存中;

  • 写操作:将数据从用户空间复制到内核空间的缓存中。这时对用户程序来说写操作就已经完成,至于什么时候再写到磁盘、网卡等中由操作系统决定,除非显示地调用了 sync 同步命令。

假设内核空间缓存无需要的数据,用户进程从磁盘或网络读数据分两个阶段:

  • 阶段一: 内核程序从磁盘、网卡等读取数据到内核空间缓存区;

  • 阶段二: 用户程序从内核空间缓存拷贝数据到用户空间。

缓存 IO 的缺点:

数据在传输过程中需要在应用程序地址空间和内核空间进行多次数据拷贝操作,这些数据拷贝操作所带来的CPU以及内存开销非常大。

同步阻塞

用户空间的应用程序执行一个系统调用,这会导致应用程序阻塞,什么也不干,直到数据准备好,并且将数据从内核复制到用户进程,最后进程再处理数据,在等待数据到处理数据的两个阶段,整个进程都被阻塞,不能处理别的网络IO。

  • 调用应用程序处于一种不再消费 CPU 而只是简单等待响应的状态,因此从处理的角度来看,这是非常有效的。

这也是最简单的IO模型,在通常FD较少、就绪很快的情况下使用是没有问题的。

linux io是什么

同步非阻塞

非阻塞的系统调用调用之后,进程并没有被阻塞,内核马上返回给进程,如果数据还没准备好,此时会返回一个error。

  • 进程在返回之后,可以干点别的事情,然后再发起系统调用。

  • 重复上面的过程,循环往复的进行系统调用。这个过程通常被称之为轮询。

  • 轮询检查内核数据,直到数据准备好,再拷贝数据到进程,进行数据处理。

  • 需要注意,拷贝数据整个过程,进程仍然是属于阻塞的状态。

  • 这种方式在编程中对Socket设置O_NONBLOCK即可。

linux io是什么

IO多路复用

IO多路复用,这是一种进程预先告知内核的能力,让内核发现进程指定的一个或多个IO条件就绪了,就通知进程。

使得一个进程能在一连串的事件上等待。

IO复用的实现方式目前主要有Select、Poll和Epoll。

linux io是什么

伪代码描述IO多路复用:

while(status == OK) { // 不断轮询 ready_fd_list = io_wait(fd_list); //内核缓冲区是否有准备好的数据 for(fd in ready_fd_list) {  data = read(fd) // 有准备好的数据读取到用户缓冲区  process(data) }}

信号驱动

首先我们允许Socket进行信号驱动IO,并安装一个信号处理函数,进程继续运行并不阻塞。

当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。

流程如下:

  • 开启套接字信号驱动IO功能

  • 系统调用Sigaction执行信号处理函数(非阻塞,立刻返回)

  • 数据就绪,生成Sigio信号,通过信号回调通知应用来读取数据

此种IO方式存在的一个很大的问题:Linux中信号队列是有限制的,如果超过这个数字问题就无法读取数据

linux io是什么

异步非阻塞

异步IO流程如下所示:

  • 当用户线程调用了aio_read系统调用,立刻就可以开始去做其它的事,用户线程不阻塞

  • 内核就开始了IO的第一个阶段:准备数据。当内核一直等到数据准备好了,它就会将数据从内核内核缓冲区,拷贝到用户缓冲区

  • 内核会给用户线程发送一个信号,或者回调用户线程注册的回调接口,告诉用户线程Read操作完成了

  • 用户线程读取用户缓冲区的数据,完成后续的业务操作

相对于同步IO,异步IO不是顺序执行。

用户进程进行aio_read系统调用之后,无论内核数据是否准备好,都会直接返回给用户进程,然后用户态进程可以去做别的事情。

等到数据准备好了,内核直接复制数据给进程,然后从内核向进程发送通知。

对比信号驱动IO,异步IO的主要区别在于:

  • 信号驱动由内核告诉我们何时可以开始一个IO操作(数据在内核缓冲区中),而异步IO则由内核通知IO操作何时已经完成(数据已经在用户空间中)。

异步IO又叫做事件驱动IO,在Unix中,为异步方式访问文件定义了一套库函数,定义了AIO的一系列接口。

  • 使用aio_read或者aio_write发起异步IO操作,使用aio_error检查正在运行的IO操作的状态。

目前Linux中AIO的内核实现只对文件IO有效,如果要实现真正的AIO,需要用户自己来实现。

目前有很多开源的异步IO库,例如libevent、libev、libuv。

linux io是什么

到此,相信大家对“linux io是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: linux io是什么

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

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

猜你喜欢
  • linux io是什么
    本篇内容主要讲解“linux io是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux io是什么”吧! linux io...
    99+
    2023-03-24
    linux linux io
  • Linux中五种IO模型是什么
    这篇文章主要介绍了Linux中五种IO模型是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。我们都知道unix世界里、一切皆文件、而文件是什么呢?文件就是一串二进制流而已、...
    99+
    2023-06-27
  • Java IO流是什么
    这篇文章主要讲解了“Java IO流是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java IO流是什么”吧!IO概述在这一小节,我会试着给出Java IO(java.io)包下所有类...
    99+
    2023-06-02
  • Linux网络编程中IO模型指的是什么
    今天就跟大家聊聊有关Linux网络编程中IO模型指的是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。基于IO访问中存在的两个阶段详细介绍了Linux产生的五种IO模型。同步与异步...
    99+
    2023-06-06
  • Java IO中File类是什么
    本文将为大家详细介绍“Java IO中File类是什么”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“Java IO中File类是什么”能够给你意想不到的收获,请大家跟着小编的思路慢慢深入,...
    99+
    2023-06-26
  • java中IO的原理是什么
    本篇文章为大家展示了java中IO的原理是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、IO概念I/O 即输入Input/ 输出Output的缩写,其实就是计算机调度把各个存储中(包括内存和...
    99+
    2023-06-20
  • Redis中线程IO模型是什么
    这篇文章将为大家详细讲解有关Redis中线程IO模型是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Redis是一个单线程的应用程序,NodeJs、Nginx都是单线...
    99+
    2024-04-02
  • Java IO之流的分类是什么
    这篇文章主要为大家展示了“Java IO之流的分类是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java IO之流的分类是什么”这篇文章吧。一、根据流向分为输入流和输出...
    99+
    2023-06-26
  • Java中io流的概念是什么
    在Java中,I/O流是用于处理输入和输出的一种机制。它允许程序从输入源读取数据,并将数据写入输出源。I/O流可以用于读取和写入文件...
    99+
    2024-02-29
    Java
  • Linux块设备中的IO路径及调度策略是什么
    这篇“Linux块设备中的IO路径及调度策略是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux块设备中的IO路径...
    99+
    2023-06-16
  • 什么事IO流
    本篇内容介绍了“什么事IO流”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!传统的 BIOJava IO流是一个庞大的生态环境,其内部提供了很...
    99+
    2023-06-16
  • 云服务器io值是什么意思
    云服务器io值是指:io指字是指云服务器磁盘中的输入/输出值,输入指的是对磁盘写入数据,输出指的是从磁盘读出数据。具体分析如下:磁盘IOPS即在一秒内磁盘能够处理的I/O请求数量。衡量存储性能一般看吞吐量和IOPS两个指标。吞吐量主要指大文...
    99+
    2024-04-02
  • c++中的基本IO类型是什么
    这篇文章主要讲解了“c++中的基本IO类型是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“c++中的基本IO类型是什么”吧!引言c++不直接处理输入和输出,而是通过标准库中的类型处理IO...
    99+
    2023-06-19
  • python中的IO操作方法是什么
    这篇文章跟大家分析一下“python中的IO操作方法是什么”。内容详细易懂,对“python中的IO操作方法是什么”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编一起深入学习“python中的I...
    99+
    2023-06-26
  • 文件IO操作的方法是什么
    本篇内容介绍了“文件IO操作的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!01/背景/已经过去的中间件性能挑战赛,和正在进行中的...
    99+
    2023-06-04
  • Innodb关键特性之什么是异步IO
    这篇文章主要介绍“Innodb关键特性之什么是异步IO”,在日常操作中,相信很多人在Innodb关键特性之什么是异步IO问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Inno...
    99+
    2024-04-02
  • Java的IO模型和Netty框架是什么
    这篇文章主要介绍“Java的IO模型和Netty框架是什么”,在日常操作中,相信很多人在Java的IO模型和Netty框架是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java的IO模型和Netty框架...
    99+
    2023-06-29
  • Nodejs中的非阻塞异步IO是什么
    这篇文章主要讲解了“Nodejs中的非阻塞异步IO是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Nodejs中的非阻塞异步IO是什么”吧!我们以网络请求IO为例,首先介绍服务端处理一次...
    99+
    2023-07-04
  • linux怎么测试io性能
    在Linux上测试IO性能可以使用以下工具和方法:1. 使用dd命令:dd命令可以用于复制文件、转换文件的格式以及执行其他操作。通过...
    99+
    2023-10-10
    linux
  • Linux IO内存的访问是怎样的
    本篇内容主要讲解“Linux IO内存的访问是怎样的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux IO内存的访问是怎样的”吧!IO内存访问流程我们知道,为了管理最重要的系统资源并让物...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作