把这两天做Proactor的一些经验和心得写一下,可能会给一些人帮助。
    Proactor是异步模式的网络处理器,ACE中叫做“前摄器”。
    先讲几个概念:
    前摄器(Proactor)-异步的事件多路分离器、处理器,是核心处理类。启动后由3个线程组成(你不需要关心这三个线程,我只是让你知道一下有这回事存在)。
    接受器(Acceptor)-用于服务端,监听在一个端口上,接受用户的请求。
    连接器(Connector)-用于客户端,去连接远程的监听。当然,如果远程是ACE写的,就是Acceptor。
    异步模式-即非阻塞模式。网络的传输速度一般来讲为10Mbps、100Mbps、1000Mbps。拿千兆网来说,实际的传输速度为1000Mbps/8大概为128KB左右。我们的CPU一般为P4 3.0GHZ,如果是32位的处理器,一秒钟大概可以处理6G的字节,那么,128KB的网络速度是远远及不上处理器的速度的。网络发送数据是一位一位发送出去的,如果CPU等在这里,发送完成函数才结束,那么,处理器浪费了大量时间在网络传输上。
    操作系统提供了异步的模式来传输网络数据,工作模式即:应用程序把要发送的数据交给操作系统,操作系统把数据放在系统缓冲区后就告诉应用程序OK了,我帮你发,应用程序该干嘛干嘛去。操作系统发送完成后,会给应用系统一个回执,告诉应用程序:刚才那个包发送完成了!
   举个例子:你有几封邮件和包裹要发,最有效率的办法是什么?你把邮件和包裹及交给总台,总台MM说,好了,你帮你发,你忙去吧!然后你去工作了。过了一会,总台MM打电话告诉你:“刚才我叫快递公司的人来了,把你的包裹发出去了。邮局的人也来了,取走了邮件,放心好了”。同样,如果你知道今天会有包裹来,比如你在淘宝上购物了,你能成天等在总台?你应该告诉总台MM:“今天可能有我的一个快递,你帮我收一下,晚上请你肯德基!”。MM:“看在肯得基的面子上,帮你收了”。某个时间,MM打电话来了:“帅哥,你的包裹到了,我帮你签收了,快来拿吧。”
   因为操作系统是很有效率的,所有,他在后台收发是很快的。应用程序也很简单。Proactor就是这种异步模式的。Proactor就是总台MM;ACE_Service_Handle就是总台代为收发邮件的公司流程。
   以上转载于http://www.cnblogs.com/acerrail/archive/2007/11/29/977415.html
   上面转载写的非常好,但是在网络延时很厉害的时候可能会出现点问题。我根据我的见解补充一下也,如果不对请各位指教。

   首先是说发数据:把邮件和包裹交个总台MM(假设一个邮件,一个包裹),过了一会总台妹妹打电话啊告诉你"邮件发出去了,但是包裹没有发出去" (通过RESULT你可以知道发送多少,一共要发送多少).这个时候总台MM会把包裹退还给你(从RESULT.message_block()中获得有什么数据没有发),我们开始重复以上的工作“包裹给总台MM,总台MM通知你发送结果”一直到你的邮件和包裹全部发送完为止。
   在就是收数据:告诉总台MM今天我一个包裹一个邮件,需要接收,你帮我收一下,十分钟后总台MM通知你“包裹来了”,你接手到包裹(表示实际上数据还未接收完),你就跟MM说“麻烦你回去继续等着我还有一个邮件”,总台MM就回去继续等知道你的邮件来了他在继续通知你。
   以上说的是在网络延迟的情况下出现的情况,如果在局域网中基本不存在以上的情况。
 

   不过在实际应用中 前置器在windows上的效果比较好,而在linux上主要还是使用反应器
posted on 2011-03-14 21:24 arrow8209 阅读(364) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


统计