linux-内存分布测试
#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.测试小内存分配后不释放

posted on 2022-07-19 17:50  DuoRuaiMi4567  阅读(52)  评论(0编辑  收藏  举报