zoukankan      html  css  js  c++  java
  • 完成端口

    来源:完成端口详解

    目标:使得CPU满负荷工作

    步骤:

    1. 创建一个完成端口
    2. 获取系统中CPU数量
    3. 根据2建立对应的worker线程(建议worker数量=CPU数量*2:同一个CPU核心上,一个线程处于Sleep()/WaitForSingleObject(),另一个线程可以代替这个线程执行)
    4. 创建一个用于监听的socket
    5. 绑定到完成端口
    6. 开始在指定端口上监听连接请求
    7. 在监听socket上投递AcceptEx请求
    8. worker线程工作
      1. 使用GetQueuedCompletionStatus()监控完成端口 (让worker线程进入不占用CPU的状态,直到出现需要处理的网络操作或超出等待时间为止)
      2. 收到Accept/Recv通知,_DoAccept()/_DoRecv()
    9. 关闭完成端口
      1. PostQueuedCompletionStatus() //,函数作用:将一个I/O数据包发送到一个I/O完成端口。提供了一种方式与线程池中的所有线程进行通信
      2. CloseHandle()

    优势:

    1. 使用AcceptEx:在与客户端通信之前,无论是否有客户端接入,AcceptEx都预先建立好socket
    2. 将IO操作从手动变为自动:不仅能自动通知数据可读写,还自动进行数据收发工作
    3. 一个连接对应一个线程,避免了大量线程切换
    4. 唤醒GetQueuedCompletionStatus()调用是后入先出模式,通过这种后入先出的算法,系统可以将那些未被调度的线程内存资源换出到磁盘,并将它们从处理器的高速缓存中清除,这也意味着让许多线程等待一个完成端口并不是坏事,如果我们等待的线程数大于已完成的I/O请求数,那么多余线程的资源将被换出内存。
  • 相关阅读:
    1-EI-灵魂画手解释安卓的Message对象
    2-VVI-材料设计之TabLayout下标签
    1.安卓基础之Activity生命周期
    golang复制一个指针对象(反射)
    小罗的面试题
    http1.0 、http1.1和http2.0的区别
    HTTP长连接、短连接究竟是什么?
    详解TCP中的拥塞控制
    TCP怎么保证传输的安全性
    ulimit设置完在其他用户上没有生效解决办法
  • 原文地址:https://www.cnblogs.com/tomatokely/p/8980462.html
Copyright © 2011-2022 走看看