逐步实现TCP服务端Step04-5:内存管理

这里要说的不是操作系统层面的内存管理,而是在netio及s中对对象实施的管理。之前实现的那些类大多重载了new运算符,在实例化时实际使用的是从共享内存中分配的一块空间。这块共享内存是事先创建好的一块足够大的空间,通过计算相关对象的尺寸,及运行时最多会创建的对象的个数可以得出这块共享内存的大小。

下图为目前为止各类间的静态关系,在初始版本的基础上加入了前一篇提出的几个Control类。目前被视作基础类的类用蓝色表示。

图中聚合了SharedMemory类的类,其实例均存活于共享内存之中。

我们一共设定了三块共享内存,其Key分别为:0x1110、0x1111和0x1109,其中0x1110用于c2s_code_queue,0x1111用于s2c_code_queue,而0x1109则专门服务于s进程。下面的简图展示了在Key为0x1109的共享内存中存在的那些对象们。每次s启动,这些对象就要进行new操作,new已被重载,其分配的内存源于SharedMemory对象,该对象管理了那块Key为0x1109的共享内存。new出内存之后,紧接着会查询SharedMemory对象的启动模式,根据它的模式来决定当前对象是执行Init还是Recover 。

这个简图展示了s和netio进程启动后,存在于共享内存中的对象们,对象名使用全小写的类名表示。图中没有netio是因为没有专门服务于它的共享内存。

在开发时未使用STL容器,并非出于运行效率的考虑。主要是想完全掌控内存/对象的管理。而基于共享内存去做,是因为用它可以方便地实现“恢复”功能。


<==  index  ==>