Настройка размера стека процесса
Q: Мое приложение поддерживает большое количество параллельных потоков, и потребности использовать большую сумму штабеля выделили данные. Как я могу защитить от переполнения моего выделенного стекового пространства?
A: Мое приложение поддерживает большое количество параллельных потоков, и потребности использовать большую сумму штабеля выделили данные. Как я могу защитить от переполнения моего выделенного стекового пространства?
Каждый процесс Mac OS X запускается с размером штабеля по умолчанию 8 мегабайтов. Это выделение используется исключительно для потребностей штабеля основного потока. Каждый последующий создаваемый поток выделяется его собственный штабель по умолчанию, размер которого отличается в зависимости от поточной обработки используемый API. Например, в то время как Углерод MPTasks создается с 4-килобайтным штабелем, реализация Mac OS X Pthreads определяет размер штабеля по умолчанию 512 килобайтов.
Процесс может перерасти свое выделенное стековое пространство любым из следующих средних значений:
Глубокая рекурсия
Глубоко вложенные вызовы процедуры
Большие выделения данных штабеля
Много параллельных потоков
Определение пределов стека процесса
Так как определенные системные значения по умолчанию и пределы могут измениться между выпусками Mac OS X, полезно быть в состоянии определить размер стека процесса по умолчанию для системы, на которой Вы разрабатываете. Из командной строки
Поочередно, определенные с помощью системы и максимальные размеры стека процесса по умолчанию могут быть получены с помощью getrlimit вызов функции. См. Дарвинскую страницу справочника для
Установка большего штабеля во время ссылки
Если Вы находите, что Ваше приложение отказывает, потому что оно перерастает выделение штабеля на 8 мегабайтов по умолчанию, можно повысить его значение по умолчанию путем передачи -stack_size флаг на строке ссылки и указании нового размера штабеля до 64 мегабайтов.
Установка размера штабеля к 16 МБ (0x1000000)
Используя XCode:
Добавить -Wl,-stack_size,1000000 к полю Other Linker Flags области Build Styles.
Используя ld от Make-файла или командной строки:
ld -stack_size 1000000 foo.o bar.o
Используя gcc, ссылка передачи отмечает через к ld с -Wl:
gcc -Wl,-stack_size -Wl,1000000 foo.c
Динамично увеличивая стек процесса во время выполнения
Используя системный вызов BSD setrlimit, можно увеличить размер штабеля процесса до размера, позволенного системой. См. Дарвинскую страницу справочника для
Установка размера штабеля для отдельного потока
Можно также увеличить размер штабеля, выделенный потокам, поскольку Вы создаете их. В Pthreads это сделано путем установки пользовательского атрибута и передачи его pthread_create.
Перечисление 1 , устанавливающее размер штабеля Птрида
#include <limits.h>
#include <pthread.h>
#define REQUIRED_STACK_SIZE 1024*1024
int CreateThreadWithLargeStack (pthread_t *outThread, void *threadFunc, void *arg)
{
int err = 0;
pthread_attr_t stackSizeAttribute;
size_t stackSize = 0;
/* Initialize the attribute */
err = pthread_attr_init (&stackSizeAttribute);
if (err) return (err);
/* Get the default value */
err = pthread_attr_getstacksize(&stackSizeAttribute, &stackSize);
if (err) return (err);
/* If the default size does not fit our needs, set the attribute with our required value */
if (stackSize < REQUIRED_STACK_SIZE)
{
err = pthread_attr_setstacksize (&stackSizeAttribute, REQUIRED_STACK_SIZE);
if (err) return (err);
}
/* Create the thread with our attribute */
err = pthread_create (outThread, &stackSizeAttribute, threadFunc, arg);
return (err);
} |
Углерод MPTasks
При использовании Carbon Multiprocessing Services можно установить размер штабеля MPTask, когда это создается путем передачи значения кроме 0 в stackSize параметр MPCreateTask.
Какао NSThreads
С Mac OS X 10.5, класс NSThread включает setStackSize: метод, который может использоваться для установки размера штабеля выше на 1 ГБ. Предыдущие выпуски трудно кодировали размер штабеля NSThread к 512 КБ.
История версии документа
| Дата | Примечания |
|---|---|
| 26.01.2011 | Обновленные «Другие Флаги Компоновщика» sntax для XCode 3.1.2. |
| 20.02.2008 | Обновленный раздел NSThread для Leopard. |
| 22.04.2005 | Новый документ, описывающий методы для установки размера штабеля процесса и/или потока. |