# wServer **Repository Path**: weareidiots/w-server ## Basic Information - **Project Name**: wServer - **Description**: 利用线程池+非阻塞IO+epoll反应堆模型实现了高并发服务器 - **Primary Language**: C++ - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2021-03-24 - **Last Updated**: 2022-11-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # wServer #### 介绍 利用线程池+非阻塞IO+epoll反应堆模型实现了高并发服务器 #### 运行环境 Deepin15.11 #### 说明 1. 线程池 在目前绝大多数网络服务器中,单位时间内必须处理数目巨大的连接请求,但处理时间相对较短,传统的每接受一个请求就创建一个线程的模式在处理大量的短连接,任务执行时间短的连接请求时将会使服务器长时间处于创建线程和销毁线程的状态中,极大的浪费 CPU 资源。 线程池是一种线程使用模式,线程过多会带来调度的开销进而影响缓存局部性和整体性能,而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价,它保证了内核的充分利用,防止过度调用。 2. 边缘触发+非阻塞IO 边缘触发是指每当状态变化时发生一个io事件,也就是只有在缓冲区增加数据的那一刻才会触发。 当应用程序对设备驱动进行操作的时候,如果不能获取到设备资源,那么阻塞式IO就会将应用程序对应的线程挂起,直到设备资源可以才做为止。对于非阻塞IO,应用程序对应的线程不会挂起,它要么一直轮询等待, 直到设备资源可以使用,要么就直接放弃。 阻塞IO:![avatar](https://img-blog.csdnimg.cn/20200413213314991.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzOTIxMjQx,size_16,color_FFFFFF,t_70) 非阻塞IO:![avatar](https://img-blog.csdnimg.cn/2020041321333452.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzOTIxMjQx,size_16,color_FFFFFF,t_70) 3. epoll反应堆模型 1)传统的epoll服务器模型 监听可读事件(ET) ⇒ 数据到来 ⇒ 触发读事件 ⇒ epoll_wait()返回 ⇒ read消息 ⇒ write回射信息 ⇒ 继续epoll_wait() ⇒ 直到程序停止前都是这么循环 2)epoll反应堆服务器模型 监听可读事件(ET) ⇒ 数据到来 ⇒ 触发读事件 ⇒ epoll_wait()返回 ⇒ read完数据; 节点下树; 设置监听写事件和对应写回调函数; 节点上树(可读事件回调函数内) ⇒ 监听可写事件(ET) ⇒ 对方可读 ⇒ 触发事件 ⇒ epoll_wait()返回 ⇒ write数据; 节点下树; 设置监听读事件和对应可读回调函数; 节点上树(可写事件回调函数内) ⇒ 直到程序停止前一直这么交替循环