关于同步异步,阻塞非阻塞的理解

关于同步异步,阻塞非阻塞,一直有困惑,大致了解整理一下,如有错误,请指正谢谢!

同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?

一、同步异步

同步和异步,关注的是消息通信机制,主要针对Client端

同步:client执行一个操作后,需要等待结果返回,只有等待结果返回后,才能执行下一个操作,事情得一件一件来,之前的事情做完了才能做下一件事情。

异步:client执行一个操作后,可以返回执行其他操作(无需等待当期执行结果返回),然后等待通知再回来执行刚才没有完成的操作。(ajax,node.js异步编程)

二、阻塞非阻塞

阻塞和非阻塞,关注的是程序在等待调用结果(消息,返回值)时的状态。主要针对Server端

阻塞:阻塞指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行),调用线程只有得到结果后才返回。

非阻塞:非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

调用非阻塞I/O跟阻塞I/O的差别为调用之后立即返回,返回后,CPU的时间片可以用来处理其他事务,此时性能是提升的

三、区别

同步IO和异步IO的区别就在于:数据访问的时候进程是否阻塞!

阻塞IO和非阻塞IO的区别就在于:应用程序的调用是否立即返回!

同步和异步都只针对于本机SOCKET而言的。

同步和异步,阻塞和非阻塞,有些混用,其实它们完全不是一回事,而且它们修饰的对象也不相同。
阻塞和非阻塞是指当server端的进程访问的数据如果尚未就绪,进程是否需要等待,简单说这相当于函数内部的实现区别,也就是未就绪时是直接返回还是等待就绪;

而同步和异步是指client端访问数据的机制,同步一般指主动请求并等待I/O操作完毕的方式,当数据就绪后在读写的时候必须阻塞(区别就绪与读写二个阶段,同步的读写必须阻塞),异步则指主动请求数据后便可以继续处理其它任务,随后等待I/O,操作完毕的通知,这可以使进程在数据读写时也不阻塞。(等待"通知")

四、举个栗子:

老张喝茶,要烧水

1、老张把水壶装满水放到煤气灶上加热,等水开 (同步阻塞)

2、老张把水壶装满水放到煤气灶上加热,就离开了,时不时回来看下水开了没有(同步非阻塞)

参考链接:

http://blog.csdn.net/historyasamirror/article/details/5778378

https://www.zhihu.com/question/19732473

猜你喜欢

转载自my.oschina.net/klausprince/blog/1634638