服务器中线程模型

日期:2013-12-23点击次数:8897

模型概述

       在服务器实现过程中往往会遇到各种各样的业务。对业务实现有不同的要求,这样,在满足业务设计服务器中,不可避免的会涉及到线程的使用。线程模型选择对系统稳定性和服务能力影响重大。网络模型种类也有多种。本文针对线程使用分类:单线程模型,多线程模型,线程池模型。而选用哪种模型能够满足需求则由业务响应和业务处理的时间决定。
       以下针对模型的定义和使用结合服务器搭建进行举例说明。具体流程中涉及函数的使用,可以参考相关的文档,仅侧重业务说明。 

一、单线程模型

       适用于服务器处理并发响应要求不高,且业务单元简单的模型。特点:顺序性,对接收到的连接事件处理,按顺序执行。其优点,程序设计简单,处理逻辑业务也相对简单。
       适用范围:对业务做过简单化抽象处理,即保证处理单位时间尽可能短。这种场合单线程模型也不失为一种有效的处理模型; 对业务进行细分,每种单线程模型处理一类业务,单线程执行如下图所示:




          这个模型,能够很好地处理响应和业务的关系,保证服务器系统响应运行。但是这个服务器也有很大的局限性:由于该模型将事件探测和事件响应夹杂在一起,一旦事件响应的执行体庞大,则对整个模型是灾难性的。如:socket1处理业务好使过长的话将直接导致响应事件socket2的处理的单元得不到执行,并在很大程度上降低了响应的及时性。会回避这个问题,我们引入多线程模型。

二、多线程模型

        多线程模型是解决并发事件响应的问题的服务器模型。一旦我们接收到请求,会创建一个新线程,由该线程执行任务,等到任务结束线程退出。也就是“及时创建,及时销毁”的策略。
        kingsmart监控服务器搭建的接入服务器正是基于这样的模型。其业务主要是对设备的操作的处理。例如索要某个设备视频,设置视频参数,关闭视频信息等,在连接设备的过程中,业务周期长,不需要频繁的创建线程,每个连接都拥有独立的线程。具体业务在链接中执行。这样多个业务可以并行不悖的执行。多线程模型能够解决接入的问题。如图多线程的模型构图。


          该模型能够有效解决多个业务并发,且每个业务响应时间耗时过大的问题。其中会发产生线程的创建、工作、销毁的流程。针对业务比较大的处理过程。这个模型能够胜任。但是如果针对大量的短业务我们采用多线程模型则会会造成创建和销毁资源的浪费,这就引入线程池模型。

三、线程池模型

          线程池严格来讲是属于多线程,是将多线程的创建和销毁集中管理。当事件到来的时候,能够及时的调度响应处理。“线程池”旨在减少创建和销毁线程的频率,其维持一定合理数量的线程,并让空闲的线程不断重新执行任务。针对服务器响应频繁,需要及时处理,但每个业务的处理时间较短的特点,引入线程池模型。Linux端的epoll 加线程池方案能够有效解决响应和处理的矛盾问题,window端的事件驱动服务器模型是Iocp+线程池。
       例如,kingsmart服务器-存储服务器,需要响应控制服务短链接命令消息,报警,心跳,设置参数,录像事件等各种业务。针对大量的业务逻辑,服务器采用epoll+线程池模型。将任务执行放到每个线程中,等执行完毕后,再将线程放回线程池供其它任务调用。

       线程池基于预创建技术,将线程创建和销毁本身所带来的开销分摊到了各个具体的任务上,执行次数越多,每个任务所分担到的线程本身开销则越小,对系统而言,这种线程模型的处理业务效率也高。我们另外可能需要考虑到线程之间同步所带来的开销,尽可能减少这样线程间的依赖。

四、多线程注意问题

1、资源维护。
       关于资源的创建和销毁。在线程中,资源所有权是不属于线程,属于进程。但是每个线程都有创建权,销毁权和使用权。这样就会存在不同的线程中资源使用和释放的问题。对资源使用原则是“同一个线程的创建销毁,多个线程使用”。这样会避免很多问题。如果涉及到创建和删除资源在不同的线程中情况,一定要保证使用线程的停止调度改资源。
2、堆栈溢出
       多线程编程还要注意递归调用问题,线程栈默认1M。养成良好习惯,大段内存申请堆上的; 减少递归调用,多次递归调用会导致栈溢出,多个对象之间互相递归调用应该合理避免。
3、注意线程中死锁问题
       合理设计减少线程间耦合度,避免占有等待的情况。






软件部         张亚飞

姓名:
性别:
电话:
E-mail
问题:
问题描述: