【问题标题】:Reserve RAM in C在 C 中保留 RAM
【发布时间】:2010-03-08 02:05:30
【问题描述】:

我需要有关如何编写一个 C 程序的想法,该程序保留指定数量的 MB RAM 直到一个键 [例如。在 Linux 2.6 32 位系统上按下任意键]。

*
/.eat_ram.out 200

# If free -m is execute at this time, it should report 200 MB more in the used section, than before running the program.

[Any key is pressed]

# Now all the reserved RAM should be released and the program exits.
*

这是程序的核心功能 [保留 RAM] 我不知道该怎么做,从命令行获取参数、打印 [任何键被按下] 等等对我来说都不是问题。

关于如何做到这一点的任何想法?

【问题讨论】:

  • “任意键”?那个笑话还没死吗?你在开玩笑,不是吗?
  • 我最近看了辛普森一家第 1 集。 135 [特大号荷马]:开始按任意键”。ANY 键在哪里?我看到 Esk ["ESC"]、Catarl ["CTRL"] 和 Pig-Up ["PGUP"]。没有似乎是任何键。哇!所有这些计算机黑客都让我口渴。我想我会订购一个 TAB。[按 TAB 键] 哎呀...现在没时间了,计算机正在启动那个笑话永远不会消失=)
  • 不是功课就是在集群中检查一个资源管理器,同时还要学习

标签: c linux memory ram


【解决方案1】:

您想使用 malloc() 来执行此操作。根据您的需要,您还需要:

  1. 将数据写入内存,以便内核真正保证它。您可以为此使用 memset()。
  2. 防止内存被分页(交换),mlock() / mlockall() 函数可以帮助您。
  3. 告诉内核您实际上打算如何使用内存,这是通过 posix_madvise() 完成的(这比显式的 mlockall() 更可取)。

在大多数情况下,malloc() 和 memset()(或 calloc() 有效地做同样的事情)将满足您的需求。

最后,当然,您想在不再需要内存时释放()内存。

【讨论】:

  • 我在检查您提到的功能时找到了 POSIX 程序员手册,我认为这对我也很有用。
  • 对于那些想知道的人;除非您使用您请求的内存,否则内核可能会终止您的进程并将内存分配给另一个请求内存的进程。这称为 overcommit
  • dreamlax - 感谢您的信息,我刚刚了解了我系统上的过度使用百分比并找到了有关 vm.overcommit_memory 的信息,我之前不知道
  • 您可以通过在 shell 中键入(以 root 身份)来禁用过度使用:echo 2 > /proc/sys/vm/overcommit_memory
  • +1 用于 mlock() / mlockall()。确保写入内存,以便实际占用内存..
【解决方案2】:

您不能只使用malloc() 将该内存分配给您的进程吗?这将为您保留该 RAM,然后您可以随意使用它。

这里有一个例子:

#include <stdlib.h>
int main (int argc, char* argv[]) {
    int bytesToAllocate;
    char* bytesReserved = NULL;

    //assume you have code here that fills bytesToAllocate

    bytesReserved = malloc(bytesToAllocate);
    if (bytesReserved == NULL) {
        //an error occurred while reserving the memory - handle it here
    }

    //when the program ends:
    free(bytesReserved);

    return 0;
}

如果您想了解更多信息,请查看手册页(Linux shell 中的man malloc)。如果您不在 linux 上,请查看 the online man page

【讨论】:

  • 这可能是动态分配对这个家伙来说是新的......你应该真正解释一下,或者至少提供一个体面教程的链接。
  • 这对于最终应用来说似乎是一个很棒的框架。
  • 另外,正如 Tim Post 指出的那样,malloc 并不总是足够的。例如,在您实际写入内存之前,内存可能不会真正被保留。
  • @Steve314 - 显然,malloc 不会分配物理内存,但会确保分配了足够的虚拟内存。这仍应显示在资源管理中,AFAIK。
【解决方案3】:

calloc() 是你想要的。它将为您的进程保留内存并向其写入零。这可确保内存实际分配给您的进程。如果您malloc() 很大一部分内存,操作系统可能会懒惰地为您实际分配内存,仅在写入时才实际分配它(在这种情况下永远不会发生)。

【讨论】:

    【解决方案4】:

    你需要:

    • malloc() 分配您需要的任意数量的字节(malloc(200000000)malloc(20 * (1 &lt;&lt; 20)))。
    • getc() 等待按键。
    • free() 释放内存。

    信息onthesepages应该会有所帮助。

    【讨论】:

    • 实际上是检查集群中的资源管理器,以便在节点上释放 x MB RAM 时运行作业。但是当我不使用集群时,我正在尝试学习 C,因此我在这里发布了问题,以便我可以尝试不同的想法和解决方案,同时学习 C 的新部分。
    • 如果您想知道有多少可用内存,您绝对应该使用 /proc/vmstat 而不仅仅是测试 malloc 失败。
    • @petersmith221:加油,好哲学。 @Matt J:很抱歉仅针对原始发布者评论的该地址劫持评论。 :-)
    【解决方案5】:

    这样做了,应该可以了。尽管我能够保留比我安装的更多的 RAM,但这应该适用于有效值。

    #include <stdio.h>
    #include <stdlib.h>
    
    enum
    {
       MULTIPLICATOR = 1024 * 1024 // 1 MB
    };
    
    
    int
    main(int argc, char *argv[])
    {
       void *reserve;
       unsigned int amount;
    
       if (argc < 2)
       {   
          fprintf(stderr, "usage: %s <megabytes>\n", argv[0]);
          return EXIT_FAILURE;
       }   
    
       amount = atoi(argv[1]);
    
       printf("About to reserve %ld MB (%ld Bytes) of RAM...\n", amount, amount * MULTIPLICATOR);
    
       reserve = calloc(amount * MULTIPLICATOR, 1);
       if (reserve == NULL)
       {   
          fprintf(stderr, "Couldn't allocate memory\n");
          return EXIT_FAILURE;
       }   
    
       printf("Allocated. Press any key to release the memory.\n");
    
       getchar();
       free(reserve);
       printf("Deallocated reserved memory\n");
    
       return EXIT_SUCCESS;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      • 2015-06-13
      • 2013-02-18
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      • 1970-01-01
      相关资源
      最近更新 更多