Stos i sterta

Kupując komputer zawsze myślimy o pamięci: im więcej tym lepiej. Nie zastanawiamy się jak jest zorganizowana.

Stos (ang: stack) to liniowa struktura pamięci, w której dane dodawane są na wierzch stosu i są z niego pobierane.

Sterta (czasami określana jako kopiec lub stóg, ang. heap) to obszar pamięci służący do implementacji dynamicznie tworzonych struktur danych.

Za każdym razem gdy użyjemy konstrukcji typu:

{
    int a;
}

tworzona jest zmienna (a w tym przypadku) , a pamięć przydzielana jest na stosie. Każdy proces ma swój własny stos o ograniczonej wielkości. Po wyjściu z bloku pamięć jest zwalniana.

Poniższy program pozwala „zbadać” (w przybliżeniu) wielkość stosu:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
    for ( long int i = 1; ; i = i * 2 )
    {
        printf("i=%ld\n", i);
        char t[i];
        t[i - 1] = 0.;
    }
    return 0;
}

Program kończy pracę wypisując ostatnią wartość i = 8388608 czyli około 8 Mbajtów.

Polecenie powłoki ulimit -s podaje (w kilobajtach) dokładną wartość:

$ ulimit -s
8192

W konsekwencji ilość pamięci na dane jest ograniczona. Wielkość tej pamięci można zmienić. Polecenie powłoki ulimit pozwala tę wartość zmienić.

$ ulimit -s 20000
$ ulimit -s
20000
# sprawdźmy teraz nasz program
./tablica-stos
...
i=33554432

Zatem ilość dostępnej pamięci na stosie się zwiększyła…


Poniższy program korzysta z funkcji malloc():

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
    for ( long int i = 1; ; i = i * 2 )
    {
        double * t = malloc(sizeof( double ) * i);
        if ( t == NULL )
        {
            printf("brak pamieci, i=%ld\n", i);
            return 1;
        }
        t[i - 1] = 0.;
        free(t);
    }
    return 0;
}

Po uruchomieniu wynik jest następujacy:

brak pamieci, i=2147483648
Poprzedni
Następny