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)复制文件小例前简单说明的更多相关文章

  1. 【windows核心编程】IO完成端口(IOCP)复制文件小例

    1.演示内容 文件复制 2.提要 复制大文件时,使用FILE_FLAG_NO_BUFFERING标志 同时需要注意: 读写文件的偏移地址为 磁盘扇区 的整数倍 读写文件的字节数为 磁盘扇区 的整数倍 ...

  2. 【Windows核心编程】一个使用内存映射文件进行进程间通信的例子

    进程间通信的方式有很多种,其底层原理使用的都是内存映射文件. 本文实现了Windows核心编程第五版475页上的demo,即使用内存映射文件来在进程间通信. 进程1 按钮[Create  mappin ...

  3. 《windows核心编程》 17章 内存映射文件

    内存映射文件主要用于以下三种情况: 系统使用内存映射文件载入并运行exe和dll,这大量节省了页交换文件的空间以及应用程序的启动时间 开发人员可以使用内存映射文件来访问磁盘上的数据文件.这使得我们可以 ...

  4. Windows核心编程 第十七章 -内存映射文件(下)

    17.3 使用内存映射文件 若要使用内存映射文件,必须执行下列操作步骤: 1) 创建或打开一个文件内核对象,该对象用于标识磁盘上你想用作内存映射文件的文件. 2) 创建一个文件映射内核对象,告诉系统该 ...

  5. Windows核心编程 第十七章 -内存映射文件(上)

    第1 7章 内存映射文件 对文件进行操作几乎是所有应用程序都必须进行的,并且这常常是人们争论的一个问题.应用程序究竟是应该打开文件,读取文件并关闭文件,还是打开文件,然后使用一种缓冲算法,从文件的各个 ...

  6. 《windows核心编程系列》十八谈谈windows钩子

    windows应用程序是基于消息驱动的.各种应用程序对各种消息作出响应从而实现各种功能. windows钩子是windows消息处理机制的一个监视点,通过安装钩子能够达到监视指定窗体某种类型的消息的功 ...

  7. 《Windows核心编程》之“完成端口”(对所有IO都是如此,不仅仅是对socket)

    <Windows核心编程>第10章开头部分一再强调:“IO Completion Port”是“构建高性能.可升缩的应用程序”的最佳设施之一,它不仅适用于处理设备IO,也适用于其它越来越多 ...

  8. windows核心编程---第九章 同步设备IO与异步设备IO之同步IO

    同步设备IO 所谓同步IO是指线程在发起IO请求后会被挂起,IO完成后继续执行. 异步IO是指:线程发起IO请求后并不会挂起而是继续执行.IO完毕后会得到设备的通知.而IO完成端口就是实现这种通知的很 ...

  9. 《Windows核心编程》读书笔记 上

    [C++]<Windows核心编程>读书笔记 这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对 ...

随机推荐

  1. iOS使用Charts框架绘制—柱形图

    首先看一下最终要实现的效果: 最终效果 一.初始化barChartView 绘制柱形图需要用到BarChartView这个类,下面是初始化代码: self.barChartView = [[BarCh ...

  2. Java学习笔记之:Java封装

    一.引言 在面向对象程式设计方法中,封装(英语:Encapsulation)是指,一种将抽象性函式接口的实作细节部份包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定 ...

  3. JavaWeb项目开发案例精粹-第2章投票系统-004action层

    1. package com.sanqing.action; import java.util.UUID; import com.opensymphony.xwork2.ActionSupport; ...

  4. ScannerTest-------double string

    import java.util.*; public class ScannerTest { public static void main(String[] args){ Scanner scann ...

  5. Quartz任务调度快速入门

    Quartz任务调度快速入门 概述 了解Quartz体系结构 Quartz对任务调度的领域问题进行了高度的抽象,提出了调度器.任务和触发器这3个核心的概念,并在org.quartz通过接口和类对重要的 ...

  6. multi-cursor

    可以进行多处同时编辑 用C-n选择第一个单词,再次按住选住下一个单词,C-p放弃当前选中的,返回到第上一个,C-x放弃当前选中的,光标到下一处 选中一段文本后用:MultipleCursorsFind ...

  7. 结构体TABLE_share

    struct TABLE_share { static inline TABLE **next_ptr(TABLE *l) { return &l->share_next; } stat ...

  8. java--关键字和保留字

    关键字:Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等. 保留字:为java预留的关键字.现在还没用到,但是在升级版本中可能作为关键字. 访问控制:pr ...

  9. Spring 使用注解方式进行事务管理

    转载:http://www.cnblogs.com/younggun/archive/2013/07/16/3193800.html 使用步骤: 步骤一.在spring配置文件中引入<tx:&g ...

  10. UVa 1467 (贪心+暴力) Installations

    题意: 一共有n项服务,每项服务有安装的时间s和截止时间d.对于每项任务,如果有一项超出截止时间,惩罚值为所超出时间的长度.问如何安装才能使惩罚值最大的两个任务的惩罚值之和最小. 分析: 如果是求总惩 ...