Wyjaśnienie pamięci wirtualnej — w jaki sposób Android zapewnia płynne działanie aplikacji

Wyjaśnienie pamięci wirtualnej — w jaki sposób Android zapewnia płynne działanie aplikacji

Sercem smartfona z Androidem jest jądro Linux, nowoczesny wielozadaniowy system operacyjny. Jego zadaniem jest zarządzanie zasobami obliczeniowymi w telefonie, w tym procesorem, procesorem graficznym, wyświetlaczem, pamięcią masową, siecią i tak dalej. Jest również odpowiedzialny za pamięć o dostępie swobodnym (RAM). Aplikacje, usługi działające w tle, a nawet sam Android wymagają dostępu do pamięci RAM. Sposób, w jaki Linux dzieli tę pamięć na partycje i przydziela ją, ma kluczowe znaczenie dla płynnego działania smartfona. Tutaj wkracza pamięć wirtualna.

Co to jest pamięć wirtualna?

Jako szybkie przypomnienie, programy (aplikacje) składają się z kodu i danych. Kod jest ładowany do pamięci po uruchomieniu aplikacji. Kod zaczyna się w określonym punkcie i postępuje po jednej instrukcji na raz. Dane są następnie odczytywane z pamięci, pobierane przez sieć, generowane lub kombinacja wszystkich trzech. Każda lokalizacja w pamięci, która przechowuje kod lub dane, jest znana pod swoim adresem. Podobnie jak adres pocztowy, który jednoznacznie identyfikuje budynek, adres pamięci jednoznacznie identyfikuje miejsce w pamięci RAM. Pamięć wirtualna mapuje dane aplikacji do miejsca w fizycznej pamięci RAM telefonu. Problem polega na tym, że aplikacje nie wiedzą, gdzie zostaną załadowane do pamięci RAM. Jeśli więc program oczekuje na przykład adresu 12048, który będzie używany jako licznik, to musi to być dokładnie ten adres. Ale aplikacja może zostać załadowana w innym miejscu pamięci, a adres 12048 może być używany przez inną aplikację. Rozwiązaniem jest nadanie wszystkim aplikacjom wirtualnych adresów, które zaczynają się od 0 i osiągają do 4 GB (lub więcej w niektórych przypadkach). Następnie każda aplikacja może używać dowolnego adresu, w tym 12048. Każda aplikacja ma swoją unikalną, ale wirtualną przestrzeń adresową i nigdy nie musi się martwić o to, co robią inne aplikacje. Te adresy wirtualne są mapowane na rzeczywiste adresy fizyczne gdzieś w pamięci RAM. Zadaniem jądra Linuksa jest zarządzanie wszystkimi mapowaniami adresów wirtualnych na adresy fizyczne.

Dlaczego pamięć wirtualna jest przydatna?

Pamięć wirtualna to cyfrowa reprezentacja pamięci fizycznej zaimplementowana w taki sposób, że każda aplikacja ma własną prywatną przestrzeń adresową. Oznacza to, że aplikacjami można zarządzać i uruchamiać niezależnie od siebie, ponieważ każda aplikacja jest samowystarczalna pod względem pamięci. Jest to podstawowy element konstrukcyjny wszystkich wielozadaniowych systemów operacyjnych, w tym Androida. Ponieważ aplikacje działają we własnej przestrzeni adresowej, Android może uruchomić aplikację, wstrzymać ją, przełączyć się do innej aplikacji, uruchomić ją i tak dalej. Bez pamięci wirtualnej utknęlibyśmy, uruchamiając tylko jedną aplikację na raz. Bez pamięci wirtualnej utknęlibyśmy, uruchamiając tylko jedną aplikację na raz. Umożliwia także systemowi Android korzystanie z przestrzeni wymiany lub pamięci ZRAM, a tym samym zwiększa liczbę aplikacji, które mogą pozostać w pamięci, zanim zostaną usunięte, aby zrobić miejsce dla nowej aplikacji. Możesz przeczytać więcej o tym, jak ZRAM wpływa na wielozadaniowość smartfona, klikając poniższy link.
Czytaj więcej: Ile pamięci RAM naprawdę potrzebuje Twój telefon z Androidem? To podstawy pamięci wirtualnej, więc przyjrzyjmy się dokładnie, jak to wszystko działa pod maską.

Pamięć wirtualna i strony

