【C# 线程】Windows系统下常见的7种I/O模型 之Overlapped I/O模型
overview

这个字符到底是什么含义呢?
其实它的意思就是当程序在等待设备操作的时候,可以继续往下做而不必阻塞到那个地方等待设备操作的返回,这就造成了程序运行和设备操作时间上的重叠。
Overlapped I/O也称Asynchronous I/O,异步I/O模型。异步I/O和同步I/O不同,同步I/O时,程序被挂起,一直到I/O处理完,程序才能获得控制。异步I/O,调用一个函数告诉OS,进行I/O操作,不等I/O结束就立即返回,继续程序执行,操作系统完成I/O之后,通知消息给你。Overlapped I/O只是一种模型,它可以由内核对象(hand),事件内核对象(hEvent), 异步过程调用(apcs) 和完成端口(I/O completion)实现。OVERLAPPED是ReadFile/WriteFile等异步操作APIs的一个必须的实参(传址方式)。iocp中也用到这个参数
Overlapped I/O的设计的目的:
取代多线程功能,(多线程存在同步机制,错误处理,在成千上万个线程I/O中,线程上下文切换是十分消耗CPU资源的)。
Overlapped I/O模型是OS为你传递数据,完成上下文切换,在处理完之后通知你。由程序中的处理,变为OS的处理。内部也是用线程处理的。
个人理解:A国的线程a要产品拿到B国家做的加工,但是自己去成本太高,它就委托OverLapped 把商品寄到B国家的工厂,并且把所有要交代的信息和个人联系方式都告诉OverLapped,然后线程a就去做自己的事情了。加工完成后OverLapped再把加工后的产品寄回来给他。如果每一个线程都建立一个OverLapped成本太高。所以OverLapped就成立一个快递公司IOCP 来处理这类业务,它自己就在里面上班。
typedef struct _OVERLAPPED
{
// 通常被保留,当GetOverlappedResult()传回False
// 并且GatLastError()并非传回ERROR_IO_PENDINO时,该状态置为系统定的状态。
DWORD Internal;
// 通常被保留,当GetOverlappedResult()传回False时,为被传输数据的长度。
DWORD InternalHigh;
// 指定文件的位置,从该位置传送数据,文件位置是相对文件开始处的字节偏移量。
// 调用 ReadFile或WriteFile函数之前调用进程设置这个成员,
// 读写命名管道及通信设备时调用进程忽略这个成员;
DWORD Offset;
// 指定开始传送数据的字节偏移量的高位字,
// 读写命名管道及通信设备时调用进程忽略这个成员;
DWORD OffsetHigh;
// 标识事件,数据传送完成时把它设为信号状态,
// 调用ReadFile, WriteFile, ConnectNamedPipe TransactNamedPipe函数前,调用进程设置这个成员.
HANDLE hEvent;
} OVERLAPPED, *LPOVERLAPPED;
产生重叠IO的原因:
对于阻塞IO的读写操作都是需要阻塞等待IO完成的,大大的浪费用户的进程的时间片,降低了程序的性能。所以系统开个后门,悄悄地给你开个后门,开个线程去帮你请求IO,等到IO操作完成之后再通知你,你就可一再接着处理就好了,那么在IO完成之前你就可以放心的做其他的了。
重叠IO的重要数据结构:
WSAEVENT hEvent是连接完成事件和用户程序的桥梁,我们可以通过可爱的waitformultipleobjects和waitforsingleobject来接受通知,进而处理完成事件。
那么,IOCP又是怎么一肥事呢?
需要知道,重叠IO解放劳动力的同时,也是有代价的,如果1000个请求同时发生就需要系统内部开启1000个线程去处理IO,那么负载实在太大了,所以需要池化,为用户进程开线程池去优化IO请求咯。于是就有了IOCP

