Intereting Posts
Регулярные выражения C ++ с Boost Regex Векторные указатели и объекты передачи по ссылке в C ++ Почему неявно и явно удаленные конструкторы перемещения обрабатываются по-разному? Отправить файл POST C ++ как установить или инициализировать значение по умолчанию для всех элементов таблицы или массива 2d или многомерного массива недопустимый вход int застревает в бесконечном цикле (Re) Использование std :: алгоритмов с нестандартными контейнерами Обнаружение прерывистого соединения во время запроса Boost.Asio Странный код, который компилируется с g ++ Объект OpenGL не преобразуется в ось вращения C ++ – векторный iterator без инкрементной ошибки eclipse-cdt как связать со статической библиотекой C ++: метод возвращает один и тот же объект каждый раз Форвардное объявление std :: wstring Имеет ли смысл доступ к данным только для чтения из нескольких streamов одновременно?

Связь между лимитом стека и streamами

  1. Какова взаимосвязь между ulimit -s <value > и размером стека (на уровне нитей) в реализации Linux (или, если на то пошло, какой-либо ОС)?

    Является ли <number of threads > * <each thread stack size > меньше < stack size assigned by ulimit command > допустимое обоснование?

  2. В нижеприведенной программе каждый stream выделяет char [PTHREAD_STACK_MIN] и создается 10 streamов. Но когда ulimit установлен в 10 * PTHREAD_STACK_MIN, он не отключается из-за прерывания. Для некоторого случайного значения stacksize (намного меньше, чем 10 * PTHREAD_STACK_MIN), это дампы ядра. Почему так?

Мое понимание состоит в том, что stacksize представляет стек, занятый всеми streamами в суммировании для процесса.

Функция резьбы

 #include  #include  #include  #include  #include  #include  using namespace std; #include  #include  const unsigned int nrOfThreads = 10; pthread_t ntid[nrOfThreads]; void* thr_fn(void* argv) { size_t _stackSz; pthread_attr_t _attr; int err; err = pthread_attr_getstacksize(&_attr,&_stackSz); if( 0 != err) { perror("pthread_getstacksize"); } printf("Stack size - %lu, Thread ID - %llu, Process Id - %llu \n", static_cast (_stackSz), static_cast (pthread_self()), static_cast (getpid()) ); //check the stack size by actual allocation - equal to 1 + PTHREAD_STACK_MIN char a[PTHREAD_STACK_MIN ] = {'0'}; struct timeval tm; tm.tv_sec = 1; while (1) select(0,0,0,0,&tm); return ( (void*) NULL); } 

Основная функция

 int main(int argc, char *argv[]) { struct rlimit rlim; int err; err = getrlimit(RLIMIT_STACK,&rlim); if( 0 != err) { perror("pthread_create "); return -1; } printf("Stacksize hard limit - %ld, Softlimit - %ld\n", static_cast  (rlim.rlim_max) , static_cast  (rlim.rlim_cur)); for(unsigned int j = 0; j < nrOfThreads; j++) { err = pthread_create(&ntid[j],NULL,thr_fn,NULL); if( 0 != err) { perror("pthread_create "); return -1; } } for(unsigned int j = 0; j < nrOfThreads; j++) { err = pthread_join(ntid[j],NULL); if( 0 != err) { perror("pthread_join "); return -1; } } perror("Join thread success"); return 0; } 

PS:
Я использую версию Ubuntu 10.04 LTS, ниже спецификации.
Linux laptop 2.6.32-26-generic # 48-Ubuntu SMP Wed Nov 24 10:14:11 UTC 2010 x86_64 GNU / Linux

В UNIX / Linux getrlimit(RLIMIT_STACK) гарантированно дает размер стека основного streamа. Ссылка OpenGroup явна на это, «стек начального streamа»:

http://www.opengroup.org/onlinepubs/009695399/functions/getrlimit.html

Для Linux есть ссылка, которая указывает, что RLIMIT_STACK – это то, что будет использоваться по умолчанию для любого стека streamов (для streamовой обработки NPTL):

http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_create.3.html

Как правило, поскольку программист может решить (используя нестандартные атрибуты при создании streamа), куда класть стек и / или сколько стека использовать для нового streamа, нет такой вещи, как «совокупный лимит стека процесса». Это скорее получается из общего RLIMIT_AS адресного пространства RLIMIT_AS .
Но у вас есть ограничение на количество streamов, которые вы можете создать, sysconf(PTHREAD_THREADS_MAX) , и у вас есть нижнее ограничение для минимального размера стека streamов, sysconf(PTHREAD_STACK_MIN) .

Кроме того, вы можете запросить стаксели по умолчанию для новых streamов:

 pthread_attr_t attr; size_t stacksize; if (!pthread_attr_init(&attr) && !pthread_attr_getstacksize(&attr, &stacksize)) printf("default stacksize for a new thread: %ld\n", stacksize); 

Т.е. по умолчанию – инициализируйте набор атрибутов pthread и спросите, для чего стекирует система.

В streamовой программе стеки для всех streamов (кроме начального) выделяются из кучи, поэтому RLIMIT_STACK мало или совсем не имеет отношения к тому, сколько стекового пространства вы можете использовать для своих streamов.