Увеличьте размер стека в Linux с помощью setrlimit
Информация о том, как увеличить размер стека для приложения С++, скомпилированного с помощью gnu, во время компиляции, я понял, что это можно сделать с помощью setrlimit в начале программы. Тем не менее, я не смог найти успешного примера о том, как его использовать и в какой части программы применить его, чтобы получить размер стека 64M для программы на С++, может кто-нибудь мне помочь?
Thanlks
Ответы
Ответ 1
Обычно вы устанавливаете размер стека на раннем этапе, e, g, в начале main() перед вызовом любых других функций. Обычно логика была бы следующей:
- вызов getrlimit для получения текущего размера стека
- если текущий размер < требуемый размер стека
- call setrlimit для увеличения размера стека до требуемого размера
В C, который может быть закодирован примерно так:
#include <sys/resource.h>
int main (int argc, char **argv)
{
const rlim_t kStackSize = 64L * 1024L * 1024L; // min stack size = 64 Mb
struct rlimit rl;
int result;
result = getrlimit(RLIMIT_STACK, &rl);
if (result == 0)
{
if (rl.rlim_cur < kStackSize)
{
rl.rlim_cur = kStackSize;
result = setrlimit(RLIMIT_STACK, &rl);
if (result != 0)
{
fprintf(stderr, "setrlimit returned result = %d\n", result);
}
}
}
// ...
return 0;
}
Ответ 2
Посмотрите, ограничивает ли его выполнение максимальный срок выполнения:
[[email protected] conf]$ ulimit -all
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 16114
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 16114
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
Обратите внимание, что размер стека по умолчанию ограничен 10 мегабайтами. Итак, чтобы увеличить его до 64 MiB:
[[email protected] conf]$ ulimit -s 64M
-bash: ulimit: 64M: invalid number
[[email protected] conf]$ ulimit -s 65536
[[email protected] conf]$ ulimit -all
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 16114
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 65536
cpu time (seconds, -t) unlimited
max user processes (-u) 16114
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
Ответ 3
Чтобы выйти за пределы жесткого ограничения в setrlimit (по умолчанию OSX - только 64 МБ), создайте новый поток, используя pthreads с размером стека по вашему выбору. Здесь фрагмент C:
// Call function f with a 256MB stack.
static int bigstack(void *(*f)(void *), void* userdata) {
pthread_t thread;
pthread_attr_t attr;
// allocate a 256MB region for the stack.
size_t stacksize = 256*1024*1024;
pthread_attr_init(&attr);
pthread_attr_setstacksize(&attr, stacksize);
int rc = pthread_create(&thread, &attr, f, userdata);
if (rc){
printf("ERROR: return code from pthread_create() is %d\n", rc);
return 0;
}
pthread_join(thread, NULL);
return 1;
}