常见的IO模型
本文最后更新于662 天前,其中的信息可能已经过时,如有错误请发送邮件到2763981847@qq.com

在计算机系统中,IO模型描述了应用程序底层IO设备之间进行交互的方式。

UNIX 系统下的五种IO模型:

  1. 阻塞IO模型(Blocking IO Model) 这种模型下,当应用程序发起IO操作时,应用程序会被阻塞,直到IO操作完成并返回结果。在此期间,CPU将不再处理其他任务。这种模型通常用于简单应用程序,因为它易于实现和使用,但不适用于高并发应用程序。
  2. 非阻塞IO模型(Non-blocking IO Model)这种模型下,当应用程序发起IO操作时,应用程序可以立即返回,并继续处理其他任务。在IO操作完成之前,应用程序需要定期轮询IO操作状态,以确定是否完成。这种模型对于高并发应用程序来说是比较适用的。
  3. IO多路复用模型(IO Multiplexing Model) 这种模型下,应用程序通过调用一个特定的函数(如select()或epoll())来向操作系统注册IO事件的关注,然后继续执行其他任务。当注册的IO事件就绪时,操作系统通知应用程序并返回相应的IO操作。这种模型可以同时处理多个IO操作,并且可以通过调整事件关注的方式来灵活地控制IO操作的处理。
  4. 信号驱动IO模型(Signal-driven IO Model) 这种模型下,应用程序通过调用一个特定的函数(如sigaction())来向操作系统注册IO事件的关注,然后继续执行其他任务。当注册的IO事件就绪时,操作系统向应用程序发送一个信号,应用程序在信号处理函数中处理相应的IO操作。这种模型可以同时处理多个IO操作,并且可以通过信号处理函数来控制IO操作的处理方式。
  5. 异步IO模型(Asynchronous IO Model) 这种模型下,应用程序发起IO操作后,应用程序可以立即返回,并继续处理其他任务。当IO操作完成时,操作系统通知应用程序,并将IO操作结果传递给应用程序。这种模型可以同时处理多个IO操作,并且可以通过回调函数来处理IO操作的结果,从而实现更高效的IO操作处理。

Java 中 3 种常见 IO 模型

  1. 阻塞IO模型(Blocking IO Model) 在Java中,阻塞IO模型也被称为传统IO模型或同步IO模型。同步阻塞 IO 模型中,应用程序发起 read 调用后,会一直阻塞,直到内核把数据拷贝到用户空间。这种模型使用Java IO或NIO中的输入输出流(InputStream、OutputStream、Reader、Writer等)来实现。在客户端连接数量不高的情况下,是没问题的。但是,当面对十万甚至百万级连接的时候,传统的 BIO 模型是无能为力的。因此,我们需要一种更高效的 I/O 处理模型来应对更高的并发量。6a9e704af49b4380bb686f0c96d33b81_tplv-k3u1fbpfcp-watermark
  2. 非阻塞IO模型(Non-blocking/New IO Model)这种模型下,当程序调用IO操作时,程序可以立即返回,并继续处理其他任务。Java 中的 NIO 于 Java 1.4 中引入,对应 java.nio 包,提供了 Channel , SelectorBuffer 等抽象。NIO 中的 N 可以理解为 Non-blocking,不单纯是 New。它是支持面向缓冲的,基于通道的 I/O 操作方法。 对于高负载、高并发的(网络)应用,应使用 NIO 。Java 中的 NIO 可以看作是 I/O 多路复用模型img在Java NIO中,多路复用是实现高并发IO操作的重要机制之一,其核心是通过select()或epoll()等函数,将多个IO通道注册到一个选择器(Selector)对象中,然后等待选择器通知哪些通道已经就绪可以进行IO操作。多路复用在Java NIO中的设计细节:
    1. 选择器(Selector)对象 选择器是Java NIO中的一个重要概念,它用于管理多个IO通道,并检测它们的状态是否已经就绪可以进行IO操作。在Java NIO中,选择器是通过Selector.open()方法创建的。
    2. 通道(Channel)对象 通道是Java NIO中的另一个重要概念,它用于表示与底层IO设备的连接,并提供了读取和写入数据的能力。在Java NIO中,通道包括传统IO通道(如FileChannel、SocketChannel和ServerSocketChannel)以及NIO.2中的异步通道(如AsynchronousFileChannel、AsynchronousSocketChannel和AsynchronousServerSocketChannel)。
    3. 缓冲区(Buffer)对象 缓冲区用于存储通道读取和写入的数据。在Java NIO中,缓冲区可以分为直接缓冲区非直接缓冲区,可以通过ByteBuffer、CharBuffer、ShortBuffer等类来实现。
    4. 就绪集合(SelectionKey) 就绪集合表示选择器通知程序的就绪IO通道集合。每个就绪集合包含一个就绪通道的引用以及该通道的就绪事件类型。在Java NIO中,就绪集合是通过SelectionKey对象来表示的。
    5. select()和epoll()函数 select()和epoll()函数是多路复用的核心函数,它们都用于将多个IO通道注册到选择器中,并等待选择器通知哪些通道已经就绪可以进行IO操作。在Java NIO中,可以通过SelectableChannel.register()方法将通道注册到选择器中。img
  3. 异步IO模型(Asynchronous IO Model) 在Java中,AIO 也就是 NIO 2。Java 7 中引入了 NIO 的改进版 NIO 2,它是异步 IO 模型。这种模型下,当程序调用IO操作时,程序可以立即返回,并继续处理其他任务。当IO操作完成时,操作系统通知程序,并将IO操作结果传递给程序。这种模型使用Java NIO.2中的异步通道(AsynchronousChannel)和回调函数(CompletionHandler)来实现。img
  • Java中的三种常见IO模型总结:img

文章:常见的IO模型
作者:oreki
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0协议。转载请注明文章地址及作者

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