基于IOCP高性能代理服务器实现.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于IOCP高性能代理服务器实现

基于IOCP高性能代理服务器实现   [摘 要]代理服务器需要处理大量并发连接请求,它所负担的数据传输和处理的任务是越来越重,然而很多普通的代理软件并不能很好地满足这种日益增长的需求。在许多企业中代理服务器现在已经是不堪重负,成为了整个网络的瓶颈。文章运用IOCP技术有效的解决了代理服务器中海量连接及数据转发中的延迟易形成瓶颈的问题,提出了一种高性能的代理服务器的具体实现方案。   [关键词]代理服务器 完成端口 线程池 异步I/O   中图分类号: Pl.2A 文献标识码:A 文章编号:1009-914X(2014)25-0023-01   1、简介   IOCP(I/O Completion Port)是一种在windows服务平台上比较成熟和高效的IO方法,利用完成端口进行重叠I/O的技术在Windows NT和Windows2000上提供了真正的可扩展性。   I/O(完成端口)实际上是一个队列。操作系统将重叠I/O请求完成的通知放在这个队列中。一旦操作完成,完成通知就会唤醒工作线程处理结果。一个socket创建后就要有一个完成端口与其相关联。   一般来说,一个应用程序可以创建多个工作线程来处理完成端口上的通知事件。工作线程的数量依赖于程序的具体需要。但是在理想的情况下,应该对应一个CPU核心创建一个线程。因为在完成端口理想模型中,每个线程都可以从系统获得一个“原子”性的时间片,轮番运行并检查完成端口,线程的切换是额外的开销。在实际开发的时候,还要考虑这些线程是否牵涉到其他堵塞操作的情况。如果某线程进行堵塞操作,系统则将其挂起,让别的线程获得运行时间。因此,如果有这样的情况,可以多创建几个线程来尽量利用时间。   2、实现   使用IOCP模型之前,首先要创建一个 I/O完成端口对象,用它面向任意数量的套接字句柄,管理多个I/O请求。要做到这一点,需要调用CreateIoCompletionPort函数,它的定义如下:   HANDLE CreateIoCompletionPort(   HANDLE FileHandle,   HANDLE ExistingCompletionPort,   DWORD ExistingCompletionPort,   DWORD NumberOfConcurrentThreads   );   最开始创建一个完成端口时,唯一感兴趣的参数便是NumberOfConcurrentThreads(并发线程的数量);前面三个参数都会被忽略。NumberOfConcurrentThreads参数的特殊之处在于,它定义了在一个完成端口上,同时允许执行的线程数量。理想情况下,我们希望每个处理器各自负责一个线程的运行,为完成端口提供服务,避免过于频繁的线程“场景”切换。若将该参数设为0,表明系统内安装了多少个处理器,便允许同时运行多少个线程!   成功创建一个完成端口后,便可开始将套接字句柄与对象关联到一起。但在关联套接字之前,首先必须创建一个或多个“工作者线程”,以便在I/O请求投递给完成端口对象后,为完成端口提供服务。   一旦在完成端口上拥有足够多的工作者线程来为I/O请求提供服务,便可着手将套接字句柄同完成端口关联到一起。这要求我们在一个现有的完成端口上,调用CreateIoCompletionPort函数,同时为前三个参数―FileHandle,ExistingCompletionPort和ExistingCompletionPort―提供套接字的信息。   将套接字句柄与一个完成端口关联在一起后,便可以套接字句柄为基础,投递发送与接收请求,开始对I/O请求的处理。接下来,可开始依赖完成端口,来接收有关I/O操作完成情况的通知。从本质上说,完成端口模型利用了Win32重叠I/O机制。在这种机制中,像WSASend和WSARecv这样的Winsock API调用会立即返回。此时,需要由应用程序负责在以后的某个时间,通过一个OVERLAPPED结构,接收调用的结果。在完成端口模型中,要想做到这一点,需要使用GetQueuedCompletionStatus(获取排队完成状态)函数,让一个或多个工作者线程在完成端口上等待。   3、性能优化   完成端口的最大优点在于其管理海量连接时的处理效率,通过操作系统内核的相关机制完成IO处理的高效率。既然完成端口处理的是海量连接问题,那么对完成端口的优化则也应该首先放在海量连接的相关管理上。为此,引入“池”的概念。   在代理服务器中,数据空间的频繁创建和释放是相当占用系统资源的。为了维护一个相对静态的数据存储空间,并在这个相对静态的空间上进行相关操作,因此在数据空间的管理上,引入了“内存池”。   

文档评论(0)

317960162 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档