Pamięć wirtualna w systemie AS/400



Prezentacja: Projekt realizowany w ramach ćwiczeń z Systemów Operacyjnych 2002/2003



autor: Wojtek Kulik
nr indeksu 189413





Spis treści:

Wstęp

AS/400 to system komputerowy firmy IBM.

"AS" oznacza Application System lub Advanced System (zależnie od wersji).

Najnowsza wersja systemu (V4R4) działa na procesorach PowerPC - opracowanych przez Apple Computer, Motorolę i IBM 64-bitowych procesorach RISC.

AS/400 - historia

AS/400 powstał na bazie systemu System/3 firmy IBM. System/3 powstał na początku lat 70-tych w laboratoriach w Rochester (stan Minnesota).

Idea - 8 stycznia 1970r. (data urodzin Elvisa Presleya) - na podstawie rozprawy doktorskiej Franka Soltisa o pamięci jednopoziomowej (ang. single-level store).
Pierwsza wersja - czerwiec 1988r. AS/400 "zawiera" w sobie System/38. W pierwszych wersjach systemu "AS" oznaczało Application System.

Kwiecień 1994r. - kolejna wersja AS/400 - "AS" oznacza Advanced System.

Najważniejsze własności

Implementacja pamięci wirtualnej w AS/400

Pamięć jednopoziomowa (ang. single-level store)

W momencie, gdy powstała idea pamięci wirtualnej (pierwsza implementacja na komputerze Atlas - początek lat 60-tych zeszłego stulecia) było zupełnie naturalne i oczywiste, że pamięć wirtualna ma udostępniać jednolity interfejs dostępu zarówno do pamięci zewnętrznej jak i wewnętrznej - tak jakby na tym poziomie oba te rodzaje były nierozróżnialne. Implementacja tej naturalnej metody okazała się na tyle trudna, że dopiero w AS/400 (i to też nie od razu - patrz Historia) zastosowano idee pionierów pamięci wirtualnej.

Standardowo, programista widzi dwa poziomy przechowywania danych: system plików i pamięć. W rozwiązaniu zastosowanym w AS/400 oba te poziomy są widoczne jako jeden. Oznacza to, że nie ma pliku wymiany. Pamięć wciąż jest używana jako bufor, z tym, że dla całego dysku, a nie tylko dla jego wydzielonego fragmentu. Procesor wciąż operuje na danych w pamięci a nie na dysku. Oznacza to, że zmiany w pliku są natychmiast widoczne, np. dla innych użytkowników.

Takie podejście narzuca wymóg posiadania większego adresu w komputerze. Jako, że dzisiaj dysk o pojemności 4GB (a tyle właśnie da się zaadresować przy pomocy 32 bitów) jest delikatnie mówiąc "mały", w AS/400 zastosowano adres 64-bitowy. Z koncepcyjnego punktu widzenia zwiększenie adresu do np. 128 bitów nie stanowi jakiegoś większego problemu, ale wymaga synchronizacji z architekturą i póki co nie jest jeszcze niezbędne.

W AS/400 każdy z użytkowników korzysta z jednej i tej samej przestrzeni adresowej. Z uwagi na to stosuje się odmienną metodologię obsługi obiektów, które zostały "zniszczone". W AS/400 adres wirtualny takich obiektów nie zostanie ponownie wykorzystany. Dzieje się tak, bo gdy użytkownik lub system wyda polecenia zwolnienia zaalokowanej na ten obiekt pamięci, to zostanie zwolniona cała pamięć za wyjątkiem nagłówka obiektu, który istnieje tak długo jak istnieje system. Miejsce na dysku może zostać ponownie wykorzystane, adres w przestrzeni wirtualnej - już nie. Projektanci AS/400 wybrali taki model z powodu łatwiejszej obsługi "śmieci" - wskaźników, które wskazują na już niewykorzystywane kawałki pamięci. AS/400 w ogóle się tym problemem nie zajmuje - właśnie z powodu 64-bitowego adresu, który umożliwia zaadresowanie olbrzymiej liczby danych - a musiałby, gdyby dopuścić ponowne wykorzystywanie tego samego adresu wirtualnego.

W AS/400 rozróżniamy 4 rodzaje adresów: efektywny, wirtualny, rzeczywisty i adres związany z miejscem zapisu/odczytu z urządzenia zewnętrznego (ang. Direct Store Address). Adres efektywny pomaga przy łatwiejszym i szybszym współdzieleniu pamięci - kosztem lekkiego narzutu czasu pracy procesora. Kilka adresów efektywnych może wskazywać na ten sam adres wirtualny.

