概述
- 在Windows应用程序中,我们可以给每个线程指定一个处理器,这样在多个处理器的机器上就可以同时执行多个操作,从而提高吞吐量。
- 但是,当一个线程发出一个同步I/O请求的时候,它就会被临时挂起,知道设备完成I/O请求为止。此类挂起会影响性能,因为线程卡在那里不能做别的事情。
- 为了不让线程闲下来,我们需要让各个线程就它们正在执行的操作互相通信。这种通信机制叫I/O完成端口。
- 通过使用I/O完成端口,我们可以让线程在读取设备和写入设备的时候不必等待设备的响应,从而显著地提高吞吐量。
- I/O完成端口可以与设备I/O有关,也可以和设备I/O无关,简单的说,它是一种有无数种用途的绝佳的线程间通信技术。
打开和关闭设备
设备 | 用途 |
文件 | 永久存储任何数据 |
目录 | 属性和文件压缩的设置 |
逻辑磁盘驱动器 | 格式化驱动器 |
物理磁盘驱动器 | 访问分区表 |
串口 | 通过电话线传输数据 |
并口 | 将数据传输至打印机 |
邮件槽 | 一对多数据传输,通常是通过网络传到另一台允许Windows的机器上 |
命名管道 | 一对一数据传输,通常是通过网络传到另一台允许Windows的机器上 |
匿名管道 | 单机上的一对一数据传输 |
套接字 | 报文或数据流的传输,通常是通过网络传到任何支持套接字的机器上(不一定是Windows系统) |
控制台 | 文本窗口的屏幕缓存 |
- 为了执行任何类型的I/O,我们必须先打开想要操作的设备并得到一个句柄。
设备 | 用来打开设备的函数 |
文件 | CreateFile(pszName)(路径名或UNC路径名) |
目录 | CreateFile(pszName) 调用这个函数的时候指定FILE_FLAG_BACKUP_SEMANTICS标志,Windows允许我们打开一个目录。 并且,打开的同时,可以改变目录的属性。 |
逻辑磁盘驱动器 | CreateFile(),pszName为"\\.x\:",打开逻辑磁盘驱动器,x是驱动器的盘符。 |
物理磁盘驱动器 | CreateFile(),pszName为"\\.PHYSICALDRIVEx",打开物理磁盘驱动器,x是驱动器的盘符。 |
串口 | CreateFile(),pszName为"COMx" |
并口 | CreateFile(),pszName为"LPTx" |
邮件槽服务器 | CreateMailslot(pszName),pszName为“\\.\mailslot\mailslotname” |
邮件槽客户端 | CreateFile(pszName),pszName为“\\.\mailslot\mailslotname” |
命名管道服务器 | CreateNamedPipe(pszName),pszName为“\\.\pipe\pipename” |
命名管道客户端 | CreateFile(pszName),pszName为“\\servername\pipe\pipename” |
匿名管道 | CreateFile用来打开服务器和客户端 |
套接字 | Socket,accept或AcceptEx |
控制台 | CreateConsoleScreenBuffer或GetStdHandle |
函数
设置串口的波特率
1 2 3 |
BOOL SetCommConfig(HANDLE hCommDev, LPCOMMCONFIG pCC, DWORD dwSize); |
在等待读取数据的时候,可以设置一个超时值
1 2 |
BOOL SetMailslotInfo(HANDLE hMailslot, DWORD dwReadTimeout); |
查看设备的类型
1 |
DWORD GetFileType(HANDLE hDevice); |
值 | 描述 |
FILE_TYPE_UNKNOWN | 文件为未知类型 |
FILE_TYPE_DISK | 文件是磁盘文件 |
FILE_TYPE_CHAR | 文件是字符文件,一般来说是一个并口设备或控制台 |
FILE_TYPE_PIPE | 文件是一个命名管道或匿名管道 |
CreateFile
1 2 3 4 5 6 |
HANDLE CreateFile(PCTSTR pszName, DWORD dwDesiredAccess, DWORD dwShareMode, PSECURITY_ATTRIBUTES psa, DWORD dwCreationDisposition, HANDLE hFileTemplate); |
- 参数一既可以表示设备的类型,也可以表示该类设备的某个实例。
- dwDesiredAccess用来指定我们想以何种方式来和设备进行数据传输。
值 | 含义 |
0 | 不希望从设备读取数据或传入数据 |
GENERIC_READ | 允许对设备进行只读访问 |
GENERIC_WRITE | 允许对设备进行只写访问。 |
GENERIC_READ | GENERIC_WRITE | 允许对设备进行读写操作 |
-
dwShareMode用来指定设备共享特权
-
psa安全信息
-
...
GetFileSizeEx
- 取文件的逻辑大小。
- 区别于GetCompressedFileSize取的是文件的物理大小。
SetFDilePointerEx
- 改变与文件内核对象相关联的文件指针。
SetEndOfFile
- 设置文件尾。
执行同步设备I/O
- ReadFile
- WriteFile
- 将数据刷新至设备:FlushFileBuffers
同步I/O的取消
- CancelSynchronousIo
异步I/O
- ReadFile
- WriteFile
取消设备I/O请求
- CancelIo
- CancelIoEx
I/O完成端口
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ COM组件_403/07
- ♥ Windows进程通信相关03/10
- ♥ Windows高级调试_调试器03/19
- ♥ COM组件_101/31
- ♥ breakpad记述:Windows下静态库的编译使用03/15
- ♥ Windows 核心编程 _ 创建&&终止线程07/02