异步IO模型和Overlapped结构
.NET中的
Overlapped 类
异步IO模型和Overlapped结构(http://blog.itpub.net/25897606/viewspace-705867/)
typedef struct _OVERLAPPED {
DWORD Internal; // 系统保留,存放系统设置的状态
DWORD InternalHigh; // 系统保留,存放被传输数据的长度
DWORD Offset; // 指定文件的位置,文件位置是相对文件开始处的字节偏移量。
DWORD OffsetHigh; // 指定开始传送数据的字节偏移量的高位字
HANDLE hEvent; // 标识事件,数据传送完成时把它设为信号状态
}OVERLAPPED;
Overlapped I/O模型可以用以下几种方式实现:
一、内核对象实现
1. 把设备句柄看作同步对象,ReadFile将设备句柄设置为无信号。ReadFile异步I/O字节位置必须在OVERLAPPED结构中指定。
2. 完成I/O,设置信息状态为有信号。
3. 通过WaitForSingleObject或WaitForMultipleObject判断或者异步设备调用GetOverLappedResult函数。
二、事件内核对象实现
1. Overlapped成员hEven标识事件内核对象。CreateEvent,为每个请求创建一个事件,初始化每个请求的hEvent成员。调用WaitForMultipleObject来等其中一个或全部完成。
2. Event对象必须是手动重置,使用自动重置WaitForSingleObject()和 WaitForMultipleObjects()函数不会返回。
关于自动重置事件和手动重置事件
自动重置事件:WaitForSingleObject()和WaitForMultipleObjects()会等待事件到信号状态,随后又自动将其重置为非信号状态,保证等待此事件的线程中只有一个会被唤醒。
手动重置事件:需要调用ResetEvent()才会重置事件。可能有若干个线程在等待同一事件,这样当事件变为信号状态时,所有等待线程都可以 运行了。 SetEvent()函数用来把事件对象设置成信号状态,ResetEvent()把事件对象重置成非信号状态,两者均需事件对象句柄作参数。
三、异步过程调用
在一个Overlapped I/O完成之后,系统调用callback回调函数。系统在设备句柄有信号状态下,才会调用回调函数,传给它完成I/O请求的错误码,传输字节数和 Overlapped结构的地址。通过下面的五个函数可以设置信号状 态:SleepEx,WaitForSingleObjectEx,WaitForMultipleObjectEx,SingalObjectAndWait,MsgWaitForMultipleObjectsEx。
四、完成端口
完成端口(I/O completion)的优点:不会限制handle个数,可处理成千上万个连接。I/O completion port允许一个线程将一个请求暂时保存下来,由另一个线程为它做实际服务。
并发模型与线程池:在典型的并发模型中,服务器为每一个客户端创建一个线程,如果很多客户同时请求,则这些线程都是运行的,那么CPU就要一个个 切换,CPU花费了更多的时间在线程切换,线程却没得到很多CPU时间。到底应该创建多少个线程比较合适呢,微软件帮助文档上讲应该是2*CPU个。但理 想条件下最好线程不要切换,而又能象线程池一样,重复利用。I/O完成端口就是使用了线程池。一个线程执行任务结束后不会销毁,而是重新回到线程队列中。
异步IO模型和Overlapped结构的更多相关文章
- 面试中常问的五种IO模型和BIO,NIO,AIO
一,五种IO模型: 一个IO操作可以分为两个步骤:发起IO请求和实际的IO操作例如:1.操作系统的一次写操作分为两步:第一步,将数据从用户空间拷贝到系统空间:第二步,从系统空间往网卡写.2.一次读操作 ...
- Java三种IO模型和LinuxIO五种IO模型
Java: https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/BIO-NIO-AIO.md https://github.co ...
- linux异步IO的两种方式【转】
转自:https://blog.csdn.net/shixin_0125/article/details/78898146 知道异步IO已经很久了,但是直到最近,才真正用它来解决一下实际问题(在一个C ...
- 异步设备IO OVERLAPPED结构(设备内核对象 事件内核对象 可提醒IO)
同步IO是指:线程在发起IO请求后会被挂起,IO完成后继续执行. 异步IO是指:线程发起IO请求后并不会挂起而是继续执行.IO完毕后会得到设备驱动程序的通知. 一.异步准备与OVERLAPPED结构 ...
- 系统间通信(5)——IO通信模型和JAVA实践 下篇
7.异步IO 上面两篇文章中,我们分别讲解了阻塞式同步IO.非阻塞式同步IO.多路复用IO 这三种IO模型,以及JAVA对于这三种IO模型的支持.重点说明了IO模型是由操作系统提供支持,且这三种IO模 ...
- 【Java】JMM内存模型和JVM内存结构
JMM内存模型和JVM内存结构 JAVA内存模型(Java Memory Model) Java内存模型,一般指的是JDK 5 开始使用的新的内存模型,主要由JSR-133: JavaTM Memor ...
- Java 内存模型和 JVM 内存结构真不是一回事
这两个概念估计有不少人会混淆,它们都可以说是 JVM 规范的一部分,但真不是一回事!它们描述和解决的是不同问题,简单来说, Java 内存模型,描述的是多线程允许的行为 JVM 内存结构,描述的是线程 ...
- IO五种模型和select与epoll工作原理(引入nginx)
用户速度体验的1-3-10原则 性能影响 有很多研究都表明,性能对用户的行为有很大的影响: 79%的用户表示不太可能再次打开一个缓慢的网站 47%的用户期望网页能在2秒钟以内加载 40%的用户 ...
- JVM内存结构、Java内存模型和Java对象模型
Java作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点.而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚.比如本文要讨论的JVM内存结构.Java内存模型和Java对象模型 ...
随机推荐
- MySQL提供的错误日志中的错误级别一共有3个分别为:
ERROR_LEVEL-->错误级别 WARNING_LEVEL-->警告级别 INFORMATION_LEVEL-->信息级别
- C语言的变量的作用域和生存期
一.c程序存储空间布局 C程序一直由下列部分组成: 1)正文段——CPU执行的机器指令部分:一个程序只有一个副本:只读,防止程序由于意外事故而修改自身指令: 2)初始化数据段(数据段)——在 ...
- javascript/jquery给动态加载的元素添加click事件
/** 这种写法:在重新加载数据后事件依然有效*/$(document).on('click', '#district_layer ul li', function () { });
- JSDOM之节点
javascript-节点属性详解 根据 DOM,HTML 文档中的每个成分都是一个节点. DOM 是这样规定的: 整个文档是一个文档节点 每个 HTML 标签是一个元素节点 包含在 HTML 元素中 ...
- ibatis 到 MyBatis区别
http://blog.csdn.net/techbirds_bao/article/details/9235309 简介: 本文主要讲述了 iBatis 2.x 和 MyBatis 3.0.x 的区 ...
- sharepoint 删除list里的所有内容
[System.reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint") $siteUrl = " ...
- HTTP 错误 500.21 - Internal Server Error的解决方案
开始菜单>所有程序>附件>命令提示符(以管理员的身份运行) 然后运行下面的命令注册: 32位机器: C:\Windows\Microsoft.NET\Framework\v4.0.3 ...
- Windows8.1下PHP环境配置(PHP5.6、Apache2.4、MySql5.6)
Step0 安装准备(均为64-bit版本) 下载php "Non Thread Safe"是IIS专用的,"Thread Safe"是Apache服务器用的. ...
- ASP.NET Web Forms 4.5的新特性
作者:Parry出处:http://www.cnblogs.com/parry/ 一.强类型数据控件 在出现强类型数据控件前,我们绑定数据控件时,前台一般使用Eval或者DataBinder.Eval ...
- 12天学好C语言——记录我的C语言学习之路(Day 3)
12天学好C语言--记录我的C语言学习之路 Day 3: 不知不觉到了第三天的学习,我们前两天学习的东西很杂乱,各个方面都有学习.我觉得这不是不系统,也不是学的不扎实,这种学习对于初学者而言我认为是很 ...