设为首页 收藏本站
查看: 827|回复: 0

[经验分享] Windows异步I/O和完成端口

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-12-16 08:20:05 | 显示全部楼层 |阅读模式
Windows异步I/O和完成端口

http://kb.cnblogs.com/page/508629/

上周做了一次关于Windows异步I/O和完成端口的部门技术分享,着重于理论介绍, 顺带review基于IOCP的网络库代码。
完成端口是异步I/O的一种,将这两个并列作为标题,因为完成端口的复杂性及用途相比其他几种异步I/O加起来还过之。Windows核心编程中关于设备异步I/O介绍的很明白,这里再回顾一下。
DSC0000.png
先区分两组概念:同步/异步(Async/Sync)阻塞/非阻塞(blocking/non-blocking)
这两组概念很暧昧,有时可以不用分的很清楚。我将这两组概念分别定性为面向结果面向过程。想象生活中排队的场景。印象中排队最痛苦的是2010那年在上海观看世博会,每进一个场馆要排上2-5个小时,而且天气燥热,排队过程中异常难耐。另外一种进场馆的方式就是凭预约票,可以在当天按票上时间段进场。排队进馆就是一种同步方式,直到队伍中轮到你才可以进去,凭票进馆则是异步方式,两种方式都是面向同一个结果:进馆。但是排队过程中,只能在队伍中等待,意味着行为失去自由,也就是阻塞,什么事也做不了,而凭票则可以在进馆之前到任何其他想去的地方,行动自由,也就是非阻塞的。从这个例子中可以看出为什么喜欢异步和非阻塞了,体现在程序中,则是它们的性能差别(可以看这篇)。现在开始介绍异步I/O。
一、请求异步i/o的条件
任何异步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;                  // 内核事件对象或自定义结构
}OVERLAPPED;
队列由设备驱动程序维护,记录I/O请求信息,其中包含数据地址和重叠结构的信息。
DSC0001.png 正是这个队列和重叠结构,设备知道要将什么数据写到什么位置上去或从什么位置读取数据。并通知完成结果给程序。通知方式的不同决定了它们的性能差异,同样,每种方式都需要不同的系统设施支持。
二、接收完成通知方式
1、触发设备内核对象


  • 工作机制
线程触发一个异步I/O请求→设备内核对象被设为未触发状态→线程继续执行其他任务,直到某个点线程开始等待,设备完成I/O操作,设备内核对象被设为触发状态→程序收到I/O完成。

  • 硬件设施
设备内核对象(句柄)。


  • 局限
只能同时执行单个I/O请求。
2、触发事件内核对象


  • 工作机制
线程设置事件内核对象(未触发状态),触发一个异步I/O请求→线程继续执行其他任务,直到某个点线程开始等待,设备完成I/O操作,事件内核对象被设为触发状态→程序收到I/O完成。


  • 硬件设施
事件内核对象(句柄)。


  • 局限
事件内核对象有限,不能满足大量I/O请求。
3、可提醒i/o

  • 工作机制
在使用可提醒I/O时,系统为程序发起I/O的线程创建了一个APC(Async Procedure Call)队列,在设备完成I/O操作时,驱动程序将操作结果放入该队列,其中包含程序传递给系统的完成回调函数和重叠结构,对程序来说,该队列时透明的。此时线程还不知道是否IO完成。在线程进入可提醒状态(调用了SleepEx及Wait*等函数),系统遍历队列,取出完成通知,然后让线程执行完成回调函数。

  • 硬件设施
DSC0002.png

  • 局限
谁请求谁处理完成通知,其他线程一直闲着没活干。
4、i/o完成端口


  • 是什么?

一种线程池机制(MSDN)
一种绝佳的线程间通信机制(Windows核心编程)
一种线程同步对象

  • 做什么?

密匙掌握在你手上!

  • 硬件设施
DSC0003.png
DSC0004.png
I/O完成端口包含大量的主题可以讨论,尤其应用在高性能易伸缩服务器上,以后再详细讨论。

THIS ENTRY WAS POSTED IN WINDOWS AND TAGGED I/O MODEL, IOCP. BOOKMARK THEPERMALINK.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-151735-1-1.html 上篇帖子: 《Windows核心编程系列》十谈谈????同步设备IO与异步设备IO之异步IO 下篇帖子: 【Windows核心编程学习笔记】设备I/O的同步与异步
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表