windows - Berør hukommelsesfordelingsrutinerne blokken, der frigøres?

Indlæg af Hanne Mølgaard Plasc

Problem



Windows HeapFree, msvcrt free: Har de fået hukommelsen frigivet til at blive paged-in? Jeg forsøger at estimere, om ikke frigivelse af hukommelse ved udgangen ville fremskynde ansøgningsafbrydelsen betydeligt.


BEMÆRK: Dette er et meget specifikt teknisk spørgsmål. Det handler ikke om, hvorvidt applikationer skal eller ikke skal ringe free ved udgangen.

Bedste reference


Hvis du ikke rentallokaliserer alle dine ressourcer ved lukning af applikationer, vil det gøre det umuligt at opdage, om du har nogle virkelig alvorlige problemer - som hukommelseslækage - hvilket ville være mere af et problem end en langsom afbrydelse. Hvis brugergrænsefladen forsvinder hurtigt, så vil brugeren tænke, at den er lukket hurtigt, selvom den stadig har meget arbejde at gøre. Med brugergrænsefladen er opfattelsen af ​​hastighed vigtigere end den faktiske hastighed. Når brugeren vælger 'Afslut applikation' Hovedprogramvinduet skal straks forsvinde. Det er ligegyldigt, om ansøgningen tager et par sekunder efter det for at frigøre alt en udgang graciøst, har brugeren ikke vundet.

Andre referencer 1


Jeg kørte en test for HeapFree. Følgende program har adgangslovgivning indenfor HeapFree ved i=31999:


#include <windows.h>

int main() {

    HANDLE heap = GetProcessHeap();
    void * bufs[64000];

    // populate heap
    for (unsigned i = 0; i < \_countof(bufs); ++i) {
        bufs[i] = HeapAlloc(heap, 0, 4000);
    }

    // protect a block in the "middle"
    DWORD dwOldProtect;
    VirtualProtect(
        bufs[\_countof(bufs) / 2], 4000, PAGE\_NOACCESS,
        &dwOldProtect);

    // free blocks
    for (unsigned i = 0; i < \_countof(bufs); ++i) {
        HeapFree(heap, 0, bufs[i]);
    }
}


Stakken er


ntdll.dll!\_RtlpCoalesceFreeBlocks@16()  + 0x12b9 bytes  
ntdll.dll!\_RtlFreeHeap@12()  + 0x91f bytes  
shutfree.exe!main()  Line 19    C++


Så det ser ud til, at svaret er 'Ja' (det gælder også free, da det bruger HeapFree internt)

Andre referencer 2


Jeg er næsten sikker på, at svaret på hastighedsforbedringsspørgsmålet ville være 'ja'. Hvis du fritager en blok, må du måske ikke røre den aktuelle blok, men det skal helt sikkert opdatere andre bogføringsoplysninger. Hvis du har zillioner af små objekter, der er tildelt (det sker), så kan indsatsen for at frigøre dem alle have en betydelig indvirkning.


Hvis du kan arrangere det, kan du prøve at konfigurere din ansøgning således, at hvis den ved, at den vil stoppe, gem alle ventende arbejder (konfiguration, dokumenter, uanset) og afslutte ungracefully.