mallocs 64 бита шириной

Все домены и субдомены, которые вы используете, необходимо настроить для разрешения IP-адресов, по которым ваш AUT доступен. Это обычно включает редактирование вашего /etc/hosts или настройку локального DNS-сервера для сообщения правильного IP-адреса.

17
задан Tim Lovell-Smith 25 March 2015 в 16:04
поделиться

7 ответов

malloc tries to allocate a contiguous memory range, and this will initially be in real memory simply due to how swap memory works (at least as far as I remember). It could easily be that your OS sometimes can't find a contiguous block of 10gb of memory and still leave all the processes that require real memory in RAM at the same time (at which point your malloc will fail).

Do you actually require 10gb of contiguous memory, or would you be able to wrap a storage class/struct around several smaller blocks and use your memory in chunks instead? This relaxes the huge contiguous requirement and should also allow your program to use the swap file for less used chunks.

8
ответ дан 30 November 2019 в 13:54
поделиться

Just a guess here, but malloc allocates contiguous memory and you may not have a sufficiently large contiguous section on your heap. Here's a few things I would try;

Where a 20GB malloc fails, do four 5GB mallocs succeed? If so, it is a contiguous space issue.

Have you checked your compiler switches for anything that limits total heap size, or largest heap block size?

Have you tried writing a program that declares a static variable of the required size? If this works you could implement your own heap with big mallocs in that space.

3
ответ дан 30 November 2019 в 13:54
поделиться

Have you tried using heap functions to allocate your memory instead?

2
ответ дан 30 November 2019 в 13:54
поделиться

Это, скорее всего, фрагментация. Для простоты давайте рассмотрим пример.

Память состоит из одного модуля по 12 КБ. Эта память организована в блоки по 1 КБ в MMU. Итак, у вас есть 12 блоков по 1 КБ. Ваша ОС использует 100 байт, но это в основном код, который управляет таблицами страниц. Таким образом, вы не можете поменять его. Затем все ваши приложения используют по 100 байт.

Теперь, когда запущена только ваша ОС и ваше приложение (200 байт), вы уже используете 200 байт памяти (занимающих блоки по 2 КБ). Оставляя ровно 10 КБ, доступно для malloc () .

Итак, вы начали с malloc () пары буферов - A (900 байт), B (200 байт). Затем вы освобождаете A. Теперь у вас есть 9.8kb свободных (несмежных). Итак, вы пытаетесь malloc () C (9kb). Внезапно вы терпите неудачу.

У вас есть 8. 9k, смежные в хвостовой части и 0.9k в передней части. Вы не можете повторно отобразить первый блок до конца, потому что B растягивается на первые 1k и вторые 1k блоки.

Вы все еще можете malloc () один блок 8kb.

Конечно, это Пример немного надуман, но надеюсь, что это поможет.

-1
ответ дан 30 November 2019 в 13:54
поделиться

Have you tried using VirtualAlloc() and VirtualFree() directly? This may help isolate the problem.

  • You'll be bypassing the C runtime heap and the NT heap.
  • You can reserve virtual address space and then commit it. This will tell you which operation fails.

If the virtual address space reservation fails (even though it shouldn't, judging from what you've said), Sysinternals VMMap may help explain why. Turn on "Show free regions" to look at how the free virtual address space is fragmented.

5
ответ дан 30 November 2019 в 13:54
поделиться

But why else could a malloc fail? I can't think of other reasons

As implicitly stated previously several times, because of memory fragmentation

0
ответ дан 30 November 2019 в 13:54
поделиться

Вот официальный источник, который заявляет, что максимальный размер запроса кучи определяется вашей связанной библиотекой CRT (кроме вашего предыдущего кода, в котором целочисленные переполнения идут до 0, поэтому вы не получили NULL назад) (_HEAP_MAXREQ).

http://msdn.microsoft.com/en-us/library/6ewkz86d.aspx

Посмотрите мой ответ здесь для выделения больших окон, я включаю ссылка на статью MS по усовершенствованию модели памяти Vista / 2008.

Короче говоря, стандартная CRT не поддерживает даже для собственного 64-битного процесса любой размер кучи, превышающий 4 ГБ. У вас есть для использования VirtualAlloc * или CreateFileMapping или некоторых других аналогов.

О, я также заметил, что вы утверждаете, что ваши большие выделения на самом деле успешны, это на самом деле неверно, вы неправильно интерпретируете malloc ( 0x200000000); вы ДОЛЖНЫ ВСЕГДА вычислять ОБЩУЮ СУММ данных, которые должны быть запрошены перед оператором, который оценивает запрос.

Почему это так плохо? Мы знаем, что это ошибка, потому что точка, в которой делается запрос для динамических ресурсов, там должна быть точкой в ​​будущем, где мы будем использовать этот ресурс.

Чтобы использовать то, что мы просили, мы должны знать, насколько он велик? (например, количество массивов, размер типа и т. д.).

Это будет означать, что если мы когда-либо увидим какую-либо арифметику внутри () запроса ресурса, это будет ошибкой, поскольку мы ДОЛЖНЫ продублируйте этот код еще раз , чтобы использовать эти данные надлежащим образом.

Почему это так плохо? Мы знаем, что это ошибка, потому что точка, в которой делается запрос для динамических ресурсов, там должна быть точкой в ​​будущем, где мы будем использовать этот ресурс.

Чтобы использовать то, что мы просили, мы должны знать, насколько он велик? (например, количество массивов, размер типа и т. д.).

Это будет означать, что если мы когда-либо увидим какую-либо арифметику внутри () запроса ресурса, это будет ошибкой, поскольку мы ДОЛЖНЫ продублируйте этот код еще раз , чтобы использовать эти данные надлежащим образом.

Почему это так плохо? Мы знаем, что это ошибка, потому что точка, в которой делается запрос для динамических ресурсов, там должна быть точкой в ​​будущем, где мы будем использовать этот ресурс.

Чтобы использовать то, что мы просили, мы должны знать, насколько он велик? (например, количество массивов, размер типа и т. д.).

Это будет означать, что если мы когда-либо увидим какую-либо арифметику внутри () запроса ресурса, это будет ошибкой, поскольку мы ДОЛЖНЫ продублируйте этот код еще раз , чтобы использовать эти данные надлежащим образом.

Чтобы использовать то, что мы просили, мы должны знать, насколько он велик? (например, количество массивов, размер типа и т. д.).

Это будет означать, что если мы когда-либо увидим какую-либо арифметику внутри () запроса ресурса, это будет ошибкой, поскольку мы ДОЛЖНЫ продублируйте этот код еще раз , чтобы использовать эти данные надлежащим образом.

Чтобы использовать то, что мы просили, мы должны знать, насколько он велик? (например, количество массивов, размер типа и т. д.).

Это будет означать, что если мы когда-либо увидим какую-либо арифметику внутри () запроса ресурса, это будет ошибкой, поскольку мы ДОЛЖНЫ продублируйте этот код еще раз , чтобы использовать эти данные надлежащим образом.

1
ответ дан 30 November 2019 в 13:54
поделиться
Другие вопросы по тегам:

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