QNX - Architettura e funzionamento ---------------------------------- Oggi una buona parte degli utenti di personal computer ignora del tutto il significato stesso del termine "sistema operativo". Usano il loro computer e basta, senza chiedersi altro. Alcuni utenti appena piu' smaliziati sanno che il loro sistema operativo si chiama Windows e che prima c'era l'MS-DOS. Di solito ignorano del tutto l'esistenza di altri sistemi operativi. In realta' i sistemi operativi che sono stati scritti fino ad oggi sono cosi' numerosi che per elencarli tutti non basterebbe questa pagina. Molti di questi sono del tutto sconosciuti, frutto del lavoro di qualche oscuro ricercatore in una oscura universita'. Lo studio dei sistemi operativi e' una scienza antica quasi quanto l'informatica stessa. Da allora sono state scoperte tantissime solunzioni tecniche che affrontano i vari problemi che si incontrano nella stesura di un OS e molte di queste vengono comunemente applicate ai sistemi operativi attuali. Tenendo conto di tutta la ricerca che e' stata fatta in questo campo, e' difficile non provare la sensazione che ormai non sia rimasto piu' niente da inventare e che, tutto sommato, gli OS che nasono oggi non siano altro che un impasto fatto sempre con gli stessi ingredienti. Ovviamente mi riferisco all'architettura interna del sistema, non all'aspetto "esteriore". Chi si discosta troppo dalle tecniche ben studiate e ben collaudate finisce spesso per produrre un sistema non ottimale. Ovviamente esiste ancora dello spazio per le innovazioni, ma sono pochi gli sviluppatori abbastanza abili da introdurre migliorie sostanziali. AmigaOS e' piuttosto peculiare nel suo design. Si discosta notevolmente dagli OS tipici per il suo sistema di comunicazione tra processi (IPC), il suo sistema di librerie condivise, i device, il sottosistema BOOPSI e cosi' via. I vantaggi e gli svantaggi di queste scelte sono tuttora argomento di discussione tra i programmatori Amiga. AmigaOS si puo' considerare un sistema operativo real-time, anche se probabilmente il termine e' stato coniato a qualche anno di distanza dall'introduzione di Amiga. Exec, il microkernel di Amiga, fu progettato per consentire un efficiente scambio di messaggi tra i processi, che e' poi stato usato con saggezza un po' ovunque nel resto sistema operativo. Questo e' il segreto alla base della ben nota efficienza di AmigaOS. Purtroppo un'architettura di questo tipo rende quasi impossibile l'introduzione della memoria protetta ed ostacola non poco la creazione di un sistema di memoria virtuale. Sono caratteristiche molto comuni in tutti i sistemi operativi moderni ed e' per questo che gli utenti Amiga ne sentono cosi' tanto il bisogno. La questione si potrebbe anche vedere da un punto di vista opposto: a causa della memoria protetta e paginata, gli altri sistemi non possono raggiungere facilmente le prestazioni real-time di AmigaOS. Il microkernel di QNX presenta alcune analogie con Exec, ma l'implementazione appare radicalmente diversa. Entrambi i sistemi sono costruiti da diversi moduli indipendenti tra loro. In QNX, la comunicazione tra questi moduli avviene esclusivamente attraverso lo scambio di messaggi (IPC), mentre in AmigaOS alcuni moduli sono librerie condivise che espongono delle strutture pubbliche. Una di queste e' la struttura Message, gestita da alcune funzioni contenute in exec.library (SendMessage(), GetMessage(), ReplyMessage()). Message rappresenta un messaggio generico, da cui derivano i diversi tipi di messaggi utilizzati nel sistrema: gli "IntuiMessage" che Intuition invia alle finestre, i "DosPacket" che servono a controllare gli handler, le IORequest che costituiscono l'interfaccia dei device. Un task puo' ricevere messaggi creando una struttura MessagePort. Quando un altro task invia un messaggio, questo viene accodato ad una lista gestita dalla MessagePort e successivamente viene prelevato dal task ricevente, che puo' elaborarlo e rispondere. La trasmissione del messaggio non comporta alcuna copia di dati da un task all'altro perche' AmigaOS utilizza un modello a memoria condivisa. In realta' SendMessage() si limita a manipolare alcuni puntatori nella lista della MessagePort per accodare il messaggio. Questo meccanismo e' senza dubbio molto efficiente, ma, come abbiamo gia' detto, impedisce l'introduzione della memoria protetta in AmigaOS. QNX utilizza un modello di memoria protetta classico, cioe' simile a quello di UNIX. Ogni processo utente possiede uno spazio di indirizzamento privato, inaccessibile a tutti gli altri processi. In molte incarnazioni di UNIX, tra cui amche NetBSD e Linux, una grossa parte del sistema costituisce il kernel e ha accesso privilegiato a tutta la memoria del sistema. Fanno parte del kernel anche tutti i driver delle periferiche, i servizi di rete ed i filesystem. Un tipico kernel UNIX contiene infatti da 1 a 4MB di codice. I moduli in esso contenuti comunicano tra loro semplicemente chiamando delle funzioni. Ne risulta che un bug in uno qualsiasi di questi moduli puo' bloccare l'intero sistema. La nota stabilita' di UNIX ha pero' dimostrato che questo non rappresenta un problema per gli utenti. Tuttavia gli sviluppatori di driver e di componenti del kernel sono costretti a riavviare il sistema numerose volte durante il test del proprio lavoro. L'architettura di QNX risolve questo problema perche' prevede un microkernel di dimensioni ridottissime che implementa soltanto il multitasking e le primitive IPC. Tutto il resto del sistema, compresi i driver dell'hardware, viene eseguito in modo utente, cioe' con uno spazio di indirizzamento protetto. Ovviamente un'interfaccia basata sullo scambio di messaggi in un sistema con memoria protetta e' meno efficiente rispetto ai metodi tradizionali per l'accesso ai servizi del sistema operativo (chiamate a funzione o interrupt), ma rispetto a questi ha il vantaggio di garantire una robustezza ed una modularita' superiore. Inoltre il sistema IPC di QNX consente la comunicazione trasparente tra processi che risiedono su computer diversi. Recentemente il modello funzionale utilizzato da QNX e' divenuto piuttosto popolare tra gli sviluppatori: ormai sono numerosi i sistemi operativi che si basano sullo stesso principio, ma QNX ha il merito di essere un OS gia' molto maturo e ben supportato. Photon, il windowing system proprietario di QNX, possiede molte caratteristiche interessanti. Volendo fare un parallelo con X11, Photon appare decisamente piu' flessibile e, soprattutto, meno pesante. Il cuore di Photon e' costituito da un innovativo sistema di gestione dell'input (mouse, tastiera, etc.) e dell'output (dispositivi grafici) che permette di ottenere un'elevata scalabilita' e configurabilita' in cambio di un overhead contenuto. In pratica Photon e' un "microkernel" che ha il compito di gestisce un certo numero di oggetti di forma rettangolare tenendo conto della loro sovrapposizione. Ogni rettangolo deve essere in grado di ricevere degli eventi di input, elaborarli e, eventualmente, produrre un output. L'output puo' quindi diventare l'input dei rettangoli che si trovano al di sotto. I rettangoli non devono necessariamente corrispondere con le finestre visibili sullo schermo. In questo scenario il driver della scheda grafica sarebbe associato ad un rettangolo grande quanto tutto lo schermo che riceve in input tutti i comandi di disegno prodotti dai rettangoli che stanno al di sopra. I problemi di clipping grafico che ogni sistema a finestre deve affrontare, in Photon si risolvono praticamente da soli grazie all'architettura utilizzata. Per capire cosa e' possibile fare con questo approccio e' necessario fare qualche esempio. Un programma potrebbe creare un rettangolo sovrapposto ad una finestra che ha l'effetto di filtrare tutto l'input prodotto dal mouse alterandone lo spostamento in modo da accelerare il movimento del puntatore limitatamente alla finestra in questione. Un desktop potrebbe estendesi su due schermi affiancati, ognuno gestito da una scheda grafica, semplicemente accostando due rettangoli. Potra' sembrare lapalissiano, ma e' spesso vero: le cose semplici tendono sempre a funzionare meglio di quelle complicate. QNX trae la propria forza dalla semplicita' e dall'omogeneita' della propria architettura, proprio come AmigaOS. Dal momento che il sistema operativo e' la base sulla quale si possono costruire delle applicazioni, una base solida e ben progettata e' un requisito indispensabile per sorreggere applicazioni di qualita'. Rimane aperto un unico grande interrogativo. In che modo Amiga Inc. intende integrare i due sistemi operativi. Sradicare Exec da AmigaOS per appoggiare il tutto sopra QNX e' un'operazione tutt'altro che banale, che richiede progettisti molto abili ed esperti. Altrimenti il risultato rischia di diventare un ibrido deforme. Windows NT ne e' un triste esempio: un buon kernel UNIX fu incastrato malamente con l'API Win32, creata per l'occasione dando una rispolverata all'API di Windows 3.1. Il risultato e' un sistema leggermente instabile, dotato di scarsa sicurezza e mostruosamente assetato di risorse che, nonostante gli sforzi della piu' grande software house del mondo, stenta tuttora ad affermarsi.