可设置参数:连接池最大连接数,最大线程数,任务队列最大值,timeslot

epoll

epoll监听listen_fd(接受新客户端和断开连接), pipefd(将信号输入到管道用epoll统一管理), client_fd(读:客户端请求, 写:响应请求)。线程池里的线程将客户读了之后,重新将客户在epoll设置为写监听。

数据库连接池

单例模式,连接池中的数据库连接用链表连接起来。用信号量实现同步,典型的生产者消费者模型:

MYSQL* get_conn()
{
sem_full.wait();
mutex.lock(); MYSQL *ret = conn_list.front();
conn_list.pop(); mutex.unlock();
sem_empty.signal(); return ret;
} bool return_conn(MUSQL* conn)
{
if(NULL == conn)
return false;
sem_empty.wait();
lock.lock(); conn_list.push_front(conn); sem_full.post();
lock.unlock(); return true;
}

http解析

由于epoll采用edge trigger模式,需要用read_once()先将缓冲区的数据全部读进read_buffer,然后用process()分析报文。

分析报文时用状态机模型,有三个状态:初始(读完数据)是REQUESTLINE状态,分析完请求行后是HEADER状态,分析请求头,最后是CONTENT状态,分析正文。分析时用从状态机,表示当前行状态,有LINE_OK, LINE_BAD, LINE_OPEN,只有当前行是LINE_OK才能进行分析。

分析完后,如果分析正常就将返回报文写到write_bufffer里,修改当前client_fd在epoll树上为EPOLLOUT,监听写。当可写时,会有线程处理write任务。如果分析不正常会关闭client_fd,并epoll上下树。

write过程主要是用writev()函数,返回报文由两部分组成,返回头和正文,由于正文是一个html或者其他文件,而返回头存在write_buffer里,所以用writev()最合适,不需要将两个部分写到一个文件里再统一发出去。

最后根据请求头是否有keep-alive来决定是否关闭该连接。

线程池

所有线程获取任务队列里的任务,因为连接池用的是信号量,所以线程池就使用了条件变量。为了避免惊群现象,需要将条件变量的判断if变成while。

定时器

处理客户端的超时事件。

正好前段时间复习了堆,所以定时器就用时间堆实现。实现小技巧:当一个节点的大小变化需要调整时,为了避免判断是变大还是变小,调整函数内把up和down都运行一下,这两个只有一个会运行。

定时信号处理

创建一个pipe,定时信号处理函数功能为:把收到的信号写入管道的写端。然后用epoll监听管道的读端,当监听到管道可读,读出信号,运行真正的信号处理函数。这样就能统一信号处理和文件描述符的处理。

