когда мне следует использовать «Механизмы манипулирования памятью» в программировании WIN32 API? - PullRequest
0 голосов
/ 07 мая 2019

Я изучаю программирование в WINAPI и провожу эксперименты по написанию битовых кодов. Когда я перешел к теме «Управление памятью с помощью winapi», я увидел, что есть некоторые «Механизмы управления памятью», которые

    Virtual Memory 
    >        LPVOID VirtualAlloc(
             LPVOID lpAddress, 
             SIZE_T dwSize, 
             DWORD  flAllocationType,
             DWORD  flProtect);

    Memory Mapped Files
    >        HANDLE CreateFileMappingA(
             HANDLE                hFile,
             LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
             DWORD                 flProtect,
             DWORD                 dwMaximumSizeHigh,
             DWORD                 dwMaximumSizeLow,
             LPCSTR                lpName
             );

    Heaps
    >        HANDLE HeapCreate(
             DWORD  flOptions,
             SIZE_T dwInitialSize,
             SIZE_T dwMaximumSize
             );


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

1 Ответ

0 голосов
/ 07 мая 2019

Приложения обычно используют два уровня выделения памяти. Операционная система выделяет память для процесса в страницах.

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

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

Как правило, вы используете функции выделения страниц, когда вам нужно выделить большой объем памяти, например, массив размером 100 МБ для молекулярного моделирования.

HeapCreate используется для создания кучи для меньшего выделения памяти. HeapAlloc может быть использован для выделения памяти из кучи. Чаще всего программисты на C просто используют malloc / free. Тем не менее, Windoze позволяет вам определять свои собственные кучи для лучшего контроля. На земле Eunuchs вы обычно ссылаетесь в своей собственной реализации malloc / free, чтобы сделать то же самое.

Таким образом, ваш первый выбор - это схема выделения памяти, используемая языком программирования (например, new / delete, malloc / free). Второй вариант - это функции API кучи (если предыдущие не соответствуют вашим потребностям). Ваш третий выбор - функции выделения страниц.

...