C 有没有办法用一个要求很高的页面初始化增加的内存?

C 有没有办法用一个要求很高的页面初始化增加的内存?,c,memory,out-of-memory,C,Memory,Out Of Memory,我在Linux中使用共享内存,我有一些问题 由于shmat访问共享内存并使用内存,因此每次移动共享内存指针时,都会激活一个“请求页面”,并增加内存 然而,这是一个问题,因为内存容量相当大 那么,有没有一种节省内存的方法,比如在移动指针之前释放已读取和传输的内存 伪代码如下所示 My_struct *mem = NULL; // The structure size is 4K. // shmat(...); // For example, `VmRSS` was 10K. However, e

我在Linux中使用共享内存,我有一些问题

由于
shmat
访问共享内存并使用内存,因此每次移动共享内存指针时,都会激活一个“请求页面”,并增加内存

然而,这是一个问题,因为内存容量相当大

那么,有没有一种节省内存的方法,比如在移动指针之前释放已读取和传输的内存

伪代码如下所示

My_struct *mem = NULL; // The structure size is 4K.

// shmat(...);
// For example, `VmRSS` was 10K. However, each iteration increases by 4K. (I know this is due to the `demand page`.)
// This is because the size of `My_struct` is 4K.
for (i=0; i<10000; i++)
{
  printf("%s\n", mem[i].name); // Here, the memory usage increases every time it is repeated.
  sleep(1); // It's just a pause to check VmRSS.

  // If I run the loop 10,000 times, I need about 40M of memory. 
  // (In real world, it is dying because of OOM in loop)
}
shmdt(mem);
My_struct*mem=NULL;//结构尺寸为4K。
//shmat(…);
//例如,`VmRSS`是10K。但是,每次迭代都会增加4K。(我知道这是因为“需求页面”。)
//这是因为“My_struct”的大小是4K。

对于(i=0;i“移动指针”是什么意思?在伪代码中,这意味着移动循环中
mem
的位置并引用下一个内存位置。此外,当您分离一些共享内存时(使用
shmdt
)您可以有效地将内存标记为可供系统使用。不过,操作系统可能会将内存映射到您的进程,使您看起来好像有内存泄漏。但是,操作系统可以在需要时将这些页面自由映射到另一个进程。将它们视为泄漏是错误的。@Someprogrammerdude感谢reply.在
shmdt
之前,我想删除由于
要求页面
shmdt
在循环外完成而积累的内存。问题是,应用程序在循环期间由于内存不足而死亡。我想是时候创建一个应用程序并向我们展示了。因为很难理解您的意思“移动内存”。你如何“分配”共享内存?你真正做的是什么?只要你不越界或做错事或有一些UB,我不认为这是一个问题。如果你向系统要求X字节的内存,而系统给了你,为什么会有问题?