线程的目的是代表进程执行工作。如果进程拥有多个线程,则每个线程执行一些子任务,每个子任务是进程执行的整个任务的一部分。进程根据特定的策略或方法来委托线程进行工作。
下面是一些通用的模型:
1) 委托模型(delegation),又称为boss-worker模型
2) 对等模型(peer-to-peer)
3) 管道模型
4) 生产者-消费者模型(producer-consumer)
各个模型的含义,如表所示:
委托模型
|
Boss线程创建其他线程(worker线程),并给每个worker线程分配任务。Boss线程可能在每个线程完成它们的任务之前一直等待。
|
对等模型
|
所有的线程都具有相同的工作状态。对等线程创建执行任务所需要的所有线程,但不执行委托职责。对等线程可以从单个输入流处理请求,这些输入流被所有线程共享,或者每个线程都有其自己的输入流。
|
管道模型
|
类似于装配线流程,分阶段处理输入流,然后传给下一个线程进行处理。
|
生-消模型
|
生产者线程生产数据给消费者线程使用,数据存储在生产者和消费者共享的存储块中。
|
委托模型
在委托模型中,单个线程(Boss线程)创建其他线程(worker线程),并给每个worker线程分配任务。Boss线程可能在每个线程完成它们的任务之前一直等待。Boss线程将任务委托给每个worker线程是通过指定一个函数来完成的。由于每个worker线程被分配了任务,所以每个worker线程的职责就是执行指定的任务并产生输出,或者与boss线程同步或者与产生输出的其他线程同步。
委托模型有两种方式:
浪费型:
当系统有请求任务时,boss线程创建worker线程。对每一个请求的处理就能够委托给一个worker线程。在这种情况下,boss线程执行事件循环,当有事件发生时,就创建一个worker线程,并给它们指派职责。 因为线程不可能无止境的创建下去,更何况创建太多的线程,势必会影响到系统的性能,这样就造成了性能瓶颈。
节约型:
boss线程创建一个线程池,可以为池中的线程指派任务,boss线程初始化时创建多个线程,然后将它们挂起,直到有请求增加到处理队列中。当有任务到达时,boss线程发信号通知worker线程进行处理。该worker线程处理完成之后,接着处理下一个请求。如果没有请求,那么就挂起自身,直到boss线程发信号通知它队列中已有更多的请求。
如果所有worker线程共享一个队列,可以安排线程只处理特定类型的请求。如果队列中的请求不是特定线程所能处理的,这个线程就再次挂起自己。
简言之,节约型中的boss线程的主要目的就是创建所有的worker线程,将请求放入队列中,然后唤醒worker线程。Worker线程检查队列中的请求,执行指派的任务。如果没有可供处理的任务,便挂起自己。
对等模型
在对等模型中,所有线程都有等同的工作状态。尽管存在单个线程,它最初创建执行任务所需的全部线程,但可以将这个线程看作work线程但没有委托。这种模型中,没有中心线程,worker线程(对等线程)具有更多的职责。对等线程可以从单个输入流中处理输入请求,所有线程可能共享单个输入流,或者每个每个线程可能有自己的输入流。对等线程可能不得不进行通信和资源共享。
管道模型
管道模型描述为装配线,项目流分段进行处理。在每段中,线程在每个输入单元上进行工作。当输入单元通过所有段时,这个输入的处理就算完成了。这种方法运行对多个输入同时进程处理。每个线程负责产生它的中间结果和输出,以便用于管道的下一段(下个线程)。
因为输入在管道中向下移动,在某些段可能必须缓冲输入单元以作为线程处理前的输入。如果一个特定段的处理比其他段要慢,在管道中就会导致减速,从而引起积压。为防止积压,对处理慢的段必须创建额外线程来处理新来的输入。可能也需要向管道中添加更多的段,从而需要增加线程。
生成者-消费者模型
略