Zvětšit velikost zásobníku v Linuxu s setrlimit

hlasů
19

čtení informací o tom, jak zvýšit velikost zásobníku pro aplikaci C ++ kompilované s GNU, v době kompilace, pochopil jsem, že to může být provedeno s setrlimit na začátku programu. Přesto jsem nemohl najít žádný úspěšný příklad o tom, jak a kdy se používají součástí programu aplikovat ji za účelem získání velikosti 64m zásobníku pro C ++ programu, by mi někdo pomoct?

Thanlks

Položena 17/02/2010 v 08:44
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
17

Za normálních okolností byste nastavit velikost zásobníku na začátku, E, G, na začátku main(), před voláním jakékoliv jiné funkce. Typicky logika bude vypadat následovně:

  • volejte getrlimitzískat aktuální velikost zásobníku
  • pokud je aktuální velikost <požadovaná velikost stack poté
    • volejte setrlimitzvýšit velikost zásobníku na požadovanou velikost

V jazyce C, které mohou být kódovány nějak takhle:

#include <sys/resource.h>
#include <stdio.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;
}
Odpovězeno 17/02/2010 v 08:51
zdroj uživatelem

hlasů
8

Podívejte se, jestli je maximální spuštění runtime je to omezující:

[wally@zf 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

Všimněte si, že velikost zásobníku, ve výchozím nastavení, je omezena na 10 MiB. Takže zvýšit ji na 64 MiB:

[wally@zf conf]$ ulimit -s 64M
-bash: ulimit: 64M: invalid number
[wally@zf conf]$ ulimit -s 65536
[wally@zf 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
Odpovězeno 17/02/2010 v 08:54
zdroj uživatelem

hlasů
4

Dostat se za pevný limit v setrlimit (na OSX jejím jediným 64MB standardně), vytvořit nové vlákno pomocí pthreads s velikostí zásobníku podle svého výběru. Zde je úryvek 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;

    }
Odpovězeno 14/02/2012 v 17:58
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more