用线程池实现的简单web服务器--tinywebserver

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用线程池实现的简单web服务器--tinywebserver相关的知识,希望对你有一定的参考价值。

                                         用线程池实现的简单web服务器--tinywebserver

写了一个使用线程池实现的简单web服务器,主要可以复习IO复用,线程池,信号,有限状态机,HTTP协议解析等内容。

下面首先给出实现过程中遇到的问题以及解决的方法,然后给出项目的具体代码,代码是基于《Linux高性能服务器编程》编写的。

0 功能和IO模型

功能:使用线程池实现的一个并发web服务器,能够解析HTTP的GET请求,使用浏览器访问可以返回对应的内容。

IO模型:采用Reator模式(事件驱动+非阻塞IO) + 线程池。epoll循环用于事件通知,如果是listenfd上可读,则调用accept将新建的fd加入到epoll例程中;如果是已经连接的fd,将其加入到生产者-消费者队列中由工作线程竞争执行任务。

1 为什么使用线程池?线程池的具体实现?

1)多进程调用fork函数时,虽然地址空间是写时复制的,但是需要复制父进程的页表(CSAPP-P584),开销大,采用线程可以解决fork开销的问题,但是调度器和内存的问题还是没法解决,所以采用线程池,线程的数量固定。可以解决上面的问题。由于TCP连接是长连接,read读取会一直等待数据读完,造成阻塞,所以要设置成非阻塞。

2)线程池的实现:使用C++封装一个线程池类,大致是创建固定数目的线程(比如和内核数目相当),然后类内部维护一个生产者-消费者队列(采用mutex和semaphore),提供相应的添加任务(生产者)和执行任务(消费者)的处理函数。

其中mutex互斥锁保证队列满了不要继续压入,队列为空的时候不要取任务操作,semaphore保证同步,每次只有一个线程在执行队列的读写操作。

 

以上是关于用线程池实现的简单web服务器--tinywebserver的主要内容,如果未能解决你的问题,请参考以下文章

Linux简单线程池实现(带源码)

TinyWeb v1.0 正式完成第一个Release版本(功能基于 libuv 跨平台库)

谁能简单说明下c++线程池怎么用的

java线程池详解一

Java 线程池原理分析

线程池配置的线程数量受哪些因素影响?如何去