Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 19

Thema: feststellen ob programm mit daten in speicher passt?

  1. #1
    Registrierter Benutzer
    Registriert seit
    24.08.2004
    Beiträge
    749

    feststellen ob programm mit daten in speicher passt?

    Hallo,

    wie kann ich auf einfache weise feststellen ob mein datensatz den ich übergebe und der ganze speicher der alloziiert wird komplett in den hauptspeicher passen? ALso so dass kein swapping stattfindet. Arbeit unter linux - reicht da der top befehl und die prozentuale auslastung des speichers anzusehen? Was gibt es sonst für mittel?

  2. #2
    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++

  3. #3
    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.

  4. #4
    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

  5. #5
    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 13:58 Uhr)

  6. #6
    Registrierter Benutzer
    Registriert seit
    24.08.2004
    Beiträge
    749
    danke erstmal. Interessant - das wusste ich noch nicht. Ginge es denn den swap auszuschalten? Wenn ja - was passiert denn dann wenn ich mehr speicher alloziiere als zur verfügung steht? Wirft er dann ne not_enough_memory_exception oder ähnlihces?

  7. #7
    Registrierter Benutzer
    Registriert seit
    18.03.2005
    Beiträge
    211
    c++ liefert dir bei nem new nen nullzeiger zurueck,
    malloc sicher auch. Exceptions kann das new werfen muss aber nicht, glaub ich ... das malloc soweiso ned, c kennt keine exceptions.
    Also immer schoen rueckgarbewert abfragen
    mit sicherheit wird auch irgendwas in die globale Fehlervariable geschrieben (GetLastError ... )

    der Standard-allocator der stl, der von den containern verwendet wird (da machst ja selber kein new) wirft dir eine outofmemory exception. wenn exceptions in c++ aktiviert hasst ... ansonsten steigt dein prog glaub ich sofort mit nem terminate aus.

    BTW dein maximale heapgrosse kann und wird auch begrenzt sein.
    egal ob 32 oder 64 bit, einem 32bit programm (in der 32bit runtime unter windows) wird das BS niemals mehr als 2GB zugestehen, egal wieviel Hauptspeicher dein system hat ....
    wobei hier programm als prozess zu verstehen ist.
    um die beschraenkungen zu umgehen, muesstest entweder auf ner 64 bit plattform entwickeln, oder auf mehrere prozesse aufteilen ... wobei da natuerlich das BS einzelne prozesse schlafen schicken kann ... da kannst dann scho swapping probleme bekommen ^^

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

  8. #8
    Registrierter Benutzer
    Registriert seit
    24.08.2004
    Beiträge
    749
    egal ob 32 oder 64 bit, einem 32bit programm (in der 32bit runtime unter windows) wird das BS niemals mehr als 2GB zugestehen, egal wieviel Hauptspeicher dein system hat ....
    ajajaj - und interessant. Wußt ich nicht - ich dachte mein Heap würde immer in den kompletten speicher passen. Also wenn ich 8Gb hab dass dann auch 8 GB Heap da wären. Wie siehts denn unter Linux/unix aus? Auch nur 2 GB für den Heap?

  9. #9
    Registrierter Benutzer
    Registriert seit
    18.03.2005
    Beiträge
    211
    mit 32bit gehen erstmal nur 4096MiByte.
    Wir haben ein lineares adressmodell, also kann man mit einer 32bit speichervariable nur 4096 * 1024 * 1024 (2^32) einzelne Bytes adressieren.

    Alles andere gaenge nur mit einem anderen spreichermodell. damit wuerden aber keine normalen runtimes mehr laufen, man brauchte entweder ne virtuelle maschine, oder nen anderes BS.

    das die 4096 ned bekommst, liegt daran, dass du vom BS auch zeugs in deinem adressbereich eingeblended benoetigst, also von den adressen eh auch welche quasi reserviert sind.

    weiss ned ob man das irgendwie einstellen kann, den 2 GiByte reserviert iss sicher sehr groszügig ueberdimensioniert. Aber windows macht es so ...
    weiss ned ob linux das anders loest ....
    bei linux weiss ich nur des es den stack dynamisch hochziehen kann, waehrend es bei windows feste grenzen gibt.

    Also wenn ich 8Gb hab dass dann auch 8 GB Heap da wären.
    8GB gehen dann auch ned ... weil das BS braucht ja auch was ... aber der "Rest" gaenge wenn du ein 64bit programm schreiben wuerdest ....
    Da sind die adresszeiger 64bit gross und amn koennte theorethisch 2^64 Byte adressieren .... aber praktisch wiederum auch ned, da die meisten boards trotz 64bit CPU keine 64 bit speicheranbindung haben, sondern glaub meist nur 48 .... aber 2^48 langen momentan auch fuer unser momentanes vorstellungsvermoegen. in 10 jahren wuerde das dann sicher auch wieder knapp ^^

    Wobei ich vermute, das irgendwann eher mal das byte in mehrere unterteibare einheiten neudefiniert wird. Also die Vorgabe von IBM aufgebrochen wird, und 1Byte(kleinste adressierbare Einheit in einem COmputersystem) momentan = 8bit auf vielleicht 32 bit angehoben wird.

    Bei zukuenftigen speichermengen, waer eine verfierfachung(verschwendung von 1+24 bit, eines verschwenden wir heut scho) von ascii text oder eine verdopplung von 16bit unicode ....
    dafuer waer dann UTF-32 quasi nativ .....

    Aber unicode isss eh alles andere als speicherfreundlich ....
    und wo ausser bei texten braucht man scho kleine blockgroessen von 8bit ?

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

  10. #10
    Registrierter Benutzer
    Registriert seit
    24.08.2004
    Beiträge
    749

    ok....interessant - ich möchte allerdings mal zurück zu meiner frage: Wie könnte ich den swap abschlaten oder wirklich sicher gehen dass kein swapping stattfindet?

  11. #11
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    05.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

  12. #12
    Registrierter Benutzer
    Registriert seit
    24.09.2005
    Beiträge
    66
    Unter Linux kann man mlock, bzw. mlockall den Prozessspeicher fürs Swapping sperren. Allerdings geht das nur als Superuser, und das ganze ist eher dafür gedacht, zeitkritische Prozesse immer bereitzuhalten.

    Übrigens, malloc wird immer einen gültigen Pointer zurückgeben, so lange noch genug virtueller Adressraum verfügbar ist. Linux bspw. allokiert den physikalischen Speicher erst, wenn man wirklich auf den Speicher zugreift. Das wäre auch der Punkt wo die Allokation letztendlich fehlschlägt, wenn kein RAM mehr verfügbar ist. Soweit ich weiß kann man dann relativ wenig dagegen tun, dass Linux den Prozess in diesem Fall einfach abschießt.

  13. #13
    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 11:31 Uhr)

  14. #14
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von Mat Beitrag anzeigen

    ok....interessant - ich möchte allerdings mal zurück zu meiner frage: Wie könnte ich den swap abschlaten oder wirklich sicher gehen dass kein swapping stattfindet?
    swapoff
    (man swapoff)

    Ohne aktivierte Swappartition kann der Kernel nicht auslagern, er wüsste ja nicht wohin

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  15. #15
    Registrierter Benutzer
    Registriert seit
    24.08.2004
    Beiträge
    749
    Unter Linux kann man mlock, bzw. mlockall den Prozessspeicher fürs Swapping sperren. Allerdings geht das nur als Superuser, und das ganze ist eher dafür gedacht, zeitkritische Prozesse immer bereitzuhalten.
    ah sehr gut - damit gewährleiste ich doch für einen prozess immer priorität 1 oder?
    Und wie kann ich das wieder lösen also den "normal"-zustand ohne mlock wieder herstellen?

Lesezeichen

Berechtigungen

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