Как определить размер стека для программы в Linux?

Как определить текущий размер стека программы в Linux?

говорится, что размер стека для каждой программы будет 8 МБ в Linux, но когда вы используете cat/proc//mmap показывает другой размер.

Также, как определить размер стека связанных потоков? Поскольку сказано, что потоки имеют свой собственный стек?

2 ответа

Если вам просто нужен текущий размер стека, вы можете объявить переменную в верхней части main(), взять ее адрес и сравнить ее с адресом переменной, объявленной там, где вы определяете "текущий". Разница должна быть приблизительным размером, который стек вырос.

Если вы хотите узнать, сколько памяти зарезервировано для стека, вы можете проверить /proc/ [pid]/maps, у которого есть область, отмеченная как [stack]. Например, мой atd-процесс имеет:

7fff72a41000-7fff72a56000 rw-p 00000000 00:00 0 [stack]
0175b000-0177c000 rw-p 00000000 00:00 0 [heap]

который дает вам представление.

Чистый трюк, который мой друг поделился со мной, когда я хотел узнать максимальный размер стека, который использовал моя программа, был следующим. Я приведу его здесь, если кто-то сочтет это полезным:)

1) В функции, называемой около начала main(), используйте alloca() или очень длинный массив, чтобы набросать 0xDEADBEEF или какую-либо другую такую ​​маловероятную константу на столько же, сколько вы могли бы использовать. Эта память будет "освобождена", когда возвращается маленькая функция.

2) В конце main снова используйте alloca(), чтобы захватить область памяти и "искать" вниз через нее за любую магическую константу, которую вы использовали для рисования (вы можете попытаться найти первый блок из 64 из них или что-то, чтобы пропустить области памяти, которые могли быть выделены, но просто никогда не использовались), и там, где этот указатель земли указывает на максимальное использование стека.

Не идеально, но это было полезно для того, что я делал!


Как предложил Стивен, существует разница между размером стека, зарезервированным для вашего потока и стека, который в настоящее время используется вашим потоком.

Если вы хотите знать, сколько памяти зарезервировано для одного потока, вы можете использовать атрибут pthread.

pthread_attr_t attr;
size_t stacksize;
pthread_attr_init(&attr);
pthread_attr_getstacksize(&attr, &stacksize); 
printf("%u\n", stacksize);

Это будет печатать размер стека по умолчанию, зарезервированный при создании одного потока. Для меня это 8 Мб.

Вы можете изменить это, используя pthread_attr_setstacksize() и передав структуру attr как 2 аргумента функции pthread_create.

Изменить: Возможно, вам также следует знать о ленивых проблемах с размещением. Ваше 8 Мбайт виртуального пространства не будет использовать 8 Мб физического пространства памяти, если вы не будете читать или писать всюду в этом пространстве памяти.

licensed under cc by-sa 3.0 with attribution.