一、并发和并行的处理机制
在实际的应用场景中,并行和并发的现象是常见的,因此,在不断的发展过程中,发现其需要解决的问题可以分成三种类型:
1、工作任务的分解
工作任务指的是具体的任务有什么,可不可以划分成独立的执行任务,可不可以每个独立任务同时运行。比如几个监控页面同时显示问题。
2、数据的分解
这个就非常常见了,比如要同时从两个表里拿数据,可不可以用两个线程同时进行。
3、数据流的分解
数据流的分解,其实更类似于任务和数据的处理流程的分解,典型的如CPU的流水线设计。
基本上,通过这三种类型的处理机制分析,可以把现实的实际应用都可以涵盖起来。而具体到上述几个问题的解决方式,又可以抽象出来几种设计模式。
二、常见的设计模式
1、分治法
分治法应该学过算法的都知道,这是一种经典的算法,用来处理复杂的型业务模型。它的本质在于把一个规模为N的问题,分解成K个小的问题,然后把这些同质且相互独立的小问题解决后,通过合并算法来解决规模为N的问题。分治法是一种非常常见的方法,在实际应用中也非常多,比如最常见的二分查找。分治法需要注意的问题是划分K个小问题的边界问题,既要保证工作量的均衡,又要尽量减少小问题之间的回溯引起的串行化问题。
2、数据分解模式
数据分解在上面就提到了,它就是把需要处理的数据合理的划分成N份,由不同的线程来处理。它和分治的思想的本质是相同的,但应用的角度不同。对数据分解的一个重要的问题,就是要小心伪共享的问题。
3、任务分解模式
任务分解模式是任务分解的一种实现方式,主要原理就是把相关的任务分解成一个个独立的任务,然后充分利用多CPU来实现任务的并行操作。它的难点在于,一般任务很难做到分解成独立的小任务。而且,小任务在CPU运行之间的负载均衡控制也是一个很重要的问题。
4、流水线模式
流水线过程其实就是上面的数据流分解的一种实现模式,它模仿着生产上的流水线,把一个任务分解成多个步骤,然后分别用不同的线程来处理,以提高处理速度。它特别适用于生产者缓慢而消费者较快的情况下,比如从IO读取视频流,可以边读边解码边播放,形成一条完整的流水。而不是一次把读和解码以及播放搞在一起。
5、任务图模式
在上面的任务分解中提到了任务很难分解成完全独立的小任务,那么根据实际情况,就可以把任务的依赖性按情况整理成一个任务图结构(DAG,有向无环图),然后按照相关的算法在CPU间进行任务调度即可。
6、动态任务模式
动态任务的模式其实和任务图模式是一动一静,在实际情况中,很多任务不是预先就制定好的。可能会有一个算法,会根据具体的任务数量来动态的扩展,比如一个网络数据处理程序,可能会有很多种情况发生,这时候儿,就需要动态的扩展任务。而动态扩展任务,就需要对线程模型和数据处理模型进行合理的设计,从而保证负载均衡的稳定性。
三、总结
方法论是一个很重要的问题,不能从事物的源头掌握事物的普遍规律,就无法正确的展开问题的分析和解决的方法。所以学习计算机技术,同样要学一学哲学。不能够正确的认知计算机理论对解决问题的思路的指导作用,就无法更高效快速的解决遇到的问题。在并行设计上,更是如此。懂代码的人,知道抽象这个方法,但不断的抽象,就会远离实际的应用,导致抽象的理论和具体的实践之间的一种间接的割裂。这也是学习计算机技术的经常遇到的问题,如何更好的把抽象的理论和实际的并行计算互相结合起来,这才是重中之重。