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可以并发执行,减少处理时间。
转载于:https://www.cnblogs.com/markhe/p/5587963.html
Windows的同步I/O和异步I/O相关推荐
- 《Windows核心编程系列》九谈谈同步设备IO与异步设备IO之同步设备IO
<Windows核心编程系列>九谈谈同步设备IO与异步设备IO之同步设备IO 同步设备IO 所谓同步IO是指线程在发起IO请求后会被挂起,IO完成后继续执行. 异步IO是指:线程发起IO请 ...
- 为什么在 Verilog HDL 设计中一定要用同步而不能用异步时序逻辑?
本博文内容来源于:<从算法设计到硬件逻辑的实现>,仅供学习交流使用! 同步时序逻辑是指表示状态的寄存器组的值只可能在唯一确定的触发条件发生时刻改变.只能由时钟的正跳沿或负跳沿触发的状态机就 ...
- windows多线程同步--临界区
推荐参考博客:秒杀多线程第五篇 经典线程同步 关键段CS 关于临界区的观念,一般操作系统书上面都有. 适用范围:它只能同步一个进程中的线程,不能跨进程同步.一般用它来做单个进程内的代码快同步,效率比较 ...
- 在Windows上同步SVN代码库到备份SVN机器上
在Windows上同步SVN代码库到备份SVN机器上 SVN源库IP: 192.168.0.200 SVN目标库(备份库)IP:192.168.0.62 visualSVN Server版本: ...
- 关于同步加载与异步加载的区别
关于同步加载与异步加载的区别 同步加载:同步模式,又称阻塞模式,会阻止浏览器的后续处理,停止了后续的解析,因此停止了后续的文件加载(如图像).渲染.代码执行. 异步加载:异步加载又叫非阻塞,浏览器在下 ...
- java同步异步调用_详解java 三种调用机制(同步、回调、异步)
1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,jsPwwCe它是一种单向调用 2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 3:异步调用:一种类似消 ...
- 同步阻塞,同步非阻塞,异步阻塞,异步非阻塞IO
在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作. 在比较这两个模式之前,我们首先的搞明白 ...
- 『安全漏洞』Windows 云同步引擎API整数溢出漏洞
随着云存储的普及,各种操作系统都添加了支持此类存储的服务和功能.现在可以在云端同步本地存储,同时也可以在系统上检索到问价.在 Windows 上,这种功能是通过Cloud Sync Engines云同 ...
- 同步阻塞、同步非阻塞、异步阻塞、异步非阻塞与 I/O 多路复用、Java NIO 之间的联系
同步阻塞.同步非阻塞.异步阻塞.异步非阻塞与 I/O 多路复用.Java NIO 之间的联系 先验知识 此处的异步指的是什么 同步.异步.阻塞.非阻塞 同步阻塞.同步非阻塞.异步阻塞.异步非阻塞 一个 ...
最新文章
- python数据结构学习笔记(五)
- 信息系统项目管理知识--信息安全
- SAP Spartacus基于travis的持续集成
- [js] js怎样避免原型链上的对象共享?
- Android input keyevent
- JAVA入门级教学之(continue)
- C++ 里利用 std::ios::sync_with_stdio(false) 解决TLE问题
- sharepoint修改主机名以后出现cannot connect to the configuration database错误
- 【java】JDK8的HashMap
- 教师排课程序设计c语言,计算中心
- Windows7操作系统下的修改屏幕旋转快捷键
- 费马小定理、欧拉定理总结
- 播放器实战08 打开AVCODEC
- Asciinema终端SSH录屏神器使用
- 微信小程序云开发及背后的云服务支持。
- 弗洛伊德 震惊二十世纪的一种分析
- 微波反应试验温度、时间、压力及功率控制
- 常用数据库默认端口号
- jquery ajax golang,原生和jQuery的ajax用法-Go语言中文社区
- 群签名和环签名的区别_环签名,聚合签名
热门文章
- linux脚本怎么发送到桌面,如何在Linux上使用Zenity创建简单的图形Shell脚本
- 4图纸 rust_安诺伊模具丨机加工图纸有英语看不懂?不怕!史上最全翻译都在这...
- mysql5.7zib配置_mysql-5.7.13 解压版安装教程
- [Flink]Flink实时框架介绍
- ES6入门之let、cont
- PDF Expert 坚果云 强强联合 优惠来袭
- inotify实时同步工具理论和实战
- SQLite第九课 sqlite3_set_authorizer案例
- 2017-3-17 SQL server 数据库 视图,事务,备份还原,分离附加
- mysql 聚集函数 count 使用详解