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