理解I/O Completion Port(完成端口)

  • 时间:
  • 浏览:1
  • 来源:uu快3下载网址_uu快3IOS下载_电脑版

  这里帮我对上方的许多概念略作补充,在解释[完成]两字事先,帮我先简单的提一下同步和异步这另另还还有一个多 概念,逻辑上来讲做完一件事后再去做另一件事只是同步,而同去同去做两件或两件以上事话语只是异步了。你也里能拿单多多线程 和多多多线程 来作借喻。有刚刚我们我们一定要将同步和堵塞,异步和非堵塞区分开来,所谓的堵塞函数诸如accept(…),当调用此函数后,此时多多线程 将挂起,直到操作系统来通知它,”HEY兄弟,一群人连进来了”,那个挂起的多多线程 将继续进行工作,也就符合”生产者-消费者”模型。堵塞和同步看上去有两分例如,但却是完整篇 不同的概念。我们我们我们知道I/O设备是个相对慢速的设备,不论打印机,调制解调器,甚至硬盘,与CPU相比完整篇 后该奇慢无比的,坐下来等I/O的完成是一件不甚明智的事情,有事先数据的流动率非常惊人,把数据从你的文件服务器中以Ethernet传输速率搬走,其传输速率愿因 高达每秒一百万字节,愿因 你尝试从文件服务器中读取100KB,在用户的眼光来看几乎是瞬间完成,有刚刚,要知道,你的多多线程 执行你你本身命令,愿因 浪费了10个一百万次CPU周期。许多许多说,我们我们一般使用原本多多线程 来进行I/O。重叠IO[overlapped I/O]是Win32的一项技术,想要要求操作系统为你传送数据,有刚刚在传送完毕时通知你。这也只是[完成]的含义。这项技术使你的多多线程 在I/O进行过程中仍然也能继续处理事务。事实上,操作系统内内外部正是以多多线程 来完成overlapped I/O。想要获得多多线程 所有利益,而不还要付出那些痛苦的代价。

  我我觉得我们我们上方的构想应该就差太多是IOCP的设计机理。我我觉得说穿了IOCP不让是一另另还还有一个多 消息队列嘛!是我不好这和[端口]这两字有何联系。我的理解只是IOCP最多是应用多多线程 和操作系统沟通的一另另还还有一个多 接口罢了。

  我们我们不妨设想一下:愿因 事先开好N个多多线程 ,让它们在那hold[堵塞],有刚刚里能将所有用户的请求都投递到一另另还还有一个多 消息队列中去。有刚刚那N个多多线程 逐一从消息队列中去取出消息并加以处理。就里能处理针对每一另另还还有一个多 用户请求都开多多线程 。不仅减少了多多线程 的资源,也提高了多多线程 的利用率。理论上很不错,你想我等泛泛之辈都能想出来的那些的问題,Microsoft又怎会没办法 考虑到呢?!

实现措施 Microsoft为IOCP提供了相应的API函数,主要的就另另还还有一个多 ,我们我们逐一的来看一下:

在讨论各参数事先,首没办法 注意该函数实际用于另另还还有一个多 截然不同的目的:

1.用于创建一另另还还有一个多 完成端口对象

2.将一另另还还有一个多 句柄[HANDLE]和完成端口关联到同去

  在创建一另另还还有一个多 完成一另另还还有一个多 端口的事先,我们我们只还要填写一下NumberOfConcurrentThreads你你本身参数就里能了。它告诉系统一另另还还有一个多 完成端口上同去允许运行的多多线程 最大数。在默认状态下,所开多多线程 数和CPU数量相同,但经验想要们一另另还还有一个多 公式:

那些是IOCP?先帮我们我们看看对IOCP的评价

  在这事先,我原本开发过一另另还还有一个多 项目,其中一块还要网络支持,当时还考虑到了代码的可移植性,倘若使用select,connect,accept,listen,send还有recv,加带带好多个#ifdef的封装以用来处理Winsock和BSD套接字[socket]上方的不兼容性,一另另还还有一个多 网络子系统只用了好多个小时很少的代码就写出来了,至今还帮我很回味。那事先很长时间也就没再碰了。

进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。

IOCP和网络又有那些关系?

原本API只是

