5种IO模型的图解分析和比较

系统 2072 0

Unix 5 IO 模型的图解分析和比较

(转自 http://blog.csdn.net/blueboy2000/archive/2009/08/26/4485874.aspx

Unix 下共有五种 I/O 模型

l           阻塞 I/O

l           非阻塞 I/O

l           I/O 复用( select poll

l           信号驱动 I/O SIGIO

l           异步 I/O Posix.1 aio_ 系列函数)



l          
阻塞 I/O 模型

应用程序调用一个 IO 函数,导致应用程序阻塞,等待数据准备好。

如果数据没有准备好,一直等待。。。。

数据准备好了,从内核拷贝到用户空, IO 函数返回成功指示。

在这种模式下,基本上 IO 操作都会用一个 Work Thread 来进行( Java )。

 

5种IO模型的图解分析和比较



l           非阻塞 I/O 模型

我们把一个套接口设置为非阻塞就是告诉内核,当所请求的 I/O 操作无法完成时,不要将进程睡眠,而是返回一个错误。这样我们的 I/O 操作函数将不断的测试数据是否已经准备好,如果没有准备好,继续测试,直到数据准备好为止。在这个不断测试的过程中,会大量的占用 CPU 的时间。

5种IO模型的图解分析和比较


l          
I/O 复用模型

I/O 复用模型会用到 select 或者 poll 函数,这两个函数也会使进程阻塞,但是和阻塞 I/O 所不同的是,这两个函数可以同时阻塞多个 I/O 操作。而且可以同时对多个读操作,多个写操作的 I/O 函数进行检测,直到有数据可读或可写时,才真正调用 I/O 操作函数。

5种IO模型的图解分析和比较

目前Java 只能支持到多路复用一级,在这种模式下,在一个线程里面以阻塞的模式监听连接,优点在于不用开过多的线程以阻塞的模式等待连接。



l           信号驱动 I/O 模型

 

首先我们允许套接口进行信号驱动 I/O, 并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个 SIGIO 信号,可以在信号处理函数中调用 I/O 操作函数处理数据。

5种IO模型的图解分析和比较

l          
异步 I/O 模型

调用 aio_read 函数,告诉内核描述字,缓冲区指针,缓冲区大小,文件偏移以及通知的方式,然后立即返回。当 内核 将数据拷贝到缓冲区后,再通知应用程序。

这个操作和信号驱动的区别就是:异步模式等操作完毕后才通知用户程序而信号驱动模式在数据到来时就通知用户程序。

5种IO模型的图解分析和比较

几种
I/O 模型的比较

前四种模型的区别是第一阶段,第二阶段基本相同,都是将数据从内核拷贝到调用者的缓冲区。而异步 I/O 的两个阶段都不同于前四个模型。

5种IO模型的图解分析和比较


同步
I/O 和异步 I/O

a. 同步 I/O 操作引起请求进程阻塞,直到 I/O 操作完成。异步 I/O 操作不引起请求进程阻塞。

b. 我们的前四个模型都是同步 I/O ,只有最后一个异步 I/O 模型是异步 I/O

Java nio 和多路复用

java 1.4 nio 提供的 select ,这是一种多路复用 I/O multiplexed non-blocking I/O )模型,底层是使用 select 或者 poll I/O 复用就是,阻塞在 select 或者 poll 系统调用的某一个之上,而不是阻塞在真正的 I/O 系统调用之上。 JDK 5.0 update 9 JDK 6.0 linux 下支持使用 epoll ,可以提高并发 idle connection 的性能( http://blogs.sun.com/alanb/entry/epoll )。

"BIO是指阻塞IO方式,即读和写必须为同步方式,NIO是指异步读,同步写的方式,AIO是指异步读,异步写的方式。
在网络协议上java对于TCP/IP和UDP/IP均支持,在网络IO的操作上,目前java仅支持BIO和NIO两种方式。"

5种IO模型的图解分析和比较


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论