Czemu `sbrk` wydaje się alokować więcej pamięci, niż potrzebuje?

0

Wygłupiam się, czytając o niskopoziomowych funkcjach, których nie rozumiem, i dotarłem do sbrk(2).

Napisałem prosty programik sprawdzający, jak można (a raczej nie można, bo robię coś źle) alokować pamięci za pomocą tej funkcji:

    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
     
    int main()
    {
        printf("%p\n", sbrk(0)); // Wypisz obecną granicę pamięci procesu
    	sbrk(sizeof(int));         // Powiększ ją by alokować pamięć na 1 inta
    	printf("%p\n", sbrk(0)); // Wypisz granicę pamięci po tej alokacji
    	sbrk(-((intptr_t)sizeof(int))); // Zwolnij pamięć na tego inta
    	printf("%p\n", sbrk(0)); // Wypisz granicę po tym zwolnieniu (powinno być tak jak przed alokacją??)
    }

Wypisuje mi się na przykład:

0x160a000
0x162b004
0x162b000

Nie pojęte. sizeof(int) to u mnie 4. więc rozumiem przejście z 0x162b004 do 0x162b000. ALE CZEMU alokacja na 1 inta spowodowała skok aż o 0x1004 bajtów?? 0x160a000->0x162b004 Przecież wywołałem sbrk(sizeof(int)) a nie sbrk(401*sizeof(int))!!

0

Odpowiedzią jest zapewne pamięć wirtualna i stronicowanie. Dodatkowo pamiętaj, że nie da się zaalokować mniej niż 64k (IIRC) więc możliwe, że to również to.

0

Wygląda na to, że rozwiązanie jest takie, że printf alokuje pamięć na bufor:

    #include <stdio.h>
    #include <unistd.h>
 
    int main()
    {
        printf("%p\n", sbrk(0));
        printf("%p\n", sbrk(0));
        sbrk(sizeof(int));
        printf("%p\n", sbrk(0));
        sbrk(-((intptr_t)sizeof(int)));
        printf("%p\n", sbrk(0));
    }

Rezultat:

0x10ca000
0x10eb000
0x10eb004
0x10eb000

A jak wyłączymy buforowanie:

    #include <stdio.h>
    #include <unistd.h>
 
    int main()
    {
        setbuf(stdout, NULL);
        printf("%p\n", sbrk(0));
        printf("%p\n", sbrk(0));
        sbrk(sizeof(int));
        printf("%p\n", sbrk(0));
        sbrk(-((intptr_t)sizeof(int)));
        printf("%p\n", sbrk(0));
    }

Rezultat:

0x1233000
0x1233000
0x1233004
0x1233000

1 użytkowników online, w tym zalogowanych: 0, gości: 1