Unitat 6 · Sistemes Operatius (SO)
La memòria virtual és un mecanisme que permet que els programes s’executin com si disposessin d’un espai d’adreces molt més gran que la Memòria Principal real.
Funciona com un sistema de cache:
L’objectiu és mantenir a la MP el conjunt de treball del procés (les pàgines usades recentment). Quan el conjunt resident ≈ conjunt de treball → el rendiment és òptim.
La MP és la cache de la MS. Les pàgines són els blocs. Les fallades de pàgina són misses de cache.
Incrementa la multiprogramació: cap procés necessita estar completament a la MP (només les pàgines actives).
Permet executar programes més grans que la MP: només es carreguen pàgines quan cal.
Comportament no determinista del temps d’accés: una instrucció pot trigar nanosegons o mil·lisegons segons si es produeix una fallada de pàgina.
Localitat = rendiment: si el procés segueix un patró de localitat (temporal + espacial), les fallades disminueixen.
Hiperpaginació: si cap procés pot mantenir resident el seu conjunt de treball, el sistema entra en un bucle de fallades → rendiment ≈ 0.
Hiperpaginació = la CPU està ocupada gestionant fallades, no executant programes.
Les pàgines només es carreguen quan s’hi accedeix per primera vegada.
L’inici del procés és lazy: cap pàgina és resident fins que es referència.
Quan es produeix una fallada:
La MMU genera un trap cap al SO
El SO decideix on col·locar la pàgina
La pàgina es transfereix des del disc
L’execució es reprèn
Aquest enfocament és extremadament eficient quan hi ha localitat.
La idea és reduir el nombre futur de fallades aprofitant la localitat:
Prepaging = precache:
Quan la MMU detecta que una pàgina no és resident (F):
Com que carregar una pàgina pot trigar mil·lisegons, el SO despatxa un altre procés per no bloquejar la CPU.
La TLB (Translation Lookaside Buffer) és una petita memòria associativa que guarda les traduccions recents d’adreces virtuals → físiques.
TLB = cache de traduccions. Si hi ha encert (hit), no cal consultar la taula de pàgines.
Quan la CPU genera una adreça virtual:
Consultar la taula de pàgines és lent perquè:
La TLB permet:
Traduir cada adreça no pot ser més lent que accedir a memòria.
Els processadors moderns fan l’accés a TLB i cache en paral·lel, perquè:
TLB + Cache treballen en paral·lel per reduir el temps d’accés efectiu.
El Temps Efectiu d’Accés (TEA) és el temps mig per accedir a memòria tenint en compte:
Si la TLB fa hit (accés ràpid)= \(\text{TEA hit}=t_{TLB}+t_{MP}\)
Si la TLB fa miss (cal consultar la taula de pàgines a la MP)= \(\text{TEA miss}=t_{TLB}+2\cdot t_{MP}\)
\[TEA = (p \cdot \text{TEA hit}) + ((1-p) \cdot \text{TEA miss})\]
On: \(t_{TLB}\) = temps d’accés a la TLB, \(t_{MP}\) = temps d’accés a la Memòria Principal, \(p\) = taxa d’encerts de la TLB (TLB hit rate).
Com més alta és la taxa d’encerts de la TLB, més ràpid és l’accés efectiu.
Els discs són el dispositiu de paginació tradicional més utilitzat. Comparats amb la Memòria Principal, els discs (sobretot els HDD) són moltes orders de magnitud més lents. Quan es carrega una pàgina de la Memòria Secundària (MS) a la Memòria Principal (MP), el temps total ve determinat per:
\[T_{MS-MP} = T_{c} + T_{l} + T_{t}\]
Un SSD/NVMe redueix significativament aquests temps (ordre \(\mu s\), no té \(T_{c}\) ni \(T_{l}\)), però encara és molt més lent que la MP.
Una fallada de pàgina pot ser 100.000×-1000× més lenta que un accés normal! Encara que \(P\) sigui molt petit, el cost d’una fallada de pàgina és tan elevat que pot disparar dramàticament el TEA.
\[TEA = [ (1-p) \cdot (T_{a})] + [p \cdot (T_{fp})]\]
on:
\[T_{a} = 4 \mu s = 4 \cdot 10^{-6} s\]
\[ T_{c} = 2ms = 2 \cdot 10^{-3}s\]
\[T_{l} = 7500 \frac{rev}{min} \cdot \frac{1 min}{60 seg} = 125 \frac{rev}{seg} \rightarrow T_{l} = \frac{1}{2} \cdot \frac{1}{125}s = 4 \cdot 10^{-3} s\]
\[T_{t} = 100.000 \frac{paraules}{segon} \cdot \frac{1 pagina}{1.000 paraules} = 100 \frac{pagines}{segon} \rightarrow T_{t} = 10^{-2} s = 10 \cdot 10^{-3} s\]
\[T_{MP-MS} = T_{c} + T_{l} + T_{t} = 2 \cdot 10^{-3} + 4 \cdot 10^{-3} + 10 \cdot 10^{-3} = 16 \cdot 10^{-3}s\]
La relació \(\frac{1}{2}\) és un assumpció comuna en el context dels discos durs. Fa referencia al temps mitjà que tarda el disc a girar per situar-se a la pista/cilindre desitjat per fer una operació de lectura o escriptura.
\[TEA = [(1-P) \cdot (T_{a})] + [P \cdot (T_{fp})]\]
Com el sistema de gestió de memòria és Paginació:
Si no hi ha fallada de pàgina, el temps d’accés a Memòria Principal és \(2 \cdot T_{a}\). Ja que s’ha d’accedir a la taula de pàgines i a la pàgina.
En cas de fallada de pàgina, el temps d’accés a Memòria Principal és \(T_{MP-MS} + 3 \cdot T_{a}\). Ja que s’ha d’accedir a la taula de pàgines, després s’ha de carregar la pàgina a Memòria Principal, accedir a la pàgina i finalment accedir a la taula de pàgines per marcar la pàgina com a vàlida (actualització de la taula).
\[TEA = [(1-P) \cdot (2 \cdot T_{a})] + [P \cdot (T_{MP-MS} + 3 \cdot T_{a})]\] \[TEA = [(1-0,25) \cdot (2 \cdot 4 \cdot 10^{-6})] + [0,25 \cdot (16 \cdot 10^{-3} + 3 \cdot 4 \cdot 10^{-6})]\] \[TEA = 4,009 \; ms\]
Suposeu que tenim un sistema amb memòria virtual (del tipus paginació sota demanda). El sistema de gestió de memòria és Segmentació Paginada. Totes les taules (de segments i de pàgines) s’implementen en M.P (Memòria Principal). Les pàgines tenen 1.000 paraules. El dispositiu de paginació és un disc dur amb un temps de cerca mig de \(10 ms\). El disc dur gira a 7.200 revolucions per minut i transfereix 1.000.000 paraules per segon. Assumeix que el TLB no s’utilitza.
D’entre tots els accessos, el 20% dels mateixos es realitzen a pàgines carregades en M.P. Quan es produeix una fallada de pàgina, el 60% de les vegades es reemplaça una pàgina. El 70% de les vegades, la pàgina a reemplaçar ha estat accedida solament en mode lectura. Quan es produeix una fallada de pàgina, l’actualització de les taules de pàgines dels processos triga \(1 \mu s\). El temps d’accés a memòria és \(2 \mu s\).
Quin és el temps efectius d’accés (TEA) a M.P.?
Calculem els diferents temps:
\[\begin{equation*} \begin{split} TEA = & \, 0.2 \cdot (\text{Temps NO fallada}) + 0.8 \cdot (\text{Temps fallada}) \\ = & \, 0.2 \cdot (\text{Temps NO fallada}) \\ & + 0.8 \cdot \left[ 0.6 \cdot (\text{Temps reemplaçament}) + 0.4 \cdot (\text{Temps sense reemplaçament}) \right] \end{split} \end{equation*}\]
\[\begin{align*} \text{Temps reemplaçament} &= (0.3 \cdot \text{Temps intercanvi cel·la/pàgina (MP - MS)}) \\ &+ (0.7 \cdot \text{Temps moure pàgina (MS a MP)}) \\ \end{align*}\]
\[ \text{Temps NO fallada} = 3 \cdot T_a \]
\[ TEA = \frac{20}{100} \cdot (3 \cdot T_a) + \frac{80}{100} \cdot \text{Temps fallada} \]
\[ \text{Temps fallada} = \frac{60}{100} \cdot \text{Temps reemplaçament} + \frac{40}{100} \cdot \text{Temps sense reemplaçament} \]
On: \(\text{Temps sense reemplaçament} = T_{MP-MS} + 5 \cdot T_a + T_{Ac-Tau}\)
\[\begin{equation*} \begin{split} TEA = &\frac{20}{100} \cdot (3 \cdot T_a) \\ &+ \frac{80}{100} \cdot \left[ \frac{60}{100} \cdot \text{Temps reemplaçament} + \frac{40}{100} \cdot \left( T_{MP-MS} + 5 \cdot T_a + T_{Ac-Tau} \right) \right] \end{split} \end{equation*}\]
\[ \text{Temps reemplaçament} = \frac{30}{100} \cdot \text{Temps Modificada} + \frac{70}{100} \cdot \text{Temps No Modificada} \]
On: \(\text{Temps No Modificada} = T_{MP-MS} + 5 \cdot T_a + T_{Ac-Tau}\)
\[ \text{Temps reemplaçament} = \frac{30}{100} \cdot \text{Temps Modificada} + \frac{70}{100} \cdot \text{Temps No Modificada} \]
On: \(\text{Temps Modificada} = 2 \cdot T_{MP-MS} + 5 \cdot T_a + T_{Ac-Tau}\)
\[\begin{equation*} \begin{split} TEA = &\frac{20}{100} \cdot (3 \cdot T_a) \\ &+ \frac{80}{100} \cdot \left[ \begin{aligned} &\frac{40}{100} \cdot \left( T_{MP-MS} + 5 \cdot T_a + T_{Ac-Tau} \right) \\ &+ \frac{60}{100} \cdot \left[ \begin{aligned} &\frac{30}{100} \cdot \left( 2 \cdot T_{MP-MS} + 5 \cdot T_a + T_{Ac-Tau} \right) \\ &+ \frac{70}{100} \cdot \left( T_{MP-MS} + 5 \cdot T_a + T_{Ac-Tau} \right) \end{aligned} \right] \end{aligned} \right] \end{split} \end{equation*}\]
\[TEA = 14,17 \; ms\]
La gestió de marcs (frames) determina què s’assigna a cada procés i què s’expulsa quan cal alliberar espai a la Memòria Principal (MP).
Cal garantir que qualsevol instrucció que el procés executi pot ser resolta amb les pàgines que té assignades.
El nombre mínim de cel·les dependrà de:
Aquest mínim determina el nombre de marcs que cal assignar al procés perquè pugui executar qualsevol instrucció sense fallades permanents.
Suposeu que el format d’una instrucció ocupa dues paraules (mida paraula = 1 Byte):
Quin és el mínim nombre de cel·les que cal assignar a un procés? Suposem que OP1 i OP2 són operands d’adreçament indirecte i RES és directe.
En l’assignació global, els marcs de la Memòria Principal (MP) es distribueixen entre tots els processos considerant la visió global del sistema. A diferència de l’assignació local, en aquest model:
Hi ha dues estratègies habituals:
Suposeu que disposem d’una MP de 8 cel·les. Si tenim 3 processos, amb uns requeriments de memòria de P1 (6 cel·les), P2 (3 cel·les) i P3 (2 cel·les). Quina serà l’assignació de Memòria segons els algorismes d’Assignació Igualitària i Proporcional?
Assignació Igualitària: Cada procés té assignades \(\frac{8}{3} = 2,66\) cel·les de MP. Per tant, el procés P1 té assignades 2 cel·les de MP, el procés P2 té assignades 2 cel·les de MP i el procés P3 té assignades 2 cel·les de MP. En total hi ha 2 cel·les lliures.
Assignació Proporcional:
No totes les pàgines residents a Memòria es poden reemplaçar. Hi ha pàgines que no es poden reemplaçar perquè són necessàries, com per exemple les pàgines que contenen les funcions del sistema operatiu.
A més a més, en sistemes linux, existeix la crida a sistema mlock que permet fixar una pàgina a la Memòria Principal.
L’algorisme Òptim (OPT) substitueix la pàgina que no tornarà a ser necessària durant més temps en el futur.
És la política que minimitza el nombre total de fallades de pàgina, però no es pot implementar en temps real, ja que requereix conèixer l’accés futur. S’utilitza com a referència teòrica (llindar inferior).
Mirar endavant en la seqüència d’accés -> expulsar la pàgina amb la pròxima referència més llunyana (o que no es torna a referenciar).
Regla farthest next use, i si totes són infinits (no es tornen a usar) el resultat depèn de la tria arbitrària —> totes les opcions són igualment òptimes en aquell punt.
Assumeix 3 marcs i la següent seqüència de referències a pàgines: 0 → 7 → 5 → 8 → 10 → 12 → 0 → 10 → 8 → 5 → 9 → 7
Funcionament
| Pas | Referència | Marcs | Page fault? |
|---|---|---|---|
| 0 | 0 | [0, –, –] | Sí (1) |
| 1 | 7 | [0, 7, –] | Sí (2) |
| 2 | 5 | [0, 7, 5] | Sí (3) |
| 3 | 8 | [0, 8, 5] | Sí (4) — reemplaça 7 (proper ús futur a posició 11) |
| 4 | 10 | [0, 8, 10] | Sí (5) — reemplaça 5 (proper ús futur a posició 9) |
| 5 | 12 | [0, 12, 10] | Sí (6) — reemplaça 8 (proper ús futur a posició 8) |
| 6 | 0 | [0, 12, 10] | No (hit) |
| 7 | 10 | [0, 12, 10] | No (hit) |
| 8 | 8 | [0, 8, 10] | Sí (7) — totes les altres pàgines no tornen a aparèixer; escollim una (per exemple 12) |
| 9 | 5 | [5, 8, 10] | Sí (8) — escollim expulsar 0 (no apareix més endavant) |
| 10 | 9 | [9, 8, 10] | Sí (9) — expulsar 5 (no torna a aparèixer) |
| 11 | 7 | [7, 8, 10] | Sí (10) — expulsar 9 |
L’algorisme FIFO és un algorisme de reemplaçament de pàgines que substitueix la pàgina que ha estat a la Memòria Principal durant més temps.
FIFO no utilitza informació del futur. Expulsa sempre la pàgina més antiga.
És senzill d’implementar, però pot portar a un rendiment subòptim en alguns casos (ex: Anomalies de Belady).
Assumeix 3 marcs i la següent seqüència de referències a pàgines: 0 → 7 → 5 → 8 → 10 → 12 → 0 → 10 → 8 → 5 → 9 → 7
Funcionament
| Ref | F1 | F2 | F3 | Fault | Expulsa |
|---|---|---|---|---|---|
| 0 | 0 | – | – | ✓ | – |
| 7 | 0 | 7 | – | ✓ | – |
| 5 | 0 | 7 | 5 | ✓ | – |
| 8 | 8 | 7 | 5 | ✓ | 0 |
| 10 | 8 | 10 | 5 | ✓ | 7 |
| 12 | 8 | 10 | 12 | ✓ | 5 |
| 0 | 0 | 10 | 12 | ✓ | 8 |
| 10 | 0 | 10 | 12 | ✗ | – |
| 8 | 0 | 8 | 12 | ✓ | 10 |
| 5 | 0 | 8 | 5 | ✓ | 12 |
| 9 | 9 | 8 | 5 | ✓ | 0 |
| 7 | 9 | 7 | 5 | ✓ | 8 |
L’algorisme LRU (Least Recently Used) substitueix la pàgina que no ha estat utilitzada durant el període de temps més llarg.
El funcionament bàsic consisteix a mantenir un registre de l’ordre d’ús de les pàgines i expulsar la que fa més temps que no s’utilitza.
És una aproximació pràctica a Óptim quan les referències presenten localitat temporal.
No es pot implementar de manera eficient sense suport de maquinari (cadenes, timestamps, etc.).
Assumeix 3 marcs i la següent seqüència de referències a pàgines: 0 → 7 → 5 → 8 → 10 → 12 → 0 → 10 → 8 → 5 → 9 → 7
Funcionament
| Ref | F1 | F2 | F3 | Fault | Expulsa (LRU) |
|---|---|---|---|---|---|
| 0 | 0 | – | – | ✓ | – |
| 7 | 0 | 7 | – | ✓ | – |
| 5 | 0 | 7 | 5 | ✓ | – |
| 8 | 8 | 7 | 5 | ✓ | 0 |
| 10 | 8 | 10 | 5 | ✓ | 7 |
| 12 | 8 | 10 | 12 | ✓ | 5 |
| 0 | 0 | 10 | 12 | ✓ | 8 |
| 10 | 0 | 10 | 12 | ✗ | – |
| 8 | 0 | 10 | 8 | ✓ | 12 |
| 5 | 5 | 10 | 8 | ✓ | 0 |
| 9 | 5 | 9 | 8 | ✓ | 10 |
| 7 | 5 | 9 | 7 | ✓ | 8 |
La Segona Oportunitat és una millora de FIFO que utilitza el bit de referència (R) per evitar expulsar pàgines que han estat utilitzades recentment.
La idea és aproximar el comportament de LRU sense haver d’actualitzar estructures costoses.
Assumeix 3 marcs i 0 → 7 → 5 → 8 → 10 → 12 → 0 → 10 → 8 → 5 → 9 → 7
Funcionament
| Ref | F1 | F2 | F3 | Fault | Víctima |
|---|---|---|---|---|---|
| 0 | →0(1) | – | – | ✓ | – |
| 7 | 0(1) | →7(1) | – | ✓ | – |
| 5 | 0(1) | 7(1) | →5(1) | ✓ | – |
| 8 | →0(0) | 7(0) | 5(0) | ✓ | 0 |
| 10 | 8(1) | →7(0) | 5(0) | ✓ | 7 |
| 12 | 8(1) | 10(1) | →5(0) | ✓ | 5 |
| 0 | →8(0) | 10(0) | 12(0) | ✓ | 8 |
| 10 | 0(1) | →10(1) | 12(0) | ✗ | – |
| 8 | →0(0) | 10(0) | 8(1) | ✓ | 12 |
| 5 | →0(0) | 10(0) | 8(1) | ✓ | 0 |
| 9 | 5(0) | →10(0) | 8(0) | ✓ | 10 |
| 7 | 5(0) | 9(1) | →8(0) | ✓ | 8 |
El WSClock (Working Set Clock) és una millora del 2ª Oportunitat que incorpora:
L’objectiu és expulsar la millor víctima possible: pàgina poc usada, preferiblement no modificada, i fora del seu conjunt de treball.
WSClock ≈ 2ª Oportunitat + heurística del conjunt de treball ⇒ Millor rendiment i menys E/S al disc.
Disposem d’una memòria amb una mida de 4 cel·les. Un programa ha realitzat la seqüència de referències a les 19 pàgines següent:
4 → 3 → 2 → 1 → 0 → 1 → 0 → 2 → 3 → 4 → 5 → 6 → 7 → 8 → 1 → 5 → 3 → 4 → 5
Una anomalia de Belady es produeix quan un algorisme de reemplaçament com FIFO té més fallades de pàgina quan augmentem el nombre de marcs.
És contraintuïtiu -> més memòria hauria de significar menys fallades, però amb alguns algorismes això no és cert.
Per exemple, amb la seqüència següent: 1 → 2 → 3 → 4 → 1 → 2 → 5 → 1 → 2 → 3 → 4 → 5 i l’algorisme FIFO:
FIFO pot empitjorar quan augmentem els marcs. És l’únic algorisme clàssic on apareix aquesta anomalia.
1 → 2 → 3 → 4 → 1 → 2 → 5 → 1 → 2 → 3 → 4 → 5
3 marcs
| T | C1 | C2 | C3 | Falla? |
|---|---|---|---|---|
| 1 | 1 | – | – | ✔ |
| 2 | 1 | 2 | – | ✔ |
| 3 | 1 | 2 | 3 | ✔ |
| 4 | 4 | 2 | 3 | ✔ |
| 1 | 4 | 1 | 3 | ✔ |
| 2 | 4 | 1 | 2 | ✔ |
| 5 | 5 | 1 | 2 | ✔ |
| 1 | 5 | 1 | 2 | ✘ |
| 2 | 5 | 1 | 2 | ✘ |
| 3 | 5 | 3 | 2 | ✔ |
| 4 | 5 | 3 | 4 | ✔ |
| 5 | 5 | 3 | 4 | ✘ |
4 marcs
| T | C1 | C2 | C3 | C4 | Falla? |
|---|---|---|---|---|---|
| 1 | 1 | – | – | – | ✔ |
| 2 | 1 | 2 | – | – | ✔ |
| 3 | 1 | 2 | 3 | – | ✔ |
| 4 | 1 | 2 | 3 | 4 | ✔ |
| 1 | 1 | 2 | 3 | 4 | ✘ |
| 2 | 1 | 2 | 3 | 4 | ✘ |
| 5 | 5 | 2 | 3 | 4 | ✔ |
| 1 | 5 | 1 | 3 | 4 | ✔ |
| 2 | 5 | 1 | 2 | 4 | ✔ |
| 3 | 5 | 1 | 2 | 3 | ✔ |
| 4 | 4 | 1 | 2 | 3 | ✔ |
| 5 | 4 | 5 | 2 | 3 | ✔ |
El buffering de pàgines és una tècnica que intenta reduir el cost de les fallades de pàgina mantenint una reserva de marcs lliures.
Quan es produeix una fallada de pàgina:
S’utilitza un marc lliure, però encara no s’ha alliberat cap pàgina resident.
Quan el nombre de marcs lliures cau per sota d’un llindar \(\theta\), el SO:
El buffering converteix el reemplaçament immediat en un procés diferit, suavitzant l’impacte de les fallades.
Suposem un sistema amb una Memòria Principal amb 6 marcs i una \(\theta=2\). Utilitzarem l’algorisme FIFO per gestionar el reemplaçament de pàgines.
Una aplicació pot demanar que determinades pàgines no surtin mai de la MP:
La retenció garanteix latència baixa i evita fallades crítiques.
Assumim que i i j estan en registres i no ocupen memòria. La matriu A està emmagatzemada per files (row-major).
La matriu A té 100x100 = 10.000 enters → ocupa 10.000 paraules.
Mida de pàgina = 200 paraules → \(200\frac{enters}{pàgina}\).
Nombre de pàgines necessàries per a A: \(\frac{10.000 paraules}{200\frac{paraules}{pàgina}} = 50 pàgines\).
Cada fila ocupa 100 bytes. Com que una pàgina conté 200 bytes,cada pàgina conté exactament 2 files completes.
El bucle recorregut fila a fila provoca que cada 2 files s’accedeixi a una nova pàgina.
Resultat
Per tant, hi haurà una fallada de pàgina cada 2 files. Amb 100 files, hi haurà 50 fallades de pàgina en total sobre l’accés a la matriu A.
Nota
Si vols comptar també la possible fallada inicial per carregar codi/taules del procés a MP, s’hi pot sumar 1 → 51 en total.
Repeteix els càlculs anteriors però assumint que ara la matriu A està emmagatzemada per columnes (column-major).
En column-major, la memòria s’organitza per columnes: les posicions consecutives corresponen a A[0][c], A[1][c], A[2][c], ….
Cada columna té 100 enters; cada pàgina conté 200 enters → cada pàgina conté 2 columnes:
Warning
El patró d’accés generat pel doble bucle (primer i, després j) visita les cel·les en ordre: A[0][0], A[0][1], A[0][2], …, A[0][99], A[1][0], A[1][1], …, A[99][99] Per a column-major això significa: per una fila fixa i anem saltant entre columnes i, per tant, entre moltes pàgines diferents.
Per una fila i fixa la seqüència de pàgines és: p(0), p(1), p(2), …, p(49)
Cada pàgina p(k) s’accedeix dues vegades consecutives per cada fila i (per j=0 i j=1)
1a utilització de p(k) → fallada (ja que no està a MP)
2a utilització de p(k) → hit (ja que acaba de ser carregada)
La proper reutilització de p(k) es produeix només a la fila següent (i+1), després d’haver visitat totes les altres pàgines entre mig.
La reuse distance (nombre de pàgines úniques entre dues utilitzacions de la mateixa pàgina) és 49.
Com que els marcs assignats = 3 i 49 > 3, LRU no pot retenir p(k) fins al seu pròxim ús → la pàgina serà expulsada abans de la següent reutilització.
Conclusió
En column-major, amb 3 marcs i LRU, es produeixen 5000 fallades de pàgina en total, o 5001 si comptem la possible fallada inicial per carregar codi/taules del procés a MP.

Unitat 6 · Sistemes Operatius (SO) 🏠