Salta al contenuto
Note per Studenti Esercizio - Allocazione contigua con first fit, best fit, worst fit e next fit (eserciziario, esercizi 35, 36, 54, 55, 102 e 115)

Esercizio - Allocazione contigua con first fit, best fit, worst fit e next fit (eserciziario, esercizi 35, 36, 54, 55, 102 e 115)

In questa pagina 8

Testo (eserciziario del corso di Sistemi Operativi, Ing. Informatica UniPD).

  • Esercizio 35. Memoria centrale di 4 KB, in celle di 1 byte, allocata ai processi in modo contiguo con first fit: si sceglie un'area libera e si alloca il processo nella sua parte iniziale; quando un processo termina, la sua memoria diventa un'area libera, fusa con le eventuali aree libere adiacenti. Processi (dimensione in byte, istante di arrivo, durata): P1P_1 (2000, 0, 4), P2P_2 (1010, 2, 7), P3P_3 (500, 3, 5), P4P_4 (580, 6, 10), P5P_5 (1500, 7, 4). Visualizzare l'allocazione della memoria.
  • Esercizio 36. Stessa memoria, algoritmo worst fit: P1P_1 (2048, 0, 10), P2P_2 (1970, 7, 13), P3P_3 (2000, 11, 19), P4P_4 (30, 13, 10). Visualizzare l'allocazione e valutare la frammentazione esterna e interna all'istante t=13t=13.
  • Esercizio 54. Memoria di 4 KB organizzata in celle da 16 bit, best fit. P1P_1: 2 KB, arrivo 0, durata 10; P2P_2: 10−310^{-3} Mbyte, 7, 13; P3P_3: 500 byte, 11, 19; P4P_4: 2400 bit, 13, 10. Quali aree sono occupate e quali libere subito dopo ogni caricamento e ogni terminazione?
  • Esercizio 55. Partendo dal precedente: qual è la dimensione massima di un processo che può partire a t=10t=10 ms? E a t=13t=13 ms?
  • Esercizio 102. Sistema con swapping e aree libere di 8, 4, 14, 18, 17, 9, 12, 15 KB, in quest'ordine. Quale area sceglie la politica next fit per caricare un segmento di 3 KB dopo aver caricato un segmento di 12 KB?
  • Esercizio 115. Aree libere contigue, in quest'ordine: 8, 15, 3, 11, 5, 7, 20, 25 KB. Tre richieste, nell'ordine: 11 KB, 4 KB, 13 KB. A quali aree sono assegnate con best fit e con worst fit?

Teoria: Memoria centrale - allocazione contigua, paginazione e segmentazioneUn programma deve stare in memoria centrale per girare; la MMU traduce a ogni accesso l'indirizzo logico (virtuale) in indirizzo fisico, sommando un registro di rilocazione e controllando il limite; con l'allocazione contigua (partizioni fisse o variabili, first/best/worst fit) si hanno frammentazione interna ed esterna e serve la compattazione; la paginazione divide memoria logica in pagine e memoria fisica in frame della stessa dimensione (potenza di 2), elimina la frammentazione esterna, traduce (p, d) con la tabella delle pagine (PTBR, PTLR) e riduce il costo dei due accessi con il TLB (EAT = h * t + (1 - h) * 2t); le tabelle grandi si dividono in gerarchiche, hash o invertite; lo swapping sposta intere pagine o processi su disco; la segmentazione usa blocchi di lunghezza variabile con coppia (base, limite), eventualmente paginati; Intel IA-32 usa segmentazione con paginazione a due livelli (10+10+12 bit) e IA-64 quattro livelli su 48 bit.Memoria centrale - allocazione contigua, paginazione e segmentazione →.


Come si ragiona

Ogni istante in cui succede qualcosa si fa in due passi: prima terminano i processi (la loro area si libera e si fonde con le aree libere vicine), poi si prova a caricare i processi arrivati. L'elenco delle aree libere va tenuto in ordine di indirizzo.

  • first fit: la prima area (per indirizzo) abbastanza grande;
  • best fit: la più piccola abbastanza grande (resto minimo);
  • worst fit: la più grande (resto massimo);
  • next fit: come first fit ma si riparte dall'ultima area usata.

Un processo va nella parte iniziale dell'area scelta: l'area si riduce dal basso.

Esercizio 35 (first fit)

