首页 > 其他分享 >初识IO模型,简单了解几种常见的IO模型

初识IO模型,简单了解几种常见的IO模型

时间:2024-09-06 17:54:06浏览次数:11  
标签:文件 模型 应用程序 描述符 初识 内核 IO CPU

什么是IO?简单来讲,就是输入和输出

从计算机结构分析:

从计算机结构来看,输入输出是一个重要的子系统,负责管理计算机与外部设备之间的数据交换。

不仅仅是硬盘和内存之间的传输,还包括各种输入输出设备(如键盘、鼠标、显示器、硬盘、网络设备)与内存、处理器之间的数据交互。

程序控制的 I/O(Programmed I/O)

  • 在程序控制的 I/O 中,CPU 直接负责管理 I/O 操作,CPU 主动轮询设备状态寄存器来判断设备是否准备好。
  • 缺点:效率低,因为 CPU 需要频繁检查设备状态,浪费 CPU 的执行时间。
  • 优点:实现简单,适合小型系统或简单设备。

中断驱动 I/O(Interrupt-driven I/O)

  • 中断驱动的 I/O 中,设备通过中断向 CPU 发信号,通知设备已准备好或操作完成。CPU 不需要频繁轮询设备,只在收到中断信号时才处理 I/O。
  • 缺点:中断会打断当前的 CPU 执行,频繁的中断也会带来开销。
  • 优点:提高了 CPU 的效率,减少了 CPU 的无用等待。

DMA(直接存储器访问,Direct Memory Access)

  • DMA 是通过专门的控制器,直接将 I/O 设备的数据传输到内存中,而不需要经过 CPU。
  • 缺点:DMA 控制器本身有一定的复杂性,且在多设备环境下可能引入总线争用问题。
  • 优点:CPU 可以专注于其他任务,而不需要参与具体的数据传输,大大提高了系统效率。

从应用程序角度分析:

        从应用程序角度分析 I/O(输入/输出)操作,重点在于应用程序与外部资源(如文件系统、网络、用户设备等)之间的数据交换。这种数据交换通过操作系统提供的 I/O 接口或 API 进行,使应用程序能够访问外部设备、文件或网络。

        I/O操作允许应用程序与外部设备进行交互,比如读取文件、从网络获取数据、接收用户输入或者将数据输出到屏幕或文件中。但应用程序本身无法直接与硬件交互,而是通过操作系统提供的系统调用或库函数完成这些操作。也就是说,用户进程想要执行IO操作的话,必须通过系统调用来间接访问内核空间。

java中常见的IO模型:

  • 同步阻塞IO(BIO)

        当用户程序执行read的时候,线程会被阻塞,一直要等到内核数据准备好,并把数据从内核缓冲区拷贝到应用程序的缓冲区中,拷贝过程完成后,read开会返回。(需要等待两个过程)

  • 同步非阻塞IO(NIO)

        同步非阻塞IO和同步阻塞IO相比,同步非阻塞IO的read请求会在内核数据未准备好的时候立即返回,可以往下继续执行,此时,应用程序不断轮询(消耗CPU资源)内核,直到数据准备好,内核将数据拷贝到应用程序缓冲区,read才可以获取到结果。

注:最后一次read调用的时候,获取数据的过程是一个同步的过程,需要等待。

  • 多路复用IO

        在多路复用IO模型中,应用程序不会直接发起read()操作,而是会先调用select()、poll()、epoll()等系统调用,让内核监控多个文件描述符的状态,当内核发现某些文件描述符可以进行读写操作时,它会通过 select()、poll() 或 epoll() 的返回值,通知应用程序哪些文件描述符已经准备好,程序再对它们进行 read() 操作。

        select()、poll() 和 epoll() 是 Linux 下用于多路复用IO(IO Multiplexing)的系统调用,它们分别在不同的场景下使用来监控多个文件描述符的状态。

1. select():是最早的IO多路复用机制,用于监控一组文件描述符是否可读、可写或有异常。

        缺点:每次调用都需要重新设置 fd_set,这是 select() 的一大性能瓶颈。支持的文件描述符数量有限(通常为 1024),超出这个数量需要进行修改。当文件描述符数量较多时,性能下降较为明显。

2. poll():允许同时监控任意数量的文件描述符,但还是会在每次调用的时候遍历所有的文件描述符

3. epoll():使用事件驱动模型,可以在大量文件描述符下更高效的工作

