Windows异步IO和完成端口.docxVIP

  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 异步 I/O 和完成端口 上周做了一次关于 Windows 异步 I/O 和完成端口的部门技术分享,着重于理论介绍, 顺带 review 基于 IOCP 的网络库代码。 完成端口是异步 I/O 的一种,将这两个并列作为标题,因为完成端口的复杂性及用途相比其他几种异步 I/O 加起来还过之。Windows 核心编程中关于设备异步 I/O 介绍的很明白,这里再回顾一下。 先区分两组概念:同步/异步(Async/Sync),阻塞/非阻塞(blocking/non-blocking) 这两组概念很暧昧,有时可以不用分的很清楚。我将这两组概念分别定性为面向结果和面向过程。想象生活中排队的场景。印象中排队最痛苦的是 2010 那年在上海观看世博会,每进一个场馆要排上 2-5 个小时,而且天气燥热,排队过程中异常难耐。另外一种进场馆的方式就是凭预约票,可以在当天按票上时间段进场。排队进馆就是一种同步方式,直到队伍中轮到你才可以进去,凭票进馆则是异步方式,两种方式都是面向同一个结果:进馆。但是排队过程中,只能在队伍中等待,意味着行为失去自由,也就是阻塞,什么事也做不了,而凭票则可以在进馆之前到任何其他想去的地方,行动自由,也就是非阻塞的。从这个例子中可以看出为什么喜欢异步和非阻塞了,体现在程序中,则是它们的性能差别(可以看这篇)。现在开始介绍异步 I/O。 一、请求异步 I/O 的条件 队列由设备驱动程序维护,记录 I/O 队列由设备驱动程序维护,记录 I/O 请求信息,其中包含数据地址和重叠结构的信息。 正是这个队列和重 叠结构,设备知道要将什么数据写到什么位置上去或从什么位置读取数据。并通知完成结果给程序。通知方式的不同决定了它们的性能差异,同样,每种方式都需要不同的系统设施支持。 二、接收完成通知方式 1、触发设备内核对象 任何异步 I/O 都需要有系统设施的支撑,正如取票进馆需要有预约票作凭证。请求异步 I/O 也需要两个基本条件:队列和重叠结构(OVERLAPPED,重叠是指I/O 请求的时间和线程执行其他任务的时间是重叠的)。 typedef struct _OVERLAPPED ULONG_PTR Internal; { // I/O 请求错误码 ULONG_PTR InternalHigh; DWORD Offset; // // 已传输字节数 I/O 操作位置(低、高位),非文件设备忽略 DWORD OffsetHigh; HANDLE hEvent; // 内核事件对象或自定义结构 7 }OVERLAPPED; ?工作机制线程触发一个异步 ? 工作机制 线程触发一个异步 I/O 请求→设备内核对象被设为未触发状态→线程继续执行其他任务,直到某个点 线程开始等待,设备完成 I/O 操作,设备内核对象被设为触发状态→程序收到 I/O 完成。 ? 硬件设施 设备内核对象(句柄)。 ? 局限 只能同时执行单个 I/O 请求。 2、触发事件内核对象 ?工作机制 ? 工作机制 线程设置事件内核对象(未触发状态),触发一个异步 I/O 请求→线程继续执行其他任务,直到某个点 线程开始等待,设备完成 I/O 操作,事件内核对象被设为触发状态→程序收到 I/O 完成。 ? 硬件设施 事件内核对象(句柄)。 ? 局限 ?工作机制 ? 工作机制 在使用可提醒 I/O 时,系统为程序发起I/O 的线程创建了一个 APC(Async Procedure Call)队列,在设备完成 I/O 操作时,驱动程序将操作结果放入该队列,其中包含程序传递给系统的完成回调函数和重叠结构,对程序来说,该队列时透明的。此时线程还不知道是否 IO 完成。在线程进入可提醒状态(调 用了 SleepEx 及 Wait*等函数),系统遍历队列,取出完成通知,然后让线程执行完成回调函数。 ? 硬件设施 ? 局限 谁请求谁处理完成通知,其他线程一直闲着没活干。 4、I/O 完成端口 事件内核对象有限,不能满足大量 I/O 请求。 3、可提醒 I/O ? ? 是什么? 一种线程池机制(MSDN) 一种绝佳的线程间通信机制(Windows 核心编程) 一种线程同步对象 ? 做什么? 密匙掌握在你手上! ? 硬件设施 诠备列表 每条记录包含 | hD eV |ce ] d WG(}mp l e1io 11Ke y 添加条件: 心 e a t e loCo m 忱e t i ooP呻 度调用(关联0 CP ) 删除条件: 量设昔句柄袍关闭 1/ 0 完贼队列 ( Fl F Oi) | [ | [d wBune m ansfi巴 贮d 1 d WOomp | e tIOn Kie- | p o ve r|ap 区d | ldWE r m r y 匐畔: ..IJ

文档评论(0)

hao187 + 关注
官方认证
文档贡献者

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

认证主体武汉豪锦宏商务信息咨询服务有限公司
IP属地上海
统一社会信用代码/组织机构代码
91420100MA4F3KHG8Q

1亿VIP精品文档

相关文档