Memoria 0…40950\ldots4095. Gli intervalli sono indirizzi di byte.

istante evento processi in memoria aree libere (inizio-fine, dimensione)
0 arriva P1P_1 (2000) P1P_1 0-1999 2000-4095 (2096)
2 arriva P2P_2 (1010) P1P_1, P2P_2 2000-3009 3010-4095 (1086)
3 arriva P3P_3 (500) P1P_1, P2P_2, P3P_3 3010-3509 3510-4095 (586)
4 termina P1P_1 (0+4) P2P_2, P3P_3 0-1999 (2000), 3510-4095 (586)
6 arriva P4P_4 (580) P4P_4 0-579, P2P_2, P3P_3 580-1999 (1420), 3510-4095 (586)
7 arriva P5P_5 (1500) nessun cambiamento: non entra 580-1999 (1420), 3510-4095 (586)
8 termina P3P_3 (3+5) P4P_4, P2P_2 580-1999 (1420), 3010-4095 (1086)
9 termina P2P_2 (2+7): P5P_5 può partire P4P_4 0-579, P5P_5 580-2079 2080-4095 (2016)
13 termina P5P_5 (9+4) P4P_4 580-4095 (3516)
16 termina P4P_4 (6+10) nessuno 0-4095 (4096)

Punti da notare:

  • a t=4t=4, alla terminazione di P1P_1, sono libere due aree (2000 e 586 byte);
  • a t=6t=6, P4P_4 (580 byte) va nella prima delle due, perché entrambe bastano;
  • a t=7t=7, P5P_5 (1500 byte) non entra: la memoria libera totale è 1420+586=2006≥15001420+586=2006\ge1500, ma è divisa in due buchi, nessuno dei quali basta: è frammentazione esterna. P5P_5 aspetta. A t=8t=8 i buchi sono 1420 e 1086 byte, ancora insufficienti; entra a t=9t=9, quando P2P_2 termina e i buchi si fondono in uno solo (la soluzione del corso si ferma a t=7t=7: il resto è la continuazione dello stesso procedimento).

Esercizio 36 (worst fit)

istante evento scelta memoria dopo
0 arriva P1P_1 (2048) unica area (4096) P1P_1 0-2047; libera 2048-4095
7 arriva P2P_2 (1970) unica area (2048) P2P_2 2048-4017; libera 4018-4095 (78 byte)
10 termina P1P_1 libere: 0-2047 (2048) e 4018-4095 (78)
11 arriva P3P_3 (2000) la più grande: 2048 P3P_3 0-1999; libere 2000-2047 (48) e 4018-4095 (78)
13 arriva P4P_4 (30) la più grande: 78 P4P_4 4018-4047; libere 2000-2047 (48) e 4048-4095 (48)
20 termina P2P_2 (7+13) libere 2000-4017 (2018) e 4048-4095 (48)
23 termina P4P_4 (13+10) libera 2000-4095 (2096)
30 termina P3P_3 (11+19) tutta libera

Stato a t=13t=13: P3P_3 (0-1999), P2P_2 (2048-4017), P4P_4 (4018-4047) occupati.

  • Frammentazione esterna: la memoria libera è 48+48=9648+48=96 byte in due buchi da 48. Un processo che chiedesse da 49 a 96 byte non potrebbe essere caricato, pur essendoci abbastanza memoria in totale.
  • Frammentazione interna: nessuna, perché a ogni processo si assegna esattamente lo spazio che richiede (partizioni variabili).

Esercizio 54 (best fit, celle da 16 bit)

La memoria è di 4 KB=40964\text{ KB}=4096 byte; con celle da 2 byte sono 4096/2=20484096/2=2048 celle, numerate 0…20470\ldots2047. Si convertono i processi in celle (arrotondando per eccesso):