【C# 线程】Windows系统下常见的7种I/O模型 之Overlapped I/O模型的更多相关文章
- 【C# 线程】IOCP IO完成端口-Windows系统下常见的7种I/O模型
一.IOCP(I/O Completion Ports)简介 要实现异步通信,必须要用到一个很风骚的I/O数据结构 ,叫重叠结构"Overlapped",Window ...
- windows系统下npm升级的正确姿势以及原理
本文来自网易云社区 作者:陈观喜 网上关于npm升级很多方法多种多样,但是在windows系统下不是每种方法都会正确升级.其中在windows系统下主要的升级方法有以下三种: 首先最暴力的方法删掉no ...
- Windows系统下Memcached缓存系列二:CouchbaseClient(c#客户端)的详细试用,单例模式
在上一篇文章里面 ( Windows系统下Memcached缓存系列一:Couchbase(服务器端)和CouchbaseClient(c#客户端)的安装教程 ),我们介绍了服务器端的安装和客户端的安 ...
- 如何用python在Windows系统下,生成UNIX格式文件
平时测试工作中,少不了制造测试数据.最近一个项目,我就需要制造一批可在UNIX下正确读取的文件.为确保这批文件能从FTP下载成功,开发叮嘱我:“文件中凡是遇到换行,换行符必须是UNIX下的LF,而不是 ...
- 在Windows系统下用命令把应用程序添加到系统服务
在Windows系统下用命令把应用程序添加到系统服务,使用SC命令. 加入服务格式如下:sc create ServiceName binPath= 程序路径 start= auto(等号后面的空格是 ...
- windows系统下在dos命令行kill掉被占用的pid (转)
原文出自:http://www.2cto.com/os/201304/203771.html windows系统下在dos命令行kill掉被占用的pid 1.开始-->运行-->c ...
- windows系统下简单nodej.s环境配置 安装
国内目前关注最高,维护最好的一个关于nodejs的网站应该是http://www.cnodejs.org/ windows系统下简单nodejs环境配置. 第一步:下载安装文件 下载地址:官网 htt ...
- windows系统下安装MySQL
可以运行在本地windows版本的MySQL数据库程 序自从3.21版以后已经可以从MySQL AB公司获得,而且 MYSQL每日的下载百分比非常大.这部分描述在windows上安装MySQL的过程. ...
- WINDOWS系统下四叶草CLOVER引导U盘制作
一.所需软件1.下载BootDiskUtility链接:http://pan.baidu.com/s/1bwBFyu 密码:glyk 2.下载Clover r3330 USB链接:http://pan ...
随机推荐
- javascript的AMD规法--esl与requirejs浅介。
AMD规范,全称是Asynchronous Module Definition,即异步模块加载机制.从它的规范描述页面看,AMD很短也很简单,但它却完整描述了模块的定义,依赖关系,引用关系以及加载机制 ...
- C#8.0 可空引用类型
介绍 我们的项目代码运行时最频繁的错误之一就是 System.NullReferenceException 异常,c#8.0增加的可为空引用类型就是用来帮助开发者降低甚至消除NULL异常.我们需要注意 ...
- 信奥题库(OI题库)8月月赛T1题解 幂次数
0.前置知识 分解质因数 快速幂(不必要) 1.思路 首先,我们知道一个正整数(设它为 \(a\) )一定能分解成这样的形式: \[a= \prod_{i\in N^*} p_i^{c_i} \] 其 ...
- JAVA多线程学习十三 - 同步工具CyclicBarrier与CountDownLatch
一.CyclicBarrier CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序 ...
- C++ XML解析之TinyXML
转载请注明来源:https://www.cnblogs.com/hookjc/ 使用TinyXML进行C++ XML解析,感觉使用起来比较简单,很容易上手,本文给出一个使用TinyXML进行XML解析 ...
- 动态修改UINavigationBar的背景色--by-胡旭
这是我们最终想要得到的效果 思路 在UISrollView的delegate方法 - (void)scrollViewDidScroll:(UIScrollView *)scrollView中根据当前 ...
- 浅谈php web安全
首先,笔记不是web安全的专家,所以这不是web安全方面专家级文章,而是学习笔记.细心总结文章,里面有些是我们phper不易发现或者说不重视的东西.所以笔者写下来方便以后查阅.在大公司肯定有专门的we ...
- @play.data.binding.NoBinding
新的@play.data.binding.NoBinding注解允许我们定义一些"不应该被绑定"的字段,以防出现安全问题.例如: public class User extends ...
- 聊一聊DTM子事务屏障功能之SQL Server版
背景 前面写了两篇如何用 C# 基于 DTM 轻松实现 SAGA 和 TCC 的分布式事务,其中有一个子事务屏障的功能,很好的处理了空补偿.悬挂.重复请求等异常问题. https://dtm.pub/ ...
- puppeteerExamples
What can I do? Most things that you can do manually in the browser can be done using Puppeteer! Here ...