- 1、本文档共48页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《c连接池pools
Linux环境下的通用线程池设计 黎庆林 2005-12-2
设计目的
Linux一般作为服务器的操作平台,上面跑的都是要求高可靠的7*24小时运行的应用服务系统,其中各种网络应用系统又占了很大比例,比如web 服务器、mail 邮件服务器等以及其他针对具体业务需要开发的各种网络服务程序。这就对这些应用系统的并发处理能力、稳定性等方面提出了很高的要求。通常情况下,为了满足这些网络应用系统在性能上的要求,会采用以下的一些通用的网络并发处理模式来设计和开发这些服务程序。
多进程/线程模式
这种模式采用的是对一个新来的客户端连接请求,创建一个新的进程/线程去做具体处理该请求的相关任务。当这个任务完成后,该进程/线程退出。在这种模式下,频繁的创建和销毁进程/线程会在时间花消和系统资源上做出牺牲。当这些时间和资源相对于每个进程/线程具体处理的任务来说占的比例很大的时候,这种模式显然是不合适的。比如 创建和销毁进程/线程的花的时间为T1,花的资源为S1,进程/线程具体处理任务的时间为T2,需要资源为S2。如果T1 / (T1+T2) 10% 或者S1/(S1+S2)10% ,那么我们可以认为消耗在创建和销毁进程/线程上的时间或者资源太多。可以看到,如果T2或者S2越大,那么这个比列会越小。所以在这样的模式下,适合处理每次连接需要处理的任务比较复杂、耗时比较长的任务。比如email服务,web 服务等。
另外一方面,这种一个请求连对应一个进程/线程的方式,在最坏情况下同时处理A个请求需要A个进程/线程同时运行。但是由于硬件和操作系统的原因,系统本身支持的最大进程/线程数是有限的,这也限制了在这种并发处理模式下系统的扩展。
当然,这种模式的设计相对简单,而且能够满足大多数情况下的应用。所以是一种非常常见的并发处理服务器设计模式。
采用多路复用I/O模型 (select)
多路复用I/O模型是LINUX环境下另外一种经常使用的并发处理模式。利用select(),同时对多个I/O句柄进行堵塞方式的查询。就是说select堵塞在多个I/O句柄上,如果任何一个句柄准备好了数据的读或者写,那么select能够通知相关的事件处理模块去处理具体的任务。
在这种模式下,由于是在同一个进程/线程里做相关处理,不用创建新的进程/线程,所以可以避免由于多进程/线程所带来的资源限制,但是同时也带了一个问题,那就是由于是在一个主进程中循环处理各个客户端的请求,如果每个连接要处理的任务消耗时间比较长,或者某一个连接出现异常,长时间不返回,都会影响其他客户的正常请求。所以在这种模式下,一般不适合用来做email ,web这样每次请求处理的任务耗时比较长的情况。通常使用的情况是:频繁的数据交互,但是交互的数据量很小。比如聊天系统,比如游戏服务端,短消息网关等。
当然,这种并发处理模式相对多进程/线程要复杂一些。
以上是两种Linux环境下最基本的网络服务器的设计模型,从这两种变异后的相关模型就更多。比如对于select()多路复用模型同样可以采用综合多线程/进程来做处理。
可以看到,针对不同的应用情况和环境,我们可以采用不同的并发处理模型。既然如此,我们设设计一个新的并发处理模型的目的在那里呢?
解决多进程/线程模型的缺点
上面我们提到过,在多进程/线程模型下,最坏的情况是A个请求需要A个进程/线程。但是这个数量A本身受操作系统的选择,所以怎样在同样的环境下提供更多的A是我们要解决的问题。
另外要解决的一个问题是,避免频繁创建和销毁进程/线程带来的开销。
构建一个通用的体系结构,可以让开发人员很方便地在这个体系上开发一个能够处理大规模的并发出路服务器。
高度的抽象,能够让开发人员不关心进程/线程的具体处理/管理逻辑,只关心具体的客户请求任务处理。下面是在该通用线程池体系下主进程的代码:
typedef struct taskNode{//定义你要处理的具体的任务数据结构,比如我要处理网络连接,那么有个 int sockfd; //socket 连接的句柄
}taskNode;
void printsd(void *task)//这里处理具体的任务
{
taskNode *node=(taskNode*)task;
printf(pthread=%d, sockfd=%d, address=%p\n,(int)pthread_self(),node-sockfd,task);
free(task); //hi,this free must be do!!!
sleep(1);
return;
您可能关注的文档
最近下载
- 【国家标准】GB∕T 35450-2017 聚碳酸酯薄膜及片材.pdf
- 医疗废物管理制度 (1).doc VIP
- 青19J2青19J3建筑专业(三):建筑用料及做法+屋面.docx
- 项目安全资料标准化实施手册 (1).pdf VIP
- 2022年成都市武侯国有资本投资运营集团有限责任公司招聘考试题库及答案解析.docx VIP
- 机械设计软件:Creo二次开发_(2).CreoAPI基础.docx VIP
- 第三十八回 及时雨会神行太保 黑旋风斗浪里白条-名著《水浒传》阅读导航+情节概括+思维导图+原文批注+阅读训练初中语文.docx VIP
- 物理性污染与防治.ppt VIP
- 1+X快递运营理论测试题.docx VIP
- 9.29事故抢险救援战评总结.ppt VIP
文档评论(0)