来源:东陆之滇
并发程序的几个概念
- 同步(Synchronous)
- 异步(Asynchronous)
- 阻塞 (Blocking)
- 非阻塞 (Non-Blocking)
- 死锁 (Deadlock)
同步和异步通常用来形容方法的调用方式。 同步的方法调用时,后续行为需要等到方法执行完毕后才能执行。 异步调用时,一旦调用可以立即拿到结果,调用方可以继续后续的操作。
举个生活中的例子,两件事:煮饭、烧菜。
同步就是:淘米–》煮饭–》等饭熟–》洗菜–》烧菜
异步可能: 淘米–》煮菜–》
洗菜–》烧菜–》–》饭菜皆好。
异步可以理解为统筹思想来解决问题,尽量不在等待中浪费时间。 在实际的产品中,异步可以增强用户体验,比如常见的消息机制,就是异步程序设计的优雅体现。
阻塞和非阻塞通常用来形容多线程间的影响。 比如一个thread1占用了临界区(主内存共享资源),另外的线程需要等待thread1使用完资源之后释放完成,才能获得资源锁。所有的等待都会导致线程挂起,导致资源占用阻塞。
死锁: 比如在双车道高速公路上并行的两辆车A、B,A想拐到B车道,B想转到A车道。现在则会发现互相等待对方开走,但是对方一直往这边转过来,一直僵持。。。这在程序中的多个线程互相等待就是死锁。
有关并行地两大定律
阿姆达尔定律是计算机并行重要的定律。定义了串行系统并行化后的加速比的计算公式和理论上限。
假设有n个处理器,t1表示优化前耗时,tn表示经过n个处理器优化后的耗时,f是程序中只能串行执行的比例。
则 tn = t1 * ( f + (1 – f) / n )
加速比 = t1/tn
我们可以分析出, 串行比例越低且处理器越多,加速比越高,程序优化效率越高。
如果串行比例占2/3,则无论处理器再多,最大加速比也只能达到1.5。
理想效果是,全部并行,最大加速比为 n。可以根据增加处理器无上限增强程序效率。
- 古斯塔夫森定律
古斯塔夫森定律也是在表明处理器个数、并行比例和加速比之间的关系。
执行时间: 串行时间a + 并行时间b
优化后时间: a + nb、
加速比: (a + nb) / (a + b)
f串行比例 : a / (a + b)
如果串行比例很小,那个加速比就是处理器的个数。
两个定律最低点、最高点都是一致的结论:
无可并行的程序,加速比就是1.
全部是并行程序,加速比就是n