前四种都是同步,只有最后一种才是异步IO。html
简介:进程会一直阻塞,直到数据拷贝完成
应用程序调用一个IO函数,致使应用程序阻塞,等待数据准备好。 若是数据没有准备好,一直等待….数据准备好了,从内核拷贝到用户空间,IO函数返回成功指示。linux
可能阻塞套接字的Windows Sockets API调用分为如下四种: windows
1.输入操做: recv()、recvfrom()、WSARecv()和WSARecvfrom()函数。以阻塞套接字为参数调用该函数接收数据。若是此时套接字缓冲区内没有数据可读,则调用线程在数据到来前一直睡眠。 服务器
2.输出操做: send()、sendto()、WSASend()和WSASendto()函数。以阻塞套接字为参数调用该函数发送数据。若是套接字缓冲区没有可用空间,线程会一直睡眠,直到有空间。 网络
3.接受链接:accept()和WSAAcept()函数。以阻塞套接字为参数调用该函数,等待接受对方的链接请求。若是此时没有链接请求,线程就会进入睡眠状态。 app
4.外出链接:connect()和WSAConnect()函数。对于TCP链接,客户端以阻塞套接字为参数,调用该函数向服务器发起链接。该函数在收到服务器的应答前,不会返回。这意味着TCP链接总会等待至少到服务器的一次往返时间。异步
简介:非阻塞IO经过进程反复调用IO函数(屡次系统调用,并立刻返回);在数据拷贝的过程当中,进程是阻塞的;socket
咱们把一个SOCKET接口设置为非阻塞就是告诉内核,当所请求的I/O操做没法完成时,不要将进程睡眠,而是返回一个错误。这样咱们的I/O操做函数将不断的测试数据是否已经准备好,若是没有准备好,继续测试,直到数据准备好为止。在这个不断测试的过程当中,会大量的占用CPU的时间。async
非阻塞套接字在控制创建的多个链接,在数据的收发量不均,时间不定时,明显具备优点。这种套接字在使用上存在必定难度,但只要排除了这些困难,它在功能上仍是很是强大的。函数
简介:主要是select和epoll;对一个IO端口,两次调用,两次返回,比阻塞IO并无什么优越性;关键是能实现同时对多个IO端口进行监听;
I/O复用模型会用到select、poll、epoll函数,这几个函数也会使进程阻塞,可是和阻塞I/O所不一样的的,这两个函数能够同时阻塞多个I/O操做。并且能够同时对多个读操做,多个写操做的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操做函数。
简介:两次调用,两次返回;
首先咱们容许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,能够在信号处理函数中调用I/O操做函数处理数据。
简介:数据拷贝的时候进程无需阻塞。
当一个异步过程调用发出后,调用者不能马上获得结果。实际处理这个调用的部件在完成后,经过状态、通知和回调来通知调用者的输入输出操做
网上有个比喻很好的说明这些模型,在这里引用一下。
老陈有一个在外地工做的女儿,不能常常回来,老陈和她经过信件联系。他们的信会被邮递员投递到他们的信箱里。
老陈很是想看到女儿的信。以致于他每隔10分钟就下楼检查信箱,看是否有女儿的信~~~~~
在这种状况下,“下楼检查信箱”而后回到楼上耽误了老陈太多的时间,以致于老陈没法作其余工做。
后来,老陈使用了微软公司的新式信箱。这种信箱很是先进,一旦信箱里有新的信件,盖茨就会给老陈打电话:喂,大爷,你有新的信件了!今后,老陈不再必频繁上下楼检查信箱了,牙也不疼了,你瞅准了,蓝天……不是,微软~~~~~~~~
后来,微软的信箱很是畅销,购买微软信箱的人以百万计数……以致于盖茨天天24小时给客户打电话,累得腰酸背痛,喝蚁力神都很差使~~~~~~
微软改进了他们的信箱:在客户的家中添加一个附加装置,这个装置会监视客户的信箱,每当新的信件来临,此装置会发出“新信件到达”声,提醒老陈去收信。盖茨终于能够睡觉了。
后来,微软经过调查发现,老陈不喜欢上下楼收发信件,由于上下楼其实很浪费时间。因而微软再次改进他们的信箱。新式的信箱采用了更为先进的技术,只要用户告诉微软本身的家在几楼几号,新式信箱会把信件直接传送到用户的家中,而后告诉用户,你的信件已经放到你的家中了!老陈很高兴,由于他没必要再亲自收发信件了!
老陈接收到新的信件后,通常的程序是:打开信封—-掏出信纸—-阅读信件—-回复信件……为了进一步减轻用户负担,微软又开发了一种新的技术:用户只要告诉微软对信件的操做步骤,微软信箱将按照这些步骤去处理信件,再也不须要用户亲自拆信/阅读/回复了!老陈终于过上了小资生活!
微软信箱彷佛很完美,老陈也很满意。可是在一些大公司状况却彻底不一样!这些大公司有数以万计的信箱,每秒钟都有数以百计的信件须要处理,以致于微软信箱常常因超负荷运转而崩溃!须要从新启动!微软不得不使出杀手锏……
微软给每一个大公司派了一名名叫“Completion Port”的超级机器人,让这个机器人去处理那些信件!
其实,上面每种模型都有优势,要根据程序需求而适当选择合适的模型,前面三种模型效率已经比较高,实现起来难道不大,不少通常的网络程序都采用前三种模型,只有对网络要求特别高的一些服务器才会考虑用后面的那些模型。MFC中的CAsyncSocket类就是用的WSAAsyncSelect模型,电驴中也是用的这种,不过在寻找对应socket的时候进行了优化,查找更快,在GridCast中采用的是WSAEventSelect模型,等待。
OIO 就是同步I/O,
在JDK 1.4版本以后才开始支持异步IO,其实NIO也是使用操做系统的IO模型,但在各操做系统上的实现方式也不太同样
在Windows系统使用的是Select模型,而不是性能更高的IOCP,缘由就是并不是全部Windows都支持IOCP,IOCP在windows NT 3.5中被引入,只支持WindowsNT和windows 2000。(参考:http://www.cnblogs.com/jobs/archive/2006/11/22/568023.html)
在Linux系统上使用的是多路复用IO,JDK 6以前用的是poll模型,JDK 7中使用epoll。(参考:http://www.cnblogs.com/jobs/archive/2006/11/22/568022.html)
JDK 7中出现了AIO,其实AIO就是NIO的加强版,由于JDK 6以前用的是poll,JDK 7用的是epoll,而epoll就是poll的加强版。
http://blog.csdn.net/hguisu/article/details/7453390
Java NIO和操做系统I/O模型
http://wugc.iteye.com/blog/986997
IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)
http://blog.csdn.net/historyasamirror/article/details/5778378
Java NIO原理 图文分析及代码实现
http://weixiaolu.iteye.com/blog/1479656
Java IO模型
http://blog.csdn.net/shanpengfei77/article/details/8161077
Windows I/O模型、同步/异步、阻塞/非阻塞
http://www.linuxnote.org/windows-i-o-model-synchronous-asynchronous-blocking-non-blocking.html