Czy można zaalokować więcej pamięci niż jest w wirtualnej przestrzeni adresowej sterty?

0

Hej
Jak wiadomo sterta to segment wirtualnej przestrzeni adresowej programu.
Wg rysunków wirtualna przestrzeń adresowa programu to 3Gb (stos,memory mapped segment, sterta, BSS, Data segment i kod programu).
Na stos 8Mb sie domyślnie, program zależy jaki ale to z 1-2Mb, BSS i Data segment to typowo pare kilobajtów, powiedzmy że nikt nie ładuje bibliotek linkowanych dynamicznie ani nie używa pamięci sharowanej, nazwanych semaforów to tak podejrzewam, że z 2GB sterta może okupować.
A co jak ktoś ma 32GB RAMu? To nie może zaalokować więcej pamięci niż na stercie, czyli więcej niż 2GB? Jeżeli jest możliwość to jak to działa - powiedzmy że będę sobie printował adres każdej zaalokowanej komórki pamięci to wiadomo to mi zwraca adres w wirtualnej rpzestrzeni adresowej programu a nie adres RAMU. To co wtedy się zwróci, gdzieśtam od jakiegoś momentu adresów sterty braknie...

4

Te rysunki co masz, to może dotyczą systemów 32-bitowych? Na 64-bitowych przestrzeń adresowa ma 48 bitów, czyli teoretycznie by się dało zaalokować 281 TB ramu.

1

Z tego co pamiętam ze studiów w Linuxach jest funkcja systemowa "dobierająca" pamięci dla danego procesu, która po wyczerpaniu możliwości "dobierania" zwraca jakiś błąd, natomiast rozmiar przestrzeni adresowej zależy od architektury.

1

Jak napisali poprzedni użytkownicy, rozmiar przestrzeni adresowej zależy od architektury. Na x86-64 jest to 48bitów.

Jeżeli mowa o Linuxach, to warto też zwrócić uwagę na fakt, że kernel posiada mechanizm overcommit, tzn. jest w stanie przydzielić procesom więcej pamięci, niż jest faktycznie dostępne na systemie.

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