Organizacja pamięci wewnętrznej komputerów
1. Własności systemów pamięci
2. Hierarchia pamięci.
3. Półprzewodnikowa pamięć główna
4. Pamięć cache.
5. Pamięć wirtualna.
Własności systemów pamięci
Położenie
•
procesor
•
wewnętrzna (główna)
•
zewnętrzna (pomocnicza)
Wydajność
•
czas dostępu
•
czas cyklu
•
szybkość transferu
Pojemność
•
rozmiar słowa
•
liczba słów
Rodzaj fizyczny
•
półprzewodnikowa
•
magnetyczna
Jednostka transferu
•
słowo
•
blok
Własności fizyczne
•
ulotna/ nieulotna
•
wymazywalna/
niewymazywalna
Sposób dostępu
•
sekwencyjny
•
bezpośredni
•
swobodny
•
skojarzeniowy
Organizacja
Hierarchia pamięci:
Hierarchia pamięci składa się z kilku poziomów przechowywania. Każdy
poziom charakteryzuje się inną szybkością działania i pojemnością.
Do wytworzenia elementów pamięci wykorzystuje się różne technologie:
- umożliwiającą szybki dostęp do danych (technologia półprzewodnikowa),
- technologie wykorzystywane do wytworzenia powierzchni magnetycznych
i optycznych dla elementów zewnętrznych, oddalonych od procesora.
Jeśli rozpatrujemy dostępne technologie, to możemy zauważyć następujące
zależności:
!"
mniejszy czas dostępu – większy koszt na bit,
!"
większa pojemność – mniejszy koszt na bit,
!"
większa pojemność – większy czas dostępu.
Procesor
Pamięć podręczna
Pamięć główna
Interfejs we-wy
Pamięć dodatkowa
1. Rejestry wewnętrzne procesora (pamięć procesora) – implementowana
jako zbiór szybkich rejestrów, zajmuje najwyższy poziom hierarchii;
2. Pamięć podręczna „cache” umiejscowiona jest między procesorem
a pamięcią operacyjną, a do jej realizacji używa się zwykle droższych
układów pamięci statycznej;
3. Pamięć operacyjna jest największym obszarem pamięci, dostępnym
bezpośrednio dla procesora. W celu obniżenia kosztu pamięć operacyjna jest
realizowana z wykorzystaniem układów pamięci dynamicznej.
4. Pamięć wirtualna (nierzeczywista), wolniejsza, odwzorowywana zwykle na
pamięciach zewnętrznych, typowo na dyskach twardych. Przesłania
PAO/PW są zwykle kontrolowane przez system operacyjny i wspomagane
sprzętowo przez specjalne mechanizmy, wbudowane w procesory
Rejestry
Pamięć
podręczna
Pamięć
operacyjna
Pamięć
dodatkowa
s
z
y
b
k
o
ś
ć
c
z
a
s
d
o
s
t
ę
p
u
pojemność
koszt
Półprzewodnikowa pamięć główna
Podział pamięci półprzewodnikowych
Pamięci półprzewodnikowe
stosowane w systemach
mikroprocesorowych
Pamięci o dostępie
swobodnym (RAM)
Pamięci stałe
NV SRAM
SRAM
SD RAM
FPM RAM
EDO RAM
BEDO RAM
Dynamiczne
Statyczne
Pamięci programowane
przez producenta
(ROM)
Pamięci programowane
jednokrotnie (PROM)
Pamięci programowane
wielokrotnie
(EPROM) i (E
2
PROM)
(Flash)
Dynamiczna pamięć RAM jest wykonana z komórek, które przechowują dane
podobnie, jak kondensatory przechowują ładunek elektryczny. Obecność lub
brak ładunku w kondensatorze mogą być interpretowane jako binarne 1 i 0.
Dynamiczne pamięci RAM wymagają okresowego odświeżania ładunku w celu
zachowania danych.
W statycznych pamięciach RAM wartości binarne są przechowywane za
pomocą przerzutników. Statyczne pamięci RAM zachowują dane tak długo, jak
długo są zasilane.
NV RAM - jest to pamięć firmy Intel. Pamięć po wyłączeniu zasilania nie traci
zawartości. Uzyskano to dzięki zastosowaniu w jednym układzie dwóch
rodzajów pamięci : SRAM oraz EEPROM. W czasie normalnej pracy jest ona
widoczna jako normalna pamięć typu SRAM. W momencie zaniku zasilania
odpowiednim sygnałem podanym przez mikroprocesor cała zawartość pamięci
RAM jest przepisywana do pamięci EEPROM. Po powrocie napięcia zasilania
zawartość pamięci EEPROM jest ponownie przepisywana do SRAM. Producent
gwarantuje 10000 cykli.
EDO RAM - jest to typ pamięci, w której jeszcze gdy dane są odczytywane
może zostać wystawiony adres następnej komórki. Przyspiesza to znacznie
odczyt kolejnych komórek pamięci. Teoretyczny przyrost prędkości do 20%
w porównaniu z pamięciami FPM RAM. Zysk w praktyce maleje do kilku
procent ponieważ danych nie można nakładkować przy zapisie.
BEDO RAM - jest to pamięć stanowiąca połączenie technik „burst” i EDO
RAM. Zamiast jednego adresu odczytywane jest jednocześnie cztery. Na
magistrali adresowej adres pojawia się tylko na początku cyklu odczytu, co
wydatnie skraca średni czas dostępu.
FPM RAM (Fast Page Mode)- jest to pamięć pracująca na zasadzie
adresowania stronicowego. Stronicowanie jest techniką zwiększenia wydajności
pamięci, poprzez podzielenie jej na strony mające długość od 512 bajtów do
kilku kilobajtów. Zwykłe odczyty i zapisy danych w pamięci wymagają
wybrania wiersza i kolumny, co zabiera dodatkowy czas. Stronicowanie polega
na udostępnianiu komórek z tego samego wiersza, dzięki czemu należy
zmieniać tylko adres kolumny.
SDRAM (Synchronous Dynamic RAM) - jest to pamięć dynamiczna w której
odczyt poszczególnych komórek następuje synchronicznie, zgodnie z taktami
zegara CPU. Układy te są zsynchronizowane z magistralą systemową (100 MHz
i szybsze).
RDRAM (Rambus DRAM) - jest pamięcią opartą na zupełnie innych
rozwiązaniach. Dzięki podwojeniu znajdującej się w układzie magistrali danych
i zwiększeniu częstotliwości pracy do 800 MHz, umożliwia uzyskanie
przepustowości rzędu 1,6 GB/s.
DDR SDRAM (Double Data Rate) SDRAM jest rozwinięciem projektu
standardowych układów SDRAM, w którym dane przesyłane są z dwa razy
większą szybkością. Poza zwiększeniem częstotliwości taktowania, pamięci
DDR osiągają podwojenie wydajności dzięki wykonywaniu 2 transferów
podczas jednego taktu zegara (przy narastającym i opadającym zboczu).
Obudowy pamięci:
SIMM - moduły pamięci na karcie ze 32-stykami. Szyna danych ma 8-bitów.
Obecnie nie stosowane.
DIMM - moduły pamięci na karcie ze 168-stykami. Pracują z szyną adresową
o szerokości 64-bitów.
Modul PS/2 - moduły pamięci na karcie ze 72-stykami. Pracują z szyną
adresową o szerokości 32-bitów. Stosowane w pamięciach typu EDO RAM
i FPM RAM. Nazwa pochodzi od pierwotnego zastosowania tego rodzajów
modułów pamięci w komputerach PS/2 IBM.
Podstawowe parametry pamięci:
•
pojemność;
•
organizacja logiczna;
•
pobór mocy na bit.
Podstawowe parametry dynamiczne:
•
czas cyklu odczytu t
RC
;
•
czas dostępu t
A
;
∗
czas dostępu od wejść adresowych t
AA
lub t
SA
;
∗
czas dostępu od wejść wybierania układu pamięci t
ACE
lub t
SA
;
∗
czas dostępu od wejść sygnału odczytu t
ARW
;
•
cykl czasu zapisu t
WC
;
•
czas odzyskiwania właściwości po sygnale zapisu t
WR
;
•
czas regeneracji (odświeżania) - dla pamięci dynamicznych.
t
AA
t
HA
t
HD2
t
HD1
t
ACE
t
RC
t
W
t
WC
b)
Adres
CE
R / W
t
SCE
t
WR
t
SA
t
HD
t
SD
a)
t
ARW
Adres
CE
R / W
Dane
wyjściowe
Dane
wejściowe
Parametry dynamiczne pamięci dla cyklu odczytu (a) oraz cyklu zapisu (b).
Odświeżanie
Przykład
Kostka pamięci o pojemności 16 Mb (4M
××××
4 – 4 M słów 4-bitowych)
Odświeżanie sprowadza się do pobudzenia (zaadresowania) linii wiersza, przy
czy odświeżeniu ulegają wszystkie komórki należące do tego wiersza.
Konieczne jest wprowadzenie mechanizmu generującego regularnie impulsy
odświeżające przebiegające kolejno wszystkie wiersze nie rzadziej niż raz na
okres czasu nazywany cyklem odświeżania (Refresh Time).
Typowe wartości cyklu odświeżania
Pojemność Organizacja Liczba
wierszy
Cykl
4 Mbit
256K
××××
16
512 8
ms
4 Mbit
4 M
××××
1
1024 (1K)
16 ms
16 Mbit
4M
××××
4
2048 (2K)
32 ms
Dekoder kolumn
Matryca pamięciowa
2048
××××
2048
Matryca pamięciowa
2048
××××
2048
Matryca pamięciowa
2048
××××
2048
Matryca pamięciowa
2048
××××
2048
kolumny
0 .. 2047
Adres kolumny
D0
D1
D2
D3
Dekode
r wi
er
sz
y
wi
er
sze
0 .. 20
47
Adr
es w
ie
rsz
a
Podział cyklu odświeżania na odcinki czasowe równej wielkości daje w wyniku
okres przebiegu zegarowego (Refresh Rate) wymaganego do spełnienia wymogu
czasowego narzuconego przez cykl odświeżania (na przykład, 16 ms/1024 =
15,6
µ
s).
Pojedyncze impulsy odświeżające można zgrupować w jeden pakiet (Burst
Refresh) lub też rozłożyć równomiernie (Distributed Refresh) w obszarze okna
czasowego wyznaczonego przez cykl odświeżania.
Rozkład impulsów odświeżania
Distributed refresh
Burst refresh
. . .
15,6
µ
s
1024 impulsy (16 ms)
. . .
1024 impulsy (~0,13ms)
max 16 ms
. . .
Organizacja pamięci DRAM o pojemności 16 Mbit (4 M
××××
4)
Matryca
pamięciowa
2048
××××
2048
Matryca
pamięciowa
2048
××××
2048
Matryca
pamięciowa
2048
××××
2048
Matryca
pamięciowa
2048
××××
2048
××××
4
Dekoder wi
er
sz
y
0
..
2047
A0
A1
.
.
.
.
A10
Taktowanie i sterowanie
R A S
C A S
W
O E
Bufor
adresu
wiersza
Bufor
adresu
kolumny
Licznik
odświeżania
M
UX
Wzmacniacz odczytu i
bramka we-wy
Dekoder kolumny
0 .. 2047
Wejściowy
bufor
danych
Wyjściowy
bufor
danych
D0
D1
D2
D3
Początkowo w komputerach wyższej klasy stosowane były inne sposoby zwiększenia
szybkości dostarczania informacji przez zrównoleglenie działania pewnych bloków
funkcjonalnych:
a) zwiększenie szerokości dostępu, wymaga rozszerzenia magistrali danych
b) zastosowanie przeplotu, czyli podział pamięci na banki:
Odczyt Odczyt Odczyt Odczyt
czas
Odczyt 4 niezależnych „porcji” danych z klasycznej pamięci.
Odczyt
Odczyt
Odczyt
Odczyt
czas
Odczyt z przeplotem
Jeśli adresowanie poszczególnych bloków PAO będzie wykonywane za pomocą dwóch
ostatnich bitów adresu, dane zapisywane w PAO „kolejno” znajdą się w rzeczywistości
w różnych blokach i mimo względnie wolnego czasu dostępu do pojedynczego bloku przy
odpowiedniej synchronizacji w czasie odczytów z poszczególnych bloków nie będą one
blokować się wzajemnie i efektywny czas odczytu może ulec skróceniu. Rzeczywista
efektywność takiego rozwiązania zależy od rozkładu odwołań do PAO.
Pamięć podręczna (cache):
Logicznie pamięć cache jest umieszczona między procesorem a PAO i dostarcza
procesorowi względnie szybko danych. Pamięć podręczna poszerza wąskie
gardło powstające w wyniku różnic szybkości działania procesora i pamięci
głównej, korzystając z własności zachowania programu zwanej zasadą
lokalności.
Zasada lokalności
Programy mają tendencję do ponownego używania danych i rozkazów, które
były niedawno używane. Rozkazy i dane używane w krótkim odstępie czasu są
zwykle położone także blisko siebie w pamięci (lokalność przestrzenna).
Zasada działania
Półprzewodnikowa pamięć podręczna zawiera ograniczoną liczbę obszarów
albo wierszy służących do przechowywania bloków z pamięci głównej. Każdy
blok ma typowo wielkość od 4 – 16 słów. W czasie wykonywania programu
procesor zamiast czytać rozkazy czy dane bezpośrednio z pamięci głównej,
szuka ich najpierw w pamięci podręcznej. Jeśli słowo zostaje znalezione, to
sygnalizowane jest „trafienie” i słowo przesyłane jest do procesora.
„Trafienie” w pamięci podręcznej
„Chybienie” w pamięci podręcznej
CPU
Pamięć
podręczna
Pamięć
operacyjna
słowo
Powielone
kopie
Bloki
CPU
Pamięć
podręczna
Pamięć
operacyjna
Przesłanie
bloku
słowo
Cykl pracy: procesor wystawia na szynę adresową adres danej, którą chce
odczytać z PAO i sygnał odczytu na szynie sterującej. MMU sprawdza, czy
w cache znajduje się żądane słowo, i jeśli tak, dostarcza je procesorowi znacznie
szybciej niż PAO. Równocześnie jest inicjowany odczyt z PAO i przy trafieniu
jest on anulowany, przy chybieniu zaś kontynuowany w celu odczytania danej.
Miarą wydajności pamięci podręcznej jest współczynnik trafień (ang. hit ratio;
h), który określa, jaka część odwołań do pamięci została obsłużona przez
pamięć podręczną, unikając korzystania z pamięci głównej. Jeżeli czasy dostępu
do pamięci podręcznej i pamięci głównej wynoszą odpowiednio: t
c
i t
m
, to
średni czas dostępu do słowa t
av
wyraża się wzorem:
t
av
= h t
c
+ (1 – h) t
m
Dla zwiększenia efektywności pracy takiego systemu, tzn. zwiększenia
współczynnika trafień stosuje się odczyt z PAO do cache nie pojedynczych słów
ale linii, stanowiących całkowitą wielokrotność szerokości szyny danych
procesora.
Struktura cache:
1. pamięć danych właściwych (tzn. instrukcji lub danych z PAO)
2. pamięć adresów komórek, których zawartość jest przechowywana w części
danych właściwych
3. pamięć znaczników, przeznaczonych dla wspomagania zarządzaniem
pamięcią cache np. wyznaczaniem, którą zawartość można usunąć
w przypadku zapełnienia pamięci cache i konieczności wprowadzenia
nowych danych
4. jednostka zarządzania pamięcią, m.in. porównująca adresy odwołań
i przechowywanych kopii zawartości komórek PAO oraz podejmująca
decyzje o usunięciu przy zapełnieniu cache. Konieczne jest zapewnienie
sterowania przez sprzęt, a nie oprogramowanie, gdyż dla wykonania odczytu
z pamięci należałoby odczytać z pamięci podprogram obsługujący odczyt
z pamięci itd.
Pojęcia, związane z pamięcią cache:
odwzorowanie bezpośrednie, blokowo-asocjacyjne, zbiorowo-asocjacyjne,
w pełni asocjacyjne, współczynnik trafień (hit ratio), współczynnik chybień,
algorytmy wymiany stron, zapis metodą write-through, write-back, bity
ważności, wieloportowość – są związane z organizacją komputerów, ale przy
omawianiu architektury także się pojawiają.
Organizacja pamięci podręcznej
Pamięć podręczna asocjacyjna
Bloki pamięci głównej są odwzorowane w obszary pamięci podręcznej i znakowane numerem
bloku lub etykietą. Etykieta jest wyznaczana przez bardziej znaczącą część adresu, zwaną
polem etykiety.
Adres pamięci
00002 A
adres z CPU
bajt do CPU
Równoległe przeszukiwanie jest realizowane przy użyciu specjalnych układów
elektronicznych wbudowanych w pamięć podręczną. Układy te są
skomplikowane i podnoszą koszt. W celu obniżenia tego kosztu często jest
wykorzystywana inna organizacja pamięci podręcznej.
etykieta
słowo
blok 0
blok 1
blok 2
blok N-1
etykieta blok
00002
blok 2
00002 A
etykieta
etykieta
00002
blok 2
wybranie bajtu
poszukiwanie
równoległe
trafienie
Pamięć
operacyjna
Pamięć podręczna
Pamięć podręczna odwzorowana bezpośrednio
Przy organizacji pamięci podręcznej z odwzorowaniem bezpośrednim unika się problemu
przeszukiwania bufora przez przypisanie każdego bloku pamięci do tylko jednego obszaru
pamięci podręcznej.
. . .
Głównym problemem przy odwzorowaniu bezpośrednim jest to, że
tylko jeden z bloków współdzielących pewne obszary w pamięci podręcznej
może znajdować się w niej w danym momencie. Jeśli program często
odwołuje się do dwóch bloków, które odwzorowane są w ten sam obszar, to
muszą być one cyklicznie usuwane i ładowane do pamięci podręcznej,
poważnie obniżając jej wydajność.
etykieta
obszar
słowo
000
. . .
FFF
00
000
. . .
FFF
01
000
. . .
FFF
FF
blok 0
.
.
.
blok 4095
blok 0
.
.
.
blok 4095
blok 0
.
.
.
blok 4095
01
blok 0
00
blok 4095
etykieta blok
Pamięć podręczna ze zbiorowym odwzorowaniem asocjacyjnym
W każdym wierszu pamięci podręcznej ze zbiorowym odwzorowaniem
asocjacyjnym może być przechowywanych kilka par etykieta – blok,
tworzących zbiór.
etykieta
zbiór
słowo
bajt do CPU
Kiedy następuje odwołanie procesora do pamięci podręcznej, wtedy pole
zbioru jest używane w buforze jako indeks w taki sam sposób, jak używane było
pole obszaru w schemacie odwzorowania bezpośredniego. Po wyznaczeniu
zbioru obie etykiety są jednocześnie porównywane z polami etykiet adresów.
Jak zapewnić spójność pamięci podręcznej ?
0F
008
5
etykieta blok etykieta blok
09
0F
000
008
.
.
FFF
chybienie
trafienie
Pamięć wirtualna
Przy wykorzystaniu tej techniki adresy generowane przez procesor nie są
używane do bezpośredniego dostępu do pamięci, ale są przekształcane w
prawdziwe adresy, które mogą wskazywać na pamięć główną, dodatkową albo
kombinację ich obu. W pamięci operacyjnej odwzorowane są tylko te części
programu, które są aktualnie niezbędne do wykonania, reszta pozostaje na dysku
do czasu aż będzie potrzebna.
Dysk
Pamięć główna
Rzeczywiste
ramki pamięci
Strony pamięci wirtualnej
Koncepcja pamięci wirtualnej bierze się z faktu, że dla właściwego
wykonania programu prawdopodobnie niezbędne jest przechowywanie w PAO
tylko pewnej jego części – instrukcji i danych, które w najbliższym czasie będą
przetwarzane. W przypadku niedoboru PAO w stosunku do wymagań programu,
niepotrzebne w danym okresie czasu fragmenty kodu i danych mogą być
przechowywane w tańszej i bardziej pojemnej, ale o rząd wielkości wolniejszej
pamięci zewnętrznej, zwykle na dysku twardym. Zjawisko to, w przypadku
wykonywania przez komputer tylko jednego programu, było nazywane
nakładkowaniem i pozostawiane na głowie programisty, ale wraz z pojawieniem
się systemów wielodostępnych i wieloprogramowych, zarządzaniem wymianą
fragmentów kodu i danych różnych zadań między PAO i dyskiem musiał się
zająć system operacyjny.
W czasie działania programu przesyłanie fragmentów kodu i danych do
i z pamięci głównej jest kontrolowane przez część systemu operacyjnego zwaną
systemem zarządzania pamięcią.
CPU
Translator
adresów
Pamięć
główna
Dysk
Wymiana
Stronicowanie
Program
Translacja adresu
Pamięć główna
Nr strony Przesunięcie
n d
f
Tablica stron
deskryptor strony
adres wirtualny n, d
ramka 0
ramka 1
ramka f
d
13
14
15
16
Używana
17
Używana
18
19
Używana
20
21
Używana
22
Używana
Lista
wolnych
ramek
13
14
15
18
20
Proces A
Strona 0
Strona 1
Strona 2
Strona 3
Proces A
13 Strona 0
Procesu A
14
Strona 1
Procesu A
15
Strona 2
Procesu A
16
Używana
17
Używana
18
Strona 3
Procesu A
19
Używana
20
21
Używana
22
Używana
Lista wolnych
ramek
20
Tablica stron
procesu A
13
14
15
18
Proces A
Strona 0
Strona 1
Strona 2
Strona 3
Stronicowanie: stały rozmiar ramki i strony, nie występuje defragmentacja, nie
wiadomo co strona zawiera (dane, kod, stos ???), nie można współużytkować.
Mała strona : niewielki obszar „zmarnowany”, ale dużo wierszy w tablicy stron,
częste krótkie transmisje z/do dysku, duża transmisja z/do dysku przy zmianie
tablic stron po przełączeniu zadania
Duża strona : duży obszar zmarnowany (średnio ½ strony ), mało wierszy,
rzadsze błędy stron, krótki czas transmisji a długi pozycjonowania dla
współczesnych dysków.
Struktura tablicy stron
Tablica stron procesu ma zmienną długość, zależną od rozmiaru procesu. Zatem
nie możemy przechowywać jej w rejestrach procesora. Musi ona znajdować się
w pamięci głównej.
Rejestr procesora przechowuje adres początkowy tablicy stron
wykonywanego procesu.
Numer strony adresu wirtualnego służy do indeksowania tablicy stron oraz
znalezienia odpowiedniego numeru ramki. Po połączeniu go z adresem
względnym, stanowiącym część adresu wirtualnego, można otrzymać adres
rzeczywisty.
Jak duża powinna być tablica stron?
Przykład – architektura VAX. (adres 32-bitowy)
Każdy proces może zajmować do 2
31
= 2 GB
pamięci wirtualnej.
Wielkość strony 512 B = 2
9
,
co oznacza, że na jeden proces może przypadać
2
22
zapisów tablicy stron (4 M !!!).
Tablice stron są przechowywane również w pamięci wirtualnej.
Oznacza to, że tablice stron również podlegają stronicowaniu.
Gdy proces jest realizowany, przynajmniej część jego tablicy stron musi
znajdować się w pamięci głównej.
Sposoby organizacji dużych tablic stron:
!"
dwupoziomowy schemat,
!"
odwrócona tablica stron.
Bufor translacji adresów
Każde odwołanie do pamięci wirtualnej wywołuje co najmniej dwa dostępy do
pamięci głównej:
!"
pobranie odpowiedniego zapisu tablicy stron,
!"
pobranie żądanych danych.
Przyjęcie prostego schematu pamięci wirtualnej powoduje podwojenie czasu
dostępu do pamięci !!!
Sposób zmniejszenia czasu dostępu:
zastosowanie specjalnej pamięci podręcznej zapisów tablicy stron, nazywanej
buforem translacji adresów (ang. tranlation lookaside buffer - TLB).
Działanie TLB
Nr strony Przesunięcie
TLB
Adres wirtualny
Chybienie
+
Do pamięci
Tablica stron
Segmentacja:
zmienny rozmiar ramki i segmentu, zależny od potrzeb, nie występują straty na
pustej ostatniej stronie, znana jest zawartość # można chronić dane i stos przed
wykonaniem czy kod przed zapisem, można współużytkować segmenty – tylko
jedna kopia w pamięci i mogą z niej korzystać różne zadania
Pamięć wirtualna jest mechanizmem jakościowo różnym od omawianych
poprzednio (pamięci cache). Aby pokazać pamięć cache, należałoby wskazać
kilka (w skrajnych przypadkach jeden) układów VLSI, realizujących wspólnie
zadanie podawania procesorowi często używanych danych i rozkazów szybciej,
niż jest to w stanie zrobić pamięć operacyjna.
Pamięć wirtualna jest zespołem zarówno elementów sprzętu
(rejestrów procesora, elementów pamięci operacyjnej, elementów
pamięci dyskowej), jak i oprogramowania – zarządzanie pamięcią
wirtualną realizuje system operacyjny.
Opis działania:
- zadanie
odwołuje się do komórki PAO, generując adres logiczny;
- MMU
tłumaczy adres logiczny na fizyczny : adres początku bloku + offset
w ramach bloku;
- MMU sprawdza, czy żądany blok znajduje się w PAO (najpierw w TLB,
potem w tablicy bloków w PAO)
- jeśli tak, obsługa odczytu/ zapisu;
- jeśli nie, zawieszane jest wykonywanie bieżącego zadania i generowany
jest wyjątek, obsługiwany przez jądro SO ; sprawdzana jest możliwość
sprowadzenia żądanej strony z dysku do „wolnego” obszaru w PAO, jeśli
nie ma wolnego, należy wyznaczyć jakiś do usunięcia, sprawdzić, czy
usuwany był modyfikowany w stosunku do kopii odczytanej poprzednio
z dysku, jeśli modyfikowany, zapisać nową postać usuwanego, wczytać
żądany obszar do PAO i wznowić wykonanie zawieszonego zadania;
Wspomaganie mechanizmu PW musi być realizowane na 3 poziomach
1.
jądra systemu operacyjnego
: obsługa braku żądanych bloków (page
fault), procedury umieszczania bloków w wolnej PAO, procedury
wymiany bloków;
2.
jednostki zarządzania pamięcią
: przechowywanie i interpretacja bitów
sterujących
- valid/ invalid bit czy ramka zawiera kopię bloku z dysku, czy
informację nieaktualną
- dirty bit: blok był modyfikowany po odczycie z dysku
- read/ write bit: strona do odczytu, zapisu ?
- licznik dostępów: dla implementacji algorytmów wymiany
- generacja sygnałów do SO: błąd pamięci, błąd strony, zapis do bloku
o atrybucie „tylko do odczytu”;
3.
procesora
: instrukcje muszą być restartowalne zarówno przy próbie
pobrania instrukcji jak i jej argumentów, wprowadza się dodatkowe
instrukcje i rejestry do obsługi PW.
Wydajność:
efektywny czas dostępu = ( 1 – współcz. chybień ) x czas dostepu PAO +
współcz. chybień x czas obsługi chybienia
PYTANIE ?
Jaki będzie efektywny czas dostępu jeżeli czas dostępu PAO wynosi 10 ns,
obsługa błędu strony (chybienia) wymaga 25 ms , a współczynnik chybień =
1/10000?
Zarządzanie pamięcią wirtualną w systemie Windows NT
Proces zarządzania stronami w systemie Windows NT (t.j. decydowanie, które
strony wirtualne mają być umieszczone w RAM, a które mają znajdować się
w pliku stronicowania) nazywany jest stronicowaniem na żądanie (demand
paging).
Obszar
adresowy
programu
2 GB
Program 1
Obszar
adresowy
programu
2 GB
Program 2
Zarządca
pamięci
wirtualnej
Program 1
Program 1
Program 2
Program 1
Program 2
Program 2
System
1
Pagefile.sys
2
3
4
Zalety pamięci wirtualnej:
- większa logiczna przestrzeń adresowa dla programu, mogąca przekraczać
rozmiar fizycznie zainstalowanej pamięci (Windows i swap file),
- stopień wieloprogramowości na danym komputerze może być zwiększony,
- dzięki przemyślanej strukturze i umieszczeniu zarządzania w jądrze systemu
operacyjnego, procesy przydziału/ wymiany /zwalniania są przezroczyste dla
programisty # mniej błędów.
Tryb wirtualny procesorów, ochrona zasobów:
Mechanizmy ochrony.
Ochrona zasobów polega na wprowadzeniu czterech poziomów
uprzywilejowania. Hierarchię poziomów uprzywilejowania przedstawia rys.:
Rozszerzenie systemu operacyjnego
PL = 2
Jądro
PL = 0
Usługi systemowe
PL = 1
Zadania użytkowe
PL = 3
Interfejsy
programowe
realizowane
przez CPU.
Hierarchiczny system poziomów uprzywilejowania.
Poziomy
te
stanowią rozszerzenie stosowanej powszechnie
w minikomputerach struktury systemowego i
użytkowego poziomu
uprzywilejowania. Poszczególne poziomy uprzywilejowania PL ponumerowane
są od 0 do 3. Poziom oznaczony cyfrą zero jest najbardziej uprzywilejowany.
Wprowadzenie czterech poziomów uprzywilejowania umożliwia stosowanie
mechanizmów ochrony również wewnątrz zadań programowych.
W wirtualnej przestrzeni adresowej każdego zadania mogą być zawarte
procedury systemowe, procedury obsługi przerwań i inne procedury
programowe. Atrybut poziomu uprzywilejowania jest przypisywany zadaniom
programowym, deskryptorom i selektorom.
Poziom uprzywilejowania zadania wpływa na rodzaj rozkazów jakie mogą
być wykonywane i na zestaw deskryptorów, który może być wykorzystany
przez zadanie.
Bieżący poziom uprzywilejowania CPL (ang. Current Privilege Level) jest
określany przez poziom uprzywilejowania aktualnie realizowanego zadania
programowego; określają go dwa najmniej znaczące bity rejestru segmentu
(selektora) CS.
Poziom ten może być zmieniony tylko przez odwołanie do mechanizmów
przekazania sterowania. Poziom uprzywilejowania deskryptora DPL określa
zestaw zadań, które mogą odwoływać się do danego deskryptora. Aby zadanie
mogło uzyskać dostęp do deskryptora numer CPL nie może być większy od
DPL. Żądany poziom uprzywilejowania RPL określany przez selektor, może
być wykorzystany do obniżenia poziomu uprzywilejowania zadania. Mechanizm
ten zapewnia, że wywoływane procedury o wysokim poziomie
uprzywilejowania nie będą miały dostępu do struktur danych umieszczonych na
wyższym poziomie uprzywilejowania, niż procedura wywołująca.
Drugim sposobem ochrony jest separacja zadań. Polega ona na tym, że
każde zadanie dysponuje własną przestrzenią adresową. Zrealizowane jest to za
pomocą tabeli translacji. Każde zadanie posiada własną, lokalną, tablicę
deskryptorów - LDTR. Dzięki temu różne zadania pomimo tego, że posługują
się tym samym adresem wirtualnym, odwołują się do różnych obszarów
pamięci, wynikających z zawartości ich lokalnych tabel deskryptorów.
Mechanizm translacji adresów
Adres logiczny
Baza
tablicy
segmen-
tów
Tablica
deskrypto-
rów
Katalog
tablic
stron
Tablica
stron
Adres liniowy
Baza
katalogu
stron
+
+
+
+
Adres
fizyczny
Strona
Pamięć fizyczna
Blok stronnicowania
Blok segmentacji
Program
15 0
+6
+4
+2
0
15
0
+6
+4
+2
0
Adres bazowy segmentu 31..24
Adres bazowy segmentu 23..16
A
t y p
DPL
S
A
Adres bazowy segmentu 15 ... 0
Wielkość segmentu 15 ... 0
Bajt atrybutów
G
D
0
AVL
Wielokość 16..19
7 4
Numer deskryptora
TI
RPL
0
1
2
15
3
(zarezerwowane)
Adres bazowy segmentu 23..16
A
t y p
DPL
S
A
Adres bazowy segmentu 15 ... 0
Wielkość segmentu 15 ... 0
Bajt atrybutów
Format deksryptora segmentu pamięci dla 80286
Format deksryptora segmentu pamięci dla 80386 i nowszych
Format selektora
Opis deskryptorów - 80286:
P - segment obecny; określa czy dany segment (strona) znajdują się w pamięci operacyjnej
komputera - P = 1, jeżeli P=0 wówczas generowany jest wyjątek w wyniku czego
przygotowywana jest odpowiednia ilość miejsca w pamięci i brakujący segment (strona)
wprowadzana jest do pamięci operacyjnej.
DPL - poziom ochrony opisywanego segmentu. Pole to zawiera podstawową informację
o segmencie, wykorzystywaną przez mechanizm ochrony mikroprocesora.
S - rodzaj deskryptora. Deskryptory mogą opisywać segmenty pamięci - danych lub kodu - S
= 1, oraz specjalne systemowe struktury danych - segmenty systemowe i bramki zadań - S
= 0.
typ - określa prawa dostępu do danego segmentu:
0 - segment danych tylko odczyt;
1 - segment danych - odczyt i zapis;
2 - segment danych rozszerzany w dół tylko odczyt;
3 - segment danych rozszerzany w dół - odczyt i zapis;
4 - segment kodu tylko wykonywanie;
5 - segment kodu - wykonywanie i odczyt;
6 - zgodny segment kodu tylko wykonywanie;
7 - zgodny segment kodu - wykonywanie i odczyt;
Segment zgodny różni się od zwykłego segmentu kodu tym, że po przekazaniu
sterowania do procedury zawartej w tym segmencie nie następuje zmiana poziomu
ochrony (na wartość określoną w deskryptorze segmentu). Procedura wykonuje się na
poziomie ochrony procesu wywołującego.
A - segment użyty. Bit ten jest ustawiany przez procesor przy ładowaniu selektora do rejestru
segmentu lub deskryptora do rejestru deskryptora.
Opis deskryptorów - 80386 oraz i486:
G - ziarnistość. Umożliwia opis segmentu do 4GB przy użyciu jedynie 20-
bitowego pola wielkość. Jednostką długości segmentu może być jeden bajt -
G = 0 - można wówczas zdefiniować segment o długości do 1MB, albo
wielkość może być zdefiniowana w jednostkach alokacji 4KB, co daje
możliwość zdefiniowania segmentu o rozmiarze do 4GB.
D - długość słowa. Dla D = 1 oznacza stosowanie 32-bitowego przemieszczenia
w adresie argumentu oraz 32-bitowych argumentów. Dla D = 0 16-bitowe
przemieszczenie i 16-bitowe argumenty.
AVL - pole nie jest interpretowane przez mikroprocesory, może być użyte przez
oprogramowanie.
Opis bitów selektora:
TI - określa rodzaj tablicy deskryptorów do, której chce się odwołać program.
TI = 0 odwołanie dotyczy tablicy globalne, TI = 1 oznacza, że odwołanie
dotyczy tablicy lokalnej.
RPL - poziom ochrony zadania żądającego dostępu. Służy do osłabienia
bieżącego poziomu ochrony.
Przykład:
Jeżeli zadanie o poziomie ochrony 3 próbuje przez wywołanie funkcji
systemowej o poziomie ochrony 0 uzyskać dostęp do danych na poziomie 2, to
nie uzyska takiego dostępu, gdyż wartość RPL selektora wywołującego będzie
równa 3.
Segmentacja w procesorach Intel
Deskryptory są umieszczane w pamięci kolejno tworząc tzw. tablice
deskryptorów. Wykonywany program ma dostęp do dwóch tablic deskryptorów:
globalnej tablicy deskryptorów GDT i lokalnej tablicy deskryptorów LDT,
których wielkość wynosi 64KB. Numer deskryptora w jednej z tablic GDT lub
LDT jest wybierany na podstawie 13 bitów selektora (bity 3...15). Zatem każda
z tablic może zawierać do 8192 deskryptorów.
Rozmiar logicznej przestrzeni adresowej określa się jako maksymalną wielkość
widzianą przez pojedyncze zadanie. Ponieważ zadanie ma dostęp do obu tablic,
dlatego też może w sumie korzystać z 16384 segmentów, 16K. O wielkości
logicznej przestrzeni adresowej decydują liczba segmentów i ich długość.
Dlatego też w mikroprocesorze 80286, gdzie maksymalna długość segmentu
wynosiła 64KB logiczna pamięć zwana też pamięcią wirtualną ma pojemność
16K * 64K = 2
14
* 2
16
= 2
30
bajtów = 1GB.
Analogicznie w 80386 (i486), gdzie maksymalna długość segmentu jest równa
4GB (przemieszczenie 32-bity), jest ona równa: 16K * 4GB = 2
14
* 2
32
= 2
46
bajtów = 64TB. Tak więc, pamięć widziana przez zadanie jest znacznie większa
od pamięci, którą może zaadresować procesor. Jednak istnieje możliwość
wykorzystania całej pamięci zadania dzięki odpowiednim mechanizmom
wbudowanym w procesor, które umożliwiają implementację pamięci wirtualnej.
Stronicowanie w procesorach Intel
Polega na podziale całej przestrzeni adresowej na bloki o długość 4KB, które są
rozmieszczone sekwencyjne począwszy od adresu 0. W przestrzeni adresowej
mikroprocesora znajdują się więc 2
32
/ 2
12
= 2
20
stron = 1M stron. Położenie
strony jest jednoznacznie określane za pomocą jej 20-bitowego numeru.
W 32-bitowym adresie liniowym można wyróżnić 12 mniej znaczących bitów
określających położenie wewnątrz strony, oraz 20-bitowy numer strony
wskazujący jej położenie w przestrzeni adresowej. Jeżeli założymy
wykorzystanie tablicy translacji, w której każdy element składałby się z 4-bitów
jej rozmiar musiałby wynosić 4 * 2
20
= 4Mb. Ze względu na tak duży rozmiar
ewentualnej tablicy translacji w mikroprocesorze 80386 zastosowano
dwupoziomowe stronicowanie, wprowadzając dwie tablicę: tablicę stron
wskazującą na położenie strony w przestrzeni adresowej oraz tablice wyższego
poziomu zwane katalogami stron, którego to elementy wskazują na właściwą
tablicę stron. Elementy obydwu tych tablic mają identyczny format.