【Windows核心编程笔记】第十章 同步设备I/O与异步设备I/O

知识点概述:

打开或关闭设备

CreateFile 创建和打开文件,当然也可以打开许多其他设备

打开文件的时候,传入的路径名不能超过MAX_PATH,但是加上”\\?\”之后可以不受此限制,注意这是针对绝对路径而言的

失败时返回值是INVALID_HANDLE_VALUE,而不是通常的NULL

 

使用文件设备

比如100kb文件压缩为10kb

GetFileSizeEx 获取文件逻辑大小---100kb

GetCompressedFileSize 获取文件物理大小---10kb

 

SetFilePointerEx 设置文件指针的位置

 

SetEndOfFile 强制设置文件大小

 

执行同步设备I/O

ReadFile 读

WriteFile 写

最后一个参数NULL表示同步

 

FlushFileBuffers 缓存数据写入到设备(是否缓存通过参数控制)

 

同步IO会阻塞同一线程的任何其他操作,所以有时我们需要取消同步操作

CancelSyncHronousIo

 

异步设备I/O基础

尽可能的执行异步操作,以创建响应良好的应用程序

 

CreateFile中指定参数dwFlagsAndAttributes FILE_FLAG_OVERLAPPED表明异步方式

ReadFile、WriteFile同上

 

在IO请求完成之前,一定不能移动或销毁发出请求时所使用的的数据缓存和OVERLAPPED结构,否则会破坏内存

 

CancelIo(CancelIoEx) 取消队列中的IO请求

 

接收IO请求完成通知

触发设备内核对象:

添加IO请求到队列之前,设备内核对象设为未触发状态,完成请求之后设为触发状态

WaitForSingleObject检查一个异步IO请求是否已经完成

这种触发设备内核对象的方法,不能处理多个IO请求,所以不实用

 

触发事件内核对象:

SetFileCompletionNotificationModes 不触发文件对象,提高性能(因为我们使用触发事件)

为每个请求创建事件(CreateEvent)。初始化给OVERLAPPED中的hEvent成员,然后使用WaitForMultipleObjects返回值判断哪个请求完成(dw-WAIT_OBJECT_0)

 

可提醒IO:

应该避免使用~

当创建一个线程的时候,会同时创建一个线程相关联的异步过程调用队列(APC)

QueryUserAPC 手动将一项加到APC队列中

 

IO完成端口:

CreateIoCompletionPort 创建一个IO完成端口,并与一个设备关联起来

线程池中的线程数:CPU数乘以2(经验~)

GetQueuedCompletionStatus 线程将自己切换到睡眠状态,等待IO请求完成进入完成端口

GetQueuedCompletionStatusEx 同时获取多个IO请求的结果,避免上下文切换开销

 

模拟已完成的IO请求

PostQueuedCompletionStatus 将一个APC项添加到另一个线程的队列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值