a3m*_*ord 2 c++ linux memory dynamic-memory-allocation
在Linux中,内核在我们实际使用该内存之前不会分配任何物理内存页面,但我在这里很难找到它为什么实际上分配这个内存:
for(int t = 0; t < T; t++){
for(int b = 0; b < B; b++){
Matrix[t][b].length = 0;
Matrix[t][b].size = 60;
Matrix[t][b].pointers = (Node**)malloc(60*sizeof(Node*));
}
}
Run Code Online (Sandbox Code Playgroud)
然后我访问这个数据结构,为它添加一个元素,如下所示:
Node* elem = NULL;
Matrix[a][b].length++;
Matrix[a][b]->pointers[ Matrix[a][b].length ] = elem;
Run Code Online (Sandbox Code Playgroud)
基本上,我用htop运行我的程序,如果增加no,Linux会分配更多的内存.我在上面的代码中有"60".为什么?它不应该只在第一个元素添加到数组时分配一个页面吗?
这取决于Linux系统的配置方式.
这是一个简单的C程序,试图分配1TB的内存并触及其中的一部分.
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
char *array[1000];
int i;
for (i = 0; i < 1000; ++i)
{
if (NULL == (array[i] = malloc((int) 1e9)))
{
perror("malloc failed!");
return -1;
}
array[i][0] = 'H';
}
for (i = 0; i < 1000; ++i)
printf("%c", array[i][0]);
printf("\n");
sleep(10);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我在它旁边运行顶部时,它表示VIRT内存使用量达到931g(其中g表示GiB),而RES仅达到4380 KiB.
现在,当我改变我的系统以使用不同的过度使用策略/sbin/sysctl -w vm.overcommit_memory=2并重新运行它时,我得到:
malloc failed!: Cannot allocate memory
Run Code Online (Sandbox Code Playgroud)
因此,您的系统可能正在使用与您预期不同的过度使用策略.欲了解更多信息,请阅读此.
| 归档时间: |
|
| 查看次数: |
196 次 |
| 最近记录: |