# QNX

QNX (si pronuncia Q-N-X o Q-nix) è un sistema operativo real-time Unix-like POSIX-compliant commerciale, basato su microkernel e mirato principalmente al mercato dei sistemi embedded. Il 12 settembre 2007 i sorgenti dell'intero sistema operativo e della maggior parte dei componenti aggiuntivi sono stati resi disponibili per scopi non commerciali.

## Descrizione

QNX è progettato come sistema microkernel, la cui idea base è quella di costruire il sistema operativo come un insieme di piccole parti che offrono uno specifico servizio: queste parti sono denominate "server" e prendono anche il posto dei "device driver" dei sistemi operativi tradizionali.
Proprio in questo approccio sta la differenza tra un sistema microkernel ed il kernel dei sistemi operativi tradizionali: in questi, il sistema operativo è composto sin dall'inizio di molti moduli raggruppati in un unico grosso software (kernel monolitico) che normalmente non possono essere individualmente separati dal resto.
Nel caso di QNX, il sistema microkernel permette all'utente di assemblare un proprio sistema utilizzando solo le parti realmente necessarie, tralasciando completamente quelle non desiderate, e questo senza modificare o ricompilare il sistema operativo stesso.
Allo stesso tempo, è invece possibile estendere il sistema con parti scritte dall'utente o da altri, senza pericolo di causare malfunzionamenti nel resto del sistema operativo. Un sistema operativo real-time completo e provvisto di molte funzionalità, compreso stack di rete TCP/IP, file system, un interprete di comandi e altro può comodamente stare su un floppy disk.
Dalla versione denominata Neutrino QNX è stato portato, oltre che sulle CPU x86, su un vasto numero di differenti processori, purché dotati di Memory management unit (MMU), tra cui: PowerPC, ARM, StrongARM, MIPS e SH-4.
Originariamente, QNX forniva una licenza d'uso utilizzabile per sviluppi non commerciali (QNX NC), che però è stata sospesa nel 2003 ed ora fornisce solamente la possibilità di scaricare il sistema completo con una licenza temporanea di 30 giorni. Poiché il sistema di sviluppo, rispetto a uno equivalente per un sistema comparabile tipo Windows CE o linux RTAI, è piuttosto costoso, questo tipo di limitazione di fatto impedisce lo studio e la diffusione di questo ottimo sistema, che potrebbe finire per chiudersi in una nicchia.
Il sistema di sviluppo si avvale della piattaforma Eclipse, in cui QNX ha integrato i propri strumenti di sviluppo ed il sistema operativo. Essendo Eclipse sviluppato in Java, il sistema di sviluppo può girare virtualmente su qualsiasi sistema dotato di Java e di una interfaccia grafica compatibile, tra cui Windows, sistemi Unix e Linux e QNX stesso.

## Storia

Gordon Bell e Dan Dodge furono le persone che crearono QNX. Nel 1980 erano studenti all'Università di Waterloo, e seguivano il corso di progettazione di Sistemi Operativi, dove era prevista la scrittura di semplici kernel real-time. Entrambi convinti della possibilità di sfruttare commercialmente questi sistemi, fondarono nel 1982 la Quantum Software Systems a Kanata, Ontario (un'area high-tech fuori Ottawa). Nello stesso anno fu pubblicata la prima versione di QNX, che girava su architettura Intel 8088.
QNX fu inizialmente scelto come sistema operativo per il computer Unisys ICON, progettato dal comprensorio educativo dell'Ontario. QNX fu utilizzato soprattutto per progetti "grossi", in quanto i suoi 44 KB di kernel erano troppi per i piccoli chip dei microcomputer dell'epoca. In quest'ambito QNX si guadagnò una reputazione di sistema robusto ed affidabile, e pertanto venne utilizzato per applicazioni industriali. Alla fine degli anni Ottanta la società decise di riscrivere il kernel e utilizzare lo standard POSIX: il risultato fu QNX 4. Grazie all'interfaccia POSIX, il passaggio di software Unix e BSD su QNX divenne molto semplice.
In questo periodo Patrick Hayden e Robin Burgener svilupparono un nuovo sistema di finestre grafiche: http://patft.uspto.gov/netacgi/nph-Parser?u=/netahtml/srchnum.htm&Sect1=PTO1&Sect2=HITOFF&p=1&r=1&l=50&f=G&d=PALL&s1=5745759.WKU.&OS=PN/5745759&RS=PN/5745759 Questo concetto fu implementato in una GUI brevettata, chiamata Photon microGUI. In QNX è però anche disponibile una versione grafica di X Window System.
Verso la fine degli anni Novanta la società riscrisse completamente QNX, che fu progettato ex novo come sistema operativo per il supporto nativo di sistemi a multiprocessori (SMP). Fu aggiunto il supporto completo delle API delle specifiche POSIX, comprese parti POSIX non ancora implementate da nessun altro sistema. Il risultato fu QNX Neutrino, pubblicato nel 2001. Contemporaneamente alla pubblicazione del kernel Neutrino, la QNX system divenne membro del consorzio Eclipse, e pubblicò una suite del workbench Eclipse con plug-in dedicati allo sviluppo di QNX Neutrino, denominata Momentics.
Nel 2004 la società fu venduta al gruppo Harman International Harman International Industries. Il 12 settembre 2007 viene pubblicato il codice sorgente di QNX sotto una licenza open source ibrida.
QNX è stato molto utilizzato in ambiente automobilistico per sistemi telematici. Fino alla cessione al gruppo Harman, QNX è stato utilizzato in più di 180 differenti modelli di automobile.
Il 9 aprile 2010 Research In Motion, azienda produttrice degli smartphone BlackBerry, ha annunciato l'acquisizione di QNX Software Systems. Quasi esattamente un anno dopo, il 19 aprile 2011, viene lanciato sul mercato il BlackBerry PlayBook, tablet RIM basato sul sistema operativo QNX (ribattezzato per l'occasione "BlackBerry Tablet OS")
Il sistema Cisco IOS-XR (ultra high availability IOS), è basato su QNX, come anche il sistema IOS Software Modularity.
Nel marzo 2014, Apple annuncia la pubblicazione del sistema CarPlay per l'informatica mobile su auto, basato sul sistema operativo QNX Neutrino OS.

