Dlaczego częściowo pełna pamięć RAM powoduje opóźnienie?

53

Dlaczego częściowo pełna pamięć RAM (powiedzmy 80%) powoduje, że urządzenie bardzo opóźnia się, mimo że jest miejsce na przechowywanie większej ilości danych? Oczekuję, że będzie działał dobrze aż do 99%.

Zauważam, że na telefonie komórkowym bardziej niż na PC, ponieważ ma mniejszą pamięć RAM, np. Mój telefon komórkowy ma 2 GB pamięci RAM; gdy mam mniej niż 1 GB wolnej pamięci RAM, to jest dużo opóźnień! Dlaczego tak się dzieje, mimo że nadal ma do dyspozycji około 1 GB?

Mohammed Noureldin
źródło
28
Podejrzewałem, że zakładasz, że dostępna pamięć RAM nie jest używana. Widzisz więc 20% dostępnej pamięci RAM i myślisz, że zużywa się tylko 80% pamięci RAM. Jest to niepoprawne, pamięć RAM może być używana i dostępna. (Na przykład, urządzenie, którego używam, ma teraz 32 GB pamięci RAM i 21,1 GB jest dostępnych, ale tylko 1,8 GB jest bezpłatne.)
David Schwartz
2
Masz na myśli moje wolne miejsce na HDD z moją pamięcią RAM? niestety.
Mohammed Noureldin
3
Oczywiście można je wymienić. Ale będzie to miało ogromny negatywny wpływ na wydajność - dokładnie tak, jak widzisz. Jeśli zestaw roboczy przekroczy pamięć RAM, wydajność będzie fatalna, bez względu na ilość dostępnej pamięci RAM.
David Schwartz
3
Co sprawia, że ​​myślisz, że to procent pamięci RAM powoduje opóźnienie urządzenia?
enkryptor
4
@MohammedNoureldin Myślę, że musi istnieć powód, dla którego pamięć RAM jest zajęta (wiele procesów działa i robi coś). Może to być ten sam powód opóźnienia urządzenia. Ładowanie pamięci RAM może być tylko objawem, a nie samym powodem.
enkryptor

Odpowiedzi:

70

Jest tu dużo zaangażowanych, ale postaram się to wyjaśnić tak prosto, jak to tylko możliwe i w sposób, który można zastosować do prawie każdego systemu operacyjnego.

Istnieją tutaj 2 podstawowe zasady:

  1. Suma wszystkich rzeczy, które muszą znajdować się w pamięci RAM, a te rzeczy, które mogłyby skorzystać z pamięci RAM, są prawie zawsze większe niż rozmiar pamięci RAM. Do rzeczy, które skorzystałyby z bycia w pamięci RAM, należą zestawy robocze procesów i lista rezerwowa. Ten ostatni zawiera dane i kod, które były kiedyś w użyciu, ale od tego czasu przestały działać. Wiele z tego zostanie ponownie wykorzystanych, niektóre z nich wkrótce, więc warto zachować to w pamięci RAM. Ta pamięć działa jak rodzaj pamięci podręcznej, ale nie jest tak naprawdę niezbędna, dlatego należy do kategorii dostępnej pamięci. Podobnie jak wolna pamięć, można ją szybko przekazać każdemu programowi, który jej potrzebuje. Ze względu na wydajność pamięć rezerwowa powinna być duża.

  2. Częstotliwość użycia bloków pamięci jest daleka od losowej, ale można ją przewidzieć ze znaczną dokładnością. Pamięć jest podzielona na bloki, często 4 bajty. Dostęp do niektórych bloków uzyskuje się wiele razy na sekundę, podczas gdy do innych nie można uzyskać dostępu przez wiele minut, godzin, dni, a nawet tygodni, jeśli system działa wystarczająco długo. Istnieje szeroki zakres zastosowania między tymi 2 skrajnościami. Menedżer pamięci wie, które bloki zostały ostatnio otwarte, a które nie. Jest rozsądnym założeniem, że blok pamięci, do którego ostatnio uzyskano dostęp, będzie wkrótce potrzebny. Pamięć, do której ostatnio nie uzyskano dostępu, prawdopodobnie wkrótce nie będzie potrzebna. Długie doświadczenie dowiodło, że jest to ważna zasada.

