| Autore: PUOJACKZ | Data: 2005-12-03 |
| Modificato:
Documento non modificato
|
Letture: 570 |
|
Questo articolo è tratto da WikiPedia ENG, tradotto e rielaborato da PUOJACKZ
In sistemistica, il kernel è il nocciolo del sistema operativo. Quest'ultimo è la parte di software responsabile nel fornire un accesso sicuro, all'hardware del computer, da parte dei vari processi attivi in esso (cioè ad un programma in esecuzione). Siccome vi possono essere più applicativi avviati, nello stesso box, l'accesso, alla componentistica hardware, dev'essere limitato. Tale sistema di "accodamento" e decisione delle precedenze è una delle funzioni del Kernel, il quale, inoltre, decide per quanto tempo una determinata risorsa viene riservata ad un processo. Questa attività è detta "Scheduling". Inoltre, l'accesso diretto all'hardware può essere molto complesso, in quanto, i componenti (anche dello stesso tipo), possono esser stati progettati diversamente. Il Kernel, solitamente, per facilitare le operazioni ai coders di applicativi, implementa un sistema di astrazione dell'hardware (cioè una serie di istruzioni universali usate da tutti i dispositivi di un certo tipo). Questo diluisce la complessità sia a livello di ambiente operativo di sistema, sia garantendo un interfaccia chiara e uniforme per il colloquio con la componentistica, utile qualora un programmatore debba scrivere un applicativo per tale OS, in quanto, ne garantisce il funzionamento. Tale parte del software di sistema è detta "Hardware Abstraction Layer" (HAL) e si basa sui drivers software di un determinato componente hardware, i quali contengono le istruzioni specifiche dichiarate dal produttore del dispositivo stesso. Introduzione Non è necessario che un computer esegua un Kernel. I programmi possono esser caricati ed eseguiti direttamente da boot. Per far ciò, però, occorre che l'autore di questi applicativi provveda nel gestirsi tutto il colloquio con le periferiche e i componenti del computer, senza possibilità di sfruttare il supporto offerto, di norma, dall'OS e dall'astrazione hardware. Tale metodo operativo era comune in passato, ove il box veniva resettato, qualora si necessitasse di eseguire più programmi differenti. In caso, eventuali software particolari (es. i caricatori di applicativi o i debuggers) venivano mantenuti all'interno di un area del computer, oppure, caricati, ogni volta, da una memoria a sola lettura. Nello svilupparsi, tali quest'ultimi han gettato le basi per la creazione dei primi kernels per OS. Oggigiorno, l'approggio "diretto" all'hardware viene applicato nelle console videoludiche o nei sistemi "embedeed", anche se, in genere, questi computers iniziano a supportare delle loro versioni di kernel. Le 4 categorie principali di Kernel Tutt'ora esistono 4 tipi principali di Kernel: - I Kernel Monolitici, i quali offrono un astrazione completa e performante, riguardo lo strato hardware sottostante. - I Microkernels, che forniscono un piccolo set di astrazioni hardware semplici, sfruttando delle particolari applicazioni, dette "Servers", per offrire maggiori funzionalità. - I Kernel Ibridi (cioè microkernels modificati), i quali, implementano del codice aggiuntivo, nel KernelSpace, al fine di aumentare le performance disponibili. - Gli Exokernels, che forniscono un minimo di astrazione, permettendo, quindi, un accesso all'hardware, a basso livello. Nei sistemi Exokernel, le librerie offrono lo stesso supporto hardware presente nei Kernels Monolitici. I Kernel Monolitici L'approccio monolitico definisce un interfaccia virtuale ad alto livello, sull'hardware, con un set di primitive (o chiamate del sistema) per implementare i servizi dell'OS (es. gestione dei processi, della memoria e concorrenza alle risorse), in più moduli eseguiti in modalità supervisore. Anche se ogni modulo che offre il servizio a queste operazioni è separato dagli altri, l'integrazione del codice è difficile ,e, siccome tutti questi componenti vengono eseguiti nello stesso spazio d'indirizzamento, un errore in un modulo può far inceppare e crashare l'intero sistema. Tuttavia, quando l'implementazione avviene completamente e con affidabilità, l'integrazione interna legata ai componenti permette, alle features a basso livello del sistema sottostante, nell'essere utilizzate efficacemente, rendendo il kernel monolitico altamente efficiente. Kernel monolitici moderni quali Linux, FreeBSD e Solaris possono caricare dei moduli eseguibili in runtime, permettendo una facile estensione delle capacità del kernel su richiesta. Inoltre, ciò aiuta il mantenere al minimo l'ammontare di codice eseguito nel Kernelspace. Sono Kernel monolitici: I Kernel tradizionali di UNIX (es. quelli di BSD) Il Kernel di Linux Il Kernel di Solaris Alcuni Kernel creati a scopi educativi, es. Agnix I Microkernels L'approccio del Microkernel consiste nel definire delle astrazioni molto semplici, riguardo l'hardware, con dei set di primitive (o chiamate del sistema) per implementare dei servizi OS minimali (es. gestione dei thread, dello spazio indirizzabile e delle comunicazioni interprocessore). Tutti gli altri servizi, incluso quelli normalmente offerti dal Kernel (es. il Networking), sono implementati negli spazi utente per programmi, riferiti come "Servers". Quest'ultimi son dei programmi, come tutti gli altri, i quali permettono all'OS di essere modificato semplicemente avviando o spegnendo applicativi. Per i piccoli box, senza supporto di networking, basta non accendere il networking server. Questo, nei sistemi tradizionali, richiederebbe la ricompilazione del Kernel, attività, spesso, che và ben oltre le conoscenze medie dell'utente finale. In teoria, il sistema è, inoltre, molto più stabile, in quanto, qualora un server s'inceppi, questo blocca un semplice programma, piuttosto che comportare l'intero crash del kernel. Tuttavia, parte dello stato operativo viene perduto e, genericamente, è difficile poter continuare con l'esecuzione dei processi legati, oppure, il recupero dei servers inceppati. Ad esempio, se il server responsabile delle connessioni TCP/IP viene riavviato, gli applicativi potrebbero identificare una disconnessione anomala, procedendo nella ri-connessione. Purtroppo, però, altri oggetti di sistema, come, ad es., i files, non supportano questa logica di ricollegamento casuale, bensì, si suppone che, durante una trasmissione, vi sia un certo grado di affidabilità, nelle operazioni. Esempi di Microkernels ed OS basati su questi: AIX AmigaOS Amoeba Chorus microkernel EROS K42 LSE/OS (Nanokernel) KeyKOS (Nanokernel) La famiglia Microkernel "L4" Mach, usato in GNU Hurd, NEXTSTEP, OPENSTEP, e Mac OS X MERT Minix MorphOS NewOS QNX Phoenix-RTOS RadiOS Spring OS VSTa Symbian OS OSE Kernel Monolitici Vs. Microkernel Agli inizi degli anni 90, i kernel monolitici vennero considerati obsoleti. A causa di ciò, il design di Linux, con tale tipologia di core interno, invece che di un'implementazione a microkernel, generò non pochi flames tra Linus Torvalds e Andrew Tanenbaum. I kernel monolitici tendono ad essere più semplici da progettare correttamente. Inoltre, possono crescere più velocemente di quelli basati su un sistema a microkernel. Quest'ultimi, invece, vengono spesso usati in ambienti "embedeed" per computer in ambiti di robotica o medicina. Tale decisione è stata attuata, in quanto, molti dei componenti dell'OS risiedono nello spazio di memoria protetto assegnato, cosa non possibile nei kernel monolitici, anche in presenza di versioni a dotate di caricamento-moduli. Tuttavia, il modello monolitico tende nel gestire, in modo più efficiente, l'uso della memoria kernel condivisa, rispetto alla comunicazione inter-processo (più lenta) presente nei microkernel. Sebbene il Mach sia il microkernel generico più conosciuto, questo tipo di progettazione è stata utilizzata per creare dei kernels per scopi specifici. L'L3 venne creato per dimostrare che i microkernels non sono, necessariamente, lenti. La versione successiva L4 e la popolare implementazione chiamata "Fiasco", è capace di eseguire Linux, in aree d'indirizzamento separate. Il QNX è un OS creato ancora agli inizi degli anni 80 e ha un design a microkernel minimo. Tale sistema, però, è stato molto più soddisfacente rispetto il Mach, nel raggiungere i traguardi del paradigma d'implementazione. Solitamente, è utilizzato in tutti quegli ambienti ove il software non deve, assolutamente, esser soggetto a malfunzionamenti (es. braccia robotiche negli space shuttle, oppure, in quei macchinari per la lavorazione di precisione (es. per tagliare le lenti per i telescopi spaziali). Kernel Ibridi I kernel ibridi, essenzialmente, si basano sulla struttura dei microkernel, i quali, inoltre, presentano del codice "non essenziale", nel KernelSpace, al fine di velocizzare l'esecuzione del codice, come se fosse eseguito nell'User-Space. Tale "drogaggio" venne introdotto prima che si dimostrasse la possibilità, per un microkernel puro, di poter raggiungere delle alte performance. Ad esempio, il Kernel di Mac OS X "XNU", nonostante sia basato sul microkernel Mach 3.0, include del codice ottenuto dal core del BSD, presente nello stesso spazio d'indirizzamento, al fine di tagliare l'eventuale latenza presente nei design dei microkernel tradizionali. Gli OS più moderni, oggi, ricadono in tale categoria e Microsoft Windows NT (e successori), sono gli esempi più popolari. Nella tecnologia NT, il microkernel è la parte del core dell'OS, mentre i servizi a più alto livello sono implementati nell'esecutivo NT. Vari server comunicano attraverso un meccanismo di spazio d'indirizzamento incrociato detto "Local Procedure Call" (LPC), oltre all'uso della memoria condivisa, al fine di ottimizzare le performance. Il "DragonFly BSD" è il primo BSD OS non basato su Mach, il quale adotta un architettura del kernel ibrida. Esempi di Kernel Ibridi sono: ReactOS kernel BeOS kernel Haiku kernel NetWare kernel Kernel di tecnologia NT presenti su Windows 2000, Windows XP e Windows Vista Alcune persone confondono il termine "Kernel Ibrido" con i kernel monolitici che caricano moduli operativi dopo il boot. Ciò è sbagliato. In questo caso, l'ibrido significa che il kernel, in questione, condivide i concetti o i meccanismi d'architettura sia monolitici che delle tipologie micro. Specificatamente il passaggio messaggi e la migrazione del codice "non essenziale" dall'UserSpace, all'interno del kernel stesso, per motivi di performance. Microkernel Atipici Ci son alcuni microkernels non considerati propriamente puri, in quanto, implementano, di tale tipologia, solo alcuni concetti. Questi kernel "Atipici" son caratterizzati da un vasto numero di features, le quali contrassegnano come facenti parte della famiglia dei "microkernel", anche se in realtà, non vi sarebbe una presenza pura di tale design. Un esempio è il Exec, Kernel presente nell'AmigaOS e il suo diretto discendente ExecSG (o "Exec Second Generation"). Gli Exokernels Un exokernel è un tipo di kernel che non effettua l'astrazione dell'hardware in modelli teorici. Principalmente, quest'ultimo allocca le risorse fisiche (es. l'uso del processore, le pagine di memoria, i blocchi dei dischi) a vari programmi. Quando uno di questi viene eseguito, vi è la possibilità di collegarsi alle librerie dell'OS, al fine di simulare un astrazione di un OS maggiormente conosciuto, oppure, sviluppandone delle versioni specifiche al programma, in modo da migliorarne la performance.
|