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