iocp和select区别 (学习)

把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,因为可移植性是第一位的,偶尔有点性能小差距,相对与可移植性和代码的健壮性,完全可以无视

你可能感兴趣的:(c++,学习笔记,c++,学习笔记,http服务器)