- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第4章 ICOP与可伸缩网络程序精要
第4章 IOCP与可伸缩网络程序 IOCP(I/O completion port,I/O完成端口)是伸缩性最好的一种I/O模型。 EPOLL --- linux/unix 4.1 完成端口I/O模型 WinSock完成端口I/O模型,一般是用在大型的服务程序里面,他的效率和功能是最强大的。如果你的服务程序需要管理几百甚至上千个Socket(海量连接)的话,如Apache,游戏服务器等,你应该采用完成端口I/O模型。 采用完成端口的好处是,操作系统的内部重叠机制可以保证大量的网络请求都被服务器处理,而不是像WSAAsyncSelect 和WSAEventSelect的那样对并发的网络请求有限制。 不同I/O模式的性能测试结果: Windows网络编程模式有好几种,他们各有特点,实现起来复杂程度各不相同,适用范围也不一样。下图是Network Programming for Microsoft Windows 2nd 一书中对不同模式的一个性能测试结果。服务器采用Pentium 4 1.7 GHz Xeon的CPU,768M内存;客户端有3台PC,配置分别是Pentium 2 233MHz ,128 MB 内存,Pentium 2 350 MHz ,128 MB内存,Itanium 733 MHz ,1 GB内存。 结果分析大家可以看到:服务器,勿庸置疑,肯定是完成端口模式。那么客户端呢,当然也可以采用完成端口,但是不同模式是在不同的操作系统下支持的,看下图: 完成端口在Windows 98下是不支持的。关键的一点,客户端程序不是用来进行大规模网络响应的,客户端的主要工作应该是进行诸如图形运算等非网络方面的任务。所以,强烈推荐大家使用WSAAsyncSelect/ WSAEvevtSelect模式实现客户端,因为它实现起来比较直接和容易,而且他完全可以满足客户端编程的需求。 从本质上说,完成端口模型要求我们创建一个Wi n 3 2完成端口对象,通过指定数量的线程,对重叠I / O请求进行管理,以便为已经完成的重叠I / O请求提供服务。 要注意: 所谓“完成端口”,实际是Wi n 3 2、 Windows NT以及Windows 2000采用的一种I / O构造机制. 使用这种模型之前,首先要创建一个I / O完成端口对象,用它面向任意数量的套接字句柄,管理多个I / O请求。 IOCP只不过是用来进行读写操作,和文件I/O有些类似。 IOCP模型工作原理图 完成端口目标是实现高效的服务器程序,其方法: 一是为完成端口指定并发线程的数量(创建完成端口对象时指定,一般与处理器数相同); 二是在初始化套接字时创建一定数量的服务线程(经验公式:服务线程数 = CPU数 * 2),即所谓的线程池。当客户端请求到来时,这些线程立即为之服务。 完成端口具有以下优点: 与事件通知方法相比,对发起重叠操作的数量不存在限制。 与完成例程相比,该模型允许一个线程发起重叠操作,而由另一个线程为完成的操作提供服务。 支持scalable架构。scalable系统是指随着RAM、磁盘空间或者CPU个数的增加而能够提升应用程序效能的一种系统。 实现过程: 以下,分为以下几步来说明完成端口模型:? 1。函数 2。常见问题 3。步骤 4。例程 函数 我们在完成端口模型下会使用到的最重要的两个函数是: (1) CreateIoCompletionPort (2) GetQueuedCompletionStatus (1) CreateIoCompletionPort函数 CreateIoCompletionPort? 的作用是:创建一个完成端口对象;把一个IO句柄和完成端口关联起来。 HANDLE CreateIoCompletionPort ( HANDLE FileHandle, /* handle to file*/ HANDLE ExistingCompletionPort, /* handle to I/O completion port*/ ULONG_PTR CompletionKey, /* completion key*/ DWORD NumberOfConcurrentThreads /* number of threads
文档评论(0)