1. 同步
同步和异步关注的是消息通信机制。所谓同步就是,系统发出一个调用,在没有得到结果之前该调用是不会返回的,一直会等到该调用得到返回值。如果一个调用很快返回,就一定是得到了返回。就是调用者会主动等待这个调用的结果。举个例子:今天老师上课问学习委员今天作业交齐了没有,学习委员立马检查后就给老师说,交齐了;如果学习委员没有改老师答案,老师会一直等学习委员给他回复。
例如:普通B/S模式:提交请求->等待服务器处理->处理完毕返回,这个期间客户端浏览去不能干任何事情,所有的操作都完成,才能返回给用户。这样用户等待的时间太长,给用户一种卡死的感觉。这种情况,用户不能关闭界面,如果关闭了,程序就中断了。
2. 异步
异步和同步相反,异步则是在系统发出一个调用之后,调用就直接返回,所以它没有返回结果。换句话说就是当一个调用执行之后,调用者不会立马得到结果,而是等待被调用者有结果之后在通知它。还拿交作业举例:老师问作业交齐了没有,数好了告诉我。老师继续上课,下课后学习委员才告诉老师结果。
例如:ajax请求:请求通过事件触发->服务器处理(这时候浏览器仍然可以做其他的事情)->处理完毕。用户将请求队列放入消息队列,并反馈给用户,系统迁移程序已经启动,你可以关闭浏览器了。然后程序在慢慢的去写入数据库。这就是异步,单用户没有卡死的感觉,会告诉你,你的请求系统已经相应了,你可以关闭界面了。
3.阻塞
阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。阻塞是指方法(函数)执行后,在结果返回之前,当线程(进程)会被挂起。调用线程(进程0)只有在得到结果之后才会返回。
4.非阻塞
非阻塞方法(函数)指在不能立即达到结果之前,该方法(函数)不会阻塞当前线程,可以立即返回,只是返回结果失败,没有数据,一般需要cpu周期轮询,以检查数据是否就绪。
总结
1.同步,就是调用方调用一个功能,该功能没有完成前,调用方死等结果
2.异步,就是调用方调用一个功能,不需要直到该功能结果,被调用方有结果后会通知调用方
3.阻塞,就是调用函数,函数没有得到结果前,函数不会返回
4.非阻塞,就是调用函数,函数立即返回,通过select通知调用者
同步IO和异步IO的区别就在于:数据拷贝的时候是否阻塞
阻塞IO和非阻塞IO的区别就在于:应用程序的调用是否立即返回
同步和阻塞的区别:对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回,它还会抢占cpu,也会主动监测IO是否准备好。
同步和异步关注的是消息通信机制。
阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。