- 论坛徽章:
- 0
|
只是粗略的整理了一下,希望大家能够接受!:)
此篇文章是以内存测试程序为出发点,使用此方法来测试内存需要关闭其他的应用程序,尽量让此程序独享系统所能分配的内存
不管现在你拥有多少内存,如果想将其耗尽的话,有一个很简单的方法
1、现解析/proc/meminfo,这是最方便,也是最快的方法,由于你的程序是要以OS为平台,所以你无法侵占OS所占用的那一部分内存,在/proc/meminfo中,你只需要关心三个字段的值:MemFree, Buffers, Cached,具体原因,很多地方都有讲到,此处不赘述,将这三个字段的值相加,所得的数据便是操作系统可以分配给用户的最大内存空间(KB)
2、分配内存:将第一步所得的结果化为单位为Byte的值,这个值便是你需要操作系统为你分配的内存大小,在此用dwMemSize变量表示,
ppMem = (unsigned char*)malloc(sizeof(unsigned char) * dwMemSize); 分配内存,有一点不同于普通的内存动态分配,那便是在分配成功后(一定要检测ppMem的值),要记得用函数
int mlock(const void *addr, size_t len);将已分配的内存禁止分页处理,因为dwMemSize的值并不一定为分页大小的整数倍,若不需要此块内存,记得在free掉之前用munlock解锁内存块
3、检查此块内存是否真的分配成功
在这里提供我所使用过的方法,通过 DWORD dwMemBlkNum = dwMemSize /1024/64;计算出以64K大小为一块的总块数,然后:
dwMemErr = 0;
wMem = (WORD *)ppMem ;
for ( i = 1; i <= (int)dwMemBlkNum; i++)
{
for ( d = 0; d < 0x10000; d=d+2)
{
*wMem = (WORD)(2*(d+i));
wMem = wMem + 1;
}
}
wMem = (WORD *)gpMem;
for ( i = 1; i <= (int)dwMemBlkNum; i++)
{
for ( d = 0; d < 0x10000; d=d+2)
{
if (*wMem != (WORD)(2*(d+i)))
{dwMemErr=1; break;};
wMem=wMem+1;
}
if (dwMemErr)
{
break;
}
}
然后通过dwMemErr的值来判断此段内存是否真的可用,若dwMemErr == 0,那么表示没有问题,此时你可以按任何你想的方式来耗尽系统的内存,不管有多大,若不成功,需要回到第一步做重新分配内存的动作,知道成功为止
在此声明,此种方法只用于测试,对一般的应用程序用处可能不会很大,只是通过此种方法是大家能够对内存分配操作的更加灵活,希望会有帮助,由于工作原因,牵扯到所谓很多的公司机密,程序的很多细节不便在此透漏,见谅
另外,本人在另一篇帖子中大概讲述了一下对CPU的操作,也希望大家能够对内核在cpu调度方面有所了解
http://bbs.chinaunix.net/viewthr ... &extra=page%3D3
有空之余,上一下本人的blog吧,刚开的,希望大家支持一下
[ 本帖最后由 dragonII 于 2006-4-8 10:18 编辑 ] |
|