Aby ułatwić mapowanie z wirtualnego na fizyczny, obie przestrzenie adresowe są podzielone na sekcje, zwane stronami. Strony w przestrzeni wirtualnej i fizycznej muszą mieć ten sam rozmiar i zazwyczaj mają długość 4K. Aby odróżnić strony wirtualne od fizycznych, te ostatnie są nazywane ramkami stron, a nie tylko stronami. Oto uproszczony diagram pokazujący mapowanie 64K przestrzeni wirtualnej do 32K fizycznej pamięci RAM.Gary Sims / Android AuthorityPage zero (od 0 do 4095) w pamięci wirtualnej (VM) jest mapowany na drugą ramkę strony (8192 do 12287) w pamięci fizycznej. Strona pierwsza (4096 do 8191) w VM jest mapowana do ramki strony 1 (również 4096 do 8191), strona druga jest mapowana do ramki strony piątej itd. Należy zauważyć, że nie wszystkie strony wirtualne muszą być mapowane. Ponieważ każda aplikacja ma wystarczającą przestrzeń adresową, pojawią się luki, których nie trzeba mapować. Czasami te luki mogą mieć rozmiar gigabajtów. Jeśli aplikacja chce uzyskać dostęp do adresu wirtualnego 3101 (czyli na stronie zero), jest tłumaczony na adres w pamięci fizycznej w ramce drugiej strony, a konkretnie na adres fizyczny 11293.

Jednostka zarządzania pamięcią (MMU) jest tutaj, aby pomóc

Nowoczesne procesory mają dedykowany sprzęt, który obsługuje mapowanie między maszyną wirtualną a pamięcią fizyczną. Nazywa się to jednostką zarządzania pamięcią (MMU). MMU przechowuje tabelę, która odwzorowuje strony na ramki stron. Oznacza to, że system operacyjny nie musi wykonywać translacji, dzieje się to automatycznie w procesorze, który jest znacznie szybszy i bardziej wydajny. Procesor wie, że aplikacje próbują uzyskać dostęp do adresów wirtualnych i automatycznie tłumaczy je na adresy fizyczne. Zadaniem systemu operacyjnego jest zarządzanie tabelami używanymi przez MMU.

Jak MMU tłumaczy adresy?

Jak MMU używa tabeli stron do tłumaczenia adresówGary Sims / Urząd Androida MMU używa tabeli stron ustawionej przez system operacyjny do tłumaczenia adresów wirtualnych na adresy fizyczne. Trzymając się naszego przykładu adresu 3101, który jest binarnie 0000 1100 0001 1101, MMU tłumaczy go na 11293 (lub 0010 1100 0001 1101). Robi to tak: Pierwsze cztery bity (0000) to wirtualny numer strony. Służy do wyszukiwania numeru ramki strony w tabeli. Wpis dla strony zero to druga ramka strony lub 0010 w formacie binarnym. Bity 0010 służą do tworzenia pierwszych czterech bitów adresu fizycznego. Pozostałe dwanaście bitów, zwane offsetem, są kopiowane bezpośrednio na adres fizyczny. Jedyna różnica między 3101 a 11293 polega na tym, że pierwsze cztery bity zostały zmienione tak, aby reprezentowały stronę w pamięci fizycznej, a nie stronę w pamięci wirtualnej. Zaletą używania stron jest to, że następny adres, 3102, używa tej samej ramki strony co 3101. Zmienia się tylko przesunięcie, więc gdy adresy pozostają wewnątrz strony 4K, MMU ma łatwy czas na wykonanie tłumaczeń. W rzeczywistości MMU używa pamięci podręcznej zwanej Translation Lookaside Buffer (TLB), aby przyspieszyć tłumaczenia.

Tłumaczenie Lookaside Buffer wyjaśnione

Bloki TLB na Cortex X1Czerwone pola podświetlają TLB w Arm Cortex-X1. Bufor translacji Lookaside (TLB) to pamięć podręczna ostatnich tłumaczeń wykonywanych przez MMU. Zanim adres zostanie przetłumaczony, MMU sprawdza, czy tłumaczenie ramki między stronami jest już zapisane w pamięci podręcznej TLB. Jeśli żądane wyszukiwanie strony jest dostępne (trafienie), tłumaczenie adresu jest natychmiast dostępne. Każdy wpis TLB zwykle zawiera nie tylko stronę i ramki strony, ale także atrybuty, takie jak typ pamięci, zasady pamięci podręcznej, uprawnienia dostępu itd. . Jeżeli TLB nie zawiera ważnego wpisu dla adresu wirtualnego (brak), wtedy MMU jest zmuszone do wyszukania ramki strony w tablicy stron. Ponieważ tablica stron sama znajduje się w pamięci, oznacza to, że MMU musi ponownie uzyskać dostęp do pamięci, aby rozwiązać bieżący dostęp do pamięci. Dedykowany sprzęt w MMU umożliwia szybki odczyt tablicy translacji w pamięci. Po wykonaniu nowego tłumaczenia można je zapisać w pamięci podręcznej do ewentualnego wykorzystania w przyszłości.
Patrząc wstecz: Historia Androida — ewolucja największego mobilnego systemu operacyjnego na świecie

Czy to takie proste?

