剖析进程池和线程池实现CGI服务器及Web服务器

目录

1.处理多客户任务

2.实现CGL服务器

3.线程池web服务器

一、项目当中并发服务器(动态创建子进程或子线程),存在缺点?

1、动态创建进程(或线程)是比较耗费时间,导致较慢的客户响应;2、动态创建子进程(或子线程)通常只用来为一个客户服务,导致系统产生大量进程(线程),进程(线程)切换消耗大量的CPU时间;3、动态创建的子进程是当前进程的完整映像。

二、进程池和线程池

前面我给大家讲过httpd守护进程就是使用包含7个子进程的进程池来实现并发操作。线程池中的线程数量应用和CPU数量差不多。主进程选择那个子进程为新任务服务,拥有两种方式来解决?使用算法主动选择子进程。常用简单随机算法和Round Robin(轮流选取)算法。

如图:

三、如何处埋多客户在使用进程池处理多客户任务的时候,首先要考虑的是:监听socket和连接socket是否都由主进程来统一管理(半同步/半反应堆模式)。多个子进程处理同一个客户连接上不同任务数据?

如图:

1 #include <stdio.h>2 #include <sys/types.h>3 #include <sys/socket.h>4 #include <netinet/in.h>5 #include <arpa/inet.h>6 #include <assert.h>7 #include <unistd.h>8 #include <errno.h>9 #include <string.h>10 #include <stdlib.h>11 #include <fcntl.h>12 #include <sys/epoll.h>13 #include <signal.h>14 #include <sys/wait.h>1516
1617 #include'procspool.h'/*引用已设计好的进程池*/1819/*处理客户CGI请求类的设计,它也可以设计作为类模板参数应用*/20 class cgi_conn21{22=public:23 cgi_conn(){}24 ~cgi_conn(){)25s/*初始化客户连接,清空读缓冲区数据信息*/26void int(int epollfd, int sockfd, const sockaddr_in &client_addr)27 {2830 }33=private:/*读取缓冲区的大小*/static const int BUFFER_SIZE=2048;36 static int m_epollfd;37 int m sockfd;38 sockaddr_in m_address;39 char m_buf[BUFFER_SIZE];40/*标记读缓冲中已经计入的客户数据的最后一个字节的下一位置*/41 int m_read_index;
while(true)idx=m_read_index;ret=recv(m_sockfd,m_buf+idx,BUFFER_SIZE-1-idx,0);/*如果读操作发生错误,则关闭客户连接。但如果暂时无数据可读,则退出循环*/if(ret<0){if(errno!=EAGEIN)removefd(m_epollfd,m_sockfd);break ;
48 aif(errno!=EAGEIN)49removefd(m_epollfd,m_sockfd);50break;5152/*如果对方关闭连接,则服务器也关闭连接*/53else if(ret==0)54a{55if(errno!=EAGEIN)56removefd(m_epollfd,m_sockfd);57break;58}59else60={61m_read_idx=m_read_indx+ret;62printf('User content is:%s\n',m_buf);/*如果遇到字符\r\n,则开始处理客户请求*/for(;idx<=m_read_idx;++idx)6566日if((idx>=1)&&(m_buf[idx-1]=='\r')&&(m_buf[idx]=='\n'))break;68/如果没有遇到字符\r\n,则需要读取更多客户数据*/70if(idx==m_read_idx)71=con73
(0)

相关推荐

  • 图解:在嵌入式设备上实现HTTP服务器

    图解:在嵌入式设备上实现HTTP服务器

  • 一篇文章浅析Python自带的线程池和进程池

    前言 大家好,我是星期八. 我们都知道,不管是Java,还是C++,还是Go,还是Python,都是有线程这个概念的. 但是我们知道,线程是不能随便创建的,就像每招一个员工一样,是有代价的,无限制招人 ...

  • 史上最清晰线程池实现原理剖析

    来源:albenw.github.io/posts/f5cda8d1/ 概要 线程池,大家都很熟悉了,我们在平时应用中也用的很多.对线程池,ThreadPoolExecutor 的实现原理有一定理解后 ...

  • 如何合理地估算线程池大小?

    这个问题虽然看起来很小,却并不那么容易回答. 大家如果有更好的方法欢迎赐教,先来一个天真的估算方法: 假设要求一个系统的TPS(Transaction Per Second或者Task Per Sec ...

  • C#线程学习笔记三:线程池中的I/O线程

    本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/20/MultiThreads.html,记录一下学习过程以备后续查用.     一.I/O线 ...

  • 多线程之旅(ThreadPool 线程池)

    一.什么是ThreadPool 线程池(源码) 1.线程池顾名思义,有我们的系统创建一个容器装载着我们的线程,由CLR控制的所有AppDomain共享.线程池可用于执行任务.发送工作项.处理异步 I/ ...

  • Java主线程等待子线程、线程池

    print public class TestThread extends Thread { public void run() { System.out.println(this.getName() ...

  • 线程池ThreadPoolExecutor源码分析,看这一篇就够了

    前言 多线程是我们日常工作中很少能接触到的技术,但是面试的时候100%会被问到,万一工作中用到了基本不会,本篇咱们就来深入分析线程池的实现类ThreadPoolExecutor. 1.构造方法 构造方 ...

  • 分析源码,学会正确使用 Java 线程池

    在日常的开发工作当中,线程池往往承载着一个应用中最重要的业务逻辑,因此我们有必要更多地去关注线程池的执行情况,包括异常的处理和分析等.本文主要聚焦在如何正确使用线程池上,以及提供一些实用的建议.文中会 ...

  • 5000字、12 连环炮、一张图快速搞定线程池

    回复"000"获取大量电子书 写在前面 前面文章中,我们总结了JVM18连环炮.并发并最基础的12连环炮,建议先阅读: 连环炮继续走起,今天我给大家总结了线程池的12连环炮. 1. ...