from:http://blog.csdn.net/fatacy/article/details/1623045

1.避免了select的查询,可以从socket直接定位到完成端口。想象同时上千个连接的程序中,别的模型里只能通过select的方式对所有的socket链接查询一次才能知道哪个socket上有事件;而完成端口模型中,一旦一个socket上有事件发生,它立即将事件组成一个完成包放入完成端口(实际上是个队列,放入完成端口的内部API是KeInsertQueue),这时等待线程直接从中取出该事件,如此即避免了一次查询。

2.相对一个链接一个线程的模型,避免了大量线程切换,能够最大限度的利用CPU。

用一个线程管理多个连接的弊端显而易见,不能同时响应多个客户请求。那么一个连接对应一个线程呢?在连接数较多的情况下,大量的CPU时间都花在了线程切换上,从而降低了CPU的利用率。完成端口模型则限定了同时运行的线程数尽量控制在(N*CPU)之内,N一般为1。这样做的好处是减少了线程切换,提高了CPU的利用率。实际上完成端口是在管理一个线程池,它会记录当前活动的(即没有被I/O等事件阻塞)线程数,一旦活动线程数低于N*CPU个,将唤醒池内的其他线程。并且唤醒次序是LIFO。另外,当一个线程完成工作后,发现完成端口队列中仍有事件,可以保持其活动状态,继续处理。

3.任何一个线程在阻塞后,都可以通知完成端口,使其能激活其他等待线程。

完成端口之所以能够做到保持活动线程数在N*CPU之内(尽量),实际上是因为每个引起线程阻塞的API,比如ReadFile内部,都对完成端口做了处理,ReadFile中一旦发现当前线程在完成端口中,它将通知该完成端口此线程将变为非活动的,使其按需激活其他等待线程。

备注:

1.类Linux上的网络模型转到Windows上时可能产生明显的性能问题。一个是因为线程切换Windows不如Linux快,另一个是在类Linux系统上,socket的分配是从小到大,有小的空余则立即分配。想象这个模型,用一个数组存储socket,当链接不多时,遍历一遍socket可能很快,有效的socket都集中的数组起始部分。但Windows上的socket分配是随机的,即便只有几个链接,也可能很分散,再用数组存储socket,想访问一遍为数不多的socket,基本上也得遍历整个数组。

参考资料:<<深入解析Windows 第四版>>,网络资料。

转-完成端口高效的三个原因相关推荐

  1. Kali Linux 网络扫描秘籍 第三章 端口扫描(三)

    第三章 端口扫描(三) 作者:Justin Hutchens 译者:飞龙 协议:CC BY-NC-SA 4.0 3.13 Dmitry 连接扫描 另一个可以对远程系统执行 TCP 连接扫描的 替代工具 ...

  2. 开发者测评:相比 Harbor,我选择 ACR 的三点原因

    2022 年 8 月起,阿里云容器镜像服务 ACR 开发者评测活动持续火热开展.截至目前,本次活动已累计吸引 600 余位开发者参与,产生了 30 位发布优质测评内容的开发者并获得相应奖励. 云原生生 ...

  3. JAVA大一新生要用电脑吗,大一新生有没有必要买电脑?辅导员:倘若不是这三点原因尽量别买...

    原标题:大一新生有没有必要买电脑?辅导员:倘若不是这三点原因尽量别买 最近也有家长留言道:"有没有必要大一就给孩子买台电脑?买了怕孩子到大学荒废学业,不买孩子说要用,很纠结--"一 ...

  4. down 网卡端口周期性的up_down 网卡端口周期性的up_思科交换机端口down或up故障原因...

    思科交换机端口down或up故障原因 接入层交换机出现故障,这个交换机的端口f0/6下连一个tp-link 的四口小交换机,上联端口为cisco 3560,有一段时间发现这个F0/6经常down ,然 ...

  5. 学Java发展前景好的三个原因

    Java技术现在几乎无处不在,你只要使用到电子产品就会接触到Java相关的东西,现在大多数的企业也是使用Java语言进行开发.大数据.移动应用开发也是如火如荼的发展着,所以说现在学Java后的职业发展 ...

  6. 币安布局去中心化交易所,原来是因为这三个原因!

    中国时间2月20日,正是币安发布去中心化交易所测试版的这一天,赵长鹏少有的接受了 Youtube区块链热门节目IVAN ON TECH的直播采访.如此巧合的时间点,无疑是币安有意而为之,将其作为推广去 ...

  7. 构建器模式_我喜欢构建器模式的三个原因

    构建器模式 有三种方法可以用Java编程语言创建新对象: 伸缩构造函数(反)模式 Javabeans模式 建造者模式 与其他两种方法相比,我更喜欢使用构建器模式. 为什么? Joshua Bloch描 ...

  8. 我喜欢构建器模式的三个原因

    有三种方法可以用Java编程语言创建新对象: 伸缩构造函数(反)模式 Javabeans模式 建造者模式 与其他两种方法相比,我更喜欢使用构建器模式. 为什么? Joshua Bloch描述了构建器模 ...

  9. 电脑卡顿不流畅是什么原因_什么造成游戏直播画画卡顿、延迟?这三个原因了解一下...

    原标题:什么造成游戏直播画画卡顿.延迟?这三个原因了解一下 从事直播的朋友们相信都有所体会,直播时很容易出现画面卡顿.延迟的现象,这究竟是什么原因造成的呢?最可能是这几点! 1.服务器过载崩溃 说起服 ...

最新文章

  1. android dump 完整so,Android dump .so 文件crash log
  2. 代码详解:Numpy——通往人工智能的大门
  3. 计算机游戏的英文单词,关于游戏的英语词汇
  4. Boosting(提升方法)之GBDT
  5. 文档智能理解:通用文档预训练模型与数据集
  6. 取文字_玉镯取不出来了怎么办?教你6种最有效的方法
  7. 面向对象编程(十)——继承之Super关键字及内存分析
  8. Python变量:声明,连接,全局和本地
  9. 痕迹清理 - Windows
  10. PyQGIS开发者手册-4 使用栅格图层
  11. linux搭建stm32开发环境
  12. const注意点(对象赋值)
  13. dpdk大页内存原理
  14. Python:peewee常用操作CRUD
  15. h2 使用liquibase的changelog表格创建不成功
  16. 数据库 SQL Server 修改 表结构 脚本 sql语句
  17. 余世维 - 有效沟通
  18. SCT2430STER电池应用
  19. linux有哪些高级语言编译器,程序语言,操作系统,编译器三者之间有何关系?...
  20. Python中用于判断两个集合的交集是否为空集isdisjoint()方法

热门文章

  1. Oracle和Mysql的 != 差异
  2. Mysql压测工具mysqlslap 讲解
  3. An eventually consistent data model for Erlang (and Riak)
  4. 【EXLIBRIS】随笔记 001
  5. 全面异步化:淘宝反应式架构升级探索
  6. JS实现HashMap
  7. Python Day23 stark组件1
  8. dubbo 部分 配置的关系-dubbo github 官方案例
  9. 2018.1.15 6周1次课
  10. 英国脱欧但网络安全领域重视未减