可设置参数:连接池最大连接数,最大线程数,任务队列最大值,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. Android Graphics 显示系统 - 如何模拟多(物理)显示屏?

    " 本着花小钱办大事,不花钱也办事的原则,为了避免花钱买设备,那如何更便捷地学习/测试Android多屏显示的内容呢?本文就给大家介绍一种模拟Android多个物理屏幕显示的方法." ...

  2. Linux 将命令的输出保存到文件

    当你在 Linux 终端中运行命令或脚本时,它会在终端中打印输出方便你立即查看.方法 1:使用重定向将命令输出保存到文件中你可以在 Linux 中使用重定向来达成目的.使用重定向操作符,它会将输出保存 ...

  3. 迟来的HIT2024和realworld2024体验赛WP

    目录 前言碎语 2024.2.14 中午 rwctf2024 体验赛 vision 哈工大青训营2024 结营赛 计算器 小技巧 神奇玩意 gdb! 再也不用苦哈哈往回翻 跟踪fork 赛后复现rw ...

  4. ES6学习 第三章 字符串的扩展

    前言 本章主要是内容为是 ES6 对字符串的改造和增强. 本章记录字符串的扩展常用重点部分,不常用知识稍作记录. 本章原文链接: 字符串的扩展 模板字符串(template string) ES6字符 ...

  5. NC15162 小H的询问

    题目链接 题目 题目描述 小H给你一个数组 \(a\) ,要求支持以下两种操作: 0 l r \((1 \leq l \leq r \leq n)\),询问区间 \([l,r]\) 中权值和最大的有效 ...

  6. Redis+Lua实现简易的秒杀抢购

    1  商品抢购 主要逻辑是:减库存,记录抢购成功的用户 @RestController public class DemoController { @Resource private StringRe ...

  7. 【Unity3D】UGUI之Text

    1 Text 简介 ​ UGUI概述 中介绍了Canvas 渲染模式.RectTransform 组件.锚点(Anchor)等,本文将介绍 UGUI 中的 Text 控件. ​ 在 Hierarchy ...

  8. 【OpenGL ES】正方形图片贴到圆形上

    1 前言 ​ 纹理贴图 中介绍了将矩形图片贴到矩形模型上,本文将介绍:在不裁剪图片的情况下,将正方形的图片贴到圆形模型上. ​ 思考:实数区间 [0, 1] 与 [0, 2] 的元素可以建立一一映射关 ...

  9. win32-制作mini dump文件

    一个完整的用户模式dump是基本的用户模式转储文件. 此转储文件包括进程的整个内存空间,程序的可执行映像本身,句柄表以及其他信息,这些信息对于调试器在重建转储发生时正在使用的内存中很有用. 可以将完整 ...

  10. 学习go语言编程之并发编程

    并发基础 并发包含如下几种主流的实现模型: 多进程 多线程 基于回到的非阻塞/异步IO 协程 协程 与传统的系统级线程和进程相比,协程最大的优势在于"轻量级",可以轻松创建上百万个 ...