Windows的同步I/O和异步I/O
同步I/O操作
执行步骤
1. 程序通过FileStream对象来打开磁盘文件,然后调用Read方法(内部调用Win32 ReadFile函数),从文件中读取数据。这时,线程从托管代码转变为本机/用户模式代码。
2. Win32 ReadFile函数生成一个I/O请求包(IRP),并传递给Windows内核。
3. Windows内核将IRP传送给I/O硬件设备驱动程序的IRP队列。
4. 硬件设备执行I/O操作。在此期间,发出I/O请求的线程将变成睡眠状态。这样可以避免浪费CPU时间,但依然会浪费内存空间。因为线程的用户模式栈、内核模式栈、线程环境块和其他数据结构仍在内存中,而且无人访问。
5. 在硬件设备完成I/O操作后,线程被唤醒,从内核模式返回用户模式,再返回托管代码。
性能分析
1. 当客户端发起一个I/O请求时,线程池会创建一个线程,发起I/O请求后,线程会阻塞并等待响应。当客户端有多个I/O请求时,线程池不得不创建多个线程,这些线程都会阻塞。
2. 当I/O响应请求时,多个线程被解锁,开始执行。这时,由于CPU内核数量限制,CPU被迫执行频繁的上下文切换,这进一步损害了性能。
异步I/O操作
概述
异步执行的I/O限制的操作,允许将任务交由硬件设备处理,期间不占用线程和CPU资源。
各种I/O操作的结果由线程池来处理,因此线程池仍然扮演重要的角色。
执行步骤
1. 程序通过FileStream对象来打开磁盘文件,然后调用ReadAsync方法(内部调用Win32 ReadFile函数),从文件中读取数据。这时,线程从托管代码转变为本机/用户模式代码。
2. Win32 ReadFile函数生成一个I/O请求包(IRP),并传递给Windows内核。
3. Windows内核将IRP传送给I/O硬件设备驱动程序的IRP队列。
4. 线程立即从内核模式返回用户模式,再返回托管代码。这时FileStream的ReadAsync方法返回一个Task<Int32>对象。
5. 硬件设备执行I/O操作。
6. 在硬件设备完成I/O操作后,将完成的IRP放到线程池队列中。
7. 将来某个时间,一个线程池线程会提取完成的IRP,并访问读取到的数据。
性能分析
1. 在硬件设备执行I/O操作期间,线程不阻塞,可以避免线程池创建更多的线程。
2. 硬件设备执行I/O操作后,它的响应也会进入线程池队列,由线程池分配线程进行处理,可以更合理地利用线程,避免CPU的频繁上下文切换。
3. 异步I/O将线程控制在少数几个,可以节省内存空间,减少每次垃圾回收的时间,增强调试性能。
4. 异步I/O可以并发执行,减少处理时间。
Windows的同步I/O和异步I/O的更多相关文章
- 《Windows核心编程系列》十谈谈同步设备IO与异步设备IO之异步IO
同步设备IO与异步设备IO之异步IO介绍 设备IO与cpu速度甚至是内存访问相比较都是比较慢的,而且更不可预测.虽然如此,通过使用异步设备IO我们仍然能够创造出更高效的程序. 同步IO时,发出IO请求 ...
- Windows核心编程:第10章 同步设备IO与异步设备IO
Github https://github.com/gongluck/Windows-Core-Program.git //第10章 同步设备IO与异步设备IO.cpp: 定义应用程序的入口点. // ...
- Windows Phone 同步方式获取网络类型
原文:Windows Phone 同步方式获取网络类型 在Windows Phone 开发中有时候需要获取设备当前连接网络的类型,是Wifi,还是2G,3G,或者4G,SDK中提供获取网络类型的API ...
- 烂泥:Linux系统与windows系统文件同步
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 上篇文章中,我们介绍了有关Linux系统之间的文件同步,这篇文章我们来介绍下,有关Linux系统与windows系统,以及windows系统与windo ...
- windows线程同步
一.前言 之前在项目中,由于需要使用到多线程,多线程能够提高执行的效率,同时也带来线程同步的问题,故特此总结如下. 二.windows线程同步机制 windows线程同步机制常用的有几种:Event. ...
- 总结windows多线程同步互斥
windows多线程同步互斥--总结 我的windows多线程系列文章: windows多线程--原子操作 windows多线程同步--事件 windows多线程同步--互斥量 windows多线程同 ...
- 同步I/O、异步I/O与阻塞I/O、非阻塞I/O的区别
一.I/O I/O (Input/Output,输入/输出)即数据的读取(接收)或写入(发送)操作. 通常用户进程中的一个完整I/O分为两阶段:用户进程空间<-->内核空间.内核空间< ...
- windows多线程同步互斥--总结
我的windows多线程系列文章: windows多线程--原子操作 windows多线程同步--事件 windows多线程同步--互斥量 windows多线程同步--临界区 windows多线程同步 ...
- windows多线程同步--临界区
推荐参考博客:秒杀多线程第五篇 经典线程同步 关键段CS 关于临界区的观念,一般操作系统书上面都有. 适用范围:它只能同步一个进程中的线程,不能跨进程同步.一般用它来做单个进程内的代码快同步,效率 ...
随机推荐
- GO语言中间的derfer
defer Go语言中有种不错的设计,即延迟(defer)语句,你可以在函数中添加多个defer语句.当函数执行到最后时,这些defer语句会按照逆序执行, 最后该函数返回.特别是当你在进行一些打开资 ...
- 转:C/C++基本数据类型所占字节数
参考:http://blog.csdn.net/vast_sea/article/details/8076934 关于这个基本的问题,很早以前就很清楚了,C标准中并没有具体给出规定那个基本类型应该是多 ...
- 使用git命令提交远程github仓库的时候提示"rejected"(拒绝)解决办法
今天使用在自己笔记本本地磁盘上使用Git命令行执行"git push"然后输入github的用户名和密码之后,报如下错误: ![rejected] master->maste ...
- 静态库冲突的解决办法:duplicate symbol
昨天在做微信sdk和xmpp的集成,发现各自单独集成没问题,一起集成却总报错,百度了好一会儿才知道,这应该是库冲突造成的问题 然后参考了很多文章,跟着敲敲一遍,却发现问题多多,最后主要综合结合了这两个 ...
- 由《win32多线程程序设计》临界区的问题所想
之前看侯捷翻译的<win32多线程程序设计>中关于线程同步中的临界区问题,其中举得例子是对链表的操作.死锁的问题是对一个Swaplist函数的问题,现列举代码如下: void SwapLi ...
- vim Project
VIM是Linux和Unix下常用的文本编辑工具,在编写代码和阅读代码中经常使用. 但VIM进行代码项目管理时,没有IDE集成开发工具方便,现在提供一个VIM插件Project,可以对代码项目进行简单 ...
- 使用升级助 升级了win10,黑屏,无桌面 解决方案
使用U盘重装即可. 事实证明,win10升级助手实在不咋地 优待又2: (1)保留原win7系统,有后悔药: (2)原系统的软件可用: 缺点: (1)装得慢,一上午: (2)开机慢,三分半 (3)开机 ...
- Laravel 实现定时任务
运行命令schedule run 时laravel会去App\console\kernel.php文件中查找schedule方法,有没有要执行的定时命令 实现流程:首先可以自定义命令并注册命令(参考上 ...
- Echart 商业级数据图表
简介 最近工作上用到这个图表库,图表丰富,用起来也很方便.纯javascript,可以流畅得运行在PC和移动设备上,兼容大部分浏览器. 支持折线图(区域图).柱状图(条状图).散点图(气泡图).K线图 ...
- .NET简谈反射(动态调用)
我们继续C#基础知识的学习,这篇文章主要要讲的是我们C#程序员迈向高级C#程序员的关键性的一步. 有的朋友会说事实不是这样的,我不用反射就不能开发吗?当然可以,但是用与不用肯定是不一样的,任何复杂抽象 ...