• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2024-07-22 19:10 Aet 隐藏边栏 |   抢沙发  7 
文章评分 2 次,平均分 5.0

概述

什么是完成端口

  1. WindowsI/O 完成端口(I/O Completion Ports, IOCP)是一种高效的 I/O 复用模型
    1. 广泛用于构建高性能的网络服务器和其他需要处理大量并发 I/O 操作的应用程序
  2. 完成端口(Completion Port)是 Windows 内核提供的一种系统资源,就像文件句柄、套接字一样
  3. 调用 CreateIoCompletionPort 函数时,本质上是在向操作系统申请一个完成端口的资源,用于管理异步 I/O 操作的完成通知

原理

  1. IOCP 是基于 Windows 的异步 I/O 模型,旨在通过减少线程上下文切换和锁竞争,提高高并发环境下的系统性能
  2. 其核心思想是使用完成端口(Completion Port)来管理和分发 I/O 操作的完成通知

核心组件

  1. 完成端口
    1. 用于管理多个异步 I/O 请求,并将完成的 I/O 操作通知工作线程
  2. 工作线程
    1. 执行异步 I/O 操作的回调处理
  3. 重叠结构
    1. 用于表示异步 I/O 操作的状态和结果

工作原理

  1. 创建完成端口
    1. 当调用 CreateIoCompletionPort 创建完成端口时,操作系统会分配一个完成端口对象,并为其创建一个内部队列,用于存储完成的 I/O 操作通知

  1. 关联文件或套接字句柄
    1. 当你将文件句柄或套接字句柄与完成端口关联时,操作系统会记录这个关联,并在该句柄上进行的异步 I/O 操作时,使用这个完成端口进行通知

  1. 启动异步 I/O 操作
    1. 使用异步 I/O 函数(如 ReadFileWriteFileWSARecvWSASend 等)启动 I/O 操作,并传入重叠结构(OVERLAPPED 结构)

  1. 操作系统管理和监控
    1. 操作系统内部会监控这些异步 I/O 操作
    2. I/O 操作完成或出现错误时,操作系统会将完成信息(包括完成键、传输的字节数和重叠结构指针)放入完成端口的队列中
  2. 工作线程处理完成通知
    1. 在你的应用程序中,工作线程会调用 GetQueuedCompletionStatus 函数,从完成端口队列中获取完成的 I/O 操作通知
    2. 这个函数会阻塞,直到有完成的 I/O 操作可供处理

注意

完成键

  1. 完成键是你在调用 CreateIoCompletionPort 时与句柄关联的一个值
  2. 这个值在 I/O 操作完成时被传递给 GetQueuedCompletionStatus,可以用来识别不同的 I/O 操作源

重叠结构

  1. 每个异步 I/O 操作需要一个 OVERLAPPED 结构。这个结构不能被重用,直到操作完成
    1. 确保正确管理 OVERLAPPED 结构的生命周期

线程池和并发性

  1. IOCP 可以自动调节并发性,通过 CreateIoCompletionPort 的最后一个参数指定并发线程数
  2. 这个参数通常设为 0,让系统自动选择合理的值

  1. 创建的工作线程数应该适应系统的并发能力,通常与 CPU 核心数相关

错误处理

  1. 处理 I/O 操作的错误非常重要
    1. 在调用异步 I/O 操作后,检查返回值和 GetLastError
    2. GetQueuedCompletionStatus 返回 FALSE 时,同样需要检查错误码

超时和取消

  1. GetQueuedCompletionStatus 可以设置超时参数,通过设定合理的超时值,避免线程永久阻塞
  2. 此外,使用 CancelIoCancelIoEx 取消未完成的 I/O 操作

处理半关闭状态

  1. 对于网络套接字,处理半关闭(half-closed)状态时需要特别注意
    1. 确保正确处理读写操作的结束情况

资源清理

  1. 确保正确关闭句柄和完成端口,以避免资源泄漏

队列深度和负载均衡

  1. 根据负载情况调整队列深度和并发线程数
  2. 过多的线程和未完成的 I/O 操作可能导致系统性能下降
    1. 通过监控和调优,确保系统在高效工作

PostQueuedCompletionStatus

  1. 可以使用 PostQueuedCompletionStatus 手动向完成端口发送自定义的完成包,用于通知工作线程执行非 I/O 任务

异步 I/O 与同步 I/O 的混合使用

  1. 在某些情况下,可以将异步 I/O 和同步 I/O 混合使用,灵活应对不同的 I/O 需求

内核对象

文件句柄

  1. 任何支持重叠 I/O 操作的文件句柄都可以与 IOCP 关联
  2. 这包括标准文件、设备文件等。通过 ReadFileWriteFile 等函数,可以对这些文件句柄执行异步 I/O 操作

套接字

  1. 套接字是最常用的与 IOCP 一起工作的内核对象之一
  2. Windows Sockets APIWinsock)支持重叠 I/O 操作,允许通过 WSARecvWSASend 等函数执行异步网络 I/O 操作

管道

  1. 命名管道(Named Pipes)和匿名管道(Anonymous Pipes)也可以与 IOCP 一起使用
  2. 通过重叠 I/O 操作,可以高效地管理跨进程通信

串口

  1. 串口设备支持重叠 I/O 操作,允许与 IOCP 结合使用以实现高效的串口通信

邮件槽

  1. 邮件槽是一种简单的消息传递机制,支持重叠 I/O 操作,可以与 IOCP 一起使用

其他支持重叠IO的设备

  1. 任何支持重叠 I/O 操作的设备句柄都可以与 IOCP 关联。这包括一些特殊设备和驱动程序

示例代码

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0 最后编辑于:2024-07-27
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享