可设置参数:连接池最大连接数,最大线程数,任务队列最大值,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. 使用Dapr和.NET 6.0进行微服务实战系列

    大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. 本文是<使用Dapr和.NET 6.0进行微服务实战>的第1篇引言部分 ...

  2. C#/.NET该如何自学入门?

    前言 随着DotNetGuide技术社区交流群的不断壮大(目前4个群都已经满500人,已开5群现已有180多个小伙伴),越来越多应届生和其他领域的小伙伴加入了我们这个大家庭.在此期间我在个人微信.公众 ...

  3. 深入浅出Java多线程(九):synchronized与锁

    引言 大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第九篇内容:synchronized与锁.大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!! 在现代软件开发中,多 ...

  4. mac os 解决Error: EMFILE: too many open files错误

    壹 ❀ 引 构建项目时终端反复出现Error: EMFILE: too many open files的错误,经排查是因为项目较大,发布过程中已经超过了mac默认的文件监听上限,错误如下: 解决方式也 ...

  5. NC210981 mixup2混乱的奶牛

    题目链接 题目 题目描述 混乱的奶牛 [Don Piele, 2007] Farmer John的 N(4 <= N <= 16) 头奶牛中的每一头都有一个唯一的编号 \(S_i (1 & ...

  6. 【分布式】load balance 03-一致性哈希算法 java 实现

    负载均衡系列专题 01-负载均衡基础知识 02-一致性 hash 原理 03-一致性哈希算法 java 实现 04-负载均衡算法 java 实现 本节我们来看一下如何实现一个一致性 hash 框架. ...

  7. 惠普CP1025 因转印离合器导致打印不全大片空白的问题

    问题症状 自检只打印出一部分, 后面大部分都是空白. 如果是碳盒缺粉, 应该是均匀地浅或者空白, 如果是成像鼓的问题, 应该是从上到下成条状的不均匀, 这样显示一节后空白的情况是没见过, 上网查有类似 ...

  8. Swoole从入门到入土(19)——WebSocket服务器[文件传输]

    要利用WebSocket进行文件传输,我们需要讨论两种情况,分别是:发送方可以是客户端,和 发送方是服务端. 1.发送方是客户端  1)服务端接收 $server->on('message', ...

  9. Vue+SpringBoot+ElementUI实战学生管理系统-7.专业管理模块

    1.章节介绍 前一篇介绍了院系管理模块,这一篇编写专业管理模块,需要的朋友可以拿去自己定制.:) 2.获取源码 源码是捐赠方式获取,详细请QQ联系我 :)! 3.实现效果 专业列表 修改专业 4.模块 ...

  10. 问题处理:java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp

    问题说明 今天跑spring boot项目,在查看列表数据时后台抛异常了,一看是这玩意: 问题原因 "0000-00-00 00:00:00"在mysql中是作为一个特殊值存在的但 ...