Pre-rilascio
# Pre-rilascio

Il pre-rilascio o prelazione (in inglese preemption) è, in informatica, l'operazione in cui un processo viene temporaneamente interrotto e portato al di fuori della CPU, senza alcuna cooperazione da parte del processo stesso, al fine di permettere l'esecuzione di un altro processo. Il processo interrotto viene in genere ripristinato una volta che quello a priorità maggiore ha terminato il suo lavoro (a meno che non ci siano ancora altri processi a priorità più alta, nel qual caso il meccanismo si ripete). Tale scambio è noto come context switch o cambiamento di contesto. Il pre-rilascio può avvenire tramite uno scheduler, che ha il compito di interrompere e/o ripristinare i processi presenti nel sistema operativo a seconda del loro stato; in tal caso si parla di preemptive scheduling (o scheduling con pre-rilascio).

## User mode e kernel mode

Nella maggior parte delle architetture di un sistema operativo, alcune operazioni possono non essere svolte attraverso il pre-rilascio: ciò vale solitamente per le funzioni del kernel e per l'Interrupt Service Routine, che, se non portate a termine, potrebbero generare una situazione di race condition, che comporta un deadlock; questo semplifica l'architettura del kernel, a spese della responsività del sistema. La distinzione tra user mode e kernel mode, che determina i livelli di priorità tra processi, può essere usata anche per capire se un processo è pre-rilasciabile o meno.

Alcuni sistemi operativi moderni possiedono un preemptive kernel, progettato per consentire ai processi di effettuare il pre-rilascio anche in kernel mode. Esempi di tali sistemi sono il kernel 2.6 di Linux e alcuni sistemi BSD.

Altri sistemi aumentano la sensibilità con un'architettura a microkernel, che in alcuni casi può ridurre sostanzialmente la necessità di pre-rilascio dei processi.

## Preemptive multitasking

Il termine preemptive multitasking (multitasking con prelazione) viene usato per distinguere un sistema operativo multitasking, che può eseguire la preemption dei processi (ovvero può interrompere un processo contro la volontà di questo in favore di un altro processo più prioritario), da un sistema operativo cooperative multitasking (multitasking cooperativo o senza prelazione) in cui i processi o i task non possono essere interrotti arbitrariamente dal sistema operativo, ma devono essere essi stessi a rendere disponibili le risorse quando non ne hanno necessità.

Praticamente, il pre-emptive multitasking comprende l'uso di meccanismi di interrupt che sospendono i processi correntemente in uso e invoca uno scheduler per determinare quale processo deve essere eseguito subito dopo. Pertanto a tutti i processi verrà data una parte del tempo di CPU.

Nel multitasking con pre-rilascio, il kernel del sistema operativo può dar luogo a una commutazione di contesto (context switch) per soddisfare i vincoli legati alla politica dello scheduler, pre-rilasciando quindi il processo attivo. In generale, pre-rilascio significa terminare l'esecuzione di un processo prima della sua naturale fine. Quando un processo ad alta priorità ne sostituisce uno attivo si parla di schedulazione con prelazione o pre-rilascio.

Il termine "multitasking con prelazione" viene a volte usato erroneamente quando si intende invece una classe di politiche di scheduling più specifica nota come time-shared scheduling (scheduling a condivisione di tempo) o time-sharing.

Il multitasking con pre-rilascio permette al sistema operativo di garantire ai processi in modo più affidabile una "fetta" del tempo di esecuzione. Inoltre permette al sistema di rispondere rapidamente ad eventi esterni come dati in arrivo che potrebbero necessitare dell'attenzione immediata di un qualche processo.

I processi possono essere raggruppati in due categorie: quelli che sono in attesa di input o output (chiamati "I/O bound"), e quelli che stanno usano appieno la CPU ("CPU-bound"). Nei primi sistemi, i processi effettuavano spesso il "polling" delle risorse, o "busywait" aspettando l'input richiesto (ad esempio dal disco, dalla tastiera o dalla rete). Durante questo tempo il processo non eseguiva lavoro utile, ma manteneva il controllo completo della CPU. Con l'avvento degli interrupt e del multitasking con pre-rilascio, questi processi legati all'I/O possono essere "bloccati" o messi in attesa, aspettando l'arrivo dei dati necessari, permettendo agli altri processi di usare la CPU. Infatti l'arrivo dei dati richiesti genera un interrupt che può risvegliare un processo precedentemente bloccato.

Anche se le tecniche di multitasking furono originariamente sviluppate per permettere a più utenti di condividere una singola macchina, presto diventò chiaro che esso era utile a prescindere dal numero di utenti. Molti sistemi operativi, a partire da quelli nei mainframe a quelli nei personal computer e a quelli nei dispositivi non controllati da utenti (come quelli nei velivoli robotici spaziali), hanno riconosciuto l'utilità del multitasking per molte ragioni.

