[传奇技术]探讨【IGE】的源代码【六】,承接【五】,内存池管理
上篇,我们提到了内存创建和释放带给长时间运行的服务器性能的损害问题。 当然还可能增加了CPU的相当的开销。 那么如何解决这个问题呢。 在这里只做一些讨论,具体实现,是你自己的事情。 到目前为止,我们能够做的都是管理一个内存池。 一开始,我们先分配好一批内存,把这批内存标注为空闲。 在客户端连接入来的时候,从空闲链表里面取第一个结构指针,填充内存。 Delete(0);删除空闲链表索引,是删除,不是释放,这个要记住。 然后使用一个正在使用链表来管理已经被调用的内存,使用ADD操作。 那么跟客户端断开连接后,将该释放的或者需要置Nil的对象处理之后。 从正在使用的链表删除该指针索引,然后把内存“归还”给空闲链表。 其实这个操作完全就是指针管理,效率如何,这个还要问???? 实际内存分配好后,释放的时候只是标识释放而已,并没有返回给操作系统,不会带来内存碎片的问题了。而且CPU占用率肯定低很多。 也许大家说,一开始分配多少合适,看你自己的需要而定。 如果不够怎么办,不够就再分配了。 其实每一个服务器都有额定的连接数目限制。所以你可以设置一个合适你自己的数目,超过该数目,直接忽略就行,或者怎么做,你自己可以定。 如果一台服务器,我最多允许5000个连接,那么就设置为5000。超过后,发送信息给客户端,让它连接另外的服务器也行。 一般情况下,是不是这样操作??? 总之,服务器编程,你必须管理内存池,这个是肯定的。除非你的服务器三头两天就重启一次。 没有内存池概念你就不要进服务器编程的范围。 至于具体做法,各人不同,都是按照自己的喜好来做,能够实现,没有内存泄露就行了。
|