异步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对象模型 ...
 
随机推荐
- js解析XML
			
//在当前页面内追加换行标签和指定的HTML内容function w( html ){ $(document.body).append("<br/>" + htm ...
 - big data vs HPC
			
When I tried some SIMD optimization in large-scale simulation(HPC), it is so difficult to implment. ...
 - Java并发编程专题
			
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/4852149. ...
 - 巧用selectKey
			
在Ibatis中,insert()的返回值为一个Object的主键,其实这个Object的主键是这样的来的:如果在bean的xml文件中设置了插入的keyProperty,则insert()方法返回的 ...
 - 【JavaScript权威指南(第五版)】笔记之第一部分 核心javascript (第1章~第12章)
			
第一章 javascript概述 ①.javascript是一种松散类型语言;也是一种解释型语言; 第二章 词法结构 ①.大小写敏感 第三章 数据类型和值 ①.isFi ...
 - ASP大数据量使用GetRows()提升速度
			
抽取10万条数据,Access数据库,GetRows() 现有10W条数据,Access数据库保存 通过正常提取: <% Set conn= Server.CreateObject(" ...
 - Android Studio依赖dependencies和Eclipse加上lib包解决重复编译某些项目的问题
			
android运行时编译,可以在android的dependencies里面加语句, 一般是compile 'com.android.support:appcompat-v7:22.2.1' comp ...
 - Meteor:用户账号管理添加密码和微博weibo账号系统支持
			
Meteor账户系统构建与accounts-base包之上,并为publish和methods提供userId的顶层支持.核心包提供的功能有:数据库中的用户记录支持:额外的包提供密码安全验证:第三方登 ...
 - java多线程总结二:后台线程(守护线程)
			
所谓的后台线程,是指在程序运行的时候在后台提供一种通用服务的线程,并且这种线程并不属于程序中不可或缺的部分.因此当所有的非后台线程结束时,程序也就终止了,同时会杀死所有后台线程.反过来说,只要有任何非 ...
 - 注意事项: Oracle Not Exists 及 Not In 使用
			
select value from temp_a awhere a.id between 1 and 100and not exists(select * from temp_b b where a. ...