在上一篇里,我介绍了如何应用socketepoll来组织和管理从客户端(如,浏览器)传入的连接,通过设置非阻塞连接让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(三)的更多相关文章

  1. 也谈如何写一个Webserver(-)

    关于如何写一个Webserver,很多大咖都发表过类似的文章.趁着这个五一假期,我也来凑个份子. 我写Webserver的原因,还得从如何将http协议传送的消息解析说起.当时,我只是想了解一下htt ...

  2. 比最差的API(ETW)更差的API(LTTng)是如何炼成的, 谈如何写一个好的接口

    最近这几天在帮柠檬看她的APM系统要如何收集.Net运行时的各种事件, 这些事件包括线程开始, JIT执行, GC触发等等. .Net在windows上(NetFramework, CoreCLR)通 ...

  3. Qt 利用XML文档,写一个程序集合 三

    接上一篇https://www.cnblogs.com/DreamDog/p/9214052.html 滚动区域实现, 滚动区域可以三成分层 第一层,显示内容 中间层,滚动层 第三层,爸爸层 把我们要 ...

  4. 一步一步写一个简单通用的makefile(三)

    上一篇一步一步写一个简单通用的makefile(二) 里面的makefile 实现对通用的代码进行编译,这一章我将会对上一次的makefile 进行进一步的优化. 优化后的makefile: #Hel ...

  5. a,b为2个整型变量,在不引入第三个变量的前提下写一个算法实现 a与b的值互换

    package com.Summer_0424.cn; /** * @author Summer * a,b为2个整型变量,在不引入第三个变量的前提下写一个算法实现 a与b的值互换? */ publi ...

  6. 一起学习造轮子(三):从零开始写一个React-Redux

    本文是一起学习造轮子系列的第三篇,本篇我们将从零开始写一个React-Redux,本系列文章将会选取一些前端比较经典的轮子进行源码分析,并且从零开始逐步实现,本系列将会学习Promises/A+,Re ...

  7. 自己写一个java的mvc框架吧(三)

    自己写一个mvc框架吧(三) 根据Method获取参数并转换参数类型 上一篇我们将url与Method的映射创建完毕,并成功的将映射关系创建起来了.这一篇我们将根据Method的入参参数名称.参数类型 ...

  8. 如何写一个简单的webserver(一):最简实现

    本文主要讲述如何用C/C++在Linux环境下写一个简单的支持并发的web服务器,并不考虑服务器的健壮性.安全性.性能等一系列因素. 在本文中,该服务器仅支持GET请求. 项目地址:https://g ...

  9. 迅雷笔试题 (JAVA多线程)启动三个线程,分别打印A B C,现在写一个程序 循环打印ABCABCABC

    题目:http://wenku.baidu.com/view/d66187aad1f34693daef3e8a.html 启动三个线程,分别打印A B C,现在写一个程序 循环打印ABCABCABC. ...

随机推荐

  1. BB网络层测试

    网络层测试2020 问题 1 以下不属于网络层的协议是___A_______. A  DHCP  B ICMP  C IGMP  D ARP 10 分    问题 2 如果目的网络.目的主机都对,但是 ...

  2. 1053 Path of Equal Weight

    Given a non-empty tree with root R, and with weight W​i​​ assigned to each tree node T​i​​. The weig ...

  3. PHP实现网站访客来访显示访客IP&浏览器&操作系统

    PHP实现网站访客来访显示访客IP&浏览器&操作系统 代码 function getOs() { if (!empty($_SERVER['HTTP_USER_AGENT'])) { ...

  4. windows黑窗口命令笔记

    windows有个黑窗口,吃惊吧!意外吧!! 哈哈,我是真的有些吃惊的!! nslookup ipconfig /all ipconfig /flushdns windows 声音修复 windows ...

  5. LA3029最大子矩阵

    题意:       给你一个n*m的矩阵<每个格子不是'F'就是'R'>,让你找一个最大的'F'矩阵,输出他的面积*3. 思路:       比较经典的题目了,现在想起来比较好想,以前的话 ...

  6. UVA11997求前k个和,多路归并问题

    题意:      给你一个二维矩阵,n*n的,每次从每一行中拿出来一个,然后加起来组成一个和,一共可以得到n^n个和,要求求出这n^n个和中最小的那n个和. 思路:      多路归并问题,先说下多路 ...

  7. PowerShell-3.多线程

    $start = Get-Date $task1 = { $vUrl = 'http://img.mottoin.com/wp-content/uploads/2016/09/5-25.png' $v ...

  8. Python爬虫之-动态网页数据抓取

    什么是AJAX: AJAX(Asynchronouse JavaScript And XML)异步JavaScript和XML.过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新.这意 ...

  9. AsSystemRum 系统提权工具 实现思路及其源码

    名字:     AsSystemRun 功能:     用system权限启动一个进程. 开发语言:   C++,C# 作者:     Ack-Code 开发时间: 2016.9.15 实现原理: w ...

  10. Andrew Ng机器学习算法入门(九):逻辑回归

    逻辑回归 先前所讲的线性回归主要是一个预测问题,根据已知的数据去预测接下来的情况.线性回归中的房价的例子就很好地说明了这个问题. 然后在现实世界中,很多问题不是预测问题而是一个分类问题. 如邮件是否为 ...