多线程笔记5

第六章:Overlapped I/O,在你身后变戏法

1.overlapped I/O 是 Win32 的一项技术,你可以要求操作系统为你传送数据,并且在传送完毕时通知你。这项技术使你的程序在I/O 进行过程中仍然能够继续处理事务。事实上,操作系统内部正是以线程来完成 overlapped I/O。

2.Win32文件操作函数

(1)CreateFile()可以用来打开文件、串行口和并行口、Named pipes、Console。

HANDLE CreateFile(
LPCTSTR lpFileName,                                         // 指向文件名称
DWORD dwDesiredAccess,                                  // 存取模式(读或写)
DWORD dwShareMode,                                      // 共享模式(share mode)
LPSECURITY_ATTRIBUTES lpSecurityAttributes,  // 指向安全属性结构
DWORD dwCreationDisposition,                          // 如何产生
DWORD dwFlagsAndAttributes,                          // 文件属性
HANDLE hTemplateFile                                      // 一个临时文件,将拥有全部的属性拷贝
);

注:overlapped I/O性质:可以在同一时间读写文件的许多部分;多个overlapped请求,执行次序无法保证;overlapped I/O的基本型式是以ReadFile()和WriteFile()完成的。

(2)ReadFile()

BOOL ReadFile(
HANDLE hFile,                                     // 欲读之文件
LPVOID lpBuffer,                                 // 接收数据之缓冲区
DWORD nNumberOfBytesToRead,         // 欲读取的字节个数
LPDWORD lpNumberOfBytesRead,        // 实际读取的字节个数的地址
LPOVERLAPPED lpOverlapped               // 指针,指向 overlapped info
);

(3)WriteFile()

BOOL WriteFile(
HANDLE hFile,                                   // 欲写之文件
LPCVOID lpBuffer,                             // 储存数据之缓冲区
DWORD nNumberOfBytesToWrite,       // 欲写入的字节个数
LPDWORD lpNumberOfBytesWritten,   // 实际写入的字节个数的地址
LPOVERLAPPED lpOverlapped             // 指针,指向 overlapped info
);

如果CreateFile() 的第6个参数被指定为FILE_FLAG_ OVERLAPPED,就必须在上述的 lpOverlapped 参数中提供一个指针,指向一个 OVERLAPPED 结构。

(4)OVERLAPPED结构

typedef struct _OVERLAPPED {
DWORD Internal;        //通常保留。当GetOverlappedResult传回False,并且GetLastError并非传回ERROR_IO_PENDING,则内含一个视系统而定的状态。
DWORD InternalHigh; //通常被保留,当GetOverlappedResult传回True,则内含“被传输数据的长度”
DWORD Offset;          //读、写偏移位置,从文件头开始算起。若目标设备不支持文件位置,忽略
DWORD OffsetHigh;   //64位文件偏移中较高32位。若目标设备不支持文件位置,忽略
HANDLE hEvent;       //manual reset event,overlapped I/O完成时被激发。ReadFileEX,WriteFileEX忽略这个栏位,彼时被用来传递一个用户自定义的指针。
} OVERLAPPED, *LPOVERLAPPED;

OVERLAPPED 结构执行两个重要的功能。第一,它像一把钥匙,用以识别每一个目前正在进行的 overlapped 操作。第二,它在你和系统之间提供了一个共享区域,参数可以在该区域中双向传递。

通常overlapped结构存放在heap中。

3.被激发的File Handles

(1)异步IO的步骤:CreateFile指定FILE_FLAG_OVERLAPPED;设立一个OVERLAPPED结构,调用ReadFile、WriteFile带上这个参数。

(2)文件handle是一个核心对象,一旦操作完毕即被激发。

(3)GetOverlappedResult()

BOOL GetOverlappedResult(
HANDLE hFile,                                        //文件设备的handle
LPOVERLAPPED lpOverlapped,                 //一个指针,指向overlapped结构
LPDWORD lpNumberOfBytesTransferred,  //一个指针,指向DWORD,保存真正被传输的字节数。
BOOL bWait                                          //是否要等待操作完成,TRUE表示等待。
);

(4)虽然你要求一个overlapped 操作,但它并不一定就是 overlapped!如果数据已经被放进 cache中,或如果操作系统认为它可以很快速地取得那份数据,那么文件操作就会在ReadFile() 返回之前完成,而 ReadFile() 将传回 TRUE。

