转-完成端口高效的三个原因
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 第四版>>,网络资料。
转-完成端口高效的三个原因相关推荐
- Kali Linux 网络扫描秘籍 第三章 端口扫描(三)
第三章 端口扫描(三) 作者:Justin Hutchens 译者:飞龙 协议:CC BY-NC-SA 4.0 3.13 Dmitry 连接扫描 另一个可以对远程系统执行 TCP 连接扫描的 替代工具 ...
- 开发者测评:相比 Harbor,我选择 ACR 的三点原因
2022 年 8 月起,阿里云容器镜像服务 ACR 开发者评测活动持续火热开展.截至目前,本次活动已累计吸引 600 余位开发者参与,产生了 30 位发布优质测评内容的开发者并获得相应奖励. 云原生生 ...
- JAVA大一新生要用电脑吗,大一新生有没有必要买电脑?辅导员:倘若不是这三点原因尽量别买...
原标题:大一新生有没有必要买电脑?辅导员:倘若不是这三点原因尽量别买 最近也有家长留言道:"有没有必要大一就给孩子买台电脑?买了怕孩子到大学荒废学业,不买孩子说要用,很纠结--"一 ...
- down 网卡端口周期性的up_down 网卡端口周期性的up_思科交换机端口down或up故障原因...
思科交换机端口down或up故障原因 接入层交换机出现故障,这个交换机的端口f0/6下连一个tp-link 的四口小交换机,上联端口为cisco 3560,有一段时间发现这个F0/6经常down ,然 ...
- 学Java发展前景好的三个原因
Java技术现在几乎无处不在,你只要使用到电子产品就会接触到Java相关的东西,现在大多数的企业也是使用Java语言进行开发.大数据.移动应用开发也是如火如荼的发展着,所以说现在学Java后的职业发展 ...
- 币安布局去中心化交易所,原来是因为这三个原因!
中国时间2月20日,正是币安发布去中心化交易所测试版的这一天,赵长鹏少有的接受了 Youtube区块链热门节目IVAN ON TECH的直播采访.如此巧合的时间点,无疑是币安有意而为之,将其作为推广去 ...
- 构建器模式_我喜欢构建器模式的三个原因
构建器模式 有三种方法可以用Java编程语言创建新对象: 伸缩构造函数(反)模式 Javabeans模式 建造者模式 与其他两种方法相比,我更喜欢使用构建器模式. 为什么? Joshua Bloch描 ...
- 我喜欢构建器模式的三个原因
有三种方法可以用Java编程语言创建新对象: 伸缩构造函数(反)模式 Javabeans模式 建造者模式 与其他两种方法相比,我更喜欢使用构建器模式. 为什么? Joshua Bloch描述了构建器模 ...
- 电脑卡顿不流畅是什么原因_什么造成游戏直播画画卡顿、延迟?这三个原因了解一下...
原标题:什么造成游戏直播画画卡顿.延迟?这三个原因了解一下 从事直播的朋友们相信都有所体会,直播时很容易出现画面卡顿.延迟的现象,这究竟是什么原因造成的呢?最可能是这几点! 1.服务器过载崩溃 说起服 ...
最新文章
- java nifty_Java NiftyDialogBuilder類代碼示例
- 让计算机自己写作文,写电脑的作文300字左右
- PTA第3章-2 查验身份证 (15 分)
- 每个人都有自己的秘密
- 智能计米器jk76怎么安装_春节智能锁消费指南:只看价格的后果有多严重?
- 大哥吾博文写得清清楚楚,怎么就不试一下?
- tftp工具_tftp,tftp等八款最佳的FTP客户端工具
- 航空公司客户价值分析的实验报告
- 如何在路由上封掉某个ip或某个断口
- 【业务安全03】密码找回业务安全
- 华人女性社交社区的存在可能
- 如何在浏览器 console 控制台中播放视频?
- 51单片机波形发生器产生各种波形的原理
- Chrome浏览器ERR_INVALID_SIGNED_EXCHANGE解决方案
- 谷歌浏览器打开显示2345浏览器界面
- java企业邮箱发送_Spring boot 的腾讯企业邮箱发送 实例
- 为什么用样本方差估计总体方差的统计量除以n-1
- 回顾这两个月的面试总结,不断的试错不断地坚持!!你也可以的
- PDF转换成PPT软件的使用方法
- vba筛选出满足条件的数据_大数据筛选出可疑账户!工商银行济源分行助力警方侦破一“地下钱庄”案件...