processo dimensione in byte in celle
P1P_1 2 KB 2048 1024
P2P_2 10−310^{-3} Mbyte 10−3⋅1024⋅1024=1048,576→104910^{-3}\cdot1024\cdot1024=1048{,}576\to1049 ⌈1049/2⌉=525\lceil1049/2\rceil=525
P3P_3 500 byte 500 250
P4P_4 2400 bit 300 150
istante evento scelta memoria (celle)
0 P1P_1 unica area P1P_1 0-1023; libera L1L_1 1024-2047
7 P2P_2 unica area P2P_2 1024-1548; L1L_1 1549-2047 (499)
10 termina P1P_1 L2L_2 0-1023 (1024) e L1L_1 1549-2047 (499)
11 P3P_3 (250) best fit: la più piccola che basta è L1L_1 (499) P3P_3 1549-1798; L1L_1 1799-2047 (249)
13 P4P_4 (150) best fit: L1L_1 (249) invece di L2L_2 (1024) P4P_4 1799-1948; L1L_1 1949-2047 (99)
20 termina P2P_2 (7+13) libera 0-1548 (1549), L1L_1 1949-2047 (99)
23 termina P4P_4 libera 0-1548 (1549) e 1799-2047 (249)
30 termina P3P_3 tutta libera

Errore nella soluzione del corso. La soluzione riporta che P2P_2 occupa le celle da 1024 a 1549, e di conseguenza P3P_3 da 1550 a 1799 e P4P_4 da 1800 a 1949. Ma P2P_2 occupa 525 celle: da 1024 a 1024+525−1=15481024+525-1=\mathbf{1548}. Tutti gli intervalli successivi sono quindi spostati di uno (una nota sulla slide corregge 1549 in 1548). Il resto del ragionamento (best fit sceglie L1L_1 sia a t=11t=11 sia a t=13t=13) è corretto.

Esercizio 55

La dimensione massima di un processo che può partire è quella della zona libera più grande.

  • A t=10t=10: le aree libere sono L2L_2 (celle 0-1023, cioè 1024 celle =2=2 KB) e L1L_1 (499 celle): il massimo è 2 KB.
  • A t=13t=13: la zona più grande è ancora L2L_2 (1024 celle): 2 KB. Lo scontro tra P3P_3 e P4P_4 ha consumato solo L1L_1.

Esercizio 102 (next fit)

Aree: 8, 4, 14, 18, 17, 9, 12, 15 KB.

  1. Carico 12 KB. Si parte dall'inizio: 8 non basta, 4 no, 14 sì: si usa l'area da 14 (resto 2 KB).
  2. Poi 3 KB con next fit: si riparte dall'ultima area usata, cioè dal resto di 2 KB (non basta), poi 18: 18 KB.

Risposta: l'area da 18 KB. Per confronto: first fit avrebbe scelto 8 KB (il primo che basta), best fit 4 KB, worst fit 18 KB (o la più grande rimasta).

Esercizio 115 (best fit e worst fit)

Aree: [8,15,3,11,5,7,20,25][8, 15, 3, 11, 5, 7, 20, 25].

