任务并行的几种方式

来源:互联网 发布:sap 物料主数据 编辑:程序博客网 时间:2024/06/11 04:54

一系列的任务能够并行的无冲突的分配给若干任务处理机处理,我们把这种任务的处理方式成为并行任务处理。

并行任务的处理关键在过各个处理机处理的任务处理互相独立,也就是构建一个无冲突的任务环境。最简单的无冲突模型,就是能够明确标识某任务分给了具体的某个任务处理机,该处理机独享该任务的处理权限。常见有如下方式的并行:

1、多线程并行任务:

基于多线程的并发任务设计,把不同的任务分配给操作系统某个进程的多个线程去处理,这样,各个线程只负责处理已分配的独享权限的任务,从而实现在单台处理机上的任务并发。然而多线程的这种并发只是一种用户态的并发,也就是说这种并发只是让用户看起来是并发的。因为多个线程共享一个进程的cpu处理资源,多个线程通过轮流切换暂用cpu空闲时间片的从而获得类似于并行的处理。实际上对一个进程而言在cpu上仍然是串行处理的。如果每个线程处理的任务时本身耗费的cpu资源是巨大的,那么导致cpu空闲时间片减少,很可能处理的效率尚不如一个串行处理机处理所有的任务,因为线程的轮流切换本身就是一个很耗费资源的操作。因此进程中创建线程太多的场景不适合采取线程并发方式。

2、cpu多核的并行任务:

充分利用多核cpu的的每一个核去构建并行程序,而非像多线程那样去共享一个cpu核的进程资源,这种并行处理是高效的,然而基于这种方案的并行设计很可能比较复杂,工程实施和维护的代价也比较高

3、并行任务本身的并发

更高层面的并发设计,他脱离了线程和进程层面,他把某个具体的任务和具体的处理机提前建立一个对应的map关系,任务处理机仅仅负责处理和他建立对应关系的任务,而对单个处理机而已仅仅是一个串行的任务处理机,这样整个并发模型的构建具有很强的灵活性和稳定性,尤其适应企业分布的环境的任务处理,更为直观的表示如下。

如上图,任务分发程序负责建立具体某个任务和处理机的map对应关系,既任务分发程序实现任务的无冲突分配。实际上我们可以大胆假设,如果任务分发程序的分发速度比N太处理机的处理速度慢时,它本身就会变成一个任务处理速度的瓶颈。

 

任务的分发需要一个类似于"任务分发程序"的东西,它会根据各个机器的实际负载运行情况主动的有预测性的给各个处理机分发任务,这种想法和实施也许是直观的简单的易于理解的。

但是作为一个分发程序需要主动的去采集各个处理机的数据,衡量每一个机器的执行情况,然后几乎在同一个时间分配每个机器不均等的任务量,显然是比较吃力的,对于处理机而言这种处理方式也是被动的。

假设,每个处理机衡量自己的处理情况,然后在一定的设定条件下主动触发向分发处理程序请求一定量的处理任务,然后任务处理机接受到请求信号后响应一个的任务队列给处理机。(如下图,处理机在当前任务处理剩下15%时出发任务请求信号请求分发程序分发任务)我们把这种处理机主动发起任务请求,分发程序响应一个任务队列的方式,称之为请求分发模型。

显然,处理速度快的处理机向任务分发程序发送任务请求的频次就会增加,从而达到"能者多劳,适量分配,求总体高效"的目的。

反之,亦然;

极端情况,某台处理机down掉,就不会向任务分发程序发送请求任务的信号。

 

这种处理模型,可以避免请求分发程序成为调度的瓶颈。适用于分布式系统下多处理器并发任务处理。

原创粉丝点击