2015-06-14 9 views
2

Как я могу получить наибольший размер (непрерывный) в байтах, которое мое приложение может выделить в одном malloc звонок без возврата out of memory? (самый большой доступный кусок)Как получить самый большой доступный фрагмент памяти, который можно выделить?

P.S .: Я хотел бы получить общий ответ для обоих, если я хочу выделить его, и если я не хочу его выделять (так что этот вопрос не нужно заново задавать).

+1

Вы хотите * на самом деле * выделить память, или вам нужно только выяснить, что такое максимальный размер? –

+0

В любой разумной современной системе ОС может рассмотреть возможность использования всего жесткого диска для переполнения. Вы хотите принять это во внимание? – usr2564301

+1

Jongware, я думаю, что OP хочет знать, как узнать максимальный размер НЕПРЕРЫВНОГО блока памяти в баране, я не думаю, что речь идет о любых проблемах подкачки. – icbytes

ответ

-3

Следующий фрагмент кода предоставит приблизительный ответ, особенно для детерминированных распределений памяти в реальном времени, обнаруженных в операционных системах реального времени. Он не предназначен для ОС общего назначения:

#include <stdio.h> 
#include <stdlib.h> 

#define INCR 100000 

int main(void){ 
    unsigned long i; 
    for(i=1;;i=i+INCR) { 
     void *ret = malloc(i); 
     if (ret) { 
      free(ret); 
     } 
     else { 
      printf("malloc could not allocate memory of size: %ld bytes!\n", i); 
      return 0; 
     } 
    } 
} 
+1

Это только хорошо в редком случае максимальный размер - это сила двух. Но он не найдет максимум 999 Мб. – Jens

+0

Хорошо, тогда можно попробовать несколько меньших приращений! –

+3

Кроме того, в зависимости от того, как работает распределитель вашей системы, запуск набора вызовов 'malloc()' и 'free()' может фактически изменить ответ. – duskwuff

4

Я предполагаю, что вы спрашиваете о (в некоторой степени) современной настольной или серверной ОС.

Проблема в следующем: любой ответ может быть недействительным уже при возврате результата. Причинами являются другие процессы, потоки, фрагментация памяти и т. Д. Как уже отмечалось в комментариях, ОС может даже сообщать больше памяти, чем доступно, - вкл. Swap. Идея состоит в том, что выделенная память может быть только редко использована процессом, поэтому при необходимости будет обеспечен только доступ к страницам памяти по мере необходимости, сама malloc() не будет запасать какую-либо память заранее.

Также часто не рекомендуется выделять как можно больше памяти, так как это может привести к чрезмерному обмену или голоданию/измельчению других процессов. Итак, просто выделите нужную вам память.

** Заключение: ** Просто забудьте об этом! Выделите требуемую память, не больше, не меньше. Если вам нужна динамическая память, подумайте о динамических структурах, таких как списки и деревья, или используйте realloc() (но используйте ее хорошо продуманно).

Sidenote:

Не чувствую искушение попробовать выделенные блоки в увеличении размера пока вы не получите NULL возвращается. Это может легко привести к фрагментации, и вы не сможете выделить даже самый предыдущий размер блока (по тем же причинам, что и выше).


Для встроенных ОС может быть совершенно другой ответ.

+1

Кроме того, с overcommit, он, возможно, никогда не вернет 'NULL'. –

+0

@ FilipeGonçalves: Да, это добавляет причин, почему это просто глупость. – Olaf

 Смежные вопросы

  • Нет связанных вопросов^_^