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

什么是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详解参考

https://mp.csdn.net/mp_blog/creation/editor/142146734?spm=1001.2014.3001.9457

  • 异步IO(AIO)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值