webserver总结的更多相关文章

  1. WebServer+ADO+百万数据查询

    很简单的demo,查询速度快,易理解,废话不说  上demo 看完就明白了 源码地址:http://files.cnblogs.com/files/SpadeA/WebDemo.zip 这是关于Web ...

  2. webserver[实时查询当天的天气情况]

    1.webserver是什么? 日常生活中经常会使用到webserver,注册时,会收到验证码,购买东西时,会收到短信,假如,A公司网站和B公司合作,那么A公司注册对的用户可以直接推送给B网站,那怎么 ...

  3. Warning: file_put_contents(data.txt): failed to open stream: Permission denied in /Library/WebServer/Documents/test.php on line 22

    最近在学习PHP 在保存文件的时候报Warning: file_put_contents(data.txt): failed to open stream: Permission denied in ...

  4. [C#] 图文解说调用WebServer实例

    本文旨在实现如何在.NET环境下调用WebServer,以天气接口为例进行说明. WebServer地址:http://www.webxml.com.cn/WebServices/WeatherWeb ...

  5. python开启简单webserver

    python开启简单webserver linux下面使用 python -m SimpleHTTPServer 8000 windows下面使用上面的命令会报错,Python.Exe: No Mod ...

  6. C# 如何调用WebServer函数

    WebServer(ASMX)服务程序网站的编写简单总结. WebServer中遇到的问题 编写WebServer程序VS运行调试时如果出现 System.Data.OracleClient.Orac ...

  7. [Top-Down Approach] Assignment 1: WebServer [Python]

    Today I complete Socket Programming Assignment 1 Web Server Here is the code: #!/usr/bin/python2.7 # ...

  8. 【监控】WebServer入库与缓存更新代码优化小计

    问题描述: 通过WebServer将监控数据入库到Hbase,在入库之前需要将指标与ip的列表更新到缓存中,以便前台页面随时选择查看.前两天上了一些新用户导致负载增加,逐渐发现某些用户的监控场景出现丢 ...

  9. Linux WebServer WebRoot Path Identification

    目录 . HTTPD(Apache) . NGINX . TENGINE . JBOSS . TOMCAT . LIGHTTPD 1. HTTPD(Apache) 0x1: 启动参数 Usage: . ...

  10. iOS - Apache Tomcat WebServer 服务器配置

    前言 提前下载好相关软件,且安装目录最好安装在全英文路径下.如果路径有中文名,那么可能会出现一些莫名其妙的问题. 提前准备好的软件: apache-tomcat-6.0.45.tar.gz eclip ...

随机推荐

  1. 配置PHP的运行环境

    一.wamp Wamp是Windows Apache Mysql PHP的缩写,即在windows下将Apache+PHP+Mysql集成的开发环境,操作简单一键安装,摆脱手动修改配置文件的繁琐. 图 ...

  2. VSCode实现GDB图形界面远程调试

    前言 在习惯了集成开发环境的图形界面调试时,首次使用GDB远程调试必定很不习惯,下面讲述如何利用VSCode实现GDB图形界面远程调试 代码在Linux服务器上,而平常都在Windows上使用,那么V ...

  3. 解决npm 下载速度慢的问题

    更换源,这个是最直接方便 有保障的方法了,不要去安装cnpm,因为你无法确定 他是否做了后门.!! 1. 如果不想安装cnpm 又想使用淘宝服务器来下载扩展插件:(这种方法 每次都得带 废弃) npm ...

  4. 好书推荐之《Java 核心技术:卷 1 基础知识》

    大佬推荐 <Java 核心技术:卷 1 基础知识>,这本书本来是 Sun 公司的官方用书,是一本 Java 的入门参考书. 对于 Java 初学者来说,是一本非常不错的值得时常翻阅的技术手 ...

  5. java实现幂等性校验

    我们在做web应用的时候通常会遇到前端提交按钮重复点击的场景,在某些新增操作上就需要做幂等性限制来保证数据的可靠性.下面来用java aop实现幂等性校验. 一:首先我们需要一个自定义注解 packa ...

  6. NC16416 [NOIP2017]逛公园

    题目链接 题目 题目描述 策策同学特别喜欢逛公园. 公园可以看成一张 N 个点 M 条边构成的有向图,且没有自环和重边.其中 1 号点是公园的入口, N 号点是公园的出口,每条边有一个非负权值,代表策 ...

  7. NC19885 [AHOI2009]CHESS 中国象棋

    题目链接 题目 题目描述 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧.一个炮要能攻击另一个炮他们必须要 ...

  8. Linux中查看dmesg中 ata1对应的盘符,以及SATA/NVME SSD的rescan/delete操作方法

    1.查看dmesg 中ata1 对应的盘符: Step1;  lsscsi -s 查看盘符(bdf) 对应的host Id: Step2: ll /sys/class/scsi_host  可以找到不 ...

  9. IPNS和DNSLink的使用说明

    IPNS和DNSLink的使用说明 IPNS说明 IPNS全称InterPlanetary Name System,就是IPFS下的一个名称解析系统,类似于互联网的DNS,但是与DNS不同的是,IPN ...

  10. win32 - SetWinEventHook的用法

    #include <Windows.h> #include <iostream> #include <thread> #include <tchar.h> ...