Menedżer pamięci wykorzystuje drugą zasadę, aby w dużej mierze złagodzić niepożądane konsekwencje pierwszej. Aby to zrobić, wykonuje operację równoważenia polegającą na przechowywaniu ostatnio używanych danych w pamięci RAM, podczas gdy rzadko używane dane są przechowywane w oryginalnych plikach lub pliku stronicowania.

Gdy pamięć RAM jest obfita, równoważenie jest łatwe. Wiele ostatnio nieużywanych danych można przechowywać w pamięci RAM. To dobra sytuacja.

Sprawy komplikują się, gdy zwiększa się obciążenie pracą. Suma użytych danych i kodu jest większa, ale rozmiar pamięci RAM pozostaje taki sam. Oznacza to, że mniejszy ich podzbiór może być przechowywany w pamięci RAM. Niektóre rzadziej używane dane nie mogą już znajdować się w pamięci RAM, ale muszą zostać pozostawione na dysku. Menedżer pamięci bardzo stara się zachować równowagę między pamięcią w aktywnym użyciu a dostępną pamięcią. Jednak wraz ze wzrostem obciążenia menedżer pamięci będzie zmuszony udostępnić więcej dostępnej pamięci działającym procesom. To nie jest dobra sytuacja, ale menedżer pamięci nie ma wyboru.

Problem polega na tym, że przenoszenie danych do iz pamięci RAM podczas działania programów zajmuje dużo czasu. Gdy pamięć RAM jest obfita, nie zdarza się to często i nawet nie zostanie zauważona. Ale kiedy użycie pamięci RAM osiągnie wysoki poziom, stanie się to znacznie częściej. Sytuacja może być tak zła, że ​​więcej czasu poświęca się na przenoszenie danych do iz pamięci RAM, niż na faktyczne ich użycie. Jest to druzgocące, czego menedżer pamięci bardzo stara się uniknąć, ale przy dużym obciążeniu często nie można tego uniknąć.

Menedżer pamięci jest po twojej stronie, zawsze starając się zachować optymalną wydajność nawet w niesprzyjających warunkach. Ale gdy obciążenie jest duże, a dostępna pamięć kończy się na niskim poziomie, musi robić złe rzeczy, aby nadal działać. To jest właściwie najważniejsza rzecz. Priorytetem jest najpierw utrzymanie działania, a następnie jak najszybsze wykonanie.

LMiller7
źródło
1
Twoja odpowiedź bardzo mi pomogła, dziękuję! To memory mangerjest część mojego OSprawa? więc jeśli miałbym do czynienia ze wskaźnikami i tymi bardzo niskimi poziomami, czy nadal będzie mógł tworzyć stronicowanie?
Mohammed Noureldin
7
Menedżer pamięci jest częścią systemu operacyjnego. Przywoływanie jest podstawową funkcją menedżera pamięci i jest tak samo ważne dla operacji, jak oddychanie dla ciebie i ja. Nie można go zatrzymać.
LMiller7
2
@MohammedNoureldin: Podczas pisania aplikacji w przestrzeni użytkownika (których widoki pamięci są odizolowane od jądra i innych procesów) nie można uzyskać bezpośredniego dostępu do pamięci fizycznej . Jedyny, co możesz uzyskać, to widok pamięci zarządzany przez - zgadłeś - menedżera pamięci ze wszystkimi jego funkcjami (prawdopodobnie), w tym stronicowaniem. Wskaźniki pamięci odnoszą się tylko do punktów w przestrzeni adresowej widoku pamięci. Są to koncepcje językowe stosowane zarówno w kodzie jądra, jak i kodzie przestrzeni użytkownika, ale to nie znaczy, że dwa widoki pamięci są identyczne. Nie myl zarządzania pamięcią procesu z jądrem MM!
David Foerster
6
Jest to „oczywiste” lub „dobrze znane”, ale być może należy dodać w tej odpowiedzi: pamięć (ram) jest około 1000 razy szybsza niż dysk twardy (cóż, zależy od wielu rzeczy, na przykład ssd / ide / sata itp.). System operacyjny wykonuje kod z pamięci RAM (+ pamięci podręcznej), a nie z dysku. Kiedy pamięć się wyczerpie, a system operacyjny musi „zamienić” fragmenty („nieużywanego”) kodu z pamięci na dysk, aby uwolnić RAM, aby wykonać coś innego, zajmie to „dużo” czasu (zamiana), i jeśli zdarza się to często (np. masz wiele programów, z których każdy potrzebował wymiany, aby ich kod został załadowany do pamięci), to znacznie spowolni.
Olivier Dulac
3
Zazwyczaj nie używamy terminu „zamień” w odniesieniu do ładowania kodu do pamięci. Jest to zwykle nazywane „błędem”. Zazwyczaj termin „zamiana” jest używany tylko w przypadku informacji, które muszą zostać zapisane na dysku, zanim można je wyrzucić z pamięci RAM.
David Schwartz
29

