IO模型 | 常见的五种IO模型介绍

目录

常见IO模型

1. 阻塞IO模型

2. 非阻塞I/O模型

3. I/O复用

4. 信号驱动IO模型

5. 异步IO

一个形象的示例说明


常见IO模型

对于一次 IO 访问,它会经历两个阶段:等待数据准备就绪 (Waiting for the data to be ready);将数据从内核拷贝到进程中 (Copying the data from the kernel to the process)。

举例来说:

读函数:分为等待系统可读真正的读

写函数:分为等待网卡可以写真正的写

说明:等待就绪的阻塞是不使用 CPU 的,是在“空等”。而真正的读写操作的阻塞是使用 CPU 的,真正在“干活”,而且这个过程非常快,属于 memory copy,宽带通常在 1GB/s 级别以上,可以理解为基本不耗时。

IO模型 | 常见的五种IO模型介绍_第1张图片

1. 阻塞IO模型

IO模型 | 常见的五种IO模型介绍_第2张图片

2. 非阻塞I/O模型

非阻塞IO通过进程反复调用IO函数,采用轮询,占用CPU。

IO模型 | 常见的五种IO模型介绍_第3张图片

3. I/O复用

主要是select和epoll,对一个IO端口,两次调用,两次返回,能实现对多个IO端口进行监听。多个连接共用一个等待机制。

IO模型 | 常见的五种IO模型介绍_第4张图片

4. 信号驱动IO模型

首先开启接口信号驱动IO功能,通过系统调用sigation执行一个信号处理函数(此信号调用直接返回,进程继续工作)。当数据准备就绪时,生成一个signal信号,通知应用程序来取数据。

IO模型 | 常见的五种IO模型介绍_第5张图片

5. 异步IO

告知内核启动某个操作,并让内核在整个操作完成的的那个之后(将数据从内核复制到用户自己的缓冲区),进行通知。和信号驱动模型的主要区别:信号驱动IO由内核通知我们合适可以开始一个IO操作,在client进行IO操作的时候需要等待,所以是同步的。异步IO模型由内核通知我们IO何时已经完成,client不需要进行IO的处理了,所以是异步的。

IO模型 | 常见的五种IO模型介绍_第6张图片

一个形象的示例说明

活动:演唱会

角色1:举办商 售票业务员

角色2:黄牛

角色3:小明

角色4:送票快递员

同步阻塞 :

小明从家里面先到演唱会现场问售票业务员买票,但是票还没出来,IO三天以后才出来,小明直接打了个地铺睡在举办商售票大厅,一直等票出来,然后买票。

同步非阻塞 : socket可以设置non-blocking

小明从家里面先到演唱会现场问售票业务员买票,但是票还没出来,然后小明走了,办理其他事情去了,然后过了2个小时,又去举办商售票大厅买票来了,如果票还没有出来,小明又先去办其他事情了,重复上面的操作,直到有票可以买。

i/o复用 java selector() => linux epoll_wait() 同步非阻塞I/O

小明想买票看演唱会,都直接给黄牛(selector/epoll)打电话了,说帮我留意买个票,票买了通知我,我自己去取(当我接到黄牛的电话时,我需要花费整个路成的时间去读这个数据,买拿这个票),那么票没出来之前,小明完全可以做自己的事情。

信号i/o

小明想买票看演唱会,给举办商售票业务员说,给你留个电话,有票了请你给我打个电话通知一下,(是看人家操作系统提不提供这种功能,Linux提供,windows没有这种机制),我自己再来买票(小明完全可以做自己的事情,但是票还是需要小明自己去拿的)。

异步非阻塞i/o Linux aio_read aio_write

小明想买票看演唱会,给举办商售票业务员说(异步非阻塞i/o)打电话了,给你留个地址,有票了请通知快递员,把这张票送到这个地址来,当小明听到敲门声,看见快递员,就知道票好了,而且知道票好了的时候,票已经到他手上了,票不用小明自己去取(应用不用自己再去read数据了)


以上都是学习过程中的总结,如果有错误或者有疑问,欢迎一起交流吖~~

你可能感兴趣的:(网络编程,java,网络,缓存)