【windows核心编程】IO完成端口(IOCP)复制文件小例前简单说明
1、关于IOCP
IOCP即IO完成端口,是一种高伸缩高效率的异步IO方式,一个设备或文件与一个IO完成端口相关联,当文件或设备的异步IO操作完成的时候,去IO完成端口的【完成队列】取一项,根据完成键(Complete Key)来判断是哪个设备或文件的操作完成,然后再根据实际情况进行处理。
2、相关API 和 数据结构
将一个已完成的IO通知追加到IOCP的【完成队列】中
BOOL PostQueuedCompletionStatus(
HANDLE hCompletionPort, //IO完成端口
DWORD dwNumBytes, //传输的字节数
ULONG_PTR completionKey, //完成键
OVERLAPPED* pOverlapped //设备或文件发送异步IO请求时的关联OVERLAPPED结构指针
)
从【完成队列】中取一项
BOOL GetWQueuedCompletionStatus(
HANDLE hCompletionPort, //IOCP
PWORD pdwNumberOfBytesTransferred, //已传输字节数
PULONG_PTR pCompletionKey, //完成键
OVERLAPPED** ppOverlapped, //与文件或设备关联的OVERLAPPED结构,指针的指针,[out]
DWORD dwMilliseconds //等待时间
)
创建IOCP 或 将一个文件/设备与一个IOCP关联起来
HANDLE WINAPI CreateIoCompletionPort(
__in HANDLE FileHandle, //文件 设备句柄
__in_opt HANDLE ExistingCompletionPort, //一个IOCP句柄
__in ULONG_PTR CompletionKey, //完成键
__in DWORD NumberOfConcurrentThreads //允许运行的最大线程数量
); 新建
HANDLE hIOCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 一个数量); 关联
CreateIoCompletionPort(hFile, hIOCP, CK_XXX, 一个数量); OVERLAPPED结构
typedef struct _OVERLAPPED {
ULONG_PTR Internal; //错误代码,系统管理
ULONG_PTR InternalHigh; //传输自字节数 系统管理
union {
struct {
DWORD Offset; //起始偏移 地位, 需要特别注意:大文件时这个值容易溢出
DWORD OffsetHigh; //起始偏移 高位
} ;
PVOID Pointer;
} ;
HANDLE hEvent; //事件内核对象
} OVERLAPPED, *LPOVERLAPPED;
IOCP的五个数据结构
①设备列表
表示与该端口相关联的一个或多个设备
②IO完成队列 FIFO
包含已传输字节数、完成键、OVERLAPPED结构、错误代码等
当IO请求完成 或 调用PostQueuedCompletionStatus时 会往该队列中添加项
③等待线程队列 FILO
当线程池中每个线程调用GetQueuedCompletionStatus时,调用线程的线程标示符会被添加到这个等待线程队列,这使得IOCP始终都能够知道有哪些线程正在等待对已完成的IO请求进行处理。
④已释放线程列表
对IO请求后进行处理的线程由于某种原因被挂起后,又被唤醒,就进入以释放线程列表
⑤已暂停线程列表
对IO请求后进行处理的线程由于某种原因被挂起后进入已暂停线程列表
3、说明
IOCP中运行运行的最大线程数一般是CPU个数
线程池中的最大线程数一般是CPU个数的2倍
下一篇用一个复制文件的例子来演示一下IOCP的使用
【windows核心编程】IO完成端口(IOCP)复制文件小例前简单说明的更多相关文章
- 【windows核心编程】IO完成端口(IOCP)复制文件小例
1.演示内容 文件复制 2.提要 复制大文件时,使用FILE_FLAG_NO_BUFFERING标志 同时需要注意: 读写文件的偏移地址为 磁盘扇区 的整数倍 读写文件的字节数为 磁盘扇区 的整数倍 ...
- 【Windows核心编程】一个使用内存映射文件进行进程间通信的例子
进程间通信的方式有很多种,其底层原理使用的都是内存映射文件. 本文实现了Windows核心编程第五版475页上的demo,即使用内存映射文件来在进程间通信. 进程1 按钮[Create mappin ...
- 《windows核心编程》 17章 内存映射文件
内存映射文件主要用于以下三种情况: 系统使用内存映射文件载入并运行exe和dll,这大量节省了页交换文件的空间以及应用程序的启动时间 开发人员可以使用内存映射文件来访问磁盘上的数据文件.这使得我们可以 ...
- Windows核心编程 第十七章 -内存映射文件(下)
17.3 使用内存映射文件 若要使用内存映射文件,必须执行下列操作步骤: 1) 创建或打开一个文件内核对象,该对象用于标识磁盘上你想用作内存映射文件的文件. 2) 创建一个文件映射内核对象,告诉系统该 ...
- Windows核心编程 第十七章 -内存映射文件(上)
第1 7章 内存映射文件 对文件进行操作几乎是所有应用程序都必须进行的,并且这常常是人们争论的一个问题.应用程序究竟是应该打开文件,读取文件并关闭文件,还是打开文件,然后使用一种缓冲算法,从文件的各个 ...
- 《windows核心编程系列》十八谈谈windows钩子
windows应用程序是基于消息驱动的.各种应用程序对各种消息作出响应从而实现各种功能. windows钩子是windows消息处理机制的一个监视点,通过安装钩子能够达到监视指定窗体某种类型的消息的功 ...
- 《Windows核心编程》之“完成端口”(对所有IO都是如此,不仅仅是对socket)
<Windows核心编程>第10章开头部分一再强调:“IO Completion Port”是“构建高性能.可升缩的应用程序”的最佳设施之一,它不仅适用于处理设备IO,也适用于其它越来越多 ...
- windows核心编程---第九章 同步设备IO与异步设备IO之同步IO
同步设备IO 所谓同步IO是指线程在发起IO请求后会被挂起,IO完成后继续执行. 异步IO是指:线程发起IO请求后并不会挂起而是继续执行.IO完毕后会得到设备的通知.而IO完成端口就是实现这种通知的很 ...
- 《Windows核心编程》读书笔记 上
[C++]<Windows核心编程>读书笔记 这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对 ...
随机推荐
- Android 标题栏封装
自定义命名空间与xml文件:
- 如何手动把jar包添加进Maven本地仓库
有以下两种情况你需要手动通过Maven命令把jar文件添加进本地仓库: 1.在中心仓库里没有你想要的jar包. 2.你自己写了一个jar包,在其他项目要用到. 补充:现在仍有很多jar包不支持Mave ...
- C#实现Comparable接口实现排序
C#中,实现排序的方法有两种,即实现Comparable或Comparer接口,下面简单介绍实现Comparable接口实现排序功能. 实现Comparable接口需要实现CompareTo(obje ...
- bzoj1296: [SCOI2009]粉刷匠
dp. 用到俩次dp,用1和0代表俩种颜色,首先对于每块木板我们进行一次dp,g[i][j]代表前j个格子刷i次最多能涂到几个格子. 则 g[i][j]=max(g[i-1][k],max(cnt[j ...
- javascript插件编写小结
写JS插件,最好是先通过HTML方式将展示结果显示出来,然后再封装成JS插件,将其画出来.JS模板如下: (function($){ $.fn.fnName = function(options){ ...
- C# 创建iis站点以及IIS站点属性,iis不能启动站点
DontLog = False是否将客户端的请求写入日志文件 2011年04月09日 #region CreateWebsite 新增网站 public string CreateWebSite(st ...
- BZOJ3850: ZCC Loves Codefires
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3850 题解:类似于国王游戏,推一下相邻两个元素交换的条件然后排个序就可以了. 代码: #inc ...
- Mysql的 时间戳转换 和 c# 的时间戳转换 (以秒来进行转换,非毫秒,主要是mysql不能存毫秒)
Mysql 时间戳函数 => 从时间 转成 时间戳 UNIX_TIMESTAMP() 获取当前服务器时间的时间戳 UNIX_TIMESTAMP('2013-01-01 12:33:19') ...
- Android实现全屏显示的方法
一种是在xml文件中设置相应属性,另一种是用代码实现. 1.在AndroidManifest.xml的配置文件里面的<activity>标签添加属性: android:theme=&quo ...
- 无线端不响应键盘事件(keydown,keypress,keyup)
今天在项目时,在android手机上使用输入法的智能推荐的词的话,不会触发keyup事件,一开始想到在focus时使用一个定时器,每隔100ms检测输入框的值是否发生了改变,如果改变了就作对应的处理, ...