webserver总结
可设置参数:连接池最大连接数,最大线程数,任务队列最大值,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总结的更多相关文章
- WebServer+ADO+百万数据查询
很简单的demo,查询速度快,易理解,废话不说 上demo 看完就明白了 源码地址:http://files.cnblogs.com/files/SpadeA/WebDemo.zip 这是关于Web ...
- webserver[实时查询当天的天气情况]
1.webserver是什么? 日常生活中经常会使用到webserver,注册时,会收到验证码,购买东西时,会收到短信,假如,A公司网站和B公司合作,那么A公司注册对的用户可以直接推送给B网站,那怎么 ...
- 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 ...
- [C#] 图文解说调用WebServer实例
本文旨在实现如何在.NET环境下调用WebServer,以天气接口为例进行说明. WebServer地址:http://www.webxml.com.cn/WebServices/WeatherWeb ...
- python开启简单webserver
python开启简单webserver linux下面使用 python -m SimpleHTTPServer 8000 windows下面使用上面的命令会报错,Python.Exe: No Mod ...
- C# 如何调用WebServer函数
WebServer(ASMX)服务程序网站的编写简单总结. WebServer中遇到的问题 编写WebServer程序VS运行调试时如果出现 System.Data.OracleClient.Orac ...
- [Top-Down Approach] Assignment 1: WebServer [Python]
Today I complete Socket Programming Assignment 1 Web Server Here is the code: #!/usr/bin/python2.7 # ...
- 【监控】WebServer入库与缓存更新代码优化小计
问题描述: 通过WebServer将监控数据入库到Hbase,在入库之前需要将指标与ip的列表更新到缓存中,以便前台页面随时选择查看.前两天上了一些新用户导致负载增加,逐渐发现某些用户的监控场景出现丢 ...
- Linux WebServer WebRoot Path Identification
目录 . HTTPD(Apache) . NGINX . TENGINE . JBOSS . TOMCAT . LIGHTTPD 1. HTTPD(Apache) 0x1: 启动参数 Usage: . ...
- iOS - Apache Tomcat WebServer 服务器配置
前言 提前下载好相关软件,且安装目录最好安装在全英文路径下.如果路径有中文名,那么可能会出现一些莫名其妙的问题. 提前准备好的软件: apache-tomcat-6.0.45.tar.gz eclip ...
随机推荐
- Git Q&A
git入门 Q: 什么是git ? A: git是一种版本控制工具,也是程序员的"后悔药":当你在工程中写入一堆混乱的代码后,只要通过几行简单的git命令,就可以回退到任意一个提交 ...
- (C语言)每日代码||2023.12.24||fwrite()可以写入字符数组中的'\0'
void test() { FILE* fp = fopen("test.txt", "w"); if (fp == NULL) { perror(" ...
- 关于ASP.NET WEB API(OWIN WEBAPI)的几个编码最佳实践总结
近期工作比较忙,确实没太多精力与时间写博文,博文写得少,但并不代表没有研究与总结,也不会停止我继续分享的节奏,最多有可能发博文间隔时间稍长一点.废话不多说,直接上干货,虽不是主流的ASP.NET CO ...
- 《ASP.NET Core 与 RESTful API 开发实战》-- (第7章)-- 读书笔记(上)
第 7 章 高级主题 7.1 缓存 缓存是一种通过存储资源的备份,在请求时返回资源备份的技术.ASP.NET Core 支持多种形式的缓存,既支持基于 HTTP 的缓存,也支持内存缓存和分布式缓存,还 ...
- Sunnyui画曲线溢出错误
之前用sunnyui做展示数据库数据曲线的时候.偶然会报溢出错误,也不报错错误在哪,就是直接程序都跑不动了. 后面发现 设置曲线上下限的时候,当上下限一样的时候就会导致溢出错误.sunnyui的曲线也 ...
- java类初始化及代码块加载顺序连根拔起
说明 相信很多人对于java中父子继承关系中,子类实例化调用过程中,代码块的执行顺序都容易忘记或搞混,尤其是java初级笔试题或面试题最容易出这类题目,让人恨得牙痒痒!!! 本文就一次性将其连根铲除, ...
- Oracle如何限制非法调用包中过程
原文:http://www.oracle.com/technetwork/issue-archive/2015/15-jan/o15plsql-2398996.html 假如我有一个包P_A,其中封装 ...
- C++的strcat实现
#include <iostream> #pragma warning(disable:4996); using namespace std; char* t = (char*)mallo ...
- Qt+QtWebApp开发笔记(二):http服务器日志系统介绍、添加日志系统至Demo测试
前言 上一篇使用QtWebApp的基于Qt的轻量级http服务器实现了一个静态网页返回的Demo,网页服务器很重要的就是日志,因为在服务器类上并没有直接返回,所以,本篇先把日志加上. Demo ...
- itertools.chain.from_iterable()将嵌套列表合并成一个
from itertools import chain a = [[1,2],[3,4]] print(chain.from_iterable(a)) # [1,2,3,4]