对于select 和 iocp 的分析。大家来拍砖。

XiongYouXiaoZhi 2012-05-11 05:16:12
都在说IOCP的效率高,select是个古老的API 效率低下。
但这个真的要看是什么应用了。其实我现在也很疑惑 到底该用谁
IOCP是异步IO 有多个工作线程为它工作 这样效率确实提高了,但如果逻辑处理是在另外的线程。那这样频繁的在工作线程和逻辑线程的同步 也会影响效率吧,特别是在请求多的时候,这样的同步代价不是很高吗?

select虽然在连接多的时候效率会下降 但可以通过多路来解决 即使这样也有瓶颈,但一般的应用足以应付。

注意到 其实很多大型网络游戏的服务器 用的就是select 并不是IOCP 一是考虑的是跨平台 二是效率其实没什么区别。可以通过架构来解决select的弱势。

不知道说的对不对。
...全文
616 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
butwang 2012-09-05
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]
把TCP/IP协议卷1-3 + UNIX网络编程看通,
然后在
486 Pentium MMX , 双核心 , 4核心 的CPU平台下
使用 10M 100M 1000M分别做测试,会得出超出你想象的结果!

硬件平台日新月异,推出 POLL , EPOLL, IOCP的初衷,是为了解决在有限CPU时间片内最高效率的利用网络带宽,当时针对的平台是486 - pentinum mmx级别的……
[/Quote]

学习了,天龙八部那一套就是select模型
danscort2000 2012-05-17
  • 打赏
  • 举报
回复
把TCP/IP协议卷1-3 + UNIX网络编程看通,
然后在
486 Pentium MMX , 双核心 , 4核心 的CPU平台下
使用 10M 100M 1000M分别做测试,会得出超出你想象的结果!

硬件平台日新月异,推出 POLL , EPOLL, IOCP的初衷,是为了解决在有限CPU时间片内最高效率的利用网络带宽,当时针对的平台是486 - pentinum mmx级别的 [EPOLL是在286 386时代,当然有SPARC等处理器,但是那不是给你一个人用的]
因为IOCP等是内核状态运行,效率当然比SELECT高
可能SELECT所在线程还要好几个时间片才轮到,但是内核线程是第一时间运行的,因此效率高

但是CPU发展到现在,网络带宽只提升了大约10倍,而CPU性能提升了几百上千倍,那些瓶颈已经不存在了,
推出IOCP的时候,微软自己的IIS都没有采用,它用的是驱动,因为那个时候CPU是瓶颈

CPU硬件还会快速发展,但是网络带宽的提升将远远落后于CPU性能的提升
所以在现在或者将来的平台上,你用SELECT也好,IOCP也好,EPOLL也好
效率的差距几乎可以忽略

至于那些说EPOLL或者IOCP明显比SELECT快的,要么是SELECT用的方法不正确,要么使用了某些极限平台,例如,在一个8核心的服务器上,使用超个8个线程做压缩,同时做对比测试,那么这个时候,IOCP的内核优势可以发挥出来了,内核态总是比SELECT的用户态响应速度要快,但是差距依然非常非常小,除非你把SOCKET的缓冲给关闭掉[设置为0]

其实,多参考国外那些开源的网络工程,你会发现,绝大部分都是用SELECT,连POLL都不用,更不会用EPOLL或者IOCP,因为可移植性是第一位的,偶尔有点性能小差距,相对与可移植性和代码的健壮性,完全可以无视
vocanicy 2012-05-14
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
IOCP在处理大数据量的时候稳定性确实不必select控制,
[/Quote]

这只能说明代码质量有问题

IOCP可以在多处理器的情况下发挥更大优势
lijianli9 2012-05-14
  • 打赏
  • 举报
回复
IOCP在处理大数据量的时候稳定性确实不必select控制,
jianghandaxue 2012-05-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
高低好坏都是要有一个标准的
如果用不同的标准去衡量肯定有不同的结果
其实我比较信奉一招鲜吃遍天
只要能解决问题
有的时候不需要方案移植
[/Quote]

确实.........
wjb_yd 2012-05-14
  • 打赏
  • 举报
回复
楼主你确定很多大型网游的服务器用的select???
wjb_yd 2012-05-14
  • 打赏
  • 举报
回复
楼主你确定很多大型网游的服务器用的select???
dfasri 2012-05-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

WINSOCK IOCP 效率高是指 在相同的线程情况下, 效率最高.
特别是针对例如HTTP协议这种 包较小 一来一回的协议.效率极高.
如果是传输大文件的话,用什么模型都一样.
[/Quote]

小包的效率, 最高的是UDP, 反正也只是一个小包的话, 何苦要用TCP? UDP的处理还节省连接处理, 收到一个包就处理一个包, 回复一个包, 简单快捷.
「已注销」 2012-05-13
  • 打赏
  • 举报
回复
你无论什么架构,网络传输的关键问题在于你如何对客户端的读写操作迅速做出回应。

select和iocp的能力差别就表现在这个地方。
chelp 2012-05-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
IOCP并不能提高处理效率,只能提高并发量。
[/Quote]提高并发量
xengine-qyt 2012-05-12
  • 打赏
  • 举报
回复
楼主还是多了解下LINUX在来说
向立天 2012-05-12
  • 打赏
  • 举报
回复
高低好坏都是要有一个标准的
如果用不同的标准去衡量肯定有不同的结果
其实我比较信奉一招鲜吃遍天
只要能解决问题
有的时候不需要方案移植
akmm88 2012-05-12
  • 打赏
  • 举报
回复
WINSOCK IOCP 效率高是指 在相同的线程情况下, 效率最高.
特别是针对例如HTTP协议这种 包较小 一来一回的协议.效率极高.
如果是传输大文件的话,用什么模型都一样.
smwhotjay 2012-05-12
  • 打赏
  • 举报
回复
我只
zhouzhipen 2012-05-11
  • 打赏
  • 举报
回复
IOCP并不能提高处理效率,只能提高并发量。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