我最擅长从零刚现在结速创造世界,许多许多从来不怕失败,它最多也就帮我一无所有

  至于IOCP的具体设计原本也没办法 说得上来,毕竟我没都看实现的代码,但你完整篇 里能进行模拟,只不过性能愿因 …,愿因 想深入理解IOCP, Jeffrey Ritchter的Advanced Windows 3rd其中第13章和第14张有许多许多宝贵的内容,想要拿来窥视一下系统是怎样完成你你本身切的。

  你你本身那些的问題的处理措施 只是一另另还还有一个多 称为I/O完成端口的内核对象,他首次在Windows NT3.5中被引入。

  前些日子,我们我们策划做一另另还还有一个多 网络游戏,我主动承担下网络你你本身块,想想这还完整篇 后该小case,心里偷着乐啊。网络游戏好啊,网络游戏为成百上千的玩家提供了乐趣和令人着秘的游戏体验,我们我们在线上互相战斗或是加入队伍去战胜同去的敌人。我信心满满的准备开写我的网络,于是乎,发现过去的阻塞同步模式模式根本不到拿到一另另还还有一个多 巨量多玩家[MMP]的架构中去,直接被否定掉了。于是乎,完整篇 后该了IOCP,愿因 能过很轻易而举的拿出IOCP,也就不让有这篇教程了。下面请诸位跟随我进入正题。

  我们我们愿因 也都感觉到并行模型的瓶颈在于它为每一另另还还有一个多 客户请求都创建了一另另还还有一个多 新多多线程 。创建多多线程 比起创建多多线程 开销要小,但也远完整篇 后该没办法 开销的。

第一另另还还有一个多 参数指出了多多线程 要监视哪一另另还还有一个多 完成端口。许多许多服务应用多多线程 只是使用一另另还还有一个多 I/O完成端口,所有的I/O请求完成事先的通知都将发给该端口。简单的说,GetQueuedCompletionStatus使调用多多线程 挂起,直到指定的端口的I/O完成队列中经常出现了一项或直到超时。同I/O完成端口相关联的第3个数据底部形态是使多多线程 得到完成I/O项中的信息:传输的字节数,完成键和OVERLAPPED底部形态的地址。该信息是通过传递给GetQueuedCompletionSatatus的lpdwNumberOfBytesTransferred,lpdwCompletionKey和lpOverlapped参数返回给多多线程 的。

根据到目前为止愿因 讲到的东西,首先来构建一另另还还有一个多 frame。下面为您说明了怎样使用完成端口来开发一另另还还有一个多 echo服务器。大致如下:

  有刚刚当并发模型应用在服务器端[基于Windows NT],Windows NT小组注意到那些应用多多线程 的性能没办法 预料的没办法 高。怪怪的的,处理许多许多同去的客户请求愿因 许多许多多多线程 并发地运行在系统中。愿因 所有那些多多线程 完整篇 后该可运行的[没办法 被挂起和等候发生那些事],Microsoft意识到NT内核花费了太多的时间来转换运行多多线程 的上下文[Context],多多线程 就没办法 得到许多许多CPU时间来做它们的工作。

版权声明:本文内容由互联网用户自发贡献,版权归作者所有,本社区不拥有所有权,只是承担相关法律责任。愿因 您发现本社区中有 涉嫌抄袭的内容,欢迎发送邮件至:

  相信倘若写过网络的我们我们,应该对原本的底部形态在熟悉不过了。accept后多多线程 被挂起,等候一另另还还有一个多 客户发出请求,而后创建新多多线程 来处理请求。当新多多线程 处理客户请求时,起初的多多线程 循环回去等候原本客户请求。处理客户请求的多多线程 处理完毕后终结。

  在上述的并发模型中,对每个客户请求都创建了一另另还还有一个多 多多线程 。其优点在于等候请求的多多线程 只需做很少的工作。大多数时间中,该多多线程 在休眠[愿因 recv发生堵塞状态]。

看来我们我们完整篇 有理由相信IOCP是大型网络架构的首选。那IOCP到底是那些呢?  微软在Winsock2中引入了IOCP你你本身概念 。IOCP全称I/O Completion Port,中文译为I/O完成端口。IOCP是一另另还还有一个多 异步I/O的API,它里能高效地将I/O事件通知给应用多多线程 。与使用select()或是其它异步措施 不同的是,一另另还还有一个多 套接字[socket]与一另另还还有一个多 完成端口关联了起来,有刚刚就可继续进行正常的Winsock操作了。然而,当一另另还还有一个多 事件发生的事先,此完成端口就将被操作系统加入一另另还还有一个多 队列中。有刚刚应用多多线程 里能对核心层进行查询以得到此完成端口。

  完成端口中所谓的[端口]并完整篇 后该我们我们在TCP/IP中所提到的端口,里能说是完整篇 没办法 关系。我到现在也没想通一另另还还有一个多 I/O设备[I/O Device]和端口[IOCP中的Port]有那些关系。估计你你本身端口也迷惑了不少人。IOCP只不过是用来进行读写操作,和文件I/O倒是许多例如。既然是一另另还还有一个多 读写设备,我们我们所能要求它的只是在处理读与写上的高效。在文章的第三帕累托图想要轻而易举的发现IOCP设计的真正用意。