linux-内存分布测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
#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   DuoRuaiMi4567  阅读(55)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示