Zarządzanie pamięcią to podstawowe zjawisko systemu operacyjnego używanego do obsługi lub zarządzania pamięcią podstawową w celu kontrolowania praw dostępu do pamięci na komputerze. Celem jest uniemożliwienie dostępu procesowi do pamięci, która nie została mu jeszcze przydzielona.
System operacyjny przydziela pamięć dla każdego procesu, który jest podzielony na segmenty. Stack i Heap to dwa sposoby alokacji pamięci w systemie operacyjnym.
Segment stosu służy do przechowywania zmiennych funkcji lokalnych, które są tworzone automatycznie, natomiast segment stosu jest używany do dynamicznie alokowanej pamięci.
Oba są przechowywane w pamięci RAM komputera i mogą się powiększać i zmniejszać podczas wykonywania programu. Omówmy je szczegółowo i porównajmy, aby zrozumieć, który z nich jest lepszy.
Segment stosu jest techniką zarządzania pamięcią stosowaną do statycznego przydzielania pamięci. Jest to specjalny obszar w pamięci komputera, który służy do przechowywania lokalnych zmiennych funkcji. Po wywołaniu funkcji pamięć jest przydzielana gdzieś wszystkim zmiennym lokalnym i można uzyskać do nich dostęp, znając ich lokalizację. Bloki pamięci są zwalniane po zakończeniu funkcji. Stack to jeden ze sposobów efektywnego wdrożenia tego procesu. Pomyśl o tym jako o podstawowej strukturze danych, w której elementy są ułożone jedna na drugiej jak stos. Podobnie, do zmiennych lokalnych można uzyskać dostęp poprzez wypychanie i popping. Pchanie odnosi się do dodawania przedmiotów do stosu, a strzelanie oznacza pobieranie przedmiotów ze stosu. Dostęp do przedmiotów można uzyskać ze stosu w kolejności „ostatni na wejściu” (LIFO).
Sterta odnosi się do dużej puli pamięci wykorzystywanej do dynamicznego przydzielania pamięci, co oznacza, że pamięć pozostaje przydzielona do momentu zakończenia programu lub zwolnienia pamięci. Pamięć jest przydzielana losowo, więc nie ma łatwego sposobu na uzyskanie dostępu do pamięci. W przeciwieństwie do segmentu stosu elementy są zwalniane w odwrotnej kolejności, tak jak zostały pierwotnie przydzielone. Mówiąc prosto, pamięć jest przydzielana programom na żądanie i zwalniana, gdy nie jest już wymagana. Elementy stosu są od siebie niezależne, co oznacza, że można do nich uzyskać dostęp podczas działania programu i zwalniać je po zakończeniu programu. To jest jak globalna pula pamięci używana do przechowywania zmiennych globalnych i wielu zmiennych, które się do niej odwołują.
W architekturze komputerowej stos jest specjalnym obszarem pamięci komputera wyraźnie przeznaczonym na zmienne automatyczne. W programowaniu zmienna automatyczna jest zmienną lokalną, co oznacza, że zakres zmiennej jest lokalny dla bloku, w którym jest zadeklarowany. Pamięć jest przydzielana automatycznie tym zmiennym po wejściu do bloku, a pamięć jest zwalniana po wyjściu. Z drugiej strony sterta to część pamięci komputera wykorzystywana do dynamicznego przydzielania pamięci, co oznacza, że bloki pamięci są przydzielane i zwalniane w sposób losowy.
Stos służy do przechowywania zmiennych lokalnych, których zakres jest zdefiniowany w funkcji. Z technicznego punktu widzenia stos obsługuje alokację pamięci statycznej, która odpowiada lokalnym zmiennym statycznym i zmiennym zakresu. Pamięć jest przydzielana przed uruchomieniem programu, zwykle w czasie kompilacji, a stosowana struktura danych nazywana jest stosem. Z drugiej strony Heap służy do dynamicznego przydzielania pamięci, co oznacza, że pamięć jest przydzielana ręcznie w czasie wykonywania podczas wykonywania programu. Programy żądają pamięci, zwykle w celu dodania węzła do struktury danych i zwracają, jeśli nie są potrzebne.
Stos jest zarządzany i optymalizowany przez CPU, a dane są dostępne w kolejności od ostatniego do pierwszego (LIFO). LIFO odnosi się do metody przechowywania danych w stosach pamięci, w której najnowszy blok pamięci jest pierwszy do uwolnienia i odwrotnie. To zapewnia efektywne zarządzanie pamięcią. Przeciwnie, elementy stosu są od siebie niezależne, a dostęp do danych można uzyskać dowolnie, co oznacza, że blok pamięci może zostać przydzielony i zwolniony w dowolnym momencie, niezależnie od ich kolejności. W przeciwieństwie do stosów, stosy nie mają określonego schematu przydzielania i zwalniania bloków pamięci.
Pamięć jest zarządzana automatycznie na stosie, a zmienne są przydzielane i zwalniane automatycznie, co oznacza, że stos jest zarezerwowany tylko dla zmiennych tymczasowych. Zmienne lokalne stają się aktywne, gdy funkcja jest wykonywana, a kiedy się kończy, zmienne wykraczają poza zakres, co oznacza, że zakres zmiennej jest lokalny dla funkcji i istnieje tak długo, jak długo funkcja się wykonuje. W przeciwieństwie do stosu, pamięć jest przydzielana, gdy program działa na stercie, co sprawia, że dostęp do przechowywanych tutaj zmiennych jest nieco wolniejszy. Ponieważ w rezerwowaniu bloków nie ma określonej kolejności, bloki pamięci można w dowolnym momencie przydzielić i zwolnić.
Oba są najczęstszymi sposobami alokacji pamięci i są przechowywane w pamięci RAM komputera w celu wydajnego zarządzania pamięcią. Jednak dostęp do pamięci na stosie jest szybki, ponieważ pamięcią zarządza się automatycznie, natomiast na stercie pamięcią należy zarządzać ręcznie, co oznacza, że musisz samodzielnie przydzielić wolną pamięć, gdy bloki nie są już potrzebne. Stack jest oczywiście szybszy i łatwiejszy w użyciu dzięki swojej elastyczności, ale ma spory udział wady i zalety. Chociaż stos nie ma ograniczenia wielkości pamięci, jest trochę trudny do wdrożenia. Sterty są wolniejsze niż stosy, ale ich implementacja jest prostsza.