4 Stimmen

Stapelgröße von proc/pid/maps in C

Ich habe die Stack-Größe von /proc/pid/maps für ein C-Programm unter Linux-64 Bit gesehen. Ich konnte die folgende Zeile in Bezug auf die Stack-Größe sehen.

7fffc2e14000-7fffc2e35000 rw-p 00000000 00:00 0 [stack]

Ich verstehe die oben genannten Werte nicht. Wenn ich die Differenz nehme, erhalte ich die Differenz 135168 in Dezimalzahlen. Aber das ist nicht annähernd 8MB. Interpretiere ich es falsch?

Aber wenn ich das rlimit drucke:

int main (void)
{
  struct rlimit limit;

  getrlimit (RLIMIT_STACK, &limit);
  printf ("\nStack Limit = %ld and %ld max\n", limit.rlim_cur, limit.rlim_max);
}

Ausgabe: Stack Limit = 8388608 und -1 max

Ich erhalte Stack Limit = 8388608, was 8 MB entspricht.

4voto

Jonathon Reinhart Punkte 123962

rlim_cur ist eine "weiche Grenze", bis zu der der Stack für diesen Prozess wachsen kann. Er ist kein Indikator für die aktuelle Stack-Nutzung. Vom man Seite :

Jede Ressource hat eine zugehörige weiche und harte Grenze, die durch die rlimit-Struktur definiert ist:

struct rlimit {
    rlim_t rlim_cur;  /* Soft limit */
    rlim_t rlim_max;  /* Hard limit (ceiling for rlim_cur) */
};

Die weiche Grenze ist der Wert, der entsprechende Ressource durchsetzt. Das harte Limit dient als Obergrenze für das weiche Limit: ein unprivilegierter Prozess kann sein weiches Limit nur auf einen Wert im Bereich von 0 bis zum harten Limit setzen und sein hartes Limit (unwiderruflich) harte Grenze senken.

/proc/[pid]/maps andererseits zeigt Ihnen, was derzeit für diesen Prozess eingeordnet ist. Ich sehe 0x21000, was höchstwahrscheinlich (33) 4k Seiten sind. Dies ist wahrscheinlich ein besserer Indikator für die aktuelle Stack-Nutzung für diesen Prozess. Allerdings sind darin wahrscheinlich auch andere Dinge als der Stack enthalten, z. B. die Umgebungsvariablen.

2voto

Linux legt nicht die gesamte rlimit-Größe für den Stack fest, wenn ein Prozess startet. Es reserviert lediglich so viel virtuellen Adressraum (damit andere mmaps usw. den Stack nicht blockieren können) und lässt den Stack dynamisch bis zum Limit wachsen. Allerdings gibt es auch eine standardmäßig festgelegte Stack-Größe, die je nach System 128k oder 132k zu betragen scheint, und ich habe keine Ahnung, wie man das optimieren kann.

0voto

Pavan Manjunath Punkte 26281

RLIMIT_STACK gibt die Höchstgrenze an, bis zu der Ihr Stack wachsen kann. Im Moment ist Ihr Stack 132 KB groß. Hätten Sie mehr Auto-Variablen verwendet, wäre die Stack-Größe, die Sie bei /proc/pid/maps wäre mehr gewesen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X