线程池

来源:互联网 发布:windows过期如何激活 编辑:程序博客网 时间:2024/04/18 09:21

一 线程池(选自:操作系统概念 第7版):

线程的来源:需要时创建和线程池。

(1)多线程服务器潜在的问题

*第一个问题:处理请求之前用以创建线程的时间,以及线程完成工作之后就要被丢弃这一事实。

*第二个问题:如果允许所有并发请求都通过新线程来处理,那么将没法限制在系统中并发执行的线程的数量。无限制的线程会耗尽系统资源(如:CPU和内存),解决方法使用线程池。


(2)主要思想:在进程开始时创建一定数量的线程,并放入到池中以等待工作。当服务器收到请求时,它会唤醒池中的一个线程(如果有可用线程),并将要处理的请求传递给它。一旦线程完成了任务,它会返回到池中再等待工作(注意,不是结束)。如果线程池中没有可用的线程,那么服务器一直等待直到有空线程为止。


(3)线程池的优点

*通常用现有的线程处理请求比等待创建新的线程要快。

*线程池限制了在任何时候可用线程的数量。这对那些不能支持大量并发线程的系统非常重要。


(4)线程池的使用时机

*频繁的创建和销毁线程占用了大量的系统资源,一个应用需要频繁的创建和销毁进程,而任务的执行时间又非常短,这样就不能忽略创建和销毁线程的开销,这时需要线程池。

*大量用户的情况下,系统为了创建和销毁线程浪费了大量的时间和资源,这时需要线程池。


(5)线程池的限制:

*线程池中的线程数量由系统CPU的数量、物理内存的大小和并发客户请求的期望值等因素决定。比较高级的线程池可以动态调整线程的数量(最大线程控制和最少线程控制),以适应具体情况。这类结构可以在系统负载较低时降低内存消耗。


(6)应用实例:

*服务器主线程在初始化时候开启两个线程:数据包接受线程和线程池管理线程。

*数据包接受线程负责接受网络上发来的数据包并放在任务队列中;线程池管理线程根据允许开启的工作线程总数开启相应数目的工作线程。

*线程池两种工作方式:一种是让空闲线程自己去任务队列读取数据包进行处理,管理线程只需要负责创建和销毁线程池;另一种由管理线程负责将数据包分配给空闲的线程。前者管理线程的任务比较轻,整个系统代码相对简单,但是线程池缺乏管理,所有线程自行其是,有可能导致管理线程无法准确地知道工作线程的状态,无法估计当前线程池的负荷量,从而导致无法调整线程池的尺寸;后者虽然导致程序复杂化,但是由于管理线程的功能比较强大,可以有效的对于整个线程池进行管理,实现线程池尺寸的动态调整,当有大量的数据包还未被处理时,管理线程将再开辟几个新的工作线程进行数据包处理,而未被处理的数据包很少时,管理线程将销毁几个线程以节约系统资源。