Зарезервируйте RAM в C

Мне нужны идеи о том, как записать программу C, которые резервируют указанную сумму 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], я не знаю, как сделать, получив аргументы от командной строки, печатая [Любая клавиша нажата], и так далее не проблема от меня.

Какие-либо идеи о том, как сделать это?

10
задан Anycorn 8 March 2010 в 02:06
поделиться

5 ответов

calloc () - это то, что вам нужно. Он зарезервирует память для вашего процесса и запишет в него нули. Это гарантирует, что память действительно выделена для вашего процесса. Если вы malloc () используете большую часть памяти, ОС может быть ленив в выделении памяти для вас, фактически выделяя ее только тогда, когда она записывается (что никогда не произойдет в этом случае).

1
ответ дан 3 December 2019 в 17:19
поделиться

Для этого вы хотите использовать malloc (). В зависимости от ваших потребностей вы также захотите:

  1. Записывать данные в память, чтобы ядро ​​действительно их гарантировало. Для этого вы можете использовать memset ().
  2. Чтобы предотвратить выгружение памяти (подкачку), в этом вам могут помочь функции mlock () / mlockall ().
  3. Сообщите ядру, как вы на самом деле собираетесь использовать память, что выполняется через posix_madvise () (это предпочтительнее явного mlockall ()).

В большинстве случаев вам подойдут функции malloc () и memset () (или calloc (), которые фактически делают то же самое).

Наконец, конечно, вы хотите освободить () память, когда она больше не нужна.

19
ответ дан 3 December 2019 в 17:19
поделиться

Разве вы не можете просто использовать malloc () для выделения этой оперативной памяти вашему процессу? Это зарезервирует для вас эту оперативную память, и тогда вы сможете делать с ней все, что захотите.

Вот вам пример:

#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;
}

Если вам нужна дополнительная информация, загляните на страницу руководства ( man malloc в оболочке Linux). Если вы не работаете в Linux, посмотрите онлайн-страницу руководства .

3
ответ дан 3 December 2019 в 17:19
поделиться

Вам потребуется:

  • malloc () , чтобы выделить необходимое количество байтов ( malloc (200000000) или malloc (20 * (1 << 20)) ).
  • getc () ждать нажатия клавиши.
  • free () для освобождения памяти.

Информация на этих страницах должна быть полезной.

0
ответ дан 3 December 2019 в 17:19
поделиться

Это должно сработать. Хотя мне удалось зарезервировать больше ОЗУ, чем я установил, это должно работать для допустимых значений, тем не менее.

#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;
}
0
ответ дан 3 December 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: