• 011 异步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的时间。
    );


  • 相关阅读:
    mysql获取插入时自增ID值的方法
    percona-toolkit介绍及安装
    mysql如何修改所有的definer
    Mysql数据库安全管理配置
    mysql update时报错You are using safe update mode
    mysql修改definer方法
    mysqldump: Couldn't execute 'show table status '解决方法
    Linux下修改PATH路径
    mysql 查看当前登陆用户匹配原则及权限user()与current_user()
    ASP.NET MVC post请求接收参数的三种方式
  • 原文地址:https://www.cnblogs.com/sdk123/p/6915762.html
Copyright © 2020-2023  润新知