深圳市进源盛塑胶材料有限公司

PEEK;PTFE;POM;PMMA

 
 
新闻中心
  • 暂无新闻
产品分类
  • 暂无分类
站内搜索
 
友情链接
  • 暂无链接
正文
三期中一期极限六肖
发布时间:2019-06-04        浏览次数:        
c?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也需要两个基本条件:队列和重叠结构(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请求信息,其中包含数据地址和重叠结构的信息。  正是这个队列和重叠结构,设备知道要将什么数据写到什么位置上去或从什么位置读取数据。并通知完成结果给程序。通知方式的不同决定了它们的性能差异,同样,每种方式都需要不同的系统设施支持。  二、接收完成通知方式  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*等函数),系统遍历队列,搅珠现场直播,取出完成通知,然后让线程执行完成回调函数。硬件设施局限  谁请求谁处理完成通知,其他线程一直闲着没活干。  4、I/O完成端口是什么?  一种线程池机制(MSDN)  一种绝佳的线程间通信机制(Windows核心编程)  一种线程同步对象做什么?  密匙把握在你手上!硬件设施  I/O完成端口包含大量的主题可以讨论,特别应用在高性能易伸缩服务器上,以后再详细讨论。