Programista widzi jeden rodzaj pamięci, ale rozgraniczenie pomiędzy pamięcią główną i pomocniczą musi mieć miejsce. Odbywa się to poniżej MI (w SLIC). Powyżej MI widać obiekty, do których odwołujemy się za pomocą nazw. Nazwa jest odwzorowywana w adres wirtualny. Jest on przechowywany w bibliotece zawierającej obiekt. Adres jest ładowany do wskaźnika systemowego. Wskaźnik systemowy zawiera więc adres wirtualny nagłówka obiektu.

Program użytkownika posiada tablicę segmentów. Pozycja w tablicy segmentów zawiera adres wirtualny segmentu w pamięci wirtualnej. Użytkownik posługuje się adresem efektywnym, który musi zostać sprzętowo przetłumaczony na adres wirtualny. Adres efektywny identyfikuje pozycję w tablicy segmentów i przesunięcie w segmencie.

Pamięć jest zorganizowana w ramki o wielkości 4kB. Obiekt na dysku jest podzielony na strony o wielkości takiej jak ramka w pamięci. Adres wirtualny obiektu implikuje stronę na dysku, przy czym nie musi wskazywać na jej początek. Duży obiekt może zajmować wiele stron, przy czym jedna strona należy do jednego obiektu.

Stronicowaniu podlegają wszystkie obiekty trwałe i tymczasowe. Pewne struktury SLIC (jak np. tablica stron) i procedury SLIC nie są stronicowane. Ich adres wirtualny jest równoważny adresowi rzeczywistemu.

Strona, która została wczytana do pamięci przez pewien proces jest dostępna dla dowolnego innego procesu. Redukuje to znacznie liczbę operacji we/wy z dysku.

Programy mogą również jawnie żądać sprowadzenia stron do pamięci. Można też jawnie tworzyć wyzerowane strony (przydzielać wyzerowane ramki pamięci). Można również jawnie żądać wymiany stron, tzn. wskazać strony, które mają być usunięte zamiast tych usuwanych przez standardowy algorytm wymiany. Ponadto można wskazać strony do przypięcia w pamięci (pewne strony muszą być rezydentne).

Charakterystyka modelu pamięci Translacja adresów

Sprowadzanie stron odbywa się na żądanie. Mając dany adres efektywny (taki, jakim posługują się programy) sprzętowo sprawdza się jego najstarsze 12 bitów (3 cyfry szesnastkowe), które implikują dalszy tryb postępowania. Jeśli te bity tworzą wartość 800, to adres efektywny jest zarazem adresem rzeczywistym. Jeśli proces sięgający pod ten adres ma do tego uprawnienia (sprawdza się to za pomocą rejestru stanu procesora), to otrzymuje od razu zawartość tego adresu pamięci. Sytuacje błędne, gdy proces nie może sięgać do wskazanego miejsca w pamięci są obsługiwane różnie na różnych architekturach.

Podobnie jest w przypadku, gdy 12 najstarszych bitów adresu efektywnego ma wartość 801, z tym, że otrzymany adres jest adresem dostępu do przestrzeni we/wy (dysku).

Pozostałe przypadki wymagają tranlacji adresu. Najpierw odbywa się translacja efektywny-wirtualny. Najstarsze 40 bitów adresu efektywnego zwane są identyfikatorem segmentu efektywnego ESID (ang. Effective Segment Identifier), pozostałe 24 bity zwane są offsetem. Offset jest ponadto podzielony na offset strony i offset bajtu - oba po 12 bajtów. Offset strony wskazuje na stronę w segmencie, offset bajtu wskazuje na bajt w stronie.

Przy translacji, na początku uzyskuje się identyfikator segmentu wirtualnego VSID (ang. Virtual Segment ID). Sposób jego uzyskania jest zależny od tego, czy aktywny jest tryb C2. W trybie bezpieczeństwa C2 konieczne jest zajrzenie do tablicy segmentów.

Adres wirtualny, podobnie jak efektywny, jest 64-bitowy i podzielony jest na 40 bitowy VSID oraz 24 bitowy offset, identyczny jak w adresie efektywnym. Najstarsze 52 bity adresu wirtualnego tworzą wirtualny numer strony VPN (ang. Virtual Page Number), który służy do wyszukania rzeczywistego numeru strony RPN (ang. Real Page Number). RPN jest numerem ramki w pamięci, a nie strony na dysku. 12 bitowy offset bajtu jest identyczny w adresie efektywnym, wirtualnym i rzeczywistym i jest używany dopiero do przesunięcia w obrębie strony.

