Tja, welchen Parameter Du setzen musst, haengt davon ab, was Du machen willst. Die Anforderung, dass ein Prozess nicht
Quote[...] mehr als 4 GB in Anspruch nehmen [...]
soll, ist einfach nicht spezifisch genug:
- Mit
ulimit -d ... bzw.
setrlimit(RLIMIT_DATA, ...) beschraenkst Du die Menge an virtuellem Speicher, die von automatisch aus der ausfuehrbaren Datei geladenen Datensektionen und mittels
brk /
sbrk allozierten Seiten belegt werden darf. Wenn Du nicht weisst, ob der Allokator des betreffenden Prozesses ueberhaupt diese Systemaufrufe verwendet, und nicht vielleicht direkt
mmap benutzt, ist das Limit je nach Betriebssystem wohl wenig sinnvoll. Wenn das Limit ueberschritten wird, bricht der Kernel den Prozess in der Regel mit einem
SEGV-Signal ab.
- Mit
ulimit -l ... bzw.
setrlimit(RLIMIT_MEMLOCK, ...) beschraenkst Du die Menge an physikalischem Speicher, der so zugewiesen ist, dass er nicht ausgelagert werden darf. Meistens existiert hier bereits standardmaessig ein recht geringes Limit und nur wenige Programme brauchen solchen Speicher, zum Beispiel um kryptographische Schluessel abzulegen. Wenn das Limit ueberschritten wird, bricht der Kernel den Prozess in der Regel mit einem
SEGV-Signal ab.
- Mit
ulimit -m ... bzw.
setrlimit(RLIMIT_RSS, ...) beschraenkst Du die Menge an physikalischem Speicher, der aktuell insgesamt von dem Programm belegt wird, also die Groesse aller Seiten, die dem Programm gehoeren und nicht ausgelagert sind. Je nach Betriebssystem haengt es auch hier vom Allokator ab, ob das Limit etwas bewirkt. Je nach Betriebssystem wird der Prozess auch nicht abgebrochen, wenn er dieses Limit ueberschreitet, sondern es werden einfach mehr Speicherseiten ausgelagert, was den Prozess nur langsamer macht und den Speichermanager des Kernels zusaetzlich belastet.
- Mit
ulimit -v ... bzw.
setrlimit(RLIMIT_AS, ...) beschraenkst Du die Menge an virtuellem Speicher, der aktuell insgesamt von dem Programm belegt wird, inklusive ausgelagerter Seiten und inklusive Bereichen, die eigentlich gar keine Daten enthalten. Dieses Limit funktioniert wohl am zuverlaessigsten auf verschiedenen Betriebssystemen aehnlich, ist aber auch am unspezifischsten. Wenn das Limit ueberschritten wird, bricht der Kernel den Prozess in der Regel mit einem
SEGV-Signal ab.
When C++ is your hammer, every problem looks like your thumb.