并发与并行
这是两个经常听到的词汇,正好最近在读相关的书籍,在此分享一下认知。
方法论
从方法论上说,他们是处理问题不同的方式。之前在我的认知中曾粗略的以为并行是高级的并发,其实不是,他们甚至不是为了解决同一个问题。
并发是问题域
并发解决的是多个线程竞争资源而出现的问题,作为系统设计者并不想发生这样的问题。并发程序往往效率并不如单线程的串型程序,因为往往涉及锁等比较复杂的操作,而且代码维护也相对困难。
并行是方法域
并行利用多核的优势,面对一个大的对象或者数据,将它分解,将它拆分成小问题,进而提升执行效率,代码也相对更简洁清晰。
时序
并发程序的时序是难以保证且不确定的,如果在细节的并发控制上没有做好锁或者隔离,可能就会产生不符预期的结果。
并行程序的执行相互隔离,时序是确定的,执行结果也完全可以确定,有时候只是性能的差异。
选择
并行看起来可能很好,但也不是万能的。但有些原则是必须遵守的:
选择合适的模型,是否存在并发?并行计算后最后的组合成本是不是比串型还高?
解决问题的同时,写出可读的代码
最后有句话送给大家:并发程序中如果某件事可能会发生,无论多难它一定会发生,而且可能在最不利的时刻。并发是不确定的,代码也是不确定的,不要心存侥幸!
评论