内存管理

 内存管理

内存管理 是件很简单的事,对大多数的程序,在进程堆里分配就足够了但对频繁分配内存的系统,这就是噩梦的开始。http://www.codeproject.com/cpp/MemoryPool.asp这篇文章提供了一个在通用系统下的解决方法。他解决了一个瓶颈,这个瓶颈就是对内存分配表的全局锁导致的排队分配或释放内存的问题。http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/vclrfimplementationofcustomstringmanagereasymethod.asp也许你会在上面的文章里得到些启发,但在这太难做到了面对一个个复杂的工程,很难的做到不垮线程的分配释放内存。但我们得到了一个最优分配内存的方法。在一个不涉及互锁的执行过程中,内存在同一个池中分配可以保证较高的效率。在多线程环境下为每个线程创建一个缓冲池并不要跨线程使用这些缓冲池可以保证较高的效率。没看懂没关系慢慢看就明白了。

         那么在具体编程上有两个解决的方法,一个是为每一个线程创建一个缓冲池(句柄),前面说过只要你能保证不垮线程的使用这些句柄,或在没次跨线程的时候使用copy的动作就会保证较高的效率。但在现实中这样的情况太难保证了,至少在我目前要做的工程里不能保证这样的情况。而且对于频繁分配的线程的系统这个效率会大幅下降,在极端的情况下每个线程只分配一次内存的情况下效率和使用进程全局内存是一样的。因为这些子堆也是在全局内存中分配的(这点不太确定要是在进程内存中分配的还好要是在一个没有旁视列表的系统中分配情况会更糟糕)。

         还有一种方法就是为每一个内存池限制固定的使用量,分担互斥的风险。比如可以限制每一个句柄只能有10个内存对象使用那么,冲突的概率公式是  使用内存的次数 - 1(1 / 句柄的数量)/ 句柄的数量 那么使用2次内存产生互锁操作的概率就是 1/100。这样要预先估计使用内存的次数来平均分配内存池的句柄。

你可能感兴趣的:(内存管理)