最近准备实现一个底层网络框架, 以供以后开发网络程序时使用。在开发的过程中,慢慢的意识到在框架设计中存在的一些问题。以下是自己的思考。
- 采用windows 还是 linux. 我选windows, 因为windows 的IOCP资料比较多, 而且提供的支持库,开发环境都比linux 要方便。可以首先在windows 上做一个实现。以后如果有需要的化,再移植到linux上. 只要系统架构设计合理,分层明确,移植应该不会太困难。
- 要提高服务器性能,一个重要部分就是内存的管理。 一般采用两种解决方法, 内存池 和Free List. 通过使用内存池,可以减少内存碎片,并提高内存分配,回收的速度。 这里我采用Boost 的Memory Pool. Free List 主要是减少频繁使用对象的构建和解构操作, 在服务器中,有大量的Session对象,这些对象如果频繁构造,释放的化,对性能影响很大, 通过把这些对象缓存起来,应该对于服务器的性能提升有一定作用。
- 合理的分层和框架主设计模式的选择。 只有分层,才能设计出比较有扩展性的框架。 这里的分层,我参考的是ACE 的分层结构, 底层采用Wrapper Facade 模式,封装OS 的API在一些Class中,减少这些API被用错的机会, 同时也能够屏蔽OS的区别,方便以后的移植。 上层,选择采用Proactor模式, Proactor模式是专门用来处理异步IO 的模式, 实现的时候,我参考了ACE 的Proactor实现。 ACE 虽然有框架太庞大的缺点,但是框架设计上,确是有很高的参考价值的。
- 仅仅实现了Proactor模式, 对于实际的服务器开发,还是显得太简陋,上层需要做的事情还是很多。 可以通过针对某一类服务器,譬如TCP服务器,做一层封装,实现Session管理和网络层的控制,尽可能的减轻该框架使用者的任务量。
- 该框架还应该提供一些辅助类,如Buffer 读写类, 实现类似IoStream的Buffer读写,方便拆包,组包。 应用层线程池类, 方便应用层采用线程池处理包,提高性能。
今天先写到这里,可能分析的不全面,还存在一些问题,请大家指正。