## Architettura

QNX è un sistema microkernel, il kernel stesso contiene solo queste parti:
* CPU scheduling, lo scheduler dei processi in esecuzione
* comunicazione tra processi (IPC), che si occupa del passaggio di comunicazioni tra processi
* interrupt, il sistema di smistamento delle interruzioni
* timers, il gestore del real time clock e dei timer.
Ogni altro software viene eseguito come quello che in altri sistemi si chiamerebbe ”processo utente“. In questa modalità gira anche il processo di sistema denominato ”proc“, abbinato al microkernel, e che ha il compito di gestire la memoria e la creazione dei processi.
Il principio di base che rende possibile utilizzare i servizi del kernel e collegare tra loro i vari processi sono i meccanismi di IPC di QNX ed il boot loader che può caricare una immagine del sistema contenente non solo il kernel, ma ogni altra risorsa desiderata come programmi utente, librerie condivise o shared libraries ed altro.

### Interprocess communication

Il meccanismo base di comunicazione tra i processi di QNX, su cui sono stati sviluppati tutti gli altri, è costituito dal passaggio di un messaggio da un processo ad un altro e dall'attesa della risposta. Questa funzione viene atomicamente eseguita dalla procedura MsgSend. Il messaggio è copiato, tramite il kernel, dallo spazio di memoria del processo mittente allo spazio di memoria del processo destinatario. La parte interessante è che se il processo destinatario è già in attesa del messaggio, contemporaneamente alla ricezione esso verrà attivato, senza passare dallo scheduler. In questo modo, sia il mittente che il destinatario non dovranno attendere cicli di scheduler per completare la loro operazione. Questo meccanismo integra alcune funzioni di scheduling del kernel nelle funzioni di IPC e rende QNX uno dei sistemi a micro kernel con il sistema IPC tra i più veloci. In molti sistemi tipo UNIX, Linux o Windows i meccanismi di IPC sono molto più pesanti e non efficienti, dovendo invece passare sempre attraverso il kernel e lo scheduler. Anche in molti micro-kernel la mancanza di efficienti meccanismi di IPC diminuisce di molto le loro prestazioni.
Nonostante questi meccanismi, un confronto diretto tra sistemi microkernel e sistemi a kernel monolitico indica che i sistemi microkernel non hanno in generale le stesse prestazioni dei sistemi a kernel monolitico. Questo perché i servizi di un sistema micro kernel sono necessariamente implementati in spazi di memoria diversi e quindi richiedono servizi IPC di comunicazione, mentre i servizi in un kernel monolitico condividono lo stesso spazio di memoria e non richiedono di norma servizi IPC. Ovviamente la maggior efficienza di un kernel monolitico è pagata in termini di affidabilità in quanto un crash in un servizio nello spazio di kernel causerà probabilmente un crash dell'intero sistema. Un crash in un servizio di un micro kernel invece causerà di norma solo la perdita di quel servizio e non dell'intero sistema. QNX implementa alcuni accorgimenti per aumentare le prestazioni, limitando per esempio l'uso di interrupt ed utilizzando tecniche di polling per diminuire il numero di cambi di contesto (task switching). Inoltre è possibile utilizzare tecniche di caricamento di un driver usando DLL o plug-in in uno spazio di un singolo processo. Queste tecniche però riducono la sicurezza del sistema in quanto diminuiscono la protezione offerta dalla separazione degli spazi di memoria, che è la chiave dei sistemi microkernel. Se si desidera mantenere una struttura completamente microkernel, anche QNX sarà soggetto a diminuzioni di prestazioni, specialmente se utilizzato in sistemi con carichi di interrupt molto pesanti.
Grazie alla struttura microkernel QNX è anche un sistema operativo distribuito. La tecnologia utilizzata da QNX è denominata Transparent Distributed Processing ed è stata sviluppata da Dan Dodge e Peter van der Veen, che ne detengono il brevetto: http://patft.uspto.gov/netacgi/nph-Parser?Sect1=PTO2&Sect2=HITOFF&p=1&u=%2Fnetahtml%2FPTO%2Fsearch-bool.html&r=2&f=G&l=50&co1=AND&d=PTXT&s1=%22QNX+Software+Systems%22.ASNM.&OS=AN/%22QNX+Software+Systems%22&RS=AN/%22QNX+Software+Systems%22 Questa tecnologia rende estremamente facile creare reti di sistemi QNX che possono costituire un supercomputer e gestire in parallelo più applicazioni su macchine diverse.

## Foundry27

Foundry27 è la nuova comunità promossa dalla QNX system per servire allo sviluppo del sistema Neutrino. Gli sviluppatori possono registrarsi, secondo la licenza proposta, ed ottenere il codice sorgente e relativi toolkit del sistema operativo.

## Sistemi similari

Altri importanti sistemi embedded paragonabili sono LynxOS, VxWorks, Linux, THEOS, Threadx, Windows CE, RTEMS, OS-9, sistemi ITRON.