浏览 470 次
|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2008-07-04 关键字: 网络编程
这两天看了点半同步/半异步模式的资料,看的文档是这一份http://www.cs.wustl.edu/~schmidt/PDF/HS-HA.pdf
对于如何实现异步层有点疑问,想请教一下大家。 在Windows下面,要实现异步io,可以使用iocp,因此异步层的实现应该问题不大。 但是在Linux下面如何实现异步层呢?Linux下是没有可以用于网络编程的异步IO的。 文章中提到可以使用Reactor模式来实现异步层,那么在Linux下也就是使用select或者poll或者epoll来实现了,但是这些都是同步io函数啊。是否就是说异步层可以用同步函数来实现? 另外还有一个疑问,就是关于Reactor模式与半同步/半异步模式的区别。我之前用Java的nio写过网络应用服务器程序,使用了Reactor模式,由于对数据的处理涉及数据库操作,所花的时间比较长,因此在最终的实现中有一个步骤是将数据丢到一个MQ队列中,由另外的一个线程从队列中取数据并作相应的处理。 假如如上面提到的,半同步/半异步模式的异步层可以使用Reactor模式来实现,并且可以使用select等函数,那么我这种做法不就是半同步/半异步模式所建议的做法么?那么半同步/半异步模式与Reactor模式的区别又体现在何处呢? 谢谢! 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2008-07-04
1 Linux用reactor模拟异步,跟proactor不一样的是,proactor将IO完成事件放入队列等待处理,demultiplexer阻塞在该队列,而reactor则将IO就绪事件放入队列,demultiplexer也阻塞在该队列,只不过proactor直接处理hook,而reactor的模拟还需要先进行数据IO
2 reactor和proactor是一类概念,处理的是网络连接并发问题,半同步半异步跟领导者跟随者是一类概念,面对的是网络连接之后,如何用线程池来处理后台各类任务 具体可参见schmidt的POSA volumn 2 |
|
| 返回顶楼 | |
|
时间:2008-07-04
fredzhang 写道 1 Linux用reactor模拟异步,跟proactor不一样的是,proactor将IO完成事件放入队列等待处理,demultiplexer阻塞在该队列,而reactor则将IO就绪事件放入队列,demultiplexer也阻塞在该队列,只不过proactor直接处理hook,而reactor的模拟还需要先进行数据IO
2 reactor和proactor是一类概念,处理的是网络连接并发问题,半同步半异步跟领导者跟随者是一类概念,面对的是网络连接之后,如何用线程池来处理后台各类任务 具体可参见schmidt的POSA volumn 2 谢谢! 我知道可以用reactor模式来模拟异步,但是这样的话在本质上仍然是同步啊。 半同步/半异步模式之所以要有一个异步层存在,目的在于利用异步操作得到性能上的提高,如果采用模拟的方式来做的话,是否算是违背了这个模式的约束呢? |
|
| 返回顶楼 | |
|
时间:2008-07-05
本质上的确是同步的,只不过在应用层面看起来好像是异步的。用reactor模拟proactor,好处在于可以在windows/unix平台上用统一的设计代码,而不必windows用proactor而类unix用reactor。
半同步半异步也属于应用层面的问题了,在应用看来的确是异步处理。 正好我也在看boost::asio的代码,这是用reactor模拟proactor的一个好例子,还有一个例子是TProactor, 但它是建立在ACE基础上,我觉得那个太庞大,有兴趣你也可以研究一下那个的实现,并对比一下asio,看看两者有哪些不同。 此外,本版的iunknown写的sp_server也用到类似的思路,建议也研读一下它的实现就有概念了 |
|
| 返回顶楼 | |
|
时间:2008-07-05
ssnake 写道 我知道可以用reactor模式来模拟异步,但是这样的话在本质上仍然是同步啊。
半同步/半异步模式之所以要有一个异步层存在,目的在于利用异步操作得到性能上的提高,如果采用模拟的方式来做的话,是否算是违背了这个模式的约束呢? 其实计算机底层的硬件,通常都是采用中断的方式来工作的。对应到软件层面,通常称为 event-driven 。因此,无论 windows 的 IOCP 还是 unix 的 aio ,其实只不过是操作系统做了 event-driven 到异步操作的这个转换。不过由于 unix 的 aio 实现还存在一些问题,比如不支持 socket ,因此很多时候在 unix 平台只能在应用层面自己来做 event-driven 到异步操作的这个转换。 |
|
| 返回顶楼 | |
|
时间:2008-07-16
请问POSA2一书中的示例代码哪里有下?
到作者还有出版商的主页都找不到,难道是ACE的example目录里面那些代码? 谢谢 |
|
| 返回顶楼 | |
|
时间:2008-07-17
ssnake 写道 请问POSA2一书中的示例代码哪里有下?
到作者还有出版商的主页都找不到,难道是ACE的example目录里面那些代码? 谢谢 这里有一些资料,可以参考一下 http://cpp-circle.group.javaeye.com/group/topic/2116 |
|
| 返回顶楼 | |
|
时间:2008-07-19
posix确实没有针对socket描述符的异步io函数,不过估计今后会把aio系列函数推广到socket描述符的。
|
|
| 返回顶楼 | |