监控方式的不同:

        select和poll是扫描式监控,在每次调用的时候,内核都会便利扫描传入的所有的文件描述符,检查他们的状态。如果没有文件描述符处于可读/可写状态,可以选择阻塞,等待文件描述符状态发生改变,也可以设定超时事件。

        epoll是事件驱动监控,应用程序只需要注册一次感兴趣的文件描述符和对应的事件,然后 epoll 在这些文件描述符的状态发生变化时通过事件通知的方式告知应用程序。内核不需要每次遍历所有文件描述符,只在状态变化时将有状态变化的文件描述符返回给应用程序。

  • 异步IO(AIO)

        应用程序不需要主动等待数据准备或者去轮询文件描述符的状态,而是让内核完成整个IO操作,包括数据的准备和传输,当操作完成时内核通知应用程序进行处理。

标签:文件,模型,应用程序,描述符,初识,内核,IO,CPU
From: https://blog.csdn.net/weixin_52096141/article/details/141965725

相关文章

  • 西游再现!一键部署 Flux 文生图大模型生成西游人物
    从花果山的灵石出世,到取经路上的九九八十一难,再到大闹天宫的惊心动魄……这些耳熟能详的西游场景,如今都能通过Flux模型,以超乎想象的细节和真实感呈现在你眼前。本次实验在函数计算中内置的flux.1-dev-fp8大模型,搭配Lora模型,无需复杂的配置,一键部署,你就能成为这场视觉盛宴的......
  • 用友U8 Cloud MultiRepChooseAction SQL注入漏洞复现
    0x01产品简介用友U8 Cloud是用友推出的新一代云ERP,主要聚焦成长型、创新型企业,提供企业级云ERP整体解决方案。0x02漏洞概述用友U8CloudMultiRepChooseAction 接口处存在SQL注入漏洞,未经身份验证的远程攻击者除了可以利用SQL注入漏洞获取数据库中的信息(例如,管理员后......
  • 用友U8 Cloud AddTaskDataRightAction SQL注入漏洞复现
    0x01产品简介用友U8 Cloud是用友推出的新一代云ERP,主要聚焦成长型、创新型企业,提供企业级云ERP整体解决方案。0x02漏洞概述用友U8 CloudAddTaskDataRightAction 接口处存在SQL注入漏洞,未经身份验证的远程攻击者除了可以利用SQL注入漏洞获取数据库中的信息(例如,管理员......
  • WPF Generic eventhandler for various event
    publicMainWindow(){InitializeComponent();this.AddHandler(ListBox.SelectionChangedEvent,newSelectionChangedEventHandler(GenericHandler));this.AddHandler(Button.ClickEvent,newRoutedEventHandler(GenericHandler));}......
  • IO流综合案例
    分析以下需求,并用代码实现训练目标:​ 掌握java中字符流的基本使用,以及理解其在实际开发中的应用需求描述:​ 编写一个程序,把一个目录里边的所有带.java文件拷贝到另一个目录中。实现提示:用File对象封装目录通过listFiles()方法获取该目录下所有的文件或者文件夹的File对象......
  • Apache RocketMQ 批处理模型演进之路
    本文收录于ApacheRocketMQ中文社区,更多RocketMQ文章和答疑请访问:https://rocketmq-learning.com/RocketMQ的目标,是致力于打造一个消息、事件、流一体的超融合处理平台。这意味着它需要满足各个场景下各式各样的要求,而批量处理则是流计算领域对于极致吞吐量要求的经典解法,这当......
  • IO流
    什么是IO流IO:(inputoutputstream):输入输出流。针对文件中的内容进行的操作。读取文件中的内容和向文件中写入内容。IO的分类按照方向:输入流和输出流按照内容:字节流和字符流。按照处理:处理流和节点流常见流类有那些字节输出流。OutputStream它是所有字节输出流类......
  • 初识jQuery
    jQuery简介jQuery由美国人JohnResig于2006年创建jQuery是目前最流行的JavaScript程序库,它是对JavaScript对象和函数的封装它的设计思想是writeless,domore例:实现隔行变色效果,只需一句关键代码<!DOCTYPEhtml><html><head><title>订单表格</title></head><!--......
  • 如何用大语言模型分析开源代码?
    要使用大语言模型(如GPT)分析开源代码,比如HyperScan正则开源代码,可以按照以下步骤进行:1.获取代码库首先,需要从开源平台(如GitHub)下载HyperScan的代码库。你可以使用Git命令克隆代码库:gitclonehttps://github.com/intel/hyperscan.git2.分块处理代码由于大语言模型在一次请求中只能......
  • 【AI大模型】AI大模型热门关键词解析与核心概念入门
    关注公众号ai技术星球回复88即可领取技术学习资料目录导航热门AI大模型关键词解析热门AI大模型关键词解析大模型代码语言:javascript复制-"大模型"的是大型的人工智能模型,特别是在深度学习领域中。这些模型因其庞大的参数数量、复杂的网络结构和在多种任务上的......