网络模型一共有这么几种, loop , fork, select, poll, epoll ..
我个人理解它们间的关系与演变过程的原因由下图所示,
以前看到的一段说的不错,补充一下:
一次IO操作都是2次系统调用,Select是先查询再发起IO请求,IOCP是先发起IO请求再接收通知。
但是Select方式在处理大量非活动连接时是比较低效的,因为每次Select需要对所有的Socket状态进行查询,
而对非活动的Socket查询是没有意义的浪费,另外由于Socket句柄不能设置用户私有数据,
当查询返回Socket句柄时还需要一个额外的查询来找到关联的用户对象,这两点是Select低效的关键。
在搞明白低效的原因之后只要接口稍作改进就可以对此进行优化,
Linux下的epoll模型就是对此的一种改进,epoll的改进在于:
1. 不再对Socket状态做查询,而是对Socket事件做查询,避免了无用的Socket状态检查
2. 在事件对象里可以设置用户私有数据,避免了从Socket句柄到用户对象的查询。