标签:
由于本人今晚喝茶太多亢奋起来突然想起一直在我思维比较混乱的知识,记得以前看了无数次同步,异步,阻塞,非阻塞直接的 异同,以为已经掌握了,今晚再次想起,还是很模糊,故记录此文作把自己所理解的描述出来。
首先是参考了这个博文:http://blog.csdn.net/historyasamirror/article/details/5778378
同步:等待函数的调用的返回值
异步:不用等待函数调用的返回值,当函数返回值准备好回调调用者注册的回调函数
阻塞:进程阻塞在IO上,内核等待IO准备好数据(数据可以是socket连接的数据或者本地磁盘上的数据)并通知用户进程,内核返回结果唤醒被阻塞的进程。
非阻塞:进程进行IO请求,不需要等待立刻返回一个结果。
这样同步跟异步还是会占用cpu资源,同步异步调用所在的进程还在占用cpu时间,即使该进程还在等待数据的到来。阻塞是将进程挂起,直到数据到达才唤醒进程,不会占用cpu时间。
理解同步IO和异步IO的描述,是理解阻塞IO,非阻塞IO,多路IO复用的关键
一个同步IO的操作导致请求的进程被阻塞直到真正的IO操作完成。
一个异步IO的操作不会导致进程被阻塞。
网络IO操作实际过程涉及到内核和调用这个IO操作的进程。以read为例,read的具体操作分为以下两个部分:
(1)内核等待数据可读
(2)将内核读到的数据拷贝到进程
同步IO:阻塞IO,非阻塞IO,多路IO复用。
阻塞IO是同步IO,进程会被阻塞。
非阻塞IO也是同步,虽然在内核等待数据时是非阻塞的,但是在内核准备好数据通知进程数据已经准备好,用户进程发起系统调用将数据从内核拷贝到用户进程中时,进程也是被阻塞的。
多路IO复用:基于事件分离器的非阻塞IO,所以也是同步IO。
异步IO:异步非阻塞: 进程发出IO调用,进程不会被阻塞立刻返回。内核准备好数据并拷贝到用户进程所指定的内存区域后发一个信号告知进程数据已经准备完成,数据可以立即使用。
java 中BIO 是阻塞IO,NIO 是多路IO复用,AIO 是异步IO。
第一次总结,欢迎各位大神拍砖
标签:
原文地址:http://my.oschina.net/mihumao/blog/389652