Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Т.е. эти 4 МБ и 8 МБ, скорее всего, расположены друг за другом.быть не может, на предыдущем шаге наш участок памяти просто расширился бы с 4 мб до 8ми.
Ну почему же.Так это наше предположение, моделируемая ситуация, если хотите.
И пусть так сложилось, что между этими двумя выделениями не было других обращений за памятью.
Ну 1.5 не сильно хуже в данном плане, нужно просто «отложить» побольше места.
Более того, эти аллокаторы особенно эффективны для размеров равных степени двойки.
Для очень больших запросов (>= 128 Кб по умолчанию) используются системные средства сопоставления памяти, если они поддерживаются
И кроме того, такой механизм требует вызова ядра, что само по себе не быстро
Этот механизм поможет только для больших блоков (больше страницы памяти)Именно. А маленькие блоки копируются быстро.
//
// I/O system definitions.
//
// Define a Memory Descriptor List (MDL)
//
// An MDL describes pages in a virtual buffer in terms of physical pages. The
// pages associated with the buffer are described in an array that is allocated
// just after the MDL header structure itself. In a future compiler this will
// be placed at:
//
// ULONG Pages[];
//
// Until this declaration is permitted, however, one simply calculates the
// base of the array by adding one to the base MDL pointer:
//
// Pages = (PULONG) (Mdl + 1);
//
// Notice that while in the context of the subject thread, the base virtual
// address of a buffer mapped by an MDL may be referenced using the following:
//
// Mdl->StartVa | Mdl->ByteOffset
//
typedef struct _MDL {
struct _MDL *Next;
CSHORT Size;
CSHORT MdlFlags;
struct _EPROCESS *Process;
PVOID MappedSystemVa;
PVOID StartVa;
ULONG ByteCount;
ULONG ByteOffset;
} MDL, *PMDL;
Почему буфер должен расти экспоненциально