Linux后台服务器编程。
分类: 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事件完成;
事件处理者,对已存放在缓冲区中的数据进行处理。