Operating System/2
Di seguito ho voluto introdurre una breve descrizione di OS/2, uno storico sistema operativo che fù sviluppato dalla IBM per l’uso sui propri personal computer.
L’inizio della storia di OS/2 risale al 1984, con l’arrivo sul mercato del primo PC AT IBM con processore 80286 che per la prima volta in un personal computer supportava la modalità protetta per il sistema operativo, una tecnica per avere un sistema stabile e al sicuro da crash o malfunzionamenti delle applicazioni.
Il progetto venne iniziato congiuntamente da IBM e da Microsoft ed in seguito sviluppato esclusivamente da IBM. Dotato di ottima stabilità, tecnicamente superiore alla concorrenza Microsoft ma meno diffuso per via della esosità di risorse di memoria delle prime versioni e storicamente carente di applicazioni, non riuscì mai a rimontare lo svantaggio presso gli utenti finali, nemmeno quando IBM con una mossa promozionale provò a distribuire gratis le versioni 3.0 e 4.0, molto migliorate. OS/2 si ricavò comunque una nicchia nel settore bancario, dove conserva ancora una certa base installata. Attualmente lo sviluppo di IBM OS/2 è congelato e il supporto tecnico a questo sistema operativo da parte della casa madre è cessato il 31 dicembre 2006 (salvo l’acquisto di un servizio di supporto personalizzato). La versione più aggiornata disponibile di OS/2 è del 2002, la versione 4.52 nota anche come OS/2 Convenience Pack 2 in cui vengono cumulati tutti i fixpack precedenti e che contiene in pratica una nuova versione di OS/2 Warp 4 e di OS/2 Warp Server for eBusiness (che supporta SMP fino a 64 processori con prestazioni ottimali a 8 processori).
Tuttavia IBM ha continuato ad aggiornare OS/2 negli anni, aggiungendo il supporto a tecnologie più recenti: Java 1.4, USB 2.0, Journaled File System (JFS) e le schede video NVidia, ATI e Matrox.
Oggi ai suoi clienti OS/2, IBM suggerisce di considerare GNU/Linux come sistema operativo alternativo.
Sysmmetric Multiprocessing
OS/2 usa il supporto SMP sysmmetric multiprocessing nel quale su ogni processore gira una copia identica del sistema operativo in maniera concorrenziale. Le copie comunicano tra loro secondo i bisogni. Il beneficio di questo modello è che molti processi girano simultaneamente (N processi per N CPU) aumentando notevolmente le prestazioni. Purtroppo può accadere che mentre una CPU è libera un’altra sia sovraccarica di lavoro causando inefficienza nel sistema. Ciò può essere evitato facendo condividere alcune strutture dati tra i processori. In questa maniera si permetterebbe ai processi e alle risorse (come la memoria) di essere condivisi dinamicamente tra i vari processori abbassando il dislivello del carico di lavoro tra di essi.
Scheduling
In OS/2 lo scheduling per processi con eguale priorità viene effettuato assegnando ad ogni processo un tempo di esecuzione pari a 31.25 millisecondi, dopo il quale, il processo in esecuzione viene prelazionato.
In un sistema ideale il tempo di prelazione è inferiore ai 25 microsecondi, tuttavia se il thread in esecuzione sta eseguendo una system call, tale tempo di prelazione può essere superiore.
Per evitare tempi di prelazione molto lunghi OS/2 prevede un ampio range di priorità e 14 stati con relative code (tutte doppiamene linkate tranne quella dello stato di esecuzione) che favoriscono una gestione efficiente dei threads dai vari stati di attesa fino all’esecuzione.
Utilizzando un’architettura SMP abbiamo per ogni processore una lista di stato di esecuzione, mentre le altre rimangono globali al sistema.
Personalmente ritengo che la politica di scheduling in OS/2 assomigli a quella dei sistemi soft real-time, infatti sono presenti system-call prelazionabili in punti strategici, differenziazione tra porzioni di codice (kernel-mode, interrupt-mode, user-mode) e implementazione dell’inversione di priorità.
Sincronizzazione
La gran parte del kernel di OS/2 è trattata come un’ampia sezione critica che può essere eseguita da un solo thread per volta all’interno del sistema. Questo per evitare che un thread del kernel che gira su una CPU sovrascriva una struttura dati condivisa con un altro thread del kernel che lavora su un’altra CPU.
Per l’accesso a delle sezioni critiche di codice viene utilizzato un semaforo chiamato spinlock. Il suo nome deriva dal lavoro ciclico di controllo (spin loop) che il processore esegue per controllare fino a quando la risorsa viene rilasciata.
Anche se apparentemente questo meccanismo di sincronizzazione può sembrare inconveniente, esso viene compensato dalla politica di scheduling e dalla logica di prelazione deterministica (deterministic pre-emption logic) che OS/2 adotta.