Chinaunix首页 | 论坛 | 博客
  • 博客访问: 891837
  • 博文数量: 299
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2493
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-21 10:07
个人简介

Linux后台服务器编程。

文章分类

全部博文(299)

文章存档

2015年(2)

2014年(297)

分类: C/C++

2014-11-11 22:03:23

1: 我预先需要知道哪些知识?

   1)socket 通讯的基本知识:如tcp/ip基本原理,socket编程的基本知识,blocking/noblocking。

   2) 关于select/poll/epoll模型的相关基础知识,知道其基本工作原理。

   3) IOCP(IO Completion Port)完成端口的基本知识,见附录2。

   4) Reactor模式。

   5)Proactor模式。

               

其中各个角色的职责及功能如下:

1:Asynchronous Operation

  其主要执行相关的异步操作,例如:通过socket进行异步读写。

2:AsynchronousOperation Processor

  当操作完成后,执行异步操作以及相关完成队列上完成事件的相关操作。从高层用户的角度来看,stream_socket_service就是一个 Asynchronous Operation Processor。更加具体的就是使用win_iocp_io_service或task_io_service来完成相应操作完成事件的入队列。在后面的文章中我们将会讨论这两个相关的类。

3:CompletionEvent Queue

  完成事件队列,保存完成事件,直到由异步事件多路复用器从事件队列中取出并将其派发。

4:CompletionHandler

   由函数对象来处理异步操作的结果。在boost中由boost::bind来完成相关事件与处理函


数句柄的绑定。在指定的事件发生后,系统将调用其所注册的句柄来对其进行服务。

5:AsynchronousEvent Demultiplexer

  异步事件的多路复用器,阻塞并等待事件发生,并将该完成事件返回其调用者。

6:Proactor

  调用异步事件多路复用器,从事件队列中取出事件,并将带有完成事件的完成句柄派发出。在BOOST中由io_service来描述该概念。

7:Initiator

  位于应用层,其发起一个异步操作。Initiator通过高层接口,例如:basic_stream_socket,与Asynchronous Operation Processor 交互,其完成类似stream_socket_service之类的用户行为服务。一个Proactor模式的相关sample code如附录3所示。


BOOST::ASIO在具体的实现中对于异步IO 在不同的平台下其具体实现方式有所不同:在非Windows平台下,其采用Reactor模式来实现。例如:在Linux/FreeBSD Unix/Mac OS平台下所采用的select/epoll/kqueue;而在Windows平台下,则采用Overlapped IO来实现。

 

两种模式(Reactor与Proactor)之间对比关系如下:

l  Reactor模式

n 某个事件处理者宣称它对某个socket上的读/写事件很感兴趣;

n 事件分离者等着这个事件的发生;

n 当事件发生了,事件分离器被唤醒,这负责通知先前那个事件处理者;

n 事件处理者收到消息,于是去那个socket上读/写数据。如果需要,它再次宣称对这个socket上的读/写事件感兴趣,一直重复上面的步骤;

l  Proactor模式

n 事件处理者直接投递发一个读/写操作(需OS支持这个异步IO操作). 这个时候,事件处理者不在关心读/写事件,它只管发这么个请求,它所关注的是读/写操作事件的完成。其只需发出请求命令后,其它事件交由系统,其只需等待操作的完成消息;

n 事件分离者等着这个读/写事件的完成(与Reactor不同);

n 事件分离者等待完成事件,操作系统进行具体的IO操作,它从目标读取数据,放入用户提供的缓存区中,最后通知事件分离者,IO事情完成;

n 事件分离者通知之前的事件处理者: IO事件完成;

事件处理者,对已存放在缓冲区中的数据进行处理。
阅读(2183) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~