Anzeige:
Ergebnis 1 bis 15 von 19

Thema: feststellen ob programm mit daten in speicher passt?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Registrierter Benutzer Avatar von Berufspenner
    Registriert seit
    30.03.2002
    Ort
    Hamburg
    Beiträge
    567
    Sobald du, z.B. mit C, Speicher alloziieren willst, bekommst du die direkte Bestätigung, ob dir die nötige Speicherkapazität zur Verfügung steht, oder nicht. Aber erzähl mal etwas genauer, was du vor hast und vorallem wie. Also in welcher Sprache, etc.
    C und C++

  2. #2
    Registrierter Benutzer
    Registriert seit
    24.08.2004
    Beiträge
    749
    Sprache ist C++. Ich habe einige arrays die sehr groß werden können je nach input. Z.b. 10^6 größe. Da ich performance-messungen mache darf auf keinen fall swapping entstehen. Deswegen wollte ich wissen wie ich auf schnelle und einfache weise feststellen kann ob alle meine daten in den Speicher passen.

    Das Problem ist die Daten werden auch nicht alle auf einmal alloziiert. Jetzt müsste ich halt immer schauen ob die daten noch voll in den speicher passen - ich alloziiere aber C-mässig mit malloc etc. Also nicht STL-mäßiges.

  3. #3
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Swap abschalten?

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  4. #4
    Registrierter Benutzer
    Registriert seit
    18.03.2005
    Beiträge
    211
    Imho darf ein BS allokierten speicher ned swappen, solange das programm ned inaktiv ist.

    Stell dir vor, dein array ... im Speicher, du greifst mit dem [] operator zu, und das BS muesste die speicherseiten erst von der platte holen ... undenkbar, das wuerde jegliche Garantien die c++ Programmen zugestanden werden, zunichte machen.
    Ausserdem muesste jegliche simple Speicherarithmetik und jeglicher speicherzugriff nen hook in BS haben, was alles mega inperformant werden lies.

    Swappen darf das BS das komplette Programm, dann inklusive stack und heap, wenn es als inaktiv erkannt wurde ....
    und beim wiederholen wird es dann wieder komplett restauriert.

    DU kannst natuerlich innerhalb deines programmes swapping verwenden, aber das musst du expliziet selber programmieren. Die winapi und sicher auch posix stellen da funktionen zur verfuegung.

    Also wenn dein thread "laeuft" sollte der Heap von deinem prog ausnahmslos zur verfuegung stehen .... also kannst mit nem simplen new / malloc deinen speicher holen und auf die rueckgabewerte bzw exceptions achten.
    Bei windows zb, wenn nen system mit 512Mb hasst, 100Mb vom BS "beansprucht werden" wirst sicher niemals mehr als 400MB insgesamt allokieren koennen, das new / malloc wird dir da nen out of memory bringen. egal wieviel "virtuellen speicher" du reserviert hasst. Das BS wird aber versuchen, in dem moment wenn dein malloc/nw laeuft, andere Programme zu supendieren und in den swap zu schicken ... was deine speicherallokierung schon mal bissi zeit kosten kann.
    Glaub ned das sich linux da soviel anders verhaelt ....

    was aber in deinem programm ned so ohne weiteres abfangen kannst, ist das dich das BS auf grund eines anderen progs mit hoeherer prio in den schlafzustand schickt, und dich dann auch rausswappt.
    Aber das ist Thema das BS und der Prioritaeten einzelner programme IMHO .

    Ciao ...
    Geändert von RHBaum (14-05-2009 um 12:58 Uhr)

  5. #5
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Zitat Zitat von RHBaum Beitrag anzeigen
    Imho darf ein BS allokierten speicher ned swappen, solange das programm ned inaktiv ist.

    Stell dir vor, dein array ... im Speicher, du greifst mit dem [] operator zu, und das BS muesste die speicherseiten erst von der platte holen ... undenkbar, das wuerde jegliche Garantien die c++ Programmen zugestanden werden, zunichte machen.
    Ausserdem muesste jegliche simple Speicherarithmetik und jeglicher speicherzugriff nen hook in BS haben, was alles mega inperformant werden lies.
    Ok an dieser Stelle hab ich aufgehört deinen Kommentar zu lesen. Informiere dich mal über Speichermanagement, virtuellen Speicher, Paging, Page Tabel, Translation Lookaside Buffer (TLB) etc oder besuche die Vorlesung "Betriebssysteme" an einer Universität deiner Wahl. In der Tat kann JEDER Speicherzugriff dazu führen, dass eine OS Routine einspringt und Speicher aus dem Swap lädt oder aber nur eine virtuelle Speicheradresse in eine physikalisch umwandelt. Auf die Festplatte werden i.d.R. jene Speicherseiten geschrieben, die schon lange nicht mehr genutzt worden sind (gibt da natürl. noch intelligentere Strategien).
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  6. #6
    Registrierter Benutzer
    Registriert seit
    18.03.2005
    Beiträge
    211
    @Panzi
    Hasst du windows ?

    kannst du das mal laufen lassen:
    (vorher alles sichern ^^)

    Code:
    int main(int argc, char * argv[])
    {
    	const int BLOCKSIZE = 0xF00000;
    	bool bdoit = true;
    	int alloc = 0;
    	while(bdoit)
    	{
    		char * pTest = new char[BLOCKSIZE];
    		if(pTest)
    		{
    			alloc += BLOCKSIZE;
    			std::cout << alloc << " Byte allokiert!" << std::endl;
    			std::cout.flush();
    			Sleep(1000);
    		}
    		else
    		{
    			bdoit = false;
    		}
    	}
    	return 0;
    }
    Also hier aufn rechner schaff ich ca. 800 MiB.
    Obwohl ich 2048 RAM und die auslagerungsdatei bis 4 GiB gehen sollte (platz aufn datenträger iss vorhanden).
    Er lagert hier vorher scho aus ca auf 400MiByte
    Dann schaufelt er den speicher hoch, und steigt bei 800 ca. mit outofmemory aus ....
    Sollte laut deiner Anmerkung aber ned passieren. Da sollte er doch bis 2Gib mindestens hochkommen oder, und vor allem regelmaessig rausswappen ?

    BS hier ist winXP 32 SP2

    Ciao ...
    Geändert von RHBaum (15-05-2009 um 10:31 Uhr)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •