Stos i kupa
Zarządzanie pamięcią jest fundamentalnym zjawiskiem 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 jakiemukolwiek procesowi uzyskania dostępu do pamięci, która nie została jeszcze do niego przydzielona.
System operacyjny przydziela pamięć dla każdego procesu, który jest podzielony na segmenty. Stack and Heap to dwa sposoby przydzielania pamięci w systemie operacyjnym.
Segment stosu służy do przechowywania zmiennych funkcji lokalnych, które są tworzone automatycznie, podczas gdy segment sterty jest używany do dynamicznie przydzielanej pamięci.
Oba są przechowywane w pamięci RAM komputera i mogą rosnąć i kurczyć się podczas wykonywania programu. Omówmy je szczegółowo i porównajmy je, aby zrozumieć, który z nich jest lepszy.
Co to jest Stack?
Segment stosu jest techniką zarządzania pamięcią używaną do alokacji pamięci statycznej. Jest to specjalny obszar w pamięci komputera, który służy do przechowywania lokalnych zmiennych funkcyjnych. Kiedy wywoływana jest funkcja, pamięć jest alokowana do wszystkich lokalnych zmiennych gdzieś i możesz uzyskać dostęp do tych zmiennych, tak jak znasz ich lokalizacje. Bloki pamięci są zwalniane, gdy funkcja się kończy. Stos 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 jeden na drugim jak stos. Podobnie dostęp do zmiennych lokalnych można uzyskać za pomocą pchania i poppingu. Pushing oznacza dodawanie przedmiotów do stosu, a popping oznacza pobieranie przedmiotów ze stosu. Dostęp do przedmiotów można uzyskać ze stosu w zamówieniu "ostatni w pierwszym wyjściu" (LIFO).
Czym jest Heap?
Sterta odnosi się do dużej puli pamięci używanej do dynamicznego przydzielania pamięci, co oznacza, że pamięć pozostaje przydzielona do czasu zakończenia programu lub zwolnienia pamięci. Pamięć jest przydzielana losowo, więc nie ma łatwego 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 prościej pamięć jest przydzielana do programów na żądanie i zwalniana, gdy nie jest już potrzebna. Elementy sterty są niezależne od siebie, co oznacza, że mogą być dostępne jako program uruchomiony i uwolniony po zakończeniu programu. Jest to globalna pula pamięci używana do przechowywania zmiennych globalnych i wielu zmiennych, które się do niej odwołują.
Różnica między stosem a stertami
Znaczenie stosu i sterty
W architekturze komputerowej stos jest specjalnym obszarem pamięci komputera jawnie 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 do tych zmiennych po wejściu do bloku, a pamięć jest zwalniana przy wyjściu. Z drugiej strony stert stanowi część pamięci komputera wykorzystywaną do dynamicznego przydzielania pamięci, co oznacza, że bloki pamięci są przydzielane i de-alokowane w sposób losowy.
Przydział pamięci dla stosu i sterty
Stos jest używany do przechowywania zmiennych lokalnych i których zakres jest zdefiniowany w funkcji. Pod względem technicznym stos obsługuje alokację pamięci statycznej, która odpowiada lokalnym zmiennym statycznym i zmiennym zasięgu. Pamięć jest alokowana przed uruchomieniem programu, zwykle w czasie kompilacji, a używana struktura danych nosi nazwę stosu. Z kolei stertę stosuje się do dynamicznego przydzielania pamięci, co oznacza, że pamięć jest przydzielana ręcznie w środowisku wykonawczym podczas wykonywania programu. Programy żądają pamięci, zwykle w celu dodania węzła do struktury danych i zwracają, jeśli nie są potrzebne.
Dostęp do stosu i sterty
Stos jest zarządzany i optymalizowany przez procesor, a dane są dostępne w kolejności "ostatni w pierwszym wyjściu" (LIFO). LIFO odnosi się do metody przechowywania danych w stosach pamięci, w których ostatni blok pamięci jest pierwszym, który zostanie zwolniony i na odwrót. Zapewnia to wydajne zarządzanie pamięcią. Natomiast elementy sterty są niezależne od siebie, a dostęp do danych można uzyskać arbitralnie, co oznacza, że blok pamięci może być przydzielany i zwalniany w dowolnym czasie, niezależnie od ich kolejności. W przeciwieństwie do stosów, hałdy nie mają określonego wzorca do alokacji i dealokacji bloków pamięci.
Zmienne w stosie i stosie
Pamięć jest automatycznie zarządzana w stosie, a zmienne są alokowane i deallokowane automatycznie, co oznacza, że stos jest zarezerwowany tylko dla zmiennych tymczasowych. Zmienne lokalne stają się aktywne, gdy funkcja jest wykonywana, a po jej zakończeniu zmienne wykraczają poza zakres, co oznacza, że zakres zmiennej jest lokalny dla funkcji i istnieje tak długo, jak długo funkcja ta jest wykonywana. W przeciwieństwie do stosu, pamięć jest alokowana, ponieważ program działa w stercie, co sprawia, że dostęp do zmiennych tutaj przechowywanych jest nieco wolniejszy. Ponieważ nie ma określonej kolejności w rezerwacji bloków, bloki pamięci mogą być przydzielane i bezpłatne w dowolnym momencie.
Stack vs. Heap: Tabela porównawcza
Podsumowanie Stack vs Heap
Oba są najczęstszymi sposobami przydzielania pamięci i są przechowywane w pamięci komputera w celu wydajnego zarządzania pamięcią. Jednak dostęp do pamięci w stosie jest szybki, ponieważ pamięć jest zarządzana automatycznie, podczas gdy w sterty pamięć jest zarządzana ręcznie, co oznacza, że trzeba samemu przydzielić wolną pamięć, gdy bloki nie są już potrzebne. Stos jest oczywiście szybszy i łatwiejszy w użyciu, dzięki swojej elastyczności, ale ma swój spory udział zalet i wad. Chociaż stos nie ma limitu rozmiaru pamięci, jest trochę trudny do wdrożenia.Stert jest wolniejszy niż stos, ale jego implementacja jest prostsza.