Ich habe das folgende Problem: Ein Programm hat einen Fehler wie den folgenden
int main() {
for(;;) {
char *p = (char*)std::malloc(1024);
std::memset(p, 1, 1024);
}
}
Und es reserviert so lange Speicher, bis mein System die Seiten anderer Anwendungen zugunsten dieses Programms austauscht und ich auf der Box nichts mehr tun kann. Ich habe dieses Problem mehrmals mit verschiedenen Anwendungen getroffen (heute war es mit Moonlight 2 Beta in Firefox). Ich denke, das Problem ist, dass das Programm dazu führt, dass der Speicher eines anderen Programms ausgelagert wird und daher mehr physischen Speicher benötigt.
Natürlich habe ich mir ulimit angeschaut und zwei Einstellungen gefunden
-m
Die maximale Größe
-v
der residenten Gruppe ist die Größe des virtuellen Speichers
Ich habe gelesen, dass der erste die gesamte physische Speichergröße angibt, die der Prozess auf einmal verwenden kann. Für mich scheint dies sinnvoller zu sein als die gesamte Größe des virtuellen Speichers, da er möglicherweise gemeinsam genutzt wird und überhaupt keine Bedeutung hat, da er ohnehin ausgetauscht wird. Also habe ich das Folgende zu meinem hinzugefügt, .bashrc
nachdem ich mir die gewohnten Resident-Set-Größen mit angesehen hatte top
, die für eine gewohnte Firefox-Sitzung bis zu etwa 120 MB reichen.
# limit usage to 256MB physical memory out of 1GB
ulimit -m 262144
Aber nach meinem obigen Test Schnipsel einsetzen, noch Brough mein System nach unten, und ich musste etwa 5 Minuten warten , bis das Terminal meine erkannten ^C
Taste drückt. Wenn ich in den ersten Sekunden nicht reagiere, kann ich in diesen Situationen normalerweise nur die Reset-Taste drücken, die mir nicht gefällt. Hat also jemand eine Strategie, wie man das löst? Warum funktioniert die körperliche Begrenzung nicht? Es scheint mir, dass auf diese Weise andere Anwendungen noch genügend physisches Gedächtnis haben sollten, um vernünftig zu reagieren.