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. java nifty_Java NiftyDialogBuilder類代碼示例
  2. 让计算机自己写作文,写电脑的作文300字左右
  3. PTA第3章-2 查验身份证 (15 分)
  4. 每个人都有自己的秘密
  5. 智能计米器jk76怎么安装_春节智能锁消费指南:只看价格的后果有多严重?
  6. 大哥吾博文写得清清楚楚,怎么就不试一下?
  7. tftp工具_tftp,tftp等八款最佳的FTP客户端工具
  8. 航空公司客户价值分析的实验报告
  9. 如何在路由上封掉某个ip或某个断口
  10. 【业务安全03】密码找回业务安全
  11. 华人女性社交社区的存在可能
  12. 如何在浏览器 console 控制台中播放视频?
  13. 51单片机波形发生器产生各种波形的原理
  14. Chrome浏览器ERR_INVALID_SIGNED_EXCHANGE解决方案
  15. 谷歌浏览器打开显示2345浏览器界面
  16. java企业邮箱发送_Spring boot 的腾讯企业邮箱发送 实例
  17. 为什么用样本方差估计总体方差的统计量除以n-1
  18. 回顾这两个月的面试总结,不断的试错不断地坚持!!你也可以的
  19. PDF转换成PPT软件的使用方法
  20. vba筛选出满足条件的数据_大数据筛选出可疑账户!工商银行济源分行助力警方侦破一“地下钱庄”案件...

热门文章

  1. Java基础知识回顾-6
  2. jenkins如何在一台机器上开启多个slave
  3. 基于OpenCV之视频读取,处理和显示框架的搭建(一)
  4. 一份非常详尽的 Objective-C 到 Swift 的迁移指南
  5. mysql数据库-主主配置
  6. HTTP与HTTPS区别/HTTPS知识点
  7. [转]Git远程操作详解
  8. 黄聪:Dsicuz x2.5、X3、X3.2如何去掉域名后面的/forum.php
  9. 七日Python之路--第八天
  10. 启用Apache Mod_rewrite模块