размер стека из proc / pid / maps в C - PullRequest
4 голосов
/ 24 марта 2012

Я видел размер стека из / proc / pid / maps для C-программы в linux-64 bit.Я мог видеть следующую строку, относящуюся к размеру стека.

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

Я не понимаю вышеуказанные значения.Если я возьму разницу, я получу разницу в 135168 в десятичном виде.Но это не близко к 8 МБ.Я неправильно понимаю?

Но если я напечатаю ограничение:

int main (void)
{
  struct rlimit limit;

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

Вывод: ограничение стека = 8388608 и -1 макс

Я получу ограничение стека = 8388608, которое достигает 8 МБ.

Ответы [ 3 ]

4 голосов
/ 24 марта 2012

rlim_cur - это «мягкий предел», на который может вырасти стек для этого процесса. Это не показатель текущего использования стека. Со страницы man :

С каждым ресурсом связано мягкое и жесткое ограничение, определяемое Структура ограничения:

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

Мягкий предел - это значение, которое ядро ​​устанавливает для соответствующий ресурс. Жесткий предел действует как потолок для мягких предел: непривилегированный процесс может только установить свое мягкое ограничение на значение в диапазоне от 0 до жесткого предела, и (необратимо) понизить его жесткий лимит.

/proc/[pid]/maps, с другой стороны, показывает, что в настоящее время отображается для этого процесса. Я вижу 0x21000, который является наиболее вероятным (33) 4k страниц. Это, вероятно, лучший показатель вашего текущего использования стека для этого процесса. Однако, это, вероятно, включает в себя и другие вещи, кроме стека, такие как переменные среды.

2 голосов
/ 24 марта 2012

Linux не фиксирует полный размер rlimit для стека при запуске процесса.Он просто резервирует это большое виртуальное адресное пространство (чтобы другие mmaps и т. Д. Не могли блокировать рост стека) и позволяет стеку динамически расти до предела.Тем не менее, существует также размер фиксированного стека по умолчанию, который в зависимости от системы составляет 128 или 132 КБ, и я понятия не имею, как это настроить.

0 голосов
/ 24 марта 2012

RLIMIT_STACK указывает максимальный предел, до которого может расти ваш стек.Прямо сейчас ваш стек в 132 КБ.Если бы вы использовали больше автоматических переменных, размер стека, который вы видели в /proc/pid/maps, был бы больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...