标签:多进程 编程 blank col 方法 调用 style 操作 web服务
写了一个使用线程池实现的简单web服务器,主要可以复习IO复用,线程池,信号,有限状态机,HTTP协议解析等内容。
下面首先给出实现过程中遇到的问题以及解决的方法,然后给出项目的具体代码,代码是基于《Linux高性能服务器编程》编写的。
功能:使用线程池实现的一个并发web服务器,能够解析HTTP的GET请求,使用浏览器访问可以返回对应的内容。
IO模型:采用Reator模式(事件驱动+非阻塞IO) + 线程池。epoll循环用于事件通知,如果是listenfd上可读,则调用accept将新建的fd加入到epoll例程中;如果是已经连接的fd,将其加入到生产者-消费者队列中由工作线程竞争执行任务。
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