Linux的异步传输模式及ACE的Proactor模式

  Reactor是工作在同步模式下,Proactor工作在异步模式下。高性能服务器一定是工作在异步模式下的。所以,ACE中有Proactor这个类组。ACE的特点是跨平台和屏蔽技术细节,Proactor应该是编写一份代码,同时可以在Linux和Windows及其它操作系统上运行。实际开发中,我们发现,Proactor编写的服务程序在Windows下工作非常正常,在内核为2.6.X的Linux上就工作不正常,比如,客户的Connect操作就不能返回,经过检查,write和read必须成对出现才会工作正常,这也就是说,比如一个服务器注册到管理服务器,管理服务器不定期将控制指令发到子服务器上将不能实现,这是致命的。
  经过研究发现,原来ACE中的Proactor在Unix上是使用Posix标准实现的异步操作,Posix中有一个AIO,Proactor使用AIO实现异步传输。但Linux在2.6以前版本中不支持AIO,而在2.6版本以后,部分支持AIO。就因为这个部分支持,所以,Posix的子类不能正常工作。
  经过调研,ACE的开发者们知道这个情况,但是他们没有采取什么措施。自己想一想,Unix的平台不止一个Linux,而Linux多支持Posix标准,使用这样的解决方法是很理想化的。Linux早晚也会完全支持Posix的。就目前这种情况,ACE的开发者提出一个解决方案,就是TProactor,是另外一个人开发的解决方案。这个方案是将ACE中的Posix系列类重新实现,用线程和select模拟异步操作。这种方案也不错,但ACE没有包含这种解决方案,我个人认为这是ACE的开发者们坚持理想、追求完美。
  经过尝试TProactor安装比较麻烦,后来我又尝试了Posix_AIO,就是将AIO模拟实现的一个解决方案,使用这个解决方案连ACE中的类都不会替换,只需要在ACE的Makefile中libPosix_AIO.a这个库加进去就行了。 
  最后我是解决了这个问题,想必有很多使用ACE的Proactor的同道会遇到这个问题。现在我的系统是ACE+TProactor和Posix-AIO一起解决的。

转自: http://blog.newsfan.net/leelin/archive/2007/01/14/7248.aspx

你可能感兴趣的:(C++/STL/Boost)