none
Malloc()-Speicher nicht sofort in Auslagerdatei schieben? RRS feed

  • Allgemeine Diskussion

  • Hallo zusammen,
    ich verwende malloc() zur Reservierung für eine verkette Liste. Ich bekomme auch schön für jede Anfrage Speicher und kann diesen auch nutzen.
    Mein Problem: Windows lagert bei der Reservierung alles sofort in die Auslagerdatei aus, obwohl noch ausreichend Speicher lt. Taskmanager verfügbar ist. Wenn ich die Liste dann nutze, pumpt Windows alles wieder zurück in den Hauptspeicher, ohne die Auslagerdatei zu verkleinern. Mit free() wird alles wieder geputzt.
    Kann man das sofortige Auslagern verhindern oder beeinflussen?
    Bei 64Bit könnte ich ja ordentlich Speicher aufrüsten. Könnte ich den Speicher dann verwenden oder lagert Windows meinen mit malloc() angeforderten Speicher trotzdem aus?
    Ich wäre für Hinweise/Literatur/Quellen sehr dankbar.
    Viele Grüße,
    Rudi

    • Typ geändert Robert Breitenhofer Montag, 6. Juni 2011 12:58 Keine Rückmeldung des Fragenstellender
    Sonntag, 15. Mai 2011 15:55

Alle Antworten

  • 1. Wieso glaubst Du, das Windows irgendetwas auslagert. GHast Du die entsprechenden Performance Counter überprüft.
    2. Windows lagert nur Speicher aus, den es nicht benötigt und zuerst garantiert keinen User-Spaicher, sondern speicher der Exeutables, der lange nicht verwendet wurde.

    Woraus schließt Du das Windows auch nur 1 Bit auslagert?

    Lies mal meinen folgenden Artikel und speziell den unteren Bereich über den Performance-Monitor wie Du wirklich Auslagerung kontrollieren kannst:
    http://blog.m-ri.de/index.php/2008/01/05/die-unsitte-aus-performancegruenden-virtuallock-zu-verwenden/


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Sonntag, 15. Mai 2011 19:43
  • Hi, danke für die Antwort!
    Hier meine Vorgehensweise, worauf meine Vermutungen basieren:
    Ich hänge mal das Programm an. Es ist sehr einfach, reserviert nur Speicher, nutzt diesen und gibt ihn wieder frei. Wenn man es durchläuft und man sich parallel den Taskmanager ansieht, so erkennt man, dass...
    Im ersten Loop mit "malloc"/"calloc" nur die Auslagerdatei anwächst, obwohl genug Hauptspeicher verfügbar ist.
    Im zweiten Loop "fill" werden nun die Strukturen genutzt. Jetzt zeigt der Taskmanager eine höhere Hauptspeicherauslastung an. Die Größe der Auslagerdatei bleibt jedoch unverändert gross. Im dritten Loop wird nur alles mal ausgegeben, die Speicherauslastung verändert sich laut Taskmanager nicht.
    Im vierten Loop "free" wird der Speicher wieder freigegeben. Auslagerdatei und genutzter Hauptspeicher werden laut Taskmanager wieder kleiner, gehen auf Ausgangswert zurück.

    Meine Frage ist, wie kann ich Windows dazu bringen, gleich und ausschließlich den reichlich verfügbaren Hauptspeicher zu nutzen. Kann ich den direkt addressieren, oder so?

    Vielen Dank auch für den Link. Habe schon mal reingesehen, muss es erst verdauen :)
    Ich will ja Windows nicht bevormunden, die wissen selbst, wie das System am besten läuft. Nur wenn ich mir für meinen neuen Rechner ordentlich Speicher kaufe, kann ich den dann auch nutzen??? Das war meine eigentliche Frage, hätte ich wohl oben anstellen sollen.

    Gruß, Rudi

    #include
    <stdio.h>
    #include <malloc.h>
    
    struct struct_test { /* nur ein paar Felder, die Speicherplatz benötigen ... */
    char t[1000];char t2[1000];char t3[1000];char t4[1000];char t5[1000];
    int i;int i2;int i3;int i4; };
    
    #define AnzStr 100000
    struct struct_test *ss[AnzStr];
    struct struct_test *s;
    
    void main ( void )
    {
      int m = 0;
      char str[100];
    
      for ( m = 0; m < AnzStr; m++ )
      {
       sprintf(str,"malloc=%d!\n",m);printf(str);
       ss[m] = calloc(1,sizeof(struct struct_test));
      }
      for ( m = 0; m < AnzStr; m++ )
      {
       sprintf(str,"fill=%d!\n",m);printf(str);
       sprintf(ss[m]->t, "in struct %ld\n", m );
      }
      for ( m = 0; m < AnzStr; m++ )
      {
       printf(ss[m]->t);
      }
      for ( m = 0; m < AnzStr; m++ )
      {
       sprintf(str,"free=%d!\n",m);printf(str);
       free(ss[m]);
      }
      getchar();
    }

     

    Sonntag, 22. Mai 2011 08:52
  • Nochmal: Woran machst Du fest, dass die Auslagerungsdatei "wächst" oder "verwendet" wird. Was für einen Wert interpretierst Du in dieser Weise?
    Woran machst Du fest, dass es nur irgendeinen Disk I/O wegen der Allokation von Speicher geben könnte?
    Hast Du mit dem Performance Monitor die entsprechenden Marker geprüft?

    Jeder Speicher der allokiert wird und auslagerbar ist, hat auch eine theoretische Position in der Auslagerungsdatei zugewiesen bekommen, wenn die Auslagerungsdatei groß genug ist, damit der Speicher eben auch sofort ausgelagert werden kann... dies ist ein interner Vorgang der keinen Disk I/O verursacht.
    Wenn Windows die Auslagerungsdatei verwaltet wird diese automatisch in 1,5facher Größe des aktuellen physikalischen Speichers angelegt.

    Die Pagefile wird auch direkt im Notfall Crashdump Speicher genutzt und erst beim neu booten des Systems wird dieser Speicher in eine DMP Datei kopiert.
     Etwas ganz anderes ist es wenn die Auslagerungsdatei wachsen muss, aber dann bist Du bereits an der Speichergrenze.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Montag, 23. Mai 2011 07:08