008 异步I/O操作 001

异步I/O操作

  ● 同步I/O操作 文件越大,打开的时间就越长

    ○ 程序要从硬盘里面加载数据,过大会导致程序卡死

  ● 异步I/0

    ○ Windows给我现实的基质

    ○ 当文件过大的时候 磁盘读取会很耗费资源

    ○ 包括我们的I/O操作

    ○ 其他的I/O操作可能我无法打开还会耗费很多的系统资源

  ● 什么是异步I/0

    ○ 我们调用CreateFile使用 就会向操作系统的设备发送一个请求

    ○ 异步I/0通信过程 模型(无需等待)

      ○ 发送请求   -> 直接返回   -> 其他操作        -> 通知来了 (操作完成)

      ○ 操作系统看到 -> 实际来操作求求 -> 通知操作完成

    ○ 它在做某些操作的时候只是发送了一个求求然后就返回了

    ○ 它不会做这些实际的请求,这些实际的请求会由操作系统替我们完成

  ● 为什么会产生阻塞

    ○ 进程(存储)空间   (工厂)一个

    ○ 线程(工作)运行单位 (工作)工人 多个 多线程

       ○  跟CPU打交道是我们的线程

       ○  当我们的某些操作停止或者阻塞的时候都是说我们当前线程被停止或者被阻塞

  ● 如果来进行I/O操作

    ○ 1.线程来完成

    ○ 2.系统线程来完成

      ○ 操作系统也是一个线程

      ○ 想通过操作系统线程操作的话我们需要使用操作系统内置的i一些函数来完成

    ○ 如何来使用异步操作呢

      ○ 设置 CreateFile函数的参数

        ○ DWORD dwFlagsAndAttributes = FILE_FLAG_OVERLAPPED,

        ○ 所有的操作就会异步的方式来实现了

 1 typedef struct _OVERLAPPED {
 2   ULONG_PTR Internal;      //请求错误码
 3   ULONG_PTR InternalHigh;   //保存传输成功的字节数  //原来的老的版本是不存在的
 4   union {
 5     struct {
 6       DWORD Offset;              //64位的偏移量一个是低位
 7       DWORD OffsetHigh;            //64位的偏移量一个是高位
                        //用两个DWORD 组成一个64位的
8 }; 9 PVOID Pointer; 10 }; 11 HANDLE hEvent;              //内核对象 事件内核对象12 } OVERLAPPED, *LPOVERLAPPED;
 1 #include <iostream>
 2 #include <tchar.h>
 3 #include <windows.h>
 4 
 5 
 6 int main()
 7 {
 8     DWORD dwDesiredAccess = GENERIC_READ | GENERIC_WRITE;
 9     _In_ DWORD dwShareMode = FILE_SHARE_READ;
10     _In_ DWORD dwCreationDisposition = OPEN_ALWAYS;
11     _In_ DWORD dwFlagsAndAttributes = FILE_FLAG_OVERLAPPED;
12     _In_opt_ LPSECURITY_ATTRIBUTES lpSecruityAttributes = nullptr;
13     HANDLE hTemplateFile = nullptr;
14     HANDLE hFile = CreateFile(TEXT("Demo.txt"),dwDesiredAccess,dwShareMode,lpSecruityAttributes,dwCreationDisposition,dwFlagsAndAttributes,hTemplateFile);
15     OVERLAPPED overlapped = { 0 };
16     overlapped.Offset = 100;
17     BYTE bBuffer[MAXBYTE] = { 0 };
18     DWORD dwReadSize = 0;
19     BOOL bRet = ReadFile(hFile, bBuffer, MAXBYTE, nullptr, &overlapped);
20     DWORD dwError = GetLastError();
21 
22     if (bRet && dwError == ERROR_IO_PENDING)
23     {
24         //请求发送成功
25         //你的逻辑
26         WaitForSingleObject(hFile, INFINITE); //阻塞
27 
28     }
29 
30     system("pause");
31     return 0;
32 }
原文地址:https://www.cnblogs.com/sdk123/p/6872115.html