首页 > 技术文章 > IO 模型简述

bllbl 2021-10-13 16:23 原文

我们在平常开发过程中接触最多的就是 磁盘 IO(读写文件)网络 IO(网络请求和响应)

从应用程序视角来看,我们的应用程序对操作系统的内核发起IO调用(系统调用),操作系统负责的内核执行具体IO操作。

UNIX系统下,IO模型有五种:同步阻塞IO、同步非阻塞IO、IO多路复用、信号驱动IO和异步IO。

阻塞与非阻塞指的的是当不能进行读写(网卡满时的写/网卡空的时候的读)的时候,I/O 操作立即返回还是阻塞。
同步异步指的是,当数据已经就绪的时候,读写操作是同步读还是异步读,他们的阶段不同而已。

Java中三种常见IO模型

BIO

BIO属于同步阻塞IO模型,应用程序发起read调用后,会一直阻塞,直到内核把数据拷贝到用户空间。

image

NIO

Java的NIO是1.4引入的,提供了channel、selector、buffer等抽象,它是面向缓冲区,基于管道的的操作方法。

应用程序会一直发起read调用,等待数据从内核空间拷贝到用户空间的这段时间,线程依然是阻塞的,直到内核把数据拷贝到用户空间。

image

他通过轮询操作,避免了一直阻塞,但是不断的调用是很消耗CPU资源。这时可以使用IO多路复用模型,线程首

先发起select调用,询问内核数据是否就绪,等内核把数据准备好,用户线程再发起read调用。read调用的过程

(数据从内核到用户)还是阻塞的。IO多路复用模型通过减少无效的系统调用,减少了对CPU资源的消耗。

image

Java中的NIO还有一个selector,也就是多路复用器,只需要一个线程就可以管理多个客户端连接。客户端数据到达才会处理。

AIO

异步IO模型,异步IO基于事件和回调机制实现,应用发起调用后立刻返回,当处理完成后,操作系统会通知应用。

image

Re

JavaGuide

推荐阅读