(5)一个文件操作为 overlapped,而操作系统把“操作请求”放到队列中等待执行, ReadFile() 和、WriteFile()都会传回 FALSE 以示失败。这个行为并不是很直观, 你必须调用GetLastError() 并确定它传回 ERROR_IO_PENDING,那意味着“overlappedI/O 请求”被放进队列之中等待执行。GetLastError() 也可能传回其他的值,例如 ERROR_HANDLE_EOF,那就真正代表一个错误了。

4.被激发的event对象

(1)所使用的 event 对象必须是手动重置(manual-reset)而非自动重置(auto-reset)。

(2)IOBYEVENT例子。

5.异步过程调用(Asynchronous Procedure Calls,APCs)

(1)使用overlapped I/O与event搭配的两个问题:

<1>WaitForMultipleObjects最多等待64个对象。

<2>必须不断的根据“哪一个handle被激发”而计算如何反应。

(2)使用Ex版的ReadFile和WriteFile,可以使用异步过程调用机制。只有当线程处于alertable状态时,APCs才会被调用。当线程因为以下5个函数而处于等待状态,且线程的“alertable”标记被设为TRUE,则线程处于alertable状态:

SleepEx()

WaitForSingleObjectEx()

WaitForMultipleObjectEx()

MsgWaitForMultipleObjectsEx()

SignalObjectAndWait();

(3)用于 overlapped I/O 的 APCs 是一种所谓的 user mode APCs。WindowsNT 另有一种所谓的 kernel mode APCs。Kernel mode APCs 也会像 usermode APCs 一样被保存起来,但一个 kernel mode APC 一定会在下一个timeslice 被调用,不管线程当时正在做什么。 Kernel mode APCs 用来处理系统机能,不在应用程序的控制之中。

(4)提供的 I/O completion routine 应该有这样的型式:

VOID WINAPI FileIOCompletionRoutine(
DWORD dwErrorCode,   //0表示操作完成,ERROR_HANDLE_EOF表示操作已经到了文件尾端。
DWORD dwNumberOfBytesTransferred,//真正被传输的数据字节数
LPOVERLAPPED lpOverlapped//指向overlapped结构,此结构由开启overlapped I/O操作的函数提供
);

(5)使用 APCs 时,OVERLAPPED 结构中的 hEvent 栏位不需要用来放置一个 event handle。Win32 文件上说此时 hEvent 栏位可以由程序员自由运用。那么最大的用途就是:首先配置一个结构,描述数据来自哪里,或是要对数据进行一些什么操作,然后将 hEvent 栏位设定指向该结构

(6)在C++ 中产生一个I/O Completion Routines:储存一个指针,指向用户自定义数据(一个对象),然后经由此指针调用一个 C++ 成员函数。由于 static 成员函数是类的一部分,你还是可以调用 private 成员函数。

6.对文件进行overlapped I/O的缺点

(1)似乎 Windows NT 是以“I/O 请求”的大小来决定要不要将此请求先记录下来。所以对于数据量小的操作,overlapped I/O的效率反而更低。

(2)解决办法:以少量的线程负责所有的硬盘 I/O,然后把这些线程的I/O 请求,保持在一个队列之中。这种效率比较高。

(3)有两种情况,overlapped I/O 总是同步执行,甚至即使 FILE_FLAG_NO_BUFFERING 已经指定。第一种情况是你进行一个写入操作而造成文件的扩展。第二种情况是你读写一个压缩文件。

7.I/O Completion Ports

(1)APCs的缺点:最大的问题就是,有好几个 I/O APIs 并不支持 APCs,如listen() 和 WaitCommEvent() 便是两个例子。APCs 的另一个问题是,只有发出“overlapped 请求”的那个线程才能够提供 callback 函数,然而在一个“scalable”(译注)系统中,最好任何线程都能够服务 events。

(2)产生一个I/O Completion Port

HANDLE CreateIoCompletionPort(
HANDLE FileHandle,                        //文件或设备的handle,若为INVALID_HANDLE_VALUE,则产生一个没有和任何handle关联的port。
HANDLE ExistingCompletionPort,      //若此栏位被指定,则FileHandle被加到此port上。指定Null产生一个新的port。
DWORD CompletionKey,                  //用户自定义的一个数值,将被交给提供服务的线程。此值和FileHanlde有关联。
DWORD NumberOfConcurrentThreads//与此I/O completion port 有关联的线程个数。
);

