也谈如何写一个Webserver(三)
在上一篇里,我介绍了如何应用socket和epoll来组织和管理从客户端(如,浏览器)传入的连接,通过设置非阻塞连接让Webserver有更好的性能.
下面,我介绍一下在我写的Webserver Maestro用的线程池.Maestro整体的结构是epoll轮询加上线程池处理传入连接中携带的http message.虽然线程池是和连接一起使用的,但其实它应该是一个独立可以处理任何任务的实体,所以,在实现时,合理的设计是可以提升应用的整体性能的.网上有很多通过简单轮询或单一队列控制的线程池,但这些线程池都不能自动伸缩来实时调整所使用的资源.虽然他们很好用,但我还是希望能更好的利用资源,动态调整线程数目,所以我选用了其他的设计思路.我采用的线程池采用的设计是,由一个Master线程控制和监控多个工作线程的方式,好处是能够根据Workload增加或减少工作线程的数目,有更好的伸缩性,更有效地利用硬件资源(CPU,内存).
整个线程池只有三个函数:
hpool_t *thpool_new(int size); void thpool_delete(thpool_t *p); void thpool_add_task(thpool_t *p,
void (*routine)(void *),
void *arg);
使用起来也是非常简单,先用thpool_new()初始化,然后通过thpool_add_task()加入需要执行的任务;使用完毕后,再通过thpool_delete()将线程池销毁.
如果读者看过了thpool.c里相应的实现,可能会比较疑惑,因为会看到类似内核链表的东西.其实,大家不用太理会这些宏,他们只是借来用用而已,整个线程池仍然应该是user space的,这些宏只是用来提升性能用的,不会影响的整个线程池的设计逻辑.大家只需知道怎么用这个线程池的三个函数就可以了.
我会在第四篇内容里介绍现在流行JWT(Json Web Token)在Webserver中的应用...
也谈如何写一个Webserver(三)的更多相关文章
- 也谈如何写一个Webserver(-)
关于如何写一个Webserver,很多大咖都发表过类似的文章.趁着这个五一假期,我也来凑个份子. 我写Webserver的原因,还得从如何将http协议传送的消息解析说起.当时,我只是想了解一下htt ...
- 比最差的API(ETW)更差的API(LTTng)是如何炼成的, 谈如何写一个好的接口
最近这几天在帮柠檬看她的APM系统要如何收集.Net运行时的各种事件, 这些事件包括线程开始, JIT执行, GC触发等等. .Net在windows上(NetFramework, CoreCLR)通 ...
- Qt 利用XML文档,写一个程序集合 三
接上一篇https://www.cnblogs.com/DreamDog/p/9214052.html 滚动区域实现, 滚动区域可以三成分层 第一层,显示内容 中间层,滚动层 第三层,爸爸层 把我们要 ...
- 一步一步写一个简单通用的makefile(三)
上一篇一步一步写一个简单通用的makefile(二) 里面的makefile 实现对通用的代码进行编译,这一章我将会对上一次的makefile 进行进一步的优化. 优化后的makefile: #Hel ...
- a,b为2个整型变量,在不引入第三个变量的前提下写一个算法实现 a与b的值互换
package com.Summer_0424.cn; /** * @author Summer * a,b为2个整型变量,在不引入第三个变量的前提下写一个算法实现 a与b的值互换? */ publi ...
- 一起学习造轮子(三):从零开始写一个React-Redux
本文是一起学习造轮子系列的第三篇,本篇我们将从零开始写一个React-Redux,本系列文章将会选取一些前端比较经典的轮子进行源码分析,并且从零开始逐步实现,本系列将会学习Promises/A+,Re ...
- 自己写一个java的mvc框架吧(三)
自己写一个mvc框架吧(三) 根据Method获取参数并转换参数类型 上一篇我们将url与Method的映射创建完毕,并成功的将映射关系创建起来了.这一篇我们将根据Method的入参参数名称.参数类型 ...
- 如何写一个简单的webserver(一):最简实现
本文主要讲述如何用C/C++在Linux环境下写一个简单的支持并发的web服务器,并不考虑服务器的健壮性.安全性.性能等一系列因素. 在本文中,该服务器仅支持GET请求. 项目地址:https://g ...
- 迅雷笔试题 (JAVA多线程)启动三个线程,分别打印A B C,现在写一个程序 循环打印ABCABCABC
题目:http://wenku.baidu.com/view/d66187aad1f34693daef3e8a.html 启动三个线程,分别打印A B C,现在写一个程序 循环打印ABCABCABC. ...
随机推荐
- FusionInsight MRS:你的大数据“管家”
摘要:4月24日-26日,HDC.Cloud2021在深圳大学城成功举办,华为云FusionInsight MRS云原生数据湖带来最懂行的大数据解决方案,为政企客户提供湖仓一体.云原生的大数据解决方案 ...
- window.location 与window.open区别
window.location 与window.open区别 1.window.location是window对象的属性,而window.open是window对象的方法 window.locat ...
- hdu1828 线段树扫描线求矩形面积的周长
题意: 给你n个矩形,问你这n个矩形所围成的图形的周长是多少. 思路: 线段树的扫描线简单应用,这个题目我用的方法比较笨,就是扫描两次,上下扫描,求出多边形的上下边长和,然后同 ...
- linux ptrace学习
ptrace提供了一种使父进程得以监视和控制其它进程的方式,它还能够改变子进程中的寄存器和内核映像,因而可以实现断点调试和系统调用的跟踪.学习linux的ptrace是为学习android adbi框 ...
- UVA11636复制粘贴
#include<stdio.h> int main() { int Cas = 1 ,n; while(~scanf("%d" ,&n) & ...
- HackingLab脚本关
目录 1:key又又找不到了 2:快速口算 3:这个题目是空的 5:逗比验证码第一期 6:逗比验证码第二期 7:逗比的验证码第三期(SESSION) 8:微笑一下就能过关了 9:逗比的手机验证码 10 ...
- Win64 驱动内核编程-30.枚举与删除线程回调
枚举与删除线程回调 进程回调可以监视进程的创建和退出,这个在前面的章节已经总结过了.某些游戏保护的驱动喜欢用这个函数来监视有没有黑名单中的程序运行,如果运行则阻止运行或者把游戏退出.而线程回调则通常用 ...
- Windows bat批处理删除指定N天前的文件
1:新建批处理文件:del_old_file.bat,更改系统时间为7天前,在c盘sql back 目录下新建测试文件,再将系统时间改为正确时间 2:编辑内容: rem 删除C:\sql back目录 ...
- vmware vpshere 安装完的必备工作
1:例如:vCenter计算机地址为:192.168.0.200, 访问地址:https://192.168.0.200,安装证书: 参考教程:https://blog.csdn.net/cooljs ...
- 修复火狐主页被篡改成hao123的办法
1:问题描述: 网上下载了某绿色小工具使用,火狐浏览器的主页被篡改为 https://www.hao123.com/?tn=96895497_hao_pg,网上找了很多主页修复工具包括火狐的解决方法以 ...