高并发线程池设计
并发基本概念
- 所谓并发编程指的是在同一台计算机上"同时"处理多个任务。
- 并发是在同一实体上的多个事件。
处理事件过程出现阻塞
- 漫长的CPU密集型处理。
- 读取文件,但文件尚未缓存,从硬盘中读取较为缓慢。
- 不得不等待获取某个资源:
- 硬件驱动
- 互斥锁
- 等待同步方式调用的数据库响应
- 网络上的请求和响应
多线程的缺陷
- 单个进程或线程同时只能处理一个任务,如果有很多请求需要同时处理怎么办?
- 解决方案——运用多进程或多线程技术解决。
- 缺陷:
- 创建和销毁线程上花费的时间和消耗的
系统资源
,甚至可能要比花在处理实际用户请求的时间和资源要多的多。 - 活动的线程需要消耗
系统资源
,如果启动太多线程,会导致系统由于过度消耗内存或"切换过度"而导致系统资源
不足。- 线程切换时,该线程执行的相关信息会被保存在对应的上下文中,线程数越多,所用于切换的时间就越多。
- 创建和销毁线程上花费的时间和消耗的
- 解决:——使用
线程池
技术。
线程池
- 线程池
- 由一个任务队列和一组处理任务队列的线程组成。一旦工作进程需要处理某个可能"阻塞"的操作,不用自己操作,将其作为一个任务放到线程池的队列,接着会被某个空闲线程提取处理。
- 注意:
- 线程中的线程都要从任务队列中拿任务(同一个任务只允许一个线程拿到),会修改任务队列的链表,进程往里面加入新的任务也会修改任务队列的链表,二者无法同时修改,所以任务队列为临界资源,所以这里要实现同步与互斥。
线程池的核心组件
任务
——待处理的工作,通常由标识、上下文和处理函数组成。任务队列
——按顺序保存待处理的任务序列,等待线程中的线程组处理。线程池
——由多个已启动的一组线程组成。条件变量
——一种同步机制,允许线程挂起,知道共享数据上的某些条件得到满足。互斥锁
——保证在任意时刻,只能有一个线程访问该对象。
Nginx线程池解析
- 注: 如下代码为本人看的某个视频中的资料,从Nginx中c抽下来的,貌似与最新的Nginx源码并不是很相同,因为经过删减,而且不是删减的最新版,但是大致意思我想应该是差不多的。