官方淘宝店 易迪拓培训 旧站入口
首页 > 无线通信 > 通信技术学习讨论 > 调解ns内存纠纷的一些思路手段

调解ns内存纠纷的一些思路手段

12-13
困扰了我很长的时间,从
http://www.isi.edu/nsnam/ns/ns-debugging.html
找到的调解内存纠纷的一些思路手段
Memory Debugging
The first thing to do if you run out of memory is to make sure you can use all the memory on your system. Some systems by default limit the memory available for individual programs to something less than all available memory. To relax this, use the limit or ulimit command These are shell functions---see the manual page for your shell for details. Limit is for csh, ulimit is for sh/bash.
Simulations of large networks can consume a lot of memory. Ns-2.0b17 supports Gray Watson's dmalloc library (see its web documentation and source code). To add it, install it on your system or leave its source in a directory parallel to ns-2 and specify --with-dmalloc when configuring ns. Then build all components of ns for which you want memory information with debugging symbols (this should include at least ns-2, possibly tclcl and otcl, maybe also tcl).
To use dmalloc:
define an alias (csh: alias dmalloc 'eval `\dmalloc -C \!*`', bash: function dmalloc { eval `command dmalloc -b $*` })
Turn debugging on by typing dmalloc -l logfile low
Run your program (which was configured and built with dmalloc as described above)
Interpret logfile by running dmalloc_summarize ns <logfile (You need to download dmalloc_summarize separately.)
On some platforms you may need to link things statically to get dmalloc to work. On Solaris this is done with by linking with these options: "-Xlinker -B -Xlinker -static {libraries} -Xlinker -B -Xlinker -dynamic -ldl -lX11 -lXext". (You'll need to change Makefile. Thanks to Haobo Yu and Doug Smith for workign this out.)
We can interpret a sample summary produced from this process on ns-2/tcl/ex/newmcast/cmcast-100.tcl with an exit statement after the 200'th duplex-link-of-interefaces statement:
Ns allocates ~6MB of memory.
~1MB is due to TclObject::bind
~900KB is StringCreate, all in 32-byte chunks
~700KB is NewVar, mostly in 24-byte chunks
Dmalloc_summarize must map function names to and from their addresses. It often can't resolve addresses for shared libraries, so if you see lots of memory allocated by things beginning with ``ra='', that's what it is. The best way to avoid this problem is to build ns statically (if not all, then as much as possible).
Dmalloc's memory allocation scheme is somewhat expensive, plus there's bookkeeping costs. Programs linked against dmalloc will consume more memory than against most standard mallocs.
Dmalloc can also diagnose other memory errors (duplicate frees, buffer overruns, etc.). See its documentation for details.
Memory Conservation Tips
Some tips to saving memory (some of these use examples from the cmcast-100.tcl script):
(Also see page on large simulations for more related info.)
If you have many links or nodes:
avoid trace-all
$ns trace-all $f causes trace objects to be pushed on all links. If you only want to trace one link, there's no need for this overhead. Saving is about 14 KB/link.
use arrays for sequences of variables
Each variable, say n$i in set n$i [$ns node], has a certain overhead. If a sequence of nodes are created as an array, i.e. n($i), then only one variable is created, consuming much less memory. Saving is about 40+ Byte/variable.
avoid unnecessary variables
If an object will not be referred to later on, avoid naming the object. E.g. set cmcast(1) [new CtrMcast $ns $n(1) $ctrmcastcomp [list 1 1]] would be better if replaced by new CtrMcast $ns $n(1) $ctrmcastcomp [list 1 1]. Saving is about 80 Byte/variable.
run on top of FreeBSD
malloc() overhead on FreeBSD is less than on some other systems. We will eventually port that allocator to other platofrms.
dynamic binding (NEW)
Using bind() in C++ consumes memory for each object you create. This approach can be very expensive if you create many identical objects. Changing bind()'s to delay_bind() changes this memory requirement to per-class. See ~ns/object.cc for an example of how to do binding, either way.
Some statistics collected by dmalloc (Investigating the bottleneck...)
KBytes  cmcast-50.tcl(217 Links)        cmcast-100.tcl(950 Links)      
trace-all       8,084   28,541  
turn off trace-all      5,095   15,465  
use array       5,091   15,459  
remove unnecessay variables     5,087   15,451  
on SunOS        5,105   15,484

感觉Segmentation fault错误一般都是指针操作错误,尤其是没有用new创建对象就进行
操作,以及操作Null的情况,真要用这个所说的,还有些麻烦啊。还是自己程序得设计
好,写好。

Top