ACE_Proactor实现

来源:互联网 发布:餐饮软件考试指定 编辑:程序博客网 时间:2024/06/05 10:47

ACE_Proactor实现了Facade模式。
其方法可以分为四类。

  • 生命周期管理方法
  • 事件循环管理方法
  • 定时器管理方法
  • IO操作facilitator方法:
    -须知ACE_Proactor是使用Bridge模式的。ACE_aynch_Read/Write_Stream都是使用Bridge模式来访问他们用于特定的OS平台的IO操作工厂的灵活实现。所有的ACE_Proactor实现实际都转发由ACE_Proactor的实现类(_Impl)来处理。

1.windows中是由ACE_WIN32_Proactor类进行实现的。使用IO完成端口进行完成事件的检测。当初始化一个异步操作的工厂,如ACE_Asynch_Read_Stream时,前摄器的IO完成端口和IO句柄相关联。同时,windows的GetQueuedCompletionStatus函数负责执行射箭循环。同时所有为于ACE_WIN32_Proactor一起使用而定义的Result类都派生自Windows的OVERLAPPED结构。
定时器队列的到期管理在一个单独的线程中处理,是有ACE_WIN32_Proactor管理的。当一个定时器到期时,超时机制使用PostQueuedCompletionStatus函数完成投递给前摄器的IO完成端口。

2.Posix系统则是由ACE_POSIX_Proactor类实现的。异步IO的posix实现使用了控制块(structaiocb),以确定每个异步IO请求和控制信息。每个aiocb同时只能与一个IO请求相关联。
但是虽然封装的Poisx异步IO机制支持read和write操作,但他们不支持任何于TCP/IP连接相关的操作。为了支持ACE_Asynch_Acceptor和ACE_Asynch_Connector的各个函数,使用两外一个线程来执行于连接相关的操作。其实际模拟的过程就是若这两个类中的操作没有立即完成,则将socket登记到框架的内部管理的一个ACE_Select_Reactor实力。一个ACE_Proactor框架产生的线程(看不见应用程序)运行似有反应器的事件循环。当连接请求完成后,框架通过反应器回调来重新获取控制,并投递完成事件,原来的ACE_Asynch_Acceptor和ACE_Asynch_Connector类中适时的接收完成事件。
ACE_POSIX_Proactor的三类变种:
ACE_POSIX_AIOCB_Proactor-每个未完成的操作由每个列表中的条目代表。
ACE_POSIX_SIG_Proactor-来自ACE_AIOCB_Proactor,但使用POSIX实时信号来检测异步IO完成。事件循环使用sigtimedwait()和sigwaitinfo()函数来执行循环和获取与已完成操作有关的信息。
ACE_SUN_Proactor-来自ACE_AIOCB_Proactor,工作方式也是一样,不过使用Sun的aiowait()函数来检测IO完成。
虽然在支持POSIX4.0 AIO平台上,ACE_POSIX_SIG_Proactor是默认的前摄器实现的。但是在Linux上,由于线程实际是克隆的进程,而信号不能跨进程发送,异步IO操作和Proactor到期都是使用线程来实现的,所以在Linux上ACE_POSIX_SIG_Proactor无法良好的工作,所以ACE_POSIX_AIOCB_Proactor才是Linux上的默认前摄器的实现,其多路分离机制的aio_suspend是线程安全的,所以多个线程可以同时运行事件循环。

0 0
原创粉丝点击