首页 > 代码库 > 010 异步I/O处理 003

010 异步I/O处理 003

 异步I/0
  ○ 使用设备内核对象
  ○ 使用事件内核对象 提醒同步以及交互
  ○ 可提醒I/O 不可跨线程的
  ○ I/O完成端口

 

  ⊙ I/O完成端口

    ○ 串行模型来进行异步IO操作
    ○ 并行模型 -> 多线程

    ○ 1个工人 -> 加工零件 -> 5天 -> 串行
    ○ 5个工人 -> 加工零件 -> 1天 -> 并行

    ○ 单核 -> 模拟出来的多进程 线程
    ○ 多核 -> 多线程 核心数 -> CPU的一个核心
    ○ 一个进程内可以有多个线程 多线程
    ○ 线程和线程之间可以相互融合

  ⊙ I/O完成端口 天生就是并行模式

    ○ 并行模型 -> 多线程

    ○ 创建队列
      ○ 设备
      ○ 设备

    ○ 设备操作的队列

      ○ 线程池
      ○ 多个线程

    ○ 创建一个完成端口

1     HANDLE hIOCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE, nullptr, 0, 0);

● CreateIoCompletionPort 函数
1 HANDLE WINAPI CreateIoCompletionPort(
2   _In_     HANDLE    FileHandle,                        //内核对象
3   _In_opt_ HANDLE    ExistingCompletionPort,        //已存在的完成端口 为NULL 则位新建一个IOCP
4   _In_     ULONG_PTR CompletionKey,                    //传递处理函数的参数
5   _In_     DWORD     NumberOfConcurrentThreads        //设置线程数 尽量根据物理实际设置
6 );

● PostQueuedCompletionStatus
1 BOOL WINAPI PostQueuedCompletionStatus(
2   _In_     HANDLE       CompletionPort,                    //指定想向其发送一个完成数据包的完成端口对象
3   _In_     DWORD        dwNumberOfBytesTransferred,        //指定—个值,直接传递给GetQueuedCompletionStatus函数中对应的参数
4   _In_     ULONG_PTR    dwCompletionKey,                //指定—个值,直接传递给GetQueuedCompletionStatus函数中对应的参数
5   _In_opt_ LPOVERLAPPED lpOverlapped                    //指定—个值,直接传递给GetQueuedCompletionStatus函数中对应的参数
6 );

● GetQueuedCompletionStatus
BOOL WINAPI GetQueuedCompletionStatus(
  _In_  HANDLE       CompletionPort,                //指定想向其发送一个完成数据包的完成端口对象
  _Out_ LPDWORD      lpNumberOfBytes,            //一次完成后的I/O操作所传送数据的字节数。
  _Out_ PULONG_PTR   lpCompletionKey,            //当文件I/O操作完成后,用于存放与之关联的CK。
  _Out_ LPOVERLAPPED *lpOverlapped,            //OVERLAPPED  结构体指针
  _In_  DWORD        dwMilliseconds                //用于指定调用者等待CP的时间。
);

 



010 异步I/O处理 003