Wszystkie współczesne systemy operacyjne używają w przeciwnym razie nieużywanej pamięci do buforowania danych, dzięki czemu można uzyskać do nich dostęp z szybkiej pamięci RAM zamiast z wolniejszej pamięci. Zazwyczaj zgłaszają to jako wolną pamięć, ponieważ aplikacje mogą wyczyścić pamięć podręczną i użyć jej w razie potrzeby, ale nadal jest używana. Im mniej tego jest, tym mniej danych można buforować, a komputer będzie wolniejszy.

Mike Scott
źródło
11
W rzeczywistości aplikacje nie muszą „wyczyścić” pamięci podręcznej. Po prostu żądają pamięci RAM od systemu operacyjnego. System operacyjny, widząc, że nie ma nieużywanej pamięci RAM, wyczyści część pamięci podręcznej plików i przekaże aplikacji zerowaną pamięć RAM. Aplikacja nie może ustalić, skąd pochodzi ta pamięć RAM.
MSalters
5
@MSalters Tak, zgadzam się, aplikacja prosi o pamięć RAM, a system operacyjny czyści pamięć podręczną, jeśli to konieczne. Starałem się to uprościć.
Mike Scott,
To było trochę jasne, ale jestem trochę bardziej świadomy szczegółów, dlatego mam wrażenie, że czegoś brakuje i potrzebuję więcej szczegółów @LMiller naprawdę mi pomógł, byłoby świetnie, gdybyś mógł zrewidować informacje w nim.
Mohammed Noureldin
4

Ta odpowiedź została przeredagowana w celu reorganizacji struktury i uczynienia wiadomości bardziej zrozumiałą. Otworzyłem go również jako odpowiedź wiki społeczności; Możesz edytować.

Stronicowanie to schemat zarządzania pamięcią, za pomocą którego bloki pamięci o stałych rozmiarach mają przypisane procesy. Gdy zużycie pamięci wzrośnie do wysokiego poziomu (tj. 80% pojemności), stronicowanie zaczyna rozciągać się z pamięci RAM na vRAM (wirtualna pamięć RAM).

vRAM znajduje się w pamięci systemowej, zwykle na dysku twardym lub w innych znacznych lokalizacjach pamięci.

Procesom przypisuje się część dysku twardego do działania jako pamięć i traktuje ich sekcję jako pamięć RAM. Jest to całkowicie normalny proces, jednak gdy czas poświęcony na przesyłanie danych do iz pamięci vRAM wzrasta, wydajność systemu maleje.

Podczas gdy dedykowana pamięć RAM jest dostępna bezpośrednio z płyty głównej z procesora, co zapewnia szybkie połączenie, wirtualna pamięć RAM musi poprowadzić okablowanie między płytą a lokalizacją pamięci vRAM.

To jednak powoduje tylko niewielki wpływ na wydajność. Gdy szybkość, z jaką odbywa się przywoływanie do pamięci vRAM, gwałtownie wzrasta (gdy pojemność dedykowanej pamięci RAM zbliża się do pojemności), następuje thrashing.

