同步I/O操作和异步I/O操作

当执行I/O操作的时候,无论是同步I/O操作还是异步I/O操作,都会调用的Windows的API方法,比如,当读取文件的时候,调用ReadFile函数。该方法会将你的当前线程从用户态转变成内核态,会生成一个I/O请求包,并且初始化这个请求包,这个包中包含一个文件句柄,一个偏移量和一个Byte[]数组。ReadFile会向内核传递,根据这个请求包,windows内核知道需要将这个I/O操作发送给哪个硬件设备。这些I/O操作会进入设备自己的处理队列中,该队列由这个设备的驱动程序维护。

如果此时是同步I/O操作,那么在硬件设备操作I/O的时候,发出I/O请求的线程由于无事可做被windows变成睡眠状态,当硬件设备完成操作后,再唤醒这个线程。这种方式非常直接,但是性能不高,如果请求数很多,那么休眠的线程数也很多,浪费了大量资源。

如果是异步I/O操作,那么情况不同了。.Net中,异步的I/O操作为BeginXXX的形式。该方法在Windows把I/O请求包发送到设备的处理队列后就返回了。同时,在调用异步I/O操作的时候,即调用BeginXXX方法的时候,需要传入一个委托,该委托方法会随着I/O请求包一路传递到设备的驱动程序。在设备处理完I/O请求包后,将该委托再放到CLR线程池队列。在CLR内部有一个IOCP(I/O
completion
port),它提供了在处理多个异步I/O请求的线程模型,可以把这个IOCP看做是一个消息队列,当一个进程创建了一个IOCP,即创建了一个队列。当异步I /
O请求完成时,设备驱动程序就会生成一个I/O完成包,将它按照FIFO方式排队列入该完成端口。之后,会有线程提取完成I/O请求包,并调用之前的委托。IOCP会预分配的线程池,线程数量和CPU数量一致,这样的好处是避免了线程的上下文切换。这种方式比即时创建线程处理I/O请求速度更快。这种机制很好的实现了异步通信,既提高了性能又平衡了资源。

参考资料

《CLR VIA C#》

《Pro .NET Performance》

《Windows核心编程(第5版)中文版》

http://blog.csdn.net/piggyxp/article/details/6922277

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365198(v=vs.85).aspx

同步I/O操作和异步I/O操作,布布扣,bubuko.com

时间: 2024-10-17 16:31:38

同步I/O操作和异步I/O操作的相关文章

什么是线程同步,什么是线程异步?同步的好处与弊端

线程同步:是多个线程同时访问同一资源,等待资源访问结束,浪费时间,效率低 线程异步:访问资源时在空闲等待时同时访问其他资源,实现多线程机制 异步处理就是,你现在问我问题,我可以不回答你,等我用时间了再处理你这个问题.同步不就反之了,同步信息被立即处理 -- 直到信息处理完成才返回消息句柄:异步信息收到后将在后台处理一段时间 -- 而早在信息处理结束前就返回消息句柄 区别同步和异步 一个进程启动的多个不相干线程,它们相互之间关系为异步. 同步必须执行到底之后才能执行其他操作,而异步可以任意操作 同

【原创-算法-实现】异步HTTP请求操作

一.说明 1) 这个类 是我 在真实项目中,优化解决真实问题 时,不参考第三方代码,完全由自己查阅MSDN官方文档 , 完成的一个真实生产环境中使用的功能类 2) 读者在使用此类时,请尊重原创,在代码中加上原创注释://  Author -- Meng.NET (cnblogs.com)  ,同时欢迎 二次改进.二次创作 以共同进步 3) 此代码以[面向对象].[C#闭包].[异步回调].[超时].[等待].[自动重试]方式实现及完成,且可以配置扩展 二.代码 废话不多说,上干货,代码如下: 1

IOS异步和多线程操作&&在sqlite3中的应用

1,数据库I/O操作(异步) 数据库本身是存储在磁盘上.访问和修改数据库,即对磁盘进行读写,即I/O操作. 磁盘属于计算机硬件,具有DMA能力,不需要CPU干预,可以实现异步操作. I/O操作一般是消耗时间,sqlite使用异步处理I/O操作. 当有多个事务对数据库进行操作,对应,也会有多个I/O操作. 操作系统将I/O操作,合理放入一个I/O队列.一次性将队列内的I/O操作提交给磁盘系统,并行处理多个I/O,提高效率.本人也没有特别深入研究. 2,异步和多线程 异步和多线程,都有能力实现,不阻

支付宝异步返回无操作问题

这两天做支付时遇到订单支付完成后订单状态无修改的情况, 各种奋斗解决终于搞定,现在拿出来分享下希望遇到同样问题的可以快速解决 支付成功后随手关闭支付成功页面,这样需要调用异步页面来修改订单状态,但是页面不接受xml post 直接用网址打开异步页面会返回错误页面.“从客户端****中检测到有潜在危险的 Request.Form 值” 这种情况需要您在web.config 中添加<httpRuntime requestValidationMode="2.0" /> 和<

JAVASE02-Unit07: 基本IO操作 、 文本数据IO操作

基本IO操作 . 文本数据IO操作 java标准IO(input/output)操作 package day07; import java.io.FileOutputStream; import java.io.IOException; /** * java标准IO(input/output)操作 * 输入流InputStrean:用于从数据源读取数据到程序中 * 输出流OutputStream:用于将数据发送至目标 * * 流划分为:节点流,处理流 * 节点流:又叫做低级流,特点:数据源明确,

JavaScript之jQuery-3 jQuery操作DOM(查询、样式操作、遍历节点、创建插入删除、替换、复制)

一.jQuery操作DOM - 查询 html操作 - html(): 读取或修改节点的HTML内容,类似于JavaScript中的innerHTML属性 文本操作 - text(): 读取或修改节点的文本内容,类似于JavaScript中的textContent属性 值操作 - val(): 读取或修改节点的value属性值,类似于 JavaScript 中的value值 属性操作 - attr(): 读取或者修改节点的属性 - removeAttr(): 删除节点的属性 二.jQuery操作

Ruby操作MongoDB(进阶八)-聚合操作Aggregation

上篇博文讲述了排序规则collations的操作和设置方式.顺带介绍了一部分聚合aggregation的设置方式.本文继续介绍聚合操作. 聚合框架的操作处理完数据记录后在返回计算结果.集合操作将来源于多个文档的值归类到一起,这样就可疑在被归类的数据上进行多种操作,然后返回一个单独的结果 1 聚合管道 聚合管道是用于数据聚合的一个框架,是以数据处理管道概念为原型.将文档输入一个多级管道后,可疑将文档转换为聚合的结果.下面以restaurants作为数据集,通过将餐馆类归类,我们就可以使用聚合管道在

hbase之python利用thrift操作hbase数据和shell操作

前沿: 以前都是用mongodb的,但是量大了,mongodb显得不那么靠谱,改成hbase撑起一个量级. HBase是Apache Hadoop的数据库,能够对大型数据提供随机.实时的读写访问.HBase的目标是存储并处理大型的数据.HBase是一个开源的,分布式的,多版本的,面向列的存储模型.它存储的是松散型数据. HBase提供了丰富的访问接口. HBase Shell Java clietn API Jython.Groovy DSL.Scala REST Thrift(Ruby.Pyt

java基础知识回顾之javaIO类--内存操作流ByteArrayInputStream和ByteArrayOutputSteam(操作字节数组)

直接看代码: package cn.itcast.io.p6.bytestream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; public class ByteArrayStreamDemo { /** * @param args * @throws IOException * 特点 * 1.内存操作流 * 2.不操作底层资源,不调