(3)与一个文件handle产生关联

  再次使用CreateIoCompletionPort接口。

(4)在一个I/O Completion Port上等待

BOOL GetQueuedCompletionStatus(
HANDLE CompletionPort,                        //将在其上等待completion port。
LPDWORD lpNumberOfBytesTransferred,  //指向DWORD,收到“被传输的数据字节数”。
LPDWORD lpCompletionKey,                   //指向DWORD,该DWORD将收到由CreateIoCompletionPort定义的key。
LPOVERLAPPED *lpOverlapped,               //overlapped结构指针的地址。
DWORD dwMilliseconds                          //等待的最长时间,时间终了,lpOverlapped被设为NULL,函数传回FALSE。
);

在completion port上等待的线程是以先进后出的次序提供服务。

(5)避免Completion Packets

设定一个 OVERLAPPED 结构,内含一个合法的手动重置(manual-reset)event 对象,放在 hEvent 栏位。然后把该 handle 的最低位设为 1。

overlap.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

overlap.hEvent = (HANDLE)((DWORD)overlap.hEvent | 0x1);

WriteFile(hFile, buffer, 128,& dwBytesWritten, &overlap);

8.对Sockets使用Overlapped I/O

分析ECHO例子,多实践socket IOCP。

转载于:https://www.cnblogs.com/programmer-wfq/p/4646151.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358566.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯手游助手android版本,腾讯游戏助手下载-腾讯游戏助手 安卓版v3.3.4.22-PC6安卓网...

需要调用以下重要权限- 允许应用程序写入到外部存储器, 允许只读到电话状态访问&#xff0c;包括该装置的电话号码&#xff0c;当前蜂窝网络信息&#xff0c;任何正在进行的呼叫的状态&#xff0c;并且任何一个列表 PhoneAccount的注册在设备上, 允许应用程序从外部存储读取, 需…

java 并发 同步信号_Java并发教程–信号量

java 并发 同步信号这是我们将要进行的Java并发系列的第一部分。 具体来说&#xff0c;我们将深入研究Java 1.5及更高版本中内置的并发工具。 我们假设您对同步和易失性关键字有基本的了解。 第一篇文章将介绍信号量-特别是对信号量进行计数 。 信号量是用于限制对资源访问的经…

教你玩转CSS 尺寸 (Dimension)

目录 所有CSS 尺寸 (Dimension)属性 CSS 尺寸 (Dimension) 属性允许你控制元素的高度和宽度。同样&#xff0c;它允许你增加行间距。 所有CSS 尺寸 (Dimension)属性

目录扫描工具dirsearch用法

目录扫描工具-dirsearch 1.下载dirsearch#git clone https://github.com/maurosoria/dirsearch2. 进入dirsearch目录&#xff0c;进行扫描 每一列的含义分别是&#xff1a;扫描时间&#xff0c;状态码&#xff0c;大小&#xff0c;扫描的目录&#xff0c;重定向的地址 参数列…

Truncated incorrect DOUBLE value

我有点傻…… sql update语法&#xff0c;修改的字段之间要用,连接&#xff0c;而不是and 否则就会报错Truncated incorrect DOUBLE value…… 如&#xff1a; update teacher set IMAGE_URL #{1} and UPDATE_TIMEnow() where TEACHER_MOBILE #{0} 错误 update teacher set …

教你玩转CSS Display(显示) 与 Visibility(可见性)

目录 隐藏元素 - display:none或visibility:hidden CSS Display - 块和内联元素 如何改变一个元素显示 隐藏元素 - display:none或visibility:hidden 隐藏一个元素可以通过把display属性设置为”none”,或把visibility属性设置为”hidden”。但是请注意,这两种方法会产…

html dd自动换行,为什么我的dd里面的内容没有自动换行呢

