注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

mie

 
 
 

日志

 
 

【Unix/Linux服务器模型】Posix AIO模型的疑虑  

2010-05-30 02:21:30|  分类: 网络开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Posix AIO模型是一种高效的IO模型。所以,我最终决定使用该模型。

然而,开始就遇到了难题。基于该模型,可以实现两种效果。

一种就是windows的IOCP模型。然而,IOCP存在一个比较麻烦的问题:组包。因为数据包可能乱序了。虽然高效,却麻烦。尤其是在数万个连接的时候,假设每秒几万个数据包,对这些数据包进行处理的时候,数据包必须重新排序。假设,数据包A要被处理,此时需要查找数据包的上下相关的数据包,于是,若干次的查询,大量的CPU时间被耗用!

另外一种,就是线程池。每个线程处理若干个客户端连接。这样的处理不会导致数据包编号混乱,但是也会导致潜在的问题:负载不均衡

材料学中有一个名词,叫做“应力”,也就是“单位面积上所承受的附加内力”。如果应力集中,就会导致很严重的问题。例如,一根橡皮筋,我们使劲拉它,较细的地方一般会先断开,这就是应力集中导致的。所以,负载不均衡的后果是很严重的。

在多个线程的情况下,如果每个线程都处理一百个客户端连接,一种极限的情况是,某个线程A处理的一百个连接的数据流量很大,这会导致该线程极度繁忙。而另外一种极限的情况是,某个线程B的一百个连接,基本上没有什么数据传输,这会导致资源浪费。

所以,这种方法也是不太好的。

 

另外一个问题。AIO模型中,无论是事件通知还是回调函数模式,最终似乎都是回调。而根据网络上面的说法,有人称之为“线程回调函数”。我觉得这个称呼不妥。windows平台中,回调函数是线程相关的,回调函数是位于发起的线程内的。而linux平台中,也应该是这样才对。所以,如果称之为“线程回调”莫非是创建新的线程?很显然,这种可能性不大!

而如果是回调函数,这会导致新的问题。因为发起线程发起回调,这会导致,如果我在接受连接的线程发起回调,那么数据包就会被接受连接的线程接收到,这显然不是我要的结果。windows对此的处理很简单,事件通知很巧妙地解决了这一问题!继续查阅资料。

 

暂停Linux/Unix的服务器开发。也暂时不再做windows平台的FTP服务器。下一步,人工智能。接着是Windows平台基于IOCP的FTP服务器,在就是Linux/Unix的服务器模型。

 

By:zhanyonhu

  评论这张
 
阅读(1049)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016