W jaki sposób odbywa się translacja wirtualny-realny? Strukturą, w której zawarte są RPN jest tablica stron (ang. Page Table). W większości systemów tablica stron zawiera jedną pozycję dla każdej strony pamięci wirtualnej, a VPN jest używany jako indeks tej tablicy. Wartość pod tym indeksem zawiera RPN, który stanowi część adresu rzeczywistego. Takie podejście jest akceptowalne w przypadku gdy adresy są co najwyżej 32-bitowe - wpp. rozmiar tej struktury byłby zbyt duży.

W AS/400 zastosowano odwrotną tablicę stron (ang. Inverted Page Table), znajdującą się w pamięci. Odwrotna tablica stron zawiera po jednej pozycji dla każdej rzeczywistej strony w pamięci, zamiast jednej pozycji dla każdej wirtualnej strony na dysku. Rozmiar tej tablicy zależy od łącznego rozmiaru pamięci. Im więcej pamięci, tym większa struktura, ale procent pamięci używany na tą strukturę jest zawsze taki sam.

Trudność stanowi odnalezienie odpowiedniej pozycji w tablicy stron - zwanej PTE (ang. Page Table Entry). Realizuje się to przy użyciu funkcji haszującej do VPN. Samo haszowanie to realizowana sprzętowo pewna funkcja kilku najstarszych bitów VPN i XOR z kilkoma młodszymi bitami VPN, potem jeszcze 'magiczne' OR i AND (szczegóły: Inside AS/400) i otrzymujemy 52-bitowy adres rzeczywisty w tablicy stron.

Dokładniej, haszowanie identyfikuje grupę pozycji tablicy stron PTEG (ang. Page Table Entry Group), która zawiera 8 pozycji PTE. VPN każdej z tych pozycji jest porównywany z danym VPN. Jeśli nie znaleziono pasującego, to zagląda się do pomocniczej tablicy stron (ang. Secondary Page Table), która zawiera zmienną liczbę PTE. Jeśli wciąż nie znaleziono, to jest generowany błąd braku strony - jest to sprzętowe przerwanie do warstwy SLIC jądra wymuszające znalezienie strony na dysku o adresie wynikającym z adresu wirtualnego; następuje operacja we/wy, w razie potrzeby zrzucenie aktualnie nie używanej strony i uaktualnienie tablicy stron.



W przypadku, gdy ściągnięto stronę z dysku, zastępuje ona stronę nie będącą aktualnie w użyciu. Informacja o tym, czy strona jest aktualnie w użyciu jest dostępna za pomocą bitu referencji (zawartym w strukturze PTE). Zamarkowana jest także zmiana strony, tak, żeby przy ewentualnym zrzucaniu jej na dysk zapisać jej aktualny stan.

Przy zrzucaniu stron na dysk stosuje się strategię LRU.

Wyszukiwanie stron ostatnio używanych jest szybsze dzięki skorzystaniu z rejestrów sprzętowych TLB. Na poziomie bezpieczeństwa C2 korzysta się dodatkowo z rejestrów sprzętowych SLB (ang. Segment Lookaside Buffer), które pamiętają ostatnio używane części tablicy segmentów. Kolejność przeglądania jest następująca: przeglądanie SLB, jeśli nie znaleziono to przeglądanie tablicy segmentów, przeglądanie TLB i przeglądanie tablicy stron.



W AS/400 jest tylko jedna tablica stron dla wszystkich użytkowników. Nie ma więc potrzeby czyszczenia TLB podczas przełączania kontekstu. Nie trzeba też czyścić pamięci podręcznych (tych między pamięcią główną a procesorem). Dlatego przełączanie kontekstu jest szybkie! Można więc wykonywać je często (eksperymentalnie zbadano, że średnio wykonuje się je raz na 1200 instrukcji). Dzięki temu AS/400 zapewnia dobrą wydajność w środowisku interakcyjnym, zorientowanym na aplikacje działające w trybie transakcji. Można więc dołączać wiele terminali. Pojedynczy duży AS/400 może obsługiwać ponad 2000 działających współbieżnie użytkowników.

Materiały, na podstawie których powstała niniejsza prezentacja



Powrót do strony głównej