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