vuoi
o PayPal
tutte le volte che vuoi
Il UNIX tradizionale è un sistema operativo sviluppato alla fine degli anni '60 presso i Bell Labs
da Ken Thompson, Dennis Ritchie e altri ricercatori. Nasce come un sistema semplice, potente e
flessibile, concepito per essere multiutente e multitasking, e ha influenzato profondamente lo
sviluppo dei moderni sistemi operativi. La sua Versione 7 (V7), rilasciata nel 1979, è considerata il
modello classico da cui derivano molte varianti successive, tra cui BSD e System V.
Al livello più basso c’è l’hardware,
Il design di UNIX si basa su una struttura modulare a livelli.
che fornisce le risorse fisiche del sistema. Sopra di esso si trova il kernel, il cuore del sistema
operativo, responsabile della gestione della CPU, della memoria, dei dispositivi di I/O e del file
un’interfaccia testuale che permette all’utente di
system. Al livello più alto, troviamo la shell,
interagire con il sistema attraverso comandi, e un vasto insieme di utility per la gestione dei file, dei
processi e della comunicazione tra utenti.
Uno degli aspetti più innovativi di UNIX è il suo file system gerarchico, organizzato in una
/
struttura ad albero con una radice ( ) da cui si diramano tutte le directory e i file. In UNIX, tutto è
un file, compresi i dispositivi hardware e i processi, il che permette un'interazione uniforme e
flessibile tra i componenti del sistema. Inoltre, il file system implementa permessi di accesso per
garantire la sicurezza, distinguendo tra utente proprietario, gruppo e altri utenti.
UNIX è un sistema multitasking, il che significa che può eseguire più processi
contemporaneamente, e multiutente, permettendo a più persone di lavorare sullo stesso sistema
senza interferenze. Ogni programma in esecuzione è un processo, identificato da un numero
univoco chiamato Process ID (PID). I processi possono essere creati da altri processi tramite la
fork()
chiamata di sistema , formando una gerarchia in cui un processo padre genera uno o più
processi figli.
L’interazione con UNIX avviene principalmente attraverso la shell, un interprete di comandi che
consente di eseguire programmi, gestire file e processi, e automatizzare operazioni tramite script.
sh
La shell più utilizzata nelle prime versioni di UNIX è la Bourne Shell ( ), che offre un potente
csh
linguaggio di scripting. Successivamente sono state sviluppate altre shell, come la C Shell ( ) e la
ksh
Korn Shell ( ), che introducono funzionalità avanzate.
Uno degli elementi distintivi di UNIX è la filosofia di progettazione, basata su alcuni principi
chiave:
1. Fai una cosa e falla bene: ogni programma UNIX è progettato per svolgere un compito
specifico in modo efficiente.
2. Utilizza file di testo per memorizzare i dati: questo facilita la manipolazione e la
portabilità delle informazioni. |
3. Sfrutta la composizione tramite pipe ( ): i comandi possono essere concatenati per creare
operazioni più complesse, permettendo una grande flessibilità.
Nel tempo, UNIX è stato adottato in ambiti accademici, industriali e militari, diventando un punto
di riferimento per lo sviluppo di altri sistemi operativi, tra cui Linux e macOS. Ancora oggi, molti
concetti e strumenti introdotti dal UNIX tradizionale rimangono fondamentali nei sistemi moderni.
3 multilevelfeedbackqueue
Il Multilevel Feedback Queue (MLFQ) è un algoritmo di scheduling avanzato utilizzato nei
sistemi operativi per la gestione dei processi. Questo algoritmo combina le caratteristiche di altri
con l’obiettivo di ottimizzare
approcci, come il Round Robin e gli algoritmi a priorità,
l’allocazione della CPU in sistemi multitasking. A differenza di altre tecniche che utilizzano una
coda di priorità fissa, l’MLFQ è dinamico, consentendo ai processi di muoversi tra diverse code in
durante l’esecuzione. In questo modo, l’algoritmo si adatta alle diverse
base al loro comportamento
necessità di processi di vario tipo, offrendo un bilanciamento tra equità e efficienza.
Funzionamento dell'Algoritmo MLFQ
Il funzionamento del Multilevel Feedback Queue si basa su una struttura di code multiple,
ciascuna con un livello di priorità differente. I processi vengono inseriti inizialmente nella coda
con la priorità più alta e sono gestiti in base al tempo di esecuzione, al loro comportamento e alla
loro tipologia. Ogni coda ha un quantum di tempo diverso: le code ad alta priorità assegnano un
quantum breve, mentre quelle a bassa priorità ne assegnano uno più lungo. Questo approccio
consente di gestire in modo ottimale processi con esigenze diverse.
Quando un processo entra nel sistema, inizialmente viene inserito nella coda di priorità più alta.
Se il processo termina prima di esaurire il quantum di tempo, viene rimosso dalla coda e
l'esecuzione finisce. Tuttavia, se il processo non termina entro il quantum assegnato, viene spostato
in una coda di priorità inferiore, dove gli viene concesso un quantum maggiore. Questa
penalizzazione permette di ridurre la quantità di tempo che i processi CPU-bound (che richiedono
molta potenza di calcolo) occupano nella CPU, lasciando più spazio per quelli interattivi.
Una caratteristica importante dell'algoritmo è che i processi non sono destinati a rimanere in una
coda fissa, ma possono muoversi dinamicamente tra le varie code. Se un processo in una coda a
bassa priorità continua a richiedere la CPU senza completare l’esecuzione, il suo tempo di attesa
aumenta, mentre un processo che completa rapidamente la sua esecuzione, come un processo I/O-
bound, può essere spostato in una coda a priorità più alta per garantirgli un accesso più rapido alla
è da cui deriva il nome dell’algoritmo, poiché i processi
CPU. Questo meccanismo di feedback
vengono continuamente monitorati e la loro priorità viene aggiornata in base al loro
comportamento.
L’algoritmo è preemptive, il che significa che i processi possono essere interrotti in qualsiasi
momento per consentire l'esecuzione di un altro processo con priorità maggiore. Se un processo di
alta priorità arriva mentre un processo a bassa priorità è in esecuzione, quest'ultimo viene sospeso e
messo da parte, mentre il processo a priorità più alta viene eseguito immediatamente. Allo stesso
modo, se un processo in una coda di priorità inferiore non completa il suo quantum, esso può essere
preempted da un altro processo con priorità superiore.
Una delle principali ragioni per l’utilizzo di MLFQ è che l'algoritmo permette di gestire
efficacemente i processi interattivi e CPU-bound. I processi che compiono frequentemente
operazioni di I/O, come le interfacce utente, tendono a passare rapidamente alla CPU, quindi
vengono spostati nelle code superiori per ridurre la latenza. I processi che invece richiedono
un’elaborazione intensiva della CPU vengono spostati nelle code inferiori, dove è meno probabile
che interferiscano con i processi interattivi.
Vantaggi dell'Algoritmo MLFQ