浅谈windows下高性能服务器程序模型IOCP.docVIP

浅谈windows下高性能服务器程序模型IOCP.doc

  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文档。上传文档
查看更多
浅谈windows下高性能服务器程序模型IOCP.doc

浅谈windows下高性能服务器程序模型IOCP   摘要:本文讨论在Windows 环境下,如何开发出一种基于TCP协议的高并发服务器程序。本文谈论Windows 下套接字I/O模型,同步和异步I/O,阻塞和非阻塞模式,主要谈论IOCP通讯模型的原理和开发过程。   关键词:高并发;服务器端程序开发;IOCP   中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2016)03-0257-02   1 概述   当前,移动互联网已成为了人们主要的获取信息的主要渠道。在移动互联网上主要有两种方式获取信息。 一是通过各种浏览器来浏览网站内容。二是通过手机上安装的app来获得来自服务器上的数据,如QQ和微信。这两种通讯方式都需要服务器端程序的支持。而衡量服务器端程序性能的一个重要指标就是并发量,也就是同时可以接入客户端的数量,本文讨论如何在windows系统下最性能的服务器端程序模型完成端口模型。   2 具体内容   首先,我们讲到同步和异步两个概念。   同步模式是比较早期的模式,在Windows套接字创建时,默认工作在同步模式下。同步模式就是需要服务器完成收发后才可以做下一步的操作,这样会大大降低程序的运行性能。所以高性能的服务器端程序多数使用异步模式。异步模式是指服务器程序不等当前I/O是否完成,就马上执行下一个任务,并不等待程序执行结果或程序本身出现错误退出。这样就大大提高了程序性能。举个例子来说,一个公司的物流公司的经理给一个快递员下达快递任务后,等待这个快递员送完快递后再给第二个快递员下达新任务。如果需要用1分钟的时间把下单的内容通知给快递员,且第一个快递员用时完成任务1小时,第二个快递员也用时1小时完成任务,则一共用时2小时2分钟,这样的模式就是同步模式。如果经理给第一个快递员下完任务后不等待快递员执行任务的完成就直接给下一个快递员下达第二个任务,这时用时就只有2分钟,仅仅是下单内容通知给快递员的时间,这样的模式就是异步模式。很明显,采用异步模式的程序大大提高了性能。   第二,我们讲到阻塞和非阻塞两个概念   阻塞模式就是指本线程结果返回之前,线程会被挂起该线程进入非可执行状态,CPU不给线程分配时间片,即线程暂停运行,进入待机状态。函数只会有执行结果或者出错码生成以后才会做下一步的操作。而非阻塞模式指的是不等待执行结果或出错码的出现不会直接进入睡眠状态而是马上执行下一步的操作,此时线程本身还是处在激活状态。同样用上面经理-快递员的例子来说明,阻塞模式是指经理在下达指令后一直等待快递员返回执行情况。在此期间不做任何事情,直到快递员返回唤醒经理,再进行下一个命令。而非阻塞模式指的是经理下达指令后在等待返回执行情况期间可以做其他事情,比例不停打电话给快递员询问执行情况等。   第三,我们来讲到IOCP的工作原理和编写过程。   IOCP是Windows下高性能的可伸展的I/O模型,是最高性能的模型,与其性能相当的模型都没有。IOCP全称Input/Output Completion Port,译为I/O完成端口。首先我们来说为什么Windows下要使用该模型。我们知道在网络上客户端与服务器发送和接收数据(即网络I/O操作)相对于CPU而言要花费大的时间,两者的差距可能有数几千倍之多。显然如果要CPU和网络I/O操作采用同步模式的话即让CPU等待网络I/O完成收发数据之后再做下一步的操作,对于整个系统来说是一种巨大的浪费。所以为了提高效率,让系统不等待结果而是直接做下一条操作,只是让I/O操作完成之后再通过回调函数来通知系统收发执行情况。这也是为什么叫做完成端口的原因。IOCP 其实上是一个线程池。这个线程池的核心工作是去调用I/O操作完成时的回调函数。IOCP可以想象为一个包含网络通信操作即接收新客户端的加入,发送数据到客户端,接收客户端上交的数据的一个信息队列,它会把上述网络操作即接收客户端接入请求,发送数据和接收数据操作执行的结果存放在这个队列里。我们可以读出所有的网络操作的结果以及出错码。   具体实现过程:   第一步:创建一个完成端口。使用HANDLE 完成端口 = CreateIoCompletionPort(参数1,参数2,参数3,参数4);参数4代表的是程序可以同时生成线程的最大数量。人们很自然地想到在一个CPU上运行的线程数量是越多越好。但是如果线程太多的话,系统要在不同的线程上不断地切换上下文,这样不但不能加大CPU的能力,反而会降低CPU的实际使用效率。所以我在这里只是设置为零,也就是说我们只需要让一个CPU上运行一个线程就好。   第二步:创建n个I/O操作线程。业内一般控制n的数量为CPU数量的2倍加2,如果是4核CPU,就是4*2+

文档评论(0)

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

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

1亿VIP精品文档

相关文档