线程池
线程池
线程池是由服务器预先创建好的一组子线程,线程池的线程数目应该和cpu数目差不多,线程中所有子线程都运行着相同的代码,当有新任务来临时,主线程通过某种方式选择线程池的某一个线程来为之服务下,相比于动态的创建子线程,选择一个已经存在的子线程代价要小得多,至于主线程要选择哪个子线程来为新任务服务,则有多种方式。
- 主线程使用某种算法来主动选择子线程。最简单、最常用的算法是随机算法和 Round Robin(轮流
选取)算法,但更优秀、更智能的算法将使任务在各个工作线程中更均匀地分配,从而减轻服务器
的整体压力 - 主线程和子线程通过一个共享的工作队列来同步,子线程都睡眠在该工作队列上,当有新任务要来时,主线程将任务添加到工作队列中,这将唤醒正在等待任务的子线程,不过只有一个子线程将会获得任务的接管权,它可以从工作队列取出任务并执行它。而其他子线程将会继续睡眠在工作队列上。
线程池的模型
线程池中的线程数量最直接的限制因素是中央处理器的处理器的数目n:如果cpu是4核的,对于cpu密集型的任务(如视频剪辑等消耗cpu计算资源的任务)来说,那线程池中的线程数量最好也设置为4(或者+1防止其他因素造成的线程阻塞);对于IO密集型的任务,一般要多于CPU的核数,因为线程间竞争的不是CPU的计算资源而是IO,IO的处理一般较慢,多于cores数的线程将为CPU争取更多的任务,不至在线程处理IO的过程造成CPU空闲导
致资源浪费。
- 空间换时间,浪费 服务器的硬件资源,换取运行效率。
- 池是一个资源的总和,这组资源在服务器启动之初就完全创建好,并且初始化,这被称为静态资源。
- 当服务器进入正式运行阶段,开始处理客户请求的时候,如果他需要相关的资源,可以从池中获取,不需要动态分配。
- 当服务器处理完一个客户链接后,可以把相关的资源放回池子,无需系统调用释放资源。