码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-11-27 21:35:32      阅读:273      评论:0      收藏:0      [点我收藏+]

标签:多进程   编程   blank   col   方法   调用   style   操作   web服务   

                                         用线程池实现的简单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

标签:多进程   编程   blank   col   方法   调用   style   操作   web服务   

原文地址:http://www.cnblogs.com/dingxiaoqiang/p/7905639.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!