2-6图文混排*{margin: 0;padding: 0;}.clear{clear: both;}.content{width: 1000px;margin: 0 auto;}.word{font-family: "微软雅黑";font-weight: bolder;font-size: 20px;padding-top: 10px;padding-bottom: 10px;text-align: center;}.content .pic-word dl{width…

Java 9抢先体验:与JShell的动手实践– Java REPL

从今天开始如何开始使用Java 9最酷的功能之一&#xff1f; 上周末&#xff0c;我终于开始尝试使用Java 9的早期访问版本了。第一站是JShell&#xff0c;它也被称为Project Kulla。 首先让我鼓起勇气尝试早期访问Java版本的原因。 那就对了。 Java 9的正式发布日期当前设置为2…

CSRF的绕过与利用

Origin & Referer Bypass Null值绕过 当遇到一个cors可用null值绕过时&#xff0c;用iframe配合data协议&#xff0c;就可以发送一个origin为null的请求。这个绕过方式同样也可以用在CSRF这里。 1<iframe sandbox"allow-scripts allow-top-navigation allow-forms&…

ASP.NET中禁止继承IIS中web.config根目录的配置

异常信息&#xff1a; Configuration Error Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appropriately. Parser…

教你玩转CSS Position(定位)

目录 CSS Position(定位) static 定位 fixed 定位 relative 定位 absolute 定位 sticky 定位 重叠的元素 所有的CSS定位属性

jOOQ配置

本文是我们学院课程的一部分&#xff0c;标题为jOOQ –类型安全的数据库查询 。 在SQL和特定关系数据库很重要的Java应用程序中&#xff0c;jOOQ是一个不错的选择。 当JPA / Hibernate抽象过多&#xff0c;JDBC过多时&#xff0c;这是一种替代方法。 它显示了一种现代的领域特…

可隐藏选项卡html,隐藏HTML中选定选项卡的底部边框

我有一个水平HTML选项卡&#xff0c;其中我希望隐藏所选选项卡的底部边框。隐藏HTML中选定选项卡的底部边框这个问题已经被问here和here但这两种解决方案都不能正常工作&#xff0c;因为我使用一个div结构&#xff0c;没有太大的JavaScript。jQuery(.tab-links a).on(click, fu…

JWT攻击手册

JSON Web Token&#xff08;JWT&#xff09;对于渗透测试人员而言可能是一种非常吸引人的攻击途径&#xff0c;因为它们不仅是让你获得无限访问权限的关键&#xff0c;而且还被视为隐藏了通往以下特权的途径&#xff1a;特权升级&#xff0c;信息泄露&#xff0c;SQLi&#xff…

DIV+CSS 入门

玩一小会儿前csdn什么时候&#xff0c;页面上的加qq而微博&#xff0c;我认为这是美好的。牛腩完成。运营商也开始了他真正的学习B/S之旅。刚開始的时候&#xff0c;我不知道<div>是什么 也不清楚CSS用来干什么的&#xff0c;敲完了回过头来再看&#xff0c;好像明确了一…

教你玩转CSS Overflow

目录 CSS Overflow overflow: visible CSS 布局 - Overflow CSS overflow 属性用于控制内容溢出元素框时显示的方式。 <style>#overflowTest {background: #4CAF50;color: white;padding: 15px;width: 80%;height: 100px;overflow: scroll;border: 1px solid #ccc;}&l…

了解Callable和Spring DeferredResult

1.简介 Servlet 3.0中引入的异步支持提供了在另一个线程中处理HTTP请求的可能性。 当您有一个长期运行的任务时&#xff0c;这特别有趣&#xff0c;因为当另一个线程处理此请求时&#xff0c;容器线程将被释放并可以继续处理其他请求。 关于这个主题的解释已经很多次了&#x…

html表单复选框样式,美化表单——自定义checkbox和radio样式

如果你对本站比较观注的话&#xff0c;应该很清楚&#xff0c;前面就有这方面的介绍。因为大家都知道表单中的部分元素如果单单使用CSS是没办法完成的&#xff0c;所以最近花全力在学习这方面的制作。在本站有关于这样制作有好几个教程了&#xff0c;比如说&#xff1a;我主要是…

BZOJ 3436: 小K的农场( 差分约束 )

orz云神...真的给跪了...BFS版spfa T 掉了...然后DFS版的就A了...我现在很迷茫....这就是个普通的差分约束... ------------------------------------------------------------------------------#include<cstdio>#include<cstring>#include<algorithm>#incl…

教你玩转CSS Float(浮动)

目录 什么是 CSS Float(浮动)? 元素怎样浮动 彼此相邻的浮动元素 清除浮动 - 使用 clear CSS 中所有的浮动属性 什么是 CSS Float(浮动)? CSS 的 Float(浮动),会使元素向左或向右移动