知识点概述:
打开或关闭设备
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项添加到另一个线程的队列