Thrashing to praktyka szybkiego i szybkiego przenoszenia stron pamięci do pamięci wirtualnej. Jest to bardzo kosztowne dla wydajności, ponieważ potrzeba więcej czasu na pobieranie i adresowanie danych.

Powiedzmy, że chcesz zapisać 30 cyfr. Możesz albo usiąść obok ekranu z notatnikiem i napisać go (używając dedykowanej pamięci), albo pamiętasz fragmenty po 5, wbiec do następnego pokoju i tam zapisać w notatniku (używając pamięci wirtualnej). Obaj wykonują zadanie, ale co będzie szybsze?

Dowiedz się więcej o thashingu tutaj !

Ogromne podziękowania dla autorów tej odpowiedzi, w tym Daniela B , ksenoidu i Jona Bentleya .

Will
źródło
3
To nie jest tak, że thrash jest celowy. To tylko efekt uboczny stronicowania i rywalizacji o pamięć fizyczną. Pamięć wirtualna nie jest „tworzona” przez przenoszenie stron na dysk.
Daniel B
Thrashing jest produktem ubocznym, to prawda, ale jest niezwykle użyteczny w czasach, gdy procesy się powtarzają, co pomaga zapobiec blokowaniu sieci. I tak, pamięć wirtualna jest zajęta, a nie tworzona. Zmienię to w.
Będzie
8
Nie, mylisz śmieci i stronicowanie. Śmieci to tylko stronicowanie, które staje się patologiczne.
ksenoid
Pager @xenoid to schemat zarządzania pamięcią; To tak, jakby powiedzieć, że mylę uderzanie jelenia moim samochodem i systemem autostrad. Thrashing to proces, który powoduje spadek wydajności; Zgadzam się jednak z tobą, że jest to wynikiem systemu przywoławczego.
Czy
1
Komentarze włączone, wykonane w odpowiedzi na wiki, możesz je edytować.
Czy
1

Jest tak, ponieważ system operacyjny musi wykonywać wiele stronicowania (ładowanie części aktywnych programów) i zamiany (przenoszenie danych z pamięci RAM do HD i odwrotnie), aby oprogramowanie działało. Gdy trzeba załadować nowe strony, które mogą wymagać więcej miejsca niż dostępne 20%, system operacyjny będzie musiał zamienić istniejące strony w pamięci RAM, które według niego będą mniej prawdopodobne, że zostaną wkrótce wykorzystane. Zwłaszcza na starcie innych programów. Zamiana stron z powrotem na strony zajmuje dużo czasu i drastycznie spowalnia działanie komputera, ponieważ pracujesz teraz z prędkością HD, a nie RAM.

Pomaga trochę na dysku twardym utworzyć specjalną partycję na dysku HD i przypisać ją jako dedykowaną przestrzeń „zamiany” (nie używaj jej do „prawdziwych” plików), dzięki czemu fragmentacja dysków HDD ma mniejszy wpływ na zamianę.

Gilles Lesire
źródło
ROM jest po prostu nazewnictwem dla HD, gdy mówimy o buforowaniu, stronicowaniu itp. Wszystko, co nie jest pamięcią roboczą. A ROM zwykle jest wolniejszy niż RAM, prawie zawsze tak było. Stare komputery kopiowały dane z pamięci ROM do pamięci RAM (ROM Shadowing) podczas uruchamiania, ponieważ działało to szybciej.
Gilles Lesire,
1
Jasne, ale ROM i RAM są również używane jako pamięć nieulotna czy pamięć ulotna? BTW ROM zwykle działa wolniej, ROM jest kopiowany do pamięci RAM (ROM Shadowing) podczas uruchamiania w celu zwiększenia wydajności. Ale jasne, zmienię jedno odniesienie, aby naprawić twoje nitpicking. ;)
Gilles Lesire
1

