2011-12-28 3 views

ответ

1

Возможно, проблемы с повреждением страницы. Если вы malloc большой блок ОЗУ, физическое ОЗУ, вероятно, не будет выделено сразу, некоторые записи таблицы страниц будут установлены. Физическое ОЗУ не будет выделено до тех пор, пока вы не получите доступ к местоположению в нем в первый раз. Это включает в себя

  • ошибка страницы,
  • найти физическую страницу памяти
  • обнуления каждое место на этой странице
  • обновление таблицы страниц

Это дорогая операция с точки зрения время и произойдет один раз на выделенную страницу (550 x 4kbyte страниц для выделенной RAM)

+0

Почему должно быть больше страниц fau Когда я перераспределяю блок чаще? Кэш iPad L2 составляет 1 МБ, поэтому для статической/стековой памяти также должны возникать ошибки страницы. И аргумент обнуления справедлив только для памяти с обращением к окну. У Malloc нет нулевой памяти. Не могли бы вы добавить дополнительные пояснения к своему сообщению? – Etan

+0

@Etan: Предположительно, он не повторно использует один и тот же блок памяти, или возвращает память ОС на освобождение (память ограничена iDevices, так что это определенно возможность). Статическая память постоянно выделяется, и стек памяти, вероятно, постоянно выделяется после его использования в первый раз. – JeremyP

+0

Так что в основном отсроченное распределение - вот что убивает меня здесь. Это также объясняет, почему calloc намного быстрее, чем memset или {0} инициализатор. Независимо от того, принимает ли он один и тот же блок памяти каждый раз, не следует изменять количество ошибок страницы, так как страница будет грязной после бесплатного вызова даже в случае повторного использования старой страницы. – Etan

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