同步、异步、阻塞、非阻塞

同步、异步、阻塞、非阻塞

在谈论I/O时,经常会出现这几个词,但是很多文章把这几个词混淆在一起。

同步/异步 和 阻塞/非阻塞 描述的是不同的对象,因此是不同的概念。

1.同步/异步

同步/异步描述的对象多个事务,这里的事务可以是一行代码,一个方法,一个功能模块,或者一个进程/线程;因此在使用同步/异步时,一定有多个事务。

  • 同步:同步指的是多个事务按照一定的顺序执行,一个执行完,执行下一个。比如两行代码,一行执行完执行下一行;两个方法,一个执行完执行另一个;两个进程/线程,一个运行完在运行另一个。所以在多进程/线程中,经常要对临界区进行同步,这里的同步也是让它们按照一个顺序进入临界区。
  • 异步:异步指的是多个事务的执行没有顺序,可以同时执行(并发/并行)。因为在同一个线程中,代码都是顺序执行,即代码层面是同步的,因此要在一个进程内实现代码层面,或者方法层面的异步,通常使用多线程来运行不同的事务。

因此,如果只有一个事务,谈不上同步/异步的概念;经常有人说一个方法A是异步方法,或者同步方法,是因为他们隐式的将方法A下面的代码B作为了参考,所以描述的是方法A和代码B之间的关系:

void main(){
    //...
	A();
    //main 函数内的其他代码B
    B
}

如果只是谈论方法A,则没有同步/异步的概念。

2.阻塞/非阻塞

同步/异步的描述对象是多个事务,阻塞/非阻塞描述的对象是单个事务,同样这里的事务可以是一行代码,一个方法,一个功能模块,或者一个进程/线程;因此在使用阻塞/非阻塞,一定只描述一个事务。

  • 阻塞:阻塞指的是这一个事务执行时,会导致该事务暂停,等到有事件发生后该事务才能执行完成,特点是需要停止等待某个事件发生,才能执行完该事务;比如一个事务是开车经过一个桥,现在桥被淹了,则该事务执行时,汽车停到桥边,等水下去了,才经过桥,即事务才能执行完成。
  • 非阻塞:非阻塞指的是这一个事务执行时,不需要暂停该事务,该事务是否执行完成不关注,能执行就执行,不能执行就直接不管了,和阻塞最大的区别就是不需要停止等待某个事件,不关心执行是否完成发生,比如上述的汽车过桥,如果桥面没水,那直接过桥执行完该事务,如果桥面有水,那这次直接不过桥了,约等于没有执行该事务。

非阻塞方式的事务不关心该事务是否执行完成,但在实际程序中,我们需要让事务执行正常完成。因此可以通过轮询非阻塞事务的方式,直到其执行完:

void main(){
	while(A事务没执行完){
        //非阻塞方法A
		A();
        //...
	}
}

从A方法层面,A方法是一个非阻塞事务,但是从while循环层面,while循环是一个阻塞事务(因为需要暂停等待某个事件发生,才能执行完,该事件就是A事务执行完成)。

3.组和使用

组和在一起就会形成同步阻塞,异步阻塞,同步非阻塞,异步非阻塞。

比如有2个事务A,B

同步阻塞:

#A先执行,然后执行B
A执行后暂停等待,事件发生后A执行完------>B执行后暂停等待,事件发生后B执行完。

同步非阻塞:

#A先执行,然后执行B
A执行后,不关心是否任务完成-------->B执行后,不关心是否任务完成。

异步阻塞:

#A,B可并发/并行执行
A执行后暂停等待,事件发生后A执行完。
B执行后暂停等待,事件发生后B执行完。

异步非阻塞:

#A,B可并发/并行执行
A执行后,不关心是否任务完成。
B执行后,不关心是否任务完成。
4.总结
  1. 同步不等于阻塞,异步也不等于非阻塞;它们描述的对象完全是不同的。
  2. 同步/异步的参照物是多个事务。
  3. 阻塞/非阻塞的参照物是单个事务。
  4. 同步/异步区分:通过执行是否有序。
    – 同步:多个事务执行有序性
    – 异步:多个事务执行无序性
  5. 阻塞/非阻塞区分:通过1.事务是否可以保证执行完;2.是否需要停止等待某事件发生。
    –阻塞:事务执行后,需要停止等待某个事件发生,才能执行完。
    –非阻塞:事务执行后, 不需要停止等待某个事件发生,不关心该事务是否可以执行完。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值