ITPub博客

线程池管理

原创 Linux操作系统 作者:powersuite 时间:2007-12-28 12:35:50 0 删除 编辑

线程技术是实现服务程序在进程内能并发执行任务的技术基础,线程的生命周期包括:创建、活动和销毁,每一个步骤都占用一定的CPU时间,当创建和销毁占据了线程周期的总CPU额度的很大一部分比例之后,性能问题随之而来,即宝贵的CPU时间被大量地消耗在线程的创建、销毁和切换过程中,当然这种情况是在一定的环境条件下出现的,线程并发数量大和线程存活周期短是两个主要的原因。

线程池技术是解决上述性能问题的方法之一,其他办法有如WIN32中的完成端口,两种办法区别很大,线程池主要是针对线程的创建和销毁的系统开销问题,方法是利用一定数量的缓存的线程来缓解服务创建和销毁线程的开销。完成端口是针对线程切换的系统开销问题,方法是利用绑定到完成端口的多个值守线程(通常根据CPU数量来定)来处理I/O,因此在I/O操作中,系统不需要在任务线程之间频繁地切换,一方面提高了I/O的处理效率,另一方面减轻线程切换的系统开销。

在这里,我们主要讨论下线程池的方式。

线程池通常由1个值守线程和n个任务线程组成,n是线程池的最小尺寸,数值根据服务的特点估算。在实际应用中,线程池的尺寸是需要动态调整的,高峰期线程池通过增加线程来尽可能满足任务的需要,空闲期线程池再缩减至最小尺寸。当然线程池的最小尺寸也无需按预置的固定尺寸,通常可以根据一定时期内任务队列的平均大小来获得一个统计量,进行调整。

值守线程的功能是监视任务队列和维护线程池的尺寸,当任务队列中有任务项目时,每次摘除一个任务并将之投放到线程池的空闲线程中去,当线程池中没有空闲线程时,值守线程负责创建新的线程加入到池中。在任务空闲状态,值守线程销毁超过线程池最小尺寸的空闲线程,以释放系统资源。

任务线程是完成具体应用服务的工作线程,未被任务占据的线程称为空闲状态,在此状态下,我们当然不希望它无效地空转,因为那样同样会消耗CPU的时间,解决办法是它阻塞在后台。任务线程的有效运行是在投放了任务之后,被投放任务的线程在任务完成之前不能再被其他任务占据,我们称之为运行状态。在服务进程退出之前,我们希望任务线程都能够自然终结。鉴于以上原因,我们必须定义一些状态量来控制任务线程的有序运行,可以用如下状态量:空闲态、运行态、终结态,并且为每一个任务线程定义一个任务信号,以下我们再讨论下任务线程状态的转移过程。

值守线程创建新的任务线程,将其状态置为空闲态,并加入到线程池中,处于空闲态的任务线程在等待任务信号的过程中阻塞。当值守线程从任务队列中摘取任务项目后,从线程池中攫取一个空闲状态的线程,把任务项目投放到该线程上,置其状态为运行态,并激活任务信号,这样,阻塞的任务线程恢复运行,执行任务。当任务线程完成任务后,重置任务信号,并将自身状态置为空闲态,回归到线程池中。当值守线程收到服务进程的退出宣告后,将池中的空闲线程的状态置为终结态,投放空任务(NULL),并激活任务信号,阻塞的任务线程恢复运行,探测到自身状态为终结态后,执行退出,线程自然终结。

状态转移的示意图如下:

值守线程和任务线程的流程示意图:

前面讲了,线程池是应当根据具体的服务环境择取的,任务项目的活动时间很短而且任务线程的并发量大是最主要的采用依据。对于需要在任务线程进行客服对话或服务端进行费时操作(数据库操作等)的情况下是不适合的。当然对于具有频繁的并发I/O操作的服务,采用完成端口来实现是一个较好的选择。

任务线程状态转移.jpg

线程池流程图.jpg

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10321586/viewspace-17284/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 小内存管理
下一篇: 重写sprintf
请登录后发表评论 登录
全部评论

注册时间:2007-12-28

  • 博文量
    3
  • 访问量
    8249