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

Если вы собираетесь попробовать параллельное программирование, то я думаю, что clojure намного лучше, чем то, что вы получаете из Java из коробки. Взгляните на эту презентацию, чтобы понять, почему:

http://blip.tv/file/812787

Я задокументировал свои первые 20 дней с Clojure в своем блоге.

http://loufranco.com/blog/files/category-20-days-of-clojure.html

Я начал с лекций SICP, а затем построил параллельное простое число сито. Я также играл с макросами.

6
задан Sashi 5 November 2009 в 07:02
поделиться

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 из них или что-то еще, чтобы пропустить области памяти, которые могли быть выделены, но просто никогда не использовались), и место, где находится этот указатель, указывает на максимальное использование стека.

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

4
ответ дан 17 December 2019 в 00:11
поделиться

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

Если вы хотите знать, сколько памяти зарезервировано для одного потока вы можете использовать атрибут 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.

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

3
ответ дан 17 December 2019 в 00:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: