作者:jmz(0电商技术组)
如何使网络服务器能够处理数以万计的客户端连接,这个问题被称为C10KProblem。在很多系统中,网络框架的性能直接决定了系统的整体性能,因此研究解决高性能网络编程框架问题具有十分重要的意义。
1.网络编程模型在C10KProblem中,给出了一些常见的解决大量并发连接的方案和模型,在此根据自己理解去除了一些不实际的方案,并做了一些整理。
1.1、PPC/TPC模型典型的Apache模型(ProcessPerConnection,简称PPC),TPC(ThreadPerConnection)模型,这两种模型思想类似,就是让每一个到来的连接都一边自己做事直到完成。只是PPC是为每个连接开了一个进程,而TPC开了一个线程。可是当连接多了之后,如此多的进程/线程切换需要大量的开销;这类模型能接受的最大连接数都不会高,一般在几百个左右。
1.、异步网络编程模型异步网络编程模型都依赖于I/O多路复用模式。一般地,I/O多路复用机制都依赖于一个事件多路分离器(EventDemultiplexer)。分离器对象可将来自事件源的I/O事件分离出来,并分发到对应的read/write事件处理器(EventHandler)。开发人员预先注册需要处理的事件及其事件处理器(或回调函数);事件分离器负责将请求事件传递给事件处理器。两个与事件分离器有关的模式是Reactor和Proactor。Reactor模式采用同步IO,而Proactor采用异步IO。
在Reactor中,事件分离器负责等待文件描述符或socket为读写操作准备就绪,然后将就绪事件传递给对应的处理器,最后由处理器负责完成实际的读写工作。
而在Proactor模式中,处理器--或者兼任处理器的事件分离器,只负责发起异步读写操作。IO操作本身由操作系统来完成。传递给操作系统的参数需要包括用户定义的数据缓冲区地址和数据大小,操作系统才能从中得到写出操作所需数据,或写入从socket读到的数据。事件分离器捕获IO操作完成事件,然后将事件传递给对应处理器。
l在Reactor中实现读:
-注册读就绪事件和相应的事件处理器
-事件分离器等待事件
-事件到来,激活分离器,分离器调用事件对应的处理器
-事件处理器完成实际的读操作,处理读到的数据,注册新事件,然后返还控制权
l在Proactor中实现读:
-处理器发起异步读操作(注意:操作系统必须支持异步IO)。在这种情况下,处理器无视IO就绪事件,它