Il multitasking rende possibile l'uso di più applicazioni contemporaneamente per un singolo utente, o l'esecuzione in "background" di processi mantenendo il controllo del computer.

### Quantizzazione del tempo

L'intervallo di tempo in cui ad un processo viene permessa l'esecuzione in un sistema a multitasking con pre-rilascio è chiamato "quanto di tempo". Lo scheduler viene eseguito all'inizio di ogni quanto di tempo per decidere il processo da eseguire. Se l'intervallo è troppo breve lo scheduler consumerà troppo tempo di calcolo.

Per permettere al kernel del sistema operativo di cambiare un processo che ha esaurito la sua fetta di tempo, viene programmato un interrupt che permette di dividere il tempo di calcolo tra diversi processi, dando l'illusione che questi ultimi vengano eseguiti contemporaneamente, o in modo concorrente. Un sistema operativo che implementi questo design viene chiamato sistema multi-tasking.

### Sistemi che supportano il multitasking con pre-rilascio

Alcuni esempi di sistemi operativi con pre-rilascio sono: AmigaOS, la famiglia Windows NT (inclusi XP e Vista), Linux, *BSD, macOS e Windows 95/98/ME (solo applicazioni a 32-bit). Unix, tutti i sistemi basati su di esso, VMS, e altri sistemi usati in ambito accademico e nelle aziende medio-grandi, hanno sempre supportato il multitasking con pre-rilascio, ma per molto tempo sono stati oltre le possibilità della maggior parte degli utenti a causa sia del costo della licenza che del costo elevato dell'hardware richiesto.

Alcuni esempi di vecchi sistemi operativi senza pre-rilascio (a cooperazione) sono Windows 1.x, 2.x, 3.x, Windows for Workgroups, Windows 95/98 (quando si eseguono applicazioni a 16-bit), NetWare, e le versioni Classic di Mac OS (system 5.0 e superiori). Alcuni sistemi operativi senza multitasking sono le vecchie versioni di Mac OS, MS DOS, e Commodore 64 OS che poteva eseguire un solo programma alla volta.

Il primo sistema basato sul multitasking con pre-rilascio TRIPOS disponibile ad un ampio pubblico fu Amiga OS (1985). Necessitava di un sistema Amiga basato su Motorola 68000 e non disponeva di gestione della memoria. Il sistema caricava dinamicamente blocchi di codice relocabile ("hunks" in gergo Amiga) per pre-rilasciare tutti i processi nello stesso spazio di indirizzi.

I primi sistemi operativi disponibili per PC come MS-DOS e DR-DOS non supportavano il multitasking in nessun modo. I sistemi Novell NetWare, Microsoft Windows e OS/2 introdussero il multitasking cooperativo nei PC, ma non supportavano il multitasking con pre-rilascio. Nel caso dei PC la partenza lenta fu dovuta in parte al bisogno di supportare una grande quantità di codice legacy DOS scritto per essere eseguito in modalità singolo utente su un PC basato su 8086, mentre il sistema Amiga fu progettato con il supporto al multitasking dall'inizio.

La prima versione di Windows a supportare in modo limitato il multitasking con pre-rilascio fu Windows 2.1x, che usava la modalità Virtual 8086 del processore Intel 80386 per eseguire le applicazioni DOS in macchine 8086 virtuali - comunemente note come "DOS boxes" ("scatole DOS") - che erano pre-rilasciabili. In Windows 95 e nei suoi successori, Windows 98 e Windows Me, le applicazioni a 32 bit erano state rese pre-rilasciabili eseguendo ognuna di esse in uno spazio di indirizzamento separato, ma le applicazioni a 16 bit rimanevano cooperative. Windows NT, che eseguiva i processi in uno spazio di indirizzamento a 32 bit paginato, ha sempre supportato il multitasking con pre-rilascio, che è stato poi ereditato dalla linea NT di sistemi Windows, inclusi Windows 2000, Windows XP e Windows Vista.

Anche se vi erano piani per l'aggiornamento del modello di multitasking cooperativo di Mac OS ad uno con pre-rilascio, questi furono abbandonati in favore di macOS, un sistema re-ingegnerizzato a partire dal kernel Darwin derivato da BSD, che supportava il multitasking con pre-rilascio.

OS/2 Warp, la riscrittura IBM del prodotto di una precedente collaborazione IBM/Microsoft, OS/2, pensato per i sistemi 386, supportavano il multitasking con pre-rilascio per applicazioni native, e permettevano di eseguirlo anche su diverse sessioni di Windows.

