Вопросы о выделении памяти Windows

Я в настоящее время изучаю malloc() реализация в соответствии с Windows. Но в моем исследовании я наткнулся на вещи, которые озадачили меня:

Во-первых, я знаю, что на уровне API, окна используют главным образом HeapAlloc() и VirtualAlloc() вызовы для выделения памяти. Я заключаю отсюда что реализация Microsoft malloc() (то, что включено в CRT - время выполнения C) в основном звонит HeapAlloc() для блоков> 480 байтов и иначе управляют специальной областью, выделенной с VirtualAlloc() для маленьких выделений, для предотвращения фрагментации.

Хорошо это - вся польза и хорошо. Но затем существует другая реализация malloc(), например, nedmalloc, которые утверждают, что были до 125% быстрее, чем Microsoft malloc.

Все это заставляет меня задаться вопросом несколько вещей:

  1. Почему мы не можем просто звонить HeapAlloc() для маленьких блоков? Работают плохо в отношении фрагментации (например, путем выполнения "первого соответствия" вместо "лучшего соответствия")?

    • На самом деле там какой-либо путь состоит в том, чтобы знать то, что идет под капотом различных вызовов выделения API? Это было бы довольно полезно.
  2. Что делает nedmalloc настолько быстрее, чем Microsoft malloc?

  3. От вышеупомянутого я получил впечатление это HeapAlloc()/VirtualAlloc() являются столь медленными, что это намного быстрее для malloc() назвать их только время от времени и затем управлять самой выделенной памятью. То предположение верно? Или malloc() "обертка" просто необходима из-за фрагментации? Можно было бы думать, что системные вызовы как это будут быстры - или по крайней мере что некоторые мысли были бы помещены в них для создания их эффективными.

    • Если это верно, почему это так?
  4. В среднем, сколько (порядок величины) чтения/запись памяти выполняются типичным malloc звоните (вероятно, функция количества уже выделенных сегментов)? Я был бы интуитивно говорить, что это находится в десятках для средней программы, действительно ли я прав?

5
задан codekaizen 7 July 2010 в 22:37
поделиться

2 ответа

Из вышесказанного у меня сложилось впечатление, что HeapAlloc()/VirtualAlloc() настолько медленные, что гораздо быстрее malloc() вызывать их только время от времени, а затем самому управлять выделенной памятью. Верно ли это предположение?

Системные вызовы на уровне ОС разработаны и оптимизированы для управления всем пространством памяти процессов. Использование их для выделения 4 байт для целого числа действительно неоптимально - вы получите в целом лучшую производительность и использование памяти, управляя крошечными выделениями в библиотечном коде и позволяя ОС оптимизировать для больших выделений. По крайней мере, насколько я понимаю.

1
ответ дан 14 December 2019 в 13:25
поделиться
  1. Вызов HeapAlloc не звучит кроссплатформенно. MS вольна менять свою реализацию, когда захочет; советую держаться подальше. :)
  2. Возможно, она более эффективно использует пулы памяти, подобно тому, как это делает библиотека Loki со своим "аллокатором малых объектов"
  3. Распределение кучи, которое по своей природе является общим, всегда медленное в любой реализации. Чем более "специализированным" является аллокатор, тем быстрее он будет работать. Это возвращает нас к пункту #2, который касается пулов памяти (и используемых размеров выделения, специфичных для вашего приложения).
  4. Не знаю.
5
ответ дан 14 December 2019 в 13:25
поделиться
Другие вопросы по тегам:

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