#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <time.h>
#include <stdlib.h>
#include <pthread.h>
/*
int new_size = 1 * 1024 * 1024;
int g_write_flg = 0;
void run_cpu()
{
int a = 1;
for (int i = 1; i < 1000 * 1000 * 1000; ++i)
{
a = a/i;
}
}
void writefile(FILE* f,char *fname,char * ctx,int nsize)
{
f = fopen(fname, "w");//
if (f)
{
fwrite(ctx, 1, nsize, f);
fclose(f);
}
else
{
printf("writefile fopen failed!\n");
}
}
void* test_fun(void* fd)
{
printf("test_fun begin.... idx:%d\n", *(int*)fd);
int idx = *(int*)fd;
char cfile[10];
sprintf(cfile, "./out%d.txt", idx);
FILE* f = NULL;// fopen(cfile, "w");
while (true)
{
char* p = new char[new_size];
memset(p, idx, new_size);
if (g_write_flg)
{
printf("write file :%s size:%d MB\n",cfile, new_size/(1024*1024));
writefile(f,cfile, p, new_size);
}
run_cpu();
delete[] p;
sleep(2);
}
}
void create_test_thread(int idx, pthread_t &thread)
{
int *tmpidx = new int;
*tmpidx = idx;
if (pthread_create(&thread, NULL, test_fun, tmpidx) != 0)//´´½¨×ÓÏß³Ì
{
perror("pthread_create check_inite_rknn_stuck");
}
else {
pthread_detach(thread);
}
}
int main(int argc, char *argv[])
{//²ÎÊý1£ºÊÇ·ñдÎļþ ²ÎÊý2£º²âÊÔÏ̸߳öÊý ²ÎÊý3£ºÃ¿´ÎÉêÇëÄÚ´æ´óС£¨M£©
if (argc != 4)
{
printf("input arg param is error! \n");
return 0;
}
g_write_flg = atoi(argv[1]);
int threadnum = atoi(argv[2]);
int nsize = atoi(argv[3]);
new_size = nsize * new_size;
printf("write_flg:%d thread num:%d new_size:%d\n",g_write_flg,threadnum, nsize);
pthread_t thread[1024];
for (int i = 0; i < threadnum; ++i)
{
create_test_thread(i,thread[i]);
sleep(1);
}
while (true)
{
printf("test running ...\n");
sleep(20);
}
return 0;
}
*/
int new_size = 0;
void* test_fun(void* fd)
{
printf("test_fun begin.... idx:%d\n", *(int*)fd);
int idx = *(int*)fd;
int cnt = 0;
while (true)
{
char* p = new char[new_size];
memset(p, '0'+idx, new_size);
++cnt;
//delete[] p;
if (cnt % 100 == 0)
{
printf("thread %d new size:%d k adress:%X\n", idx, new_size * cnt / 1024,p);
sleep(3);
}
}
}
void create_test_thread(int idx, pthread_t& thread)
{
int* tmpidx = new int;
*tmpidx = idx;
if (pthread_create(&thread, NULL, test_fun, tmpidx) != 0)//´´½¨×ÓÏß³Ì
{
perror("pthread_create check_inite_rknn_stuck");
}
else {
pthread_detach(thread);
}
}
int main()
{
int n;
int sz;
while (true)
{
printf("input case \n");
scanf("%d", &n);
switch (n)
{
case 0:
{
printf("new char size:\n");
scanf("%d", &n);
char* p = new char[n];
printf("input use memory size\n");
scanf("%d", &n);
if (n)
{
memset(p, 0, n);
}
printf("input any continue delete..\n");
scanf("%d", &n);
delete[] p;
}
break;
case 1:
{
printf("test char tmp[8 * 1024] \n");
char tmp[8 * 1024];
printf("input use memory size\n");
scanf("%d", &n);
if (n)
{
memset(tmp, 0, n);
}
printf("input any continue \n");
scanf("%d", &n);
}
break;
case 2:
{
printf("test 3 times new and not delete\n");
printf("input new memory size k\n");
scanf("%d", &n);
sz = n;
printf("input use memory size\n");
scanf("%d", &n);
for (int i = 0; i < 3; ++i)
{
printf("cnt:%d\n", i);
char* p = new char[sz * 1024];
if (n)
{
memset(p, 0, n * 1024);
}
sleep(5);
}
}
break;
case 3:
{
printf("test 3 times new and delete\n");
printf("input new memory size k\n");
scanf("%d", &n);
sz = n;
printf("input use memory size\n");
scanf("%d", &n);
for (int i = 0; i < 3; ++i)
{
printf("new char cnt:%d\n", i);
char* p = new char[sz * 1024];
if (n)
{
memset(p, 0, n * 1024);
}
sleep(5);
printf("delete p \n");
delete[] p;
sleep(5);
}
}
break;
case 4:
{
char tmp[1024];
break;
}
case 5:
{
char tmp[1024];
break;
}
case 6:
{
printf("test 1024 times new and delete small mem\n");
printf("input new small memory size k\n");
scanf("%d", &n);
for (int i = 0; i < 1024; ++i)
{
printf("new char cnt:%d\n", i);
char* p = new char[n * 1024];
if (n)
{
memset(p, 0, n * 1024);
}
if (i % 100 == 0)
{
sleep(3);
}
}
break;
}
case 7:
{
int threadnum = 0;
printf("input thread num\n");
scanf("%d", &threadnum);
int nsize = 0;
printf("input new_size k\n");
scanf("%d", &nsize);
new_size = nsize * 1024;
pthread_t thread[1024];
for (int i = 0; i < threadnum; ++i)
{
create_test_thread(i, thread[i]);
sleep(1);
}
break;
}
default:
break;
}
}
return 0;
}
//while true; do pmap -x $(pidof test_mem.bin) > test1; sleep 2; pmap -x $(pidof test_mem.bin) > test2;echo xxxxxxxxxxx;diff test1 test2;sleep 1; done
/*
while true; do pmap -x $(pidof sh.bin) > test1; echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; diff test2 test1; sleep 1; pmap -x $(pidof sh.bin) > test2; echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; diff test1 test2; sleep 1; done
*/
/*
while true; do pmap -x 42971 > test1; echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; diff test2 test1; sleep 1; pmap -x 42971 > test2; echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; diff test1 test2; sleep 1; done
*/
测试一: 使用栈区内存
pmap -x 16445 > 1
输入1,进入case 1
pmap -x 16445 > 1-used
diff 1 1-used
< 0000007fb3cff000 1220 836 0 r-x-- libc-2.24.so
> 0000007fb3cff000 1220 900 0 r-x-- libc-2.24.so
反复测试进入case 1,结果始终不变
测试二: 进入case 0 使用堆
1.输入1024 大小内存
内存结构和测试一结果完全一致,内存没有发生变化
包括new 后 memset 后 以及delete后都没发生变化
2.输入8192 大小内存
刚new出来8192内存后
diff 0-new-1024 0-new-8192
< 00000055a4c6b000 200 12 12 rw--- [ anon ]
> 00000055a4c6b000 200 16 16 rw--- [ anon ]
使用memset设置8192内存
diff 0-new-8192 0-used-8192
< 00000055a4c6b000 200 16 16 rw--- [ anon ]
> 00000055a4c6b000 200 20 20 rw--- [ anon ]
delete 8192 内存
diff 0-used-8192 0-delete-8192
没有任何变化
反复测试8192内存,内存结构没有任何变化
3.输入1048576(1M)内存
diff 0-delete-8192 0-new-1048576
> 0000007fb3bfe000 1028 4 4 rw--- [ anon ]
> 0000007fb3bfe000 0 0 0 rw--- [ anon ]
在新的内存区域重新分配了1028k空间
memset设置内存后显示使用的物理内存增加了1024k
diff 0-new-1048576 0-used-1048576
< 0000007fb3bfe000 1028 4 4 rw--- [ anon ]
> 0000007fb3bfe000 1028 1028 1028 rw--- [ anon ]
使用delete释放内存后
diff 0-used-1048576 0-delete-1048576
< 0000007fb3bfe000 1028 1028 1028 rw--- [ anon ]
< 0000007fb3bfe000 0 0 0 rw--- [ anon ]
说明申请的1M空间是完全被释放掉了
4.测试小内存分配后不释放
浙公网安备 33010602011771号