Web Server 架构浅谈-Threadpool-based Multiple Threaded Achitecture

接上一节http://blog.csdn.net/pennyliang/archive/2010/10/10/5931272.aspx

上节我们讲到了简单的多线程架构,这个架构可以做一些改进和优化:

首先,是优化线程创建的开销。操作系统默认的进程初始栈空间,32位操作系统为1M64位操作系统为2M(不同操作系统版本可能会有差异)。那么并发10K的线程可能需要10G内存,这是不可想象的,因此可以自行设定栈的大小和溢出区,代码如下:

size_t size = max(10*PAGE_SIZEPTHREAD_STACK_MIN);

void* base = get_from_penny_mmap(size);//Mmap分配的虚拟内存中割一块

ret = pthread_attr_setstack(&tattr, base,size);

 

假定我们的线程大部分情况下只需要1Page的栈空间,我们用mmap的方式分配到的虚拟内存做自定义线程栈,合计10Page,另外9Page看做是溢出区,如果线程的栈没有涨过1Page,那么着9Page只是虚拟页,不会调实际物理内存页,因此可以看做是无开销,万一溢出了,只是多一个调页过程。

 

其次,一个client通常是短连接的,即便是keep-alive的形式,每用户创建一个线程的代价还是太高,是否可以让线程的创建保持在一个常量呢?这就是线程池的思想,下面我们来看基于线程池的多线程架构。

 

基于线程池的多线程架构:

 

下图是线程池的架构,系统在刚创建时,创建有限个线程,这些线程的生死都是随着系统的创建和退出相联系,和用户访问无关。在获得链接请求后,将用户的请求看做是一个消息,将其插入到请求队列中,线程池的dispatch loop不断去将这个消息派发给一个闲置的线程进行处理,线程在处理完后进入等待队列,等待dispatch loop派发任务。

 

 

 

dispatch loop是可以去掉的,每个处理线程在处理完任务后,直接去request queue中取任务,但这样有几个缺点:1)对request的队头访问频繁;2)当线程池线程不够时无法自我感知已增加新线程。因此在每个处理线程之外,需要一个承担管理职责的线程。

 

在每个线程处理完任务后,进入一个等待信号的过程,可以采用挂起和spin的方式,前者会有上下文切换的开销,后者会出现循环空转的开销,dispatch在队头取得的线程等待信号,给予激活同时赋予请求的任务。在具体实现上还会有多种变化,这里不一一介绍,

 

基于线程池的多线程架构在并发线程的数量上大大减少,上下文切换相应减少;线程创建的数量与客户请求无关,创建成本减少;线程池的资源争用情况大大减少,资源饱和使用的程度大大加强,因此线程池在吞吐率(throughput,单位时间交互的数据量)上通常较高。但付出了排队的成本,使得响应时间会大大提高,这是线程池架构主要的问题。

 

我们日常生活中在银行办理业务,就可以看做是线程池模型的例子,排队机就是request queue,叫号系统就是dispatch loop,自动将到号的用户分配给一个空闲的客服,客服就是每个处理线程,客服在处理完业务后,按键进入闲状态,等待叫号系统安排。银行的这种设置显然是基于吞吐率考虑的,而不是响应时间考虑的,和简单多线程方式那种资源抢占式的无序相比,基于线程池的排队处理看上去更加优化。

 

下一篇博文参见:http://blog.csdn.net/pennyliang/archive/2010/10/14/5940666.aspx

 

 

申明:我写的博客欢迎转载,并可以用于任何场合,只要是对技术传播有益,我均无异议。

但不欢迎自行修改和不署名的转载。

因为有些内容我会用在一些教学等特殊场合,我不希望有人反馈给我,我的博客是抄袭别人的。希望大家在转载时务必注明作者,并全文转载,不要做任何修改,谢谢。

 

同时我会在举例中加一些特殊的记号,希望读者予以谅解,比如本文的get_from_penny_mmap。

 

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值