Pamiętaj, że dyski twarde są o rząd wielkości wolniejsze niż pamięć RAM, a sama pamięć RAM nie jest wcale taka szybka (w ogólnej architekturze). W kolejności prędkości dostępu (gdzie każdy szczebel jest o rząd wielkości wolniejszy od powyższego) masz

  1. Rejestry procesora - W praktyce rejestry są dostępne w ciągu 1 cyklu procesora . Biorąc pod uwagę, że procesory wykonują miliardy cykli na sekundę (3 GHz = 3 miliardy cykli na sekundę), jest to szalenie szybkie.
  2. Pamięć podręczna procesora - zależy od poziomu, ale nadal są one dość szybkie (dostępność 3-5 cykli dla pamięci podręcznej L1).
  3. Pamięć o dostępie swobodnym (RAM) - część losowa oznacza, że ​​nie wiesz, w jakim stanie jest dostęp. Pomyśl o dostarczycielu paczek, który musi się zatrzymać, podnieść paczkę, podejść do drzwi, zadzwonić dzwonkiem i poczekać na odpowiedź. Może wcale nie czekasz, a może czekasz minutę lub dwie, aż pani Smith podejdzie do drzwi prowadzących na tyły domu. W praktyce rozmawiamy gdziekolwiek z 14-27 cykli (w zależności od tego, jaki był stan pamięci RAM, kiedy do niej uzyskaliśmy dostęp).
  4. Dysk twardy - teraz jest tutaj proces fizyczny i chociaż dzieje się tak szybko, jak to możliwe, czekasz na ruch głowic i ścieżek pod nimi. W praktyce dysk twardy o prędkości 7200 obr./min może wykonać rewolucję w około 4 ms lub około 750 000 cykli dla procesora 3 GHz . To wolno.

Virtual Memory Manager to hazardzista. Zakłada się, że nie potrzebujesz cały czas pamięci RAM przez cały czas, więc zgaduje i rzuca kostką, że twój program do dokumentów (który był w tle przez ostatnie 10 minut podczas czytania) nie jest bardzo ważne i przenosi go na dysk twardy.

Ale potem wracasz do dokumentu! Teraz VMM musi ponownie załadować wszystkie dane z dysku twardego. Co gorsza, jeśli brakuje Ci pamięci RAM, musi ona teraz wypchnąć inne dane (więcej hazardu) na dysk twardy, aby zwolnić dostępną przestrzeń. Linux lubi tutaj żyć na krawędzi. Zapełni większość pamięci RAM często używanymi danymi (idealne dla serwerów z kilkoma procesami).

Machavity
źródło
1
Tak, menedżer pamięci jest hazardzistą, ale można to bardzo łatwo zrozumieć. Jeśli dostęp do pamięci byłby naprawdę losowy, to menedżer pamięci myliłby się tak często jak prawo i cały system się zepsułby. Ale programy zwykle wykazują silną lokalizację odniesienia. To znaczy, że większość dostępów do pamięci jest zazwyczaj zlokalizowana na stosunkowo małym obszarze pamięci. Poruszają się, ale wystarczająco wolno, aby system mógł działać. Szanse są układane na korzyść menedżerów pamięci, a błędy są szybko korygowane. Zostało to udowodnione przez dziesięciolecia doświadczenia
LMiller7
Pamięć o losowym dostępie odnosi się do faktu, że możesz uzyskać do niej dostęp losowo. (W przeciwieństwie do konieczności oczekiwania na przejście danych pod głowicami czytającymi, jak na dysku twardym lub taśmach, a następnie dostęp do danych sekwencyjnie).
Phil
0

Druzgocące odpowiedzi prawie to gwoździ. Jeśli jesteś w stanie, możesz zminimalizować, jak szybko to się dzieje, zmniejszając swapowanie (ile pamięci RAM pozwoli na użycie systemu przed przeniesieniem rzeczy do zamiany przestrzeni). Lubię ustawiać systemy tak, aby nie zamieniały się, dopóki RAM nie osiągnie 99% dla aplikacji serwerowych, ponieważ domyślnie oznaczałoby to, że musiałbym kodować rzeczy, aby wykorzystywały tylko 80% RAM, aby skorzystać z buforowania bez karania za wypychanie system w przestrzeń wymiany.

codykochmann
źródło