Z jednej strony tłumaczenia wykonywane przez MMU wydają się dość proste. Wykonaj wyszukiwanie i skopiuj kilka bitów. Jest jednak kilka problemów, które komplikują sprawę. Moje przykłady dotyczyły 64 KB pamięci, ale w prawdziwym świecie aplikacje mogą używać setek megabajtów, a nawet gigabajta lub więcej pamięci RAM. Pełna 32-bitowa tablica stron ma rozmiar około 4 MB (łącznie z ramkami, brakiem/obecnością, modyfikacją i innymi flagami). Każda aplikacja potrzebuje własnej tabeli stron. Jeśli masz uruchomionych 100 zadań (w tym aplikacje, usługi w tle i usługi Androida), to jest to 400 MB pamięci RAM tylko do przechowywania tabel stron. Aby odróżnić strony wirtualne od fizycznych, te ostatnie nazywane są ramkami stron. Sprawy się pogarszają, jeśli przekroczysz 32-bity, tabele stron muszą pozostać w pamięci RAM przez cały czas i nie można ich zamienić ani skompresować. Ponadto tabela stron wymaga wpisu dla każdej strony, nawet jeśli nie jest używana i nie ma odpowiadającej jej ramki. Rozwiązaniem tych problemów jest użycie wielopoziomowej tabeli stron. W naszym przykładzie roboczym powyżej widzieliśmy, że cztery bity zostały użyte jako numery stron. Istnieje możliwość podzielenia stołu na wiele części. Pierwsze dwa bity mogą być użyte jako odniesienie do innej tablicy, która zawiera tablicę stron dla wszystkich adresów zaczynających się od tych dwóch bitów. Byłaby więc tabela stron dla wszystkich adresów zaczynających się od 00, kolejna dla 01 i 10, a na końcu 11. Więc teraz są cztery tabele stron plus tabela najwyższego poziomu.
Wymeldować się: Najlepsze telefony z 16 GB pamięci RAM Tabele najwyższego poziomu muszą pozostać w pamięci, ale pozostałe cztery można w razie potrzeby zamienić. Podobnie, jeśli nie ma adresów zaczynających się od 11, nie jest potrzebna żadna tablica stron. W rzeczywistej implementacji tabele te mogą mieć cztery lub pięć poziomów. Każda tablica wskazuje na inną, zgodnie z odpowiednimi bitami w adresie.Diagram przedstawiający, w jaki sposób RISC V implementuje 48-bitowe adresowanie wirtualnePowyżej znajduje się diagram z dokumentacji RISC-V pokazujący, jak ta architektura implementuje 48-bitowe adresowanie wirtualne. Każdy wpis tablicy stron (PTE) ma kilka flag w przestrzeni, które byłyby używane przez przesunięcie. Bity uprawnień R, W i X wskazują, czy strona jest odpowiednio czytelna, zapisywalna i wykonywalna. Gdy wszystkie trzy mają wartość zero, PTE jest wskaźnikiem do następnego poziomu tablicy stron; w przeciwnym razie jest to PTE typu liść i można przeprowadzić wyszukiwanie.

Jak Android radzi sobie z usterką strony?

Kiedy MMU i system operacyjny są w doskonałej harmonii, wszystko jest w porządku. Ale mogą być błędy. Co się dzieje, gdy MMU próbuje wyszukać adres wirtualny i nie można go znaleźć w tabeli stron? Jest to znane jako błąd strony. Istnieją trzy rodzaje błędów strony: Twardy błąd strony — Ramka strony nie znajduje się w pamięci i musi zostać załadowana z wymiany lub z pamięci ZRAM. Błąd strony miękkiej — Jeśli strona jest załadowana do pamięci w momencie generowania błędu, ale nie jest oznaczona w jednostce zarządzania pamięcią jako załadowana do pamięci, nazywa się to błędem strony drobnej lub błędu strony miękkiej. Program obsługi błędów strony w systemie operacyjnym musi dokonać wpisu dla tej strony w MMU. Może się tak zdarzyć, jeśli pamięć jest współdzielona przez różne aplikacje, a strona została już przeniesiona do pamięci lub gdy aplikacja zażądała nowej pamięci i została leniwie przydzielona, ​​czekając na dostęp do pierwszej strony. Błąd nieprawidłowej strony — program próbuje uzyskać dostęp do pamięci, która nie znajduje się w jego przestrzeni adresowej. Prowadzi to do błędu segmentacji lub naruszenia dostępu. Może się to zdarzyć, jeśli program spróbuje pisać do pamięci tylko do odczytu, lub zignoruje wskaźnik zerowy lub z powodu przepełnienia bufora.

Korzyści z pamięci wirtualnej

Jak odkryliśmy, pamięć wirtualna to sposób na mapowanie pamięci fizycznej, aby aplikacje mogły niezależnie korzystać z pamięci RAM, bez martwienia się o to, jak inne aplikacje korzystają z pamięci. Pozwala Androidowi na wielozadaniowość i wymianę. Bez pamięci wirtualnej nasze telefony byłyby ograniczone do uruchamiania jednej aplikacji na raz, aplikacje nie mogłyby być wymieniane, a wszelkie próby przechowywania w pamięci więcej niż jednej aplikacji na raz potrzebowałby trochę wymyślnego programowania. Komentarze

Click to rate this post!
[Total: 0 Average: 0]
Android