一、网络编程的处理方式
在网络编程中,一般会遇到几个重要的环节:
1、网络IO处理
这个是最基础的,即如何快速准确的响应相关的网络IO操作。这也是网络编程中很关键的一环,所以非常多的技术涌现了出来,包括前面分析的XDP等。其中可能又根据不同的层次又划分了多个情况。
2、数据分发
这是一个承上启下的环节。数据从IO处理获取后,如何从内核态向用户态分发复制。当然,如果把数据复制分发泛化,还可以理解成全链路的数据复制。
3、数据处理
这是用户层真切的能感知的一层。数据在拷贝到用户层后,用户层面对巨大的数据量,如何进行计算和处理(二次分发、转发或保存等等)。
为了更好的处理上述的问题,一般现在的网络编程比较常用的是使用两大数类处理方式,一种是基于线程的处理模式,一种是基于事件驱动的模式。本文先分析事件驱动模式。
二、事件驱动模型
事件驱动模型(Event Drive Model)是一个非常通用的模型,做为一种编程范式,它通过外部事件来驱动程序的执行。即程序中存在一个事件循环,当有外部事件触发相关动作时,便触发相应的回调处理函数进行操作。
三、事件驱动模式
事件驱动模型可以分为两种模式,即前摄器模式(Proactor)和反应器模式(Reactor)。当然这两种模式的名字可能不同的资料上有所不同,比如叫反应堆模式,大家自己明白即可。下就这两种模式进行一下分析:
1、前摄器模式
Proactor模式也可以称为主动器模式,它应用于异步IO操作。所有的事件一般要从一个多路事件分离器(Event Demultiplexer,由CPU或者其它来处理)来处理,用来得到事件触发中的具体的IO事件,并将其分发到指定的读写操作事件处理器(一般为回调函数或中断函数);反之亦然(处理事件请求)。包括下面Reactor模式基本也是这样。
前摄器模式的麻烦之处在于,纯的异步IO动作是需要底层OS支持的。但目前主流的OS基本就是类Linux和闭源的Windows。而前者的IO操作由于开源是清晰可知的,它只是单纯的IO多路利用,并不