同步异步设备IO1机械制造设备维修与保养_机械制造-设备维修与保养.pdf

上传人:C****o 文档编号:95512113 上传时间:2023-08-25 格式:PDF 页数:7 大小:401.08KB
返回 下载 相关 举报
同步异步设备IO1机械制造设备维修与保养_机械制造-设备维修与保养.pdf_第1页
第1页 / 共7页
同步异步设备IO1机械制造设备维修与保养_机械制造-设备维修与保养.pdf_第2页
第2页 / 共7页
点击查看更多>>
资源描述

《同步异步设备IO1机械制造设备维修与保养_机械制造-设备维修与保养.pdf》由会员分享,可在线阅读,更多相关《同步异步设备IO1机械制造设备维修与保养_机械制造-设备维修与保养.pdf(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、 设备 I/O 的同步与异步 一、概述 Windows 的优势之一是它支持大量的设备类型,这里我们将设备笼统的定义为能够与之通信 的任何东西,常见的一些设备及打开方式有:设备 打开设备的函数 文件 CreateFile()目录 同上 逻辑磁盘驱动器 同上 物理磁盘驱动器 同上 串口 同上 并口 同上 邮件槽服务器 CreateMailslot()邮件槽客户端 CreateFile()命名管道服务器 CreateNamedPipe()命名管道客户端 CreateFile()匿名管道 CreatePipe()套接字 Socket()控制台 CreateConsoleScreenBuffer()Cr

2、eateStdHandle()当然,这里只是简单地列出了各个设备打开的 API,具体用法参数可以查阅 MSDN 或者 SDK。当线程与设备发生通信时,即线程发出设备 I/O 请求时,一般来说有两种方式:同步设备 I/O 请求:字如其名,线程发出设备 I/O 请求后,它会被临时挂起,直到设备完成 I/O 请求为止,显然这种方式严重损坏性能;异步设备 I/O 请求:线程发出设备 I/O 请求后,不会被临时挂起而是继续执行其他任务,而 设备同时继续处理 I/O 请求,设备处理完成后发送信号给线程,线程接着处理 I/O 结果。异 步设备 I/O 可以避免线程挂起导致的 CPU 大量闲置,提高了利用率和

3、吞吐量。与设备 I/O 的通信交互是 Windows 编程中的重点,涉及到诸多的线程的同步方式,尤其是 I/O 完成端口的引入,使得不管是否与设备 I/O 关联,都提供了一种有无数种用途的绝佳的 线程间通信机制。囿于学力,很多部分的理解都很有限,把自己掌握的整理出来,以便日后 再学习吧。这篇笔记的结构大致如下:打开和关闭设备 使用文件设备 异步设备 I/O 基础 接收 I/O 请求完成通知 二、打开和关闭设备 为了执行任何类型的设备 I/O,我们必须先打开想要操作的设备并得到一个句柄,随后我们 可以讲该句柄传给许多函数来与设备进行通信。这里同样用这个设备句柄来唯一标识我们的 设备。HANDLE

4、 CreateFile(PCTSTR pszName,DWORD dwDesiredAccess,DWORD dwShareMode,PSECURITY_A TTRIBUTES psa,1 DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hFileTemplate );从之前的表中也可以看出,CreateFile 是打开许多设备句柄的关键函数,所以我们对它的参数做一个具体的说明。pszName:既可以标识设备的类型,也可以表示该类设备的某个实例。dwDesiredAccess:用来指定我们相用什么样的方式来和设备进行数

5、据传输,常见的有 四个标志,它们是 0表示我们不希望对设备读出或写入任何数据,一般用来只想改变设备的配置(比如修 改文件的时间戳)GENERIC_READ 允许对设备进行只读访问 GENERIC_WRITE 允许对设备进行只写访问,比如备份软件或者将数据发送到打印机 GENERIC_READ|GENERIC_WRITE 允许对设备进行读写操作 dwShareMode:用来指定设备共享特权(device-sharing privilege),但我们打开一个设备 但是尚未调用 CloseHandle()关闭时,该参数可以控制其他的 CreateFile()调用以何种方 式打开设备。常见参数有 0要

6、求独占对设备的访问 FILE_SHARE_READ 只允许共享设备读取方式 FILE_SHARE_WRITE 只允许共享设备写入方式 FILE_SHARE_READ|FILE_SHARE_WRITE 不解释 FILE_SHARE_DELETE 对文件操作时我们不关心文件是否被逻辑删除或者被移动,先 将文件打上待删除标记,只有当该文件打开的所有句柄都被关闭的时候再将其真正删除 Psa 指向一个内核对象都具备的安全属性结构,里面可以指定安全信息以及我们是否希 望 CreateFile 返回的句柄能被继承。通常我们传入 NULL,这表示用默认的安全设定来创建文件,并且返回的句柄是不可继承的。dwCr

7、eationDisposition:用来表示用 CreateFile 打开文件时如果碰到存在的同名文件等情况如何处理,如 CREATE_NEW 若存在同名文件,则调用失败 CREATE_ALWAYS 若存在同名文件,则覆盖 OPEN_EXISTING 若打开的文件或者设备不存咋则调用失败 OPEN_ALWAYS 若打开文件不存在则只直接创建一个 当 调 用 CreateFile 打开文件之外的其他设备时,必须将 OPEN_EXISTING 传 给 dwCreationDisposition 参数 dwFlagsAndAttributes:允许我们设置一些标志来微调与设备之间的通信;其次我们还

8、可以通过一些属性参数来设置文件属性。比如常见的告诉缓存标志:FILE_FLAG_NO_BUFFERING 告诉高速缓存管理器我们不希望它对任何数据进行缓存,我 们会自己对数据进行缓存;标志 FILE_FLAG_DELETE_ON_CLOSE 可以让文件系统在文件 的所有句柄都被关闭后删除该文件(比如程序运行用到的临时文件,结束后删除,更加隐蔽),标志 FLIE_FLAG_BACKUP_SEMANTICS 用于备份和恢复软件,不要求文件的全部管理员 权限,还有一个重要的标志 FILE_FLAG_OVERLAPPED 告诉系统我们想要以异步方式来访 问设备,默认是同步 I/O 访问请求。我们重点来

9、介绍一下文件属性参数,可以看到常见的 Windows 文件属性都有涉及 FILE_ATTRIBUTE_ARCHIVE 存档文件,默认自动设置 2 东西常见的一些设备及打开方式有设备文件目录逻辑磁盘驱动器物理磁盘驱动器串口并口邮件槽服务器邮件槽客户端命名管道服务器命名管道客户端匿名管道套接字控制台打开设备的函数同上同上同上同上同上具体用法参数可以查当线程与设备发生通信时即线程发出设备同步设备请求字如其名线程发出设备请求为止显然这种方式严重损坏性能异步设备请求线程发出设备请求后不被临时挂起而是继续执行其他任务而设备同时继续处理请求设备处理完成后发送互是编程中的重点涉及到诸多的线程的同步方式尤其是完

10、成端口的引入使得不管是否与设备关联都提供了一种有无数种用途的绝佳的线程间通信机制囿于学力很多部分的理解都很有限把自己掌握的整理出来以便日后再学习吧这篇笔 FILE_ATTRIBUTE_ENCRYPTED 加密文件 FILE_ATTRIBUTE_HIDDEN 隐藏文件 FILE_ATTRIBUTE_NORMAL 没有其他属性,只有单独使用时才有效 FILE_ATTRIBUTE_SYSTEM 系统文件 FILE_ATTRIBUTE_READONL Y 只读文件 OK,可以看到右键文件属性的所有可能这里基本都有涉及,尽管没有向 Linux 那样提供了 丰富的命令行选项,但是 Windows 在 AP

11、I 参数中也为我们提供了尽可能多的功能选项。三、使用文件设备 文件的使用非常普遍,因此重点来讨论下与文件设备有关的问题。首先我们看看如何取得文 件的大小。BOOL GetFileSizeEx(HANDLE hFile,PLARGE_INTEGER pliFileSize/联合类型指针 );hFile 当然就是目标文件的句柄了,pliFileSize 是一个 LARGE_INTEGER 联合类型的地址,这个联合体允许我们以一个 64 位的有符号数的形式来引用一个 64 位有符号数,或者以两个 32 位值的形式来引用一个 64 位有符号数。下面是大概的定义:Typedef union _LARGE

12、_INTEGER Struct DWORD LowPart;/Low 32-bit unsigned value LONG HighPart;/High 32-bit signed value ;LONGLONG QuadPart;/Full 64-bit signed value LARGE_INTEGER,*PLARGE_INTEGER;我们调用 GetFileSizeEx 可以得到文件的逻辑大小,使用 GetCompressedFileSize 可以得到文 件压缩后的物理大小。如果要对一个文件读写,其实就是向文件发送一个 I/O 请求,当然,这里的道理其实不仅适 用于文件,对于设备同样适

13、用,如邮件槽、管道、套接字等等。我们通常使用如下函数发送 I/O 请求,BOOL ReadFile(HANDLE hFile,PVOID pvBuffer,DWORD nNumBytesToRead,PDWORD pdwNumBytes,OVERLAPPED*pOverlapped );BOOL WriteFile(HANDLE hFile,CONST VOID*pvBuffer,DWORD nNumBytesToWrite,PDWORD pdwNumBytes,OVERLAPPED*pOverlapped );执行同步 I/O 时 pOverlapped 设为 NULL,只有在异步 I/O

14、时才有意义。3 东西常见的一些设备及打开方式有设备文件目录逻辑磁盘驱动器物理磁盘驱动器串口并口邮件槽服务器邮件槽客户端命名管道服务器命名管道客户端匿名管道套接字控制台打开设备的函数同上同上同上同上同上具体用法参数可以查当线程与设备发生通信时即线程发出设备同步设备请求字如其名线程发出设备请求为止显然这种方式严重损坏性能异步设备请求线程发出设备请求后不被临时挂起而是继续执行其他任务而设备同时继续处理请求设备处理完成后发送互是编程中的重点涉及到诸多的线程的同步方式尤其是完成端口的引入使得不管是否与设备关联都提供了一种有无数种用途的绝佳的线程间通信机制囿于学力很多部分的理解都很有限把自己掌握的整理出来

15、以便日后再学习吧这篇笔 每当调用 CreateFile 时系统会创建一个文件内核对象来管理对文件的操作,在这个内核对象 中维护这一个文件指针,它指向一个 64 位的偏移量,表示应该在哪里执行下一次同步读取 或写入操作,我们称之为文件指针,初始化为 0。需要注意的是,调用 CreateFile 打开同一 个文件会得到多个文件内核对象,内部维护的文件指针彼此独立。我们可以使用 SetFilePointerEx 来设置文件指针的位置 BOOL SetFilePointerEx(HANDLE hFile,LARGE_INTEGER liDistanceToMove,PLAGER_INTEGER pli

16、NewFilePointer,DWORD dwMoveMethod );hFile 表示我们想要修改哪个文件内核对象的文件指针。liDistanceToMove 告诉系统我们想要 移动把指针在 dwMoveMethod 指定的位置移动多少个字节。使用负数可以将文件指针向后移动。dwMoveMehtod 告诉系统如何解释 liDistanceToMove,比如常用的参数值为 FILE_BEGIN 从文件头开始计算 liDistanceToMove,之和为当前的文件指针 FILE_CURRENT 从当前的文件指针位置开始计算 FILE_END 在文件末尾开始计算 我们给出一个小例子 /本程序用来实

17、验联系 Windows 关于文件读写操作的 API/命令行启动,参数作为写入文件的内容#include#include#include#include using namespacestd;int main(int argc,char*argv)/操作一个文件之前必须先调用 CreateFile()函数以指定的方式打开一个文件 /访问方式:GENERIC_READ|GENERIC_WRITE /共享模式:当文件被打开时,其他程序可以对该文进进行的操作,表示不允许同时对任何操作 /创建方式:当文件存在或者不存在时的处理策略 CREATE_ALWAYS,CREATE_NEW,OPEN_ALWAYS

18、,OPEN_EXISTING /新创建的文件属性:ARCHIVE(存档),HIDDEN,SYSTEM,READONLY/模板文件:没有则设为 NULL HANDLE hFile;hFile=CreateFile(L 桌面 FileAPITest.txt,GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_HIDDEN,NULL);if(hFile=INV ALID_HANDLE_V ALUE)coutCreateFile error!endl;return-1;4 东西常见的一些设备及打开方式有设备文件目录逻辑磁盘驱动器物理磁盘驱动器串口并口邮件槽服

19、务器邮件槽客户端命名管道服务器命名管道客户端匿名管道套接字控制台打开设备的函数同上同上同上同上同上具体用法参数可以查当线程与设备发生通信时即线程发出设备同步设备请求字如其名线程发出设备请求为止显然这种方式严重损坏性能异步设备请求线程发出设备请求后不被临时挂起而是继续执行其他任务而设备同时继续处理请求设备处理完成后发送互是编程中的重点涉及到诸多的线程的同步方式尤其是完成端口的引入使得不管是否与设备关联都提供了一种有无数种用途的绝佳的线程间通信机制囿于学力很多部分的理解都很有限把自己掌握的整理出来以便日后再学习吧这篇笔 /调用 SetFilePointer()函数凋整文 件指针位 置,移动到文 件

20、指定 位置:FILE_BEGIN,FILE_CURRENT,FILE_END /第二/三个参数指定在指定文件指针处移动到位置大小 if(SetFilePointer(hFile,0,NULL,FILE_END)=-1)coutSetFilePointer error!endl;return-2;/利用 WriteFile()函数将命令行的参数内容写入到指定的文件中 DWORD dwByteWritten;/实际写入的字节数 if(WriteFile(hFile,argv1,strlen(argv1),&dwByteWritten,NULL)=FALSE)coutWriteFile error!

21、endl;return-3;cout 写入数据成功!endl;/使用完毕后释放文件句柄 CloseHandle(hFile);return 0;/*PS:其他的相关函数:写入函数 ReadFile()复制函数 CopeFile()移动函数 MoveFile()删除函数 DeleteFile(LPCTSTR lpFileName);本函数用来生成了一个隐藏文件 */四、异步设备 I/O 基础 对于异步设备而言,线程访问 I/O 设备大致步骤如下:1.线程调用 CreateFile(.,FILE_FLAG_OVERLAPPED,.)以异步方式打开一个文件设备,调用 ReadFile/WriteFi

22、le 发送异步 I/O 请求;2.设备驱动将 I/O 请求加入等待队列,线程继续执行;3.设备执行完 I/O 请求返回给设备驱动程序,设备驱动发送信号给线程 4.线程继续执行 I/O 处理 线程将 I/O 请求加入设备等待队列的方法我们已经明白了,但是设备驱动如何告知线程 I/O 请求处理完毕呢?比着急,我们先来学习一下异步设备 I/O 的基本知识。我们已经知道,如果想异步访问一个 I/O 设备,必须首先用 CreateFile()传入 FILE_FLAG_OVERLAPPED 参 数 打 开 一 个 设 备 句 柄,然 后 调 用 ReadFile/WriteFile 将 I/O 请求加入设

23、备驱动程序的队列中。这里涉及到一个 OVERLAPPED 结构体,到底是怎么一回事呢?Typedef struct _OVERLAPPED 5 东西常见的一些设备及打开方式有设备文件目录逻辑磁盘驱动器物理磁盘驱动器串口并口邮件槽服务器邮件槽客户端命名管道服务器命名管道客户端匿名管道套接字控制台打开设备的函数同上同上同上同上同上具体用法参数可以查当线程与设备发生通信时即线程发出设备同步设备请求字如其名线程发出设备请求为止显然这种方式严重损坏性能异步设备请求线程发出设备请求后不被临时挂起而是继续执行其他任务而设备同时继续处理请求设备处理完成后发送互是编程中的重点涉及到诸多的线程的同步方式尤其是完成

24、端口的引入使得不管是否与设备关联都提供了一种有无数种用途的绝佳的线程间通信机制囿于学力很多部分的理解都很有限把自己掌握的整理出来以便日后再学习吧这篇笔 DWORD Internal;/out Error Code DWORD InternalHigh;/out Number of bytes transferred DWORD Offset;/in Low 32-bit file offset DWORD OffsetHigh;/in High 32-bit file offset HANDLE hEvent;/in Event handle or data OVERLAPPED,*LPOVE

25、RLAPPED;这里标注 out 的是在设备处理完 I/O 请求后添加的,不需要我们负责;我们需要初始化标注为 in 的三个参数。两个 32 位偏移量共同组成文件的 64 位偏移量,用来指定文件的文件指针位置,对于非文件设备 Offset 和 OffsetHigh 必须初始化 为 0,因为非文件设备不需要文件指针。使用异步设备 I/O 时我们有以下需要注意的问题:1.设备驱动程序不必以先入先出的方式来处理队列中的 I/O 请求 2.如果以同步方式执行 ReadFile/WriteFile,成功则返回非零值,失败返回 FALSE;如果以异步方式执行,执行成功也会返回 FALSE,利用 GerLa

26、stError 可以查看错误代码 ERROR_IO_PENDING 则表示异步 I/O 请求已被成功加入了队列,会在晚些时候执行。3.在异步 I/O 请求完成前,一定不能移动或是销毁在发出 I/O 请求时所使用的数据缓存和 OVERLAPPED 结构。4.我们必须为每一个 I/O 请求分配并初始化一个不同的 OVERLAPPED 结构五、接收 I/O 请求完成通知 这部分内容主要回到设备驱动如何告知线程 I/O 处理完的问题。Windows 提供了 四种方法,由易到难是 触发设备内核对象;触发事件内核对象;可提醒 I/O;I/O 完成端口。应该说,I/O 完成端口属于目前最完美的技术,但是对于

27、当前自己的程序而言不需要,所以只需要使用简单的设备内核对象或者事件内核对象就可以实现设备 I/O 请求的送达。触发设备内核对象 由于文件本身即是一种内核对象,触发规则为:有待处理的 I/O 请求时为未触发 状态,I/O 请求处理完成时为触发状态。因而我们只需要使用 WaitForSingleObject(hFile,INFINITE)一个语句即可,当然这个语句要放到一定代 码之后,估计 I/O 请求处理完毕之后再进入检查文件是否触发。我们给出一个示例代码 HANDLE hFile=CreateFile(.,FILE_FLAG_OVERLAPPED,.);BYTE bBuffer100;OVER

28、LAPPED ol=0;ol.Offset=345;BOOL bReadDone=ReadFile(hFile,bBuffer,100,NULL,&ol);DWORD dwError=GetLastError();If(!bReadDone&(dwError=ERROR_IO_PENDING)WaitForSingleObject(hFile,INFINITE);bReadDone=TRUE;6 东西常见的一些设备及打开方式有设备文件目录逻辑磁盘驱动器物理磁盘驱动器串口并口邮件槽服务器邮件槽客户端命名管道服务器命名管道客户端匿名管道套接字控制台打开设备的函数同上同上同上同上同上具体用法参数可以

29、查当线程与设备发生通信时即线程发出设备同步设备请求字如其名线程发出设备请求为止显然这种方式严重损坏性能异步设备请求线程发出设备请求后不被临时挂起而是继续执行其他任务而设备同时继续处理请求设备处理完成后发送互是编程中的重点涉及到诸多的线程的同步方式尤其是完成端口的引入使得不管是否与设备关联都提供了一种有无数种用途的绝佳的线程间通信机制囿于学力很多部分的理解都很有限把自己掌握的整理出来以便日后再学习吧这篇笔 触发事件内核对象 只需要将文件内核对象改为事件内核对象就可以了,这里需要注意的是此时 OVERLAPPED 结构的最后一个成员 hEvent 需要和我们的事件内核对象绑定起来,我们给出一个方法

30、来同时执行多个异步设备 I/O 操作并使用同一个设备对象。HANDLE hFile=CreateFile(.,FILE_FLAG_OVERLAPPED,.);BYTE bReadBuffer10;OVERLAPPED oRead=0;oRead.Offset=0;oRead.hEvent=CreateEvent(.);ReadFile(hFile,bReadBuffer,10,NULL,&oRead);BYTE bWriteBuffer10=0,1,2,3,4,5,6,7,8,9;OVERLAPPED oWrite=0;oWrite.Offset=0;oWrite.hEvent=CreateE

31、vent(.);WriteFile(hFile,bWriteBuffer,_countof(bWriteBuffer),NULL,&oWrite);.HANDLE h2;H0=oRead.hEvent;H1=oWrite.hEvent;DWORD dw=WaitForMultipleObjects(2,h,FALSE,INFINITE);Switch(dw-WAIT_OBJECT_0)Case 0:/Read completed breadk;Case 1:/Write completed Break;7 东西常见的一些设备及打开方式有设备文件目录逻辑磁盘驱动器物理磁盘驱动器串口并口邮件槽服务器邮件槽客户端命名管道服务器命名管道客户端匿名管道套接字控制台打开设备的函数同上同上同上同上同上具体用法参数可以查当线程与设备发生通信时即线程发出设备同步设备请求字如其名线程发出设备请求为止显然这种方式严重损坏性能异步设备请求线程发出设备请求后不被临时挂起而是继续执行其他任务而设备同时继续处理请求设备处理完成后发送互是编程中的重点涉及到诸多的线程的同步方式尤其是完成端口的引入使得不管是否与设备关联都提供了一种有无数种用途的绝佳的线程间通信机制囿于学力很多部分的理解都很有限把自己掌握的整理出来以便日后再学习吧这篇笔

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > PPT文档

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