richiesta best fit (la più piccola che basta) worst fit (la più grande)
11 KB area da 11 (resto 0) area da 25 (resto 14)
4 KB area da 5 (resto 1) area da 20 (resto 16)
13 KB area da 15 (resto 2) area da 16 (il resto dell'area da 20: 20−4=1620-4=16; il 14 è più piccolo)

Verifica del worst fit a 13 KB: dopo le prime due richieste le aree sono 8, 15, 3, 11, 5, 7, 16, 14: la più grande è 16, e basta per 13. Il worst fit ha lasciato 3 KB nell'area da 16 e ha consumato in tutto 3 grandi aree.


Errori tipici

  • Dimenticare che a un istante prima terminano i processi e poi arrivano i nuovi (è la regola che dà l'ordine giusto).
  • Non fondere le aree libere adiacenti dopo una terminazione.
  • Dire che c'è frammentazione interna con partizioni variabili: c'è solo quella esterna.
  • Convertire male celle e byte (con celle da 16 bit un'area da 4 KB ha 2048 celle) o dimenticare l'arrotondamento per eccesso.
  • Scrivere come fine di un intervallo inizio+dimensione\text{inizio}+\text{dimensione} invece di inizio+dimensione−1\text{inizio}+\text{dimensione}-1.

Versione ripasso

Procedura. A ogni istante: prima terminano i processi (si fondono le aree libere adiacenti), poi arrivano i nuovi. First fit: prima area che basta; best fit: la più piccola che basta; worst fit: la più grande; next fit: parte dall'ultima area usata. Il processo va all'inizio dell'area, che si riduce. Fine intervallo =inizio+dim−1=\text{inizio}+\text{dim}-1.

Ex. 35 (first fit, 4096 byte). P1P_1 0-1999; P2P_2 2000-3009; P3P_3 3010-3509; a t=4t=4 libere 0-1999 e 3510-4095; P4P_4 in 0-579; a t=7t=7 P5P_5 (1500) non entra (buchi 1420 e 586: frammentazione esterna); entra a t=9t=9 (580-2079) quando P2P_2 termina.

Ex. 36 (worst fit). P1P_1 0-2047; P2P_2 2048-4017; a t=10t=10 buchi 2048 e 78; P3P_3 in 0-1999 (resto 48); P4P_4 (30) nel buco da 78: 4018-4047. A t=13t=13: libere 48 + 48 byte, frammentazione esterna (non entra nulla da 49 a 96 byte), interna nulla.

Ex. 54 (best fit, celle da 2 byte, 2048 celle). P1P_1 1024, P2P_2 525, P3P_3 250, P4P_4 150 celle. P2P_2 in 1024-1548 (la soluzione del corso scrive 1549, con errore a catena sui successivi); P3P_3 1549-1798; P4P_4 1799-1948 (best fit sceglie il buco da 249, non quello da 1024).

Ex. 55. Il massimo è il buco più grande: 1024 celle =2=2 KB a t=10t=10 e a t=13t=13.

Ex. 102 (next fit). 12 KB nel 14 (resto 2), poi 3 KB: 2 non basta, 18 KB (first fit: 8; best fit: 4).

Ex. 115. Best fit: 11 →\to 11, 4 →\to 5, 13 →\to 15. Worst fit: 11 →\to 25, 4 →\to 20, 13 →\to 16 (resto del 20).

Tabelle da ricordare. Ex. 35 (first fit): t=0t=0 P1P_1 0-1999; t=2t=2 P2P_2 2000-3009; t=3t=3 P3P_3 3010-3509; t=4t=4 termina P1P_1 (buchi 2000 e 586); t=6t=6 P4P_4 0-579; t=7t=7 P5P_5 (1500) non entra (1420 e 586: esterna); t=8t=8 termina P3P_3 (1420 e 1086); t=9t=9 termina P2P_2, P5P_5 in 580-2079; t=13t=13 termina P5P_5; t=16t=16 termina P4P_4. Ex. 36 (worst fit): t=7t=7 P2P_2 2048-4017 (resta 78); t=10t=10 buchi 2048 e 78; t=11t=11 P3P_3 in 0-1999 (resta 48); t=13t=13 P4P_4 (30) in 4018-4047 →\to buchi 48 e 48; t=20t=20 termina P2P_2; t=23t=23 termina P4P_4; t=30t=30 termina P3P_3. Ex. 54 (best fit, celle da 2 byte): P1P_1 1024 celle, P2P_2 525, P3P_3 250, P4P_4 150; P2P_2 1024-1548, P3P_3 1549-1798, P4P_4 1799-1948; t=10t=10 e t=13t=13: massimo processo =1024=1024 celle =2=2 KB.

Errori tipici: non fondere i buchi; scambiare l'ordine terminazioni/arrivi; frammentazione interna con partizioni variabili; arrotondare male celle e byte; fine intervallo sbagliata di uno.

Teoria: Memoria centrale - allocazione contigua, paginazione e segmentazioneUn programma deve stare in memoria centrale per girare; la MMU traduce a ogni accesso l'indirizzo logico (virtuale) in indirizzo fisico, sommando un registro di rilocazione e controllando il limite; con l'allocazione contigua (partizioni fisse o variabili, first/best/worst fit) si hanno frammentazione interna ed esterna e serve la compattazione; la paginazione divide memoria logica in pagine e memoria fisica in frame della stessa dimensione (potenza di 2), elimina la frammentazione esterna, traduce (p, d) con la tabella delle pagine (PTBR, PTLR) e riduce il costo dei due accessi con il TLB (EAT = h * t + (1 - h) * 2t); le tabelle grandi si dividono in gerarchiche, hash o invertite; lo swapping sposta intere pagine o processi su disco; la segmentazione usa blocchi di lunghezza variabile con coppia (base, limite), eventualmente paginati; Intel IA-32 usa segmentazione con paginazione a due livelli (10+10+12 bit) e IA-64 quattro livelli su 48 bit.Memoria centrale - allocazione contigua, paginazione e segmentazione →.

Teoria collegata