Crea sito

Linux Cap 1: Panoramica Generale

14 / 100

Le componenti di un sistema operativo

Un sistema operativo UNIX è formato da un kernel e da programmi di sistema, oltre ad applicazioni con cui si fa il vero lavoro.

Il Kernel

Il kernel è il cuore del sistema operativo: tiene traccia dei file sul disco, avvia i programmi e li fa girare contemporaneamente, assegna la memoria ed altre risorse ai vari processi, scambia i pacchetti con la rete e così via.

Il kernel fa pochissime cose da solo, ma fornisce gli strumenti con cui si possono costruire tutti i servizi; evita anche che chiunque acceda all’hardware direttamente, forzando tutti a utilizzare gli strumenti che fornisce: in questo modo protegge gli utenti l’uno dall’altro.

Gli strumenti forniti dal kernel vengono usati attraverso chiamate di sistema: consultate le pagine man della sezione 2 per ulteriori informazioni su questo argomento.

I programmi di sistema usano gli strumenti forniti dal kernel per implementare i vari servizi propri di un sistema operativo.

I programmi di sistema, come tutti gli altri programmi, girano `sopra al kernel’, in quella che viene chiamata modalità utente (user mode).

La differenza tra i programmi di sistema e gli applicativi è lo scopo: le applicazioni sono concepite per fare delle cose utili (o per giocare, se si tratta di un gioco), mentre i programmi di sistema servono per fare funzionare il sistema stesso.

Un word processor è un’applicazione, telnet è un programma di sistema. La differenza è comunque spesso non ben definita, ed è importante solo per chi è abituato a dividere tutto in categorie.

Un sistema operativo può anche contenere dei compilatori e le corrispondenti librerie (sotto Linux in particolare GCC e la libreria C), anche se non c’è bisogno che tutti i linguaggi di programmazione ne siano parte integrante.

Ne possono fare parte anche la documentazione, e qualche volta anche dei giochi. Tradizionalmente, il sistema operativo è stato definito come il contenuto del nastro o dei dischi di installazione; con Linux non è così chiaro, perché è sparso su tutti i siti FTP del mondo.

Le parti principali del kernel

Il kernel di Linux consiste di diverse parti importanti: la gestione dei processi, la gestione della memoria, i driver per i dispositivi hardware, quelli per i filesystem, la gestione della rete ed altre parti minori.

Probabilmente le parti più importanti del kernel (nient’altro funziona senza di esse) sono :

La gestione della memoria e dei processi.
La gestione della memoria si occupa di assegnare le aree di memoria e di spazio di swap ai processi, a parti del kernel e per la cache di buffer.
La gestione dei processi crea i processi ed implementa il multitasking cambiando il processo attivo sul processore.

Al livello più basso, il kernel contiene un driver per ciascun dispositivo hardware che supporta.
Dato che il mondo è pieno di tipi diversi di hardware il numero dei driver è enorme.
Ci sono spesso molti componenti hardware simili che differiscono solo in come vengono controllati dal software; queste similitudini rendono possibile avere delle classi generali di driver che supportano operazioni simili: ogni membro della classe ha la stessa interfaccia con il resto del kernel, ma si distingue in quello che serve per implementarlo.
Ad esempio, tutti i driver dei dischi sembrano uguali dal punto di vista del resto del kernel, cioè hanno tutti operazioni come inizializza il driver',leggi il settore N’ e `scrivi il settore N’.

Alcuni dei servizi software forniti dal kernel stesso hanno proprietà simili e possono dunque essere astratti in classi. Ad esempio, i vari protocolli di rete sono stati astratti in un’interfaccia di programmazione, la BSD socket library. Un altro esempio è il livello filesystem virtuale (VFS), che astrae le operazioni su filesystem senza considerare la loro implementazione. Ciascun tipo di filesystem fornisce un’implementazione di ogni operazione; quando un’entità prova ad usare un filesystem, la richiesta passa per il VFS che la gira al driver opportuno.

I principali servizi in un sistema UNIX

Questa sezione descrive alcuni dei servizi di UNIX più importanti, ma senza scendere molto nei dettagli; verranno descritti più accuratamente nei capitoli successivi.

init

Il servizio più importante di un sistema UNIX è fornito da init. init viene inizializzato come primo processo su ciascun sistema UNIX ed è l’ultima cosa che il kernel fa all’avvio. Quando parte, init continua il processo di avvio portando avanti vari compiti (controlla e monta i filesystem, avvia i daemon ecc.).

L’elenco esatto delle cose che init fa dipende dal suo tipo: ce ne sono diversi tra cui scegliere. init di solito fornisce il concetto di modalità a singolo utente, in cui nessuno si può collegare e root usa una shell alla console; la modalità usuale viene chiamata modalità multiutente. Alcuni tipi generalizzano questo concetto in runlevel; le modalità utente singolo e multiutente sono considerate due runlevel, e ce ne possono essere altri, ad esempio, per far girare X sulla console.

Nelle normali operazioni, init si assicura che stia girando getty (per poter far collegare gli utenti), e adotta i processi orfani (quelli il cui padre è morto: in UNIX tutti i processi devono essere in un singolo albero, quindi gli orfani devono venire adottati).

Quando il sistema viene spento, è init che deve uccidere tutti gli altri processi, smontare i filesystem e fermare il processore, oltre agli altri compiti per cui è stato configurato.

Login dai terminali

I login dai terminali (attraverso linee seriali) e dalla console (quando non si sta usando X) vengono forniti dal programma getty. init avvia una getty separata per ogni terminale da cui sono consentiti i login, getty legge il nome dell’utente ed avvia il programma login, che legge la password; se questa corrisponde al nome utente, login avvia la shell. Quando questa termina, cioè l’utente si scollega, o quando login termina perché il nome dell’utente e la password non corrispondono, init lo nota ed avvia un’altra copia di getty. Il kernel non ha nozione dei login, che vengono tutti gestiti dai programmi di sistema.

Syslog

Il kernel e molti programmi di sistema producono messaggi di errore, di avvertimento e di altro tipo. Spesso è importante che questi messaggi possano essere letti in un secondo tempo, anche dopo parecchio, quindi devono essere scritti in un file. Il programma che lo fa è syslog, che può essere configurato per distribuire i messaggi in file diversi a seconda di chi li genera o del loro grado di importanza; ad esempio quelli del kernel sono spesso rediretti in un file separato dagli altri, dato che spesso sono più importanti e devono essere letti regolarmente per individuare gli eventuali problemi.

Esecuzione periodica dei comandi: cron e at

Sia gli utenti che gli amministratori di sistema hanno spesso bisogno di avviare periodicamente dei programmi, ad esempio l’amministratore di sistema potrebbe voler avviarne uno che ripulisca le directory che contengono file temporanei (/tmp e /var/tmp) dai file vecchi, per evitare che i dischi si riempiano, dato che non tutti i programmi cancellano correttamente i file generati.

Il servizio di cron funziona proprio per questo. Ciascun utente ha un file crontab, dove elenca i comandi che vuole eseguire ed il momento in cui farlo; il daemon cron avvia poi i comandi scelti al momento specificato.

Il servizio di at è simile a cron, ma vale per una sola volta: il comando viene eseguito al momento indicato, ma non viene ripetuto.

GUI – interfaccia grafica utente

UNIX e Linux non hanno incorporata l’interfaccia nel kernel, ma la fanno implementare da programmi a livello utente, sia per l’ambiente testuale che per quello grafico.
Questa soluzione rende il sistema più flessibile, ma ha lo svantaggio che è facile implementare un’interfaccia diversa per ciascun programma, rendendo il sistema più difficile da imparare.

L’ambiente grafico usato principalmente con Linux si chiama Sistema X Window (in breve, X). X stesso non implementa un’interfaccia utente, ma solo un sistema di finestre, cioè degli strumenti con cui poterne implementare una. I tre stili più conosciuti in X sono Athena, Motif e Open Look.

Le reti

Una rete è un mezzo per connettere due o più computer in modo che possano comunicare tra di loro. I metodi usati di connessione e comunicazione sono piuttosto complessi, ma il risultato finale è molto utile.

I sistemi operativi UNIX hanno molte capacità di connessione in rete. La maggior parte dei servizi di base (i filesystem, la stampa, i backup ecc.) possono essere usati attraverso la rete; questo può rendere l’amministrazione di sistema più semplice, dato che permette di centralizzare i compiti amministrativi, sfruttando nel contempo i lati positivi dei microcomputer e dell’informatica distribuita, come i costi minori e una più alta tolleranza degli errori.

Login in rete

I login in rete funzionano in modo leggermente diverso da quelli normali: in questi ultimi infatti c’è una linea seriale fisica separata per ciascun terminale attraverso cui ci si collega, mentre per ciascuna persona che si collega via rete c’è una connessione virtuale separata, e ce ne possono essere infinite. Non è quindi possibile avviare una getty separata per ciascuna connessione virtuale possibile. Ci sono poi diversi modi per collegarsi attraverso una rete: i principali nelle reti di tipo TCP/IP sono telnet e rlogin.

I login di rete hanno, invece di un insieme di getty, un daemon singolo per ciascun modo di collegamento (telnet e rlogin hanno daemon separati) che sta in ascolto per i tentativi di login in ingresso. Quando ne nota uno, inizializza una copia di se stesso per gestire quel singolo tentativo; l’istanza originale continua ad aspettarne altri. La nuova istanza funziona in modo simile a getty.

Filesystem condivisi

Una delle cose più utili che si possono fare con i servizi di rete è la condivisione di file attraverso un filesystem di rete. Quello che viene usato di solito si chiama Network File System, o NFS, ed è sviluppato dalla SUN.

Con un filesystem condiviso qualsiasi operazione su file fatta da un programma su una macchina viene spedita attraverso la rete ad un altro computer. In questo modo si inganna il programma e gli fa pensare che tutti i file sull’altro computer siano in realtà sul computer su cui sta girando, il che rende molto semplice la condivisione di informazioni, non richiedendo modifiche ai programmi.

La posta elettronica

La posta elettronica è di solito il metodo più importante per comunicare usando il computer. Un messaggio di posta elettronica viene immagazzinato in un file in un formato speciale e per inviare e leggere i messaggi vengono usati dei programmi appositi. Ciascun utente ha una casella di posta in arrivo (un file nel formato speciale) dove viene immagazzinata tutta la nuova posta in ingresso. Quando qualcuno spedisce un messaggio, il programma di posta ritrova la casella del destinatario e lo aggiunge al file. Se la casella di posta del destinatario si trova su un altro computer il messaggio viene inviato a quella macchina, che lo aggiunge alla casella nel modo che ritiene migliore.

Il sistema di posta consiste di molti programmi: la distribuzione a caselle locali o remote viene fatta dall’agente di trasferimento di posta (mail transfer agent o MTA), cioè sendmail o smail, mentre i programmi utilizzati dagli utenti sono molti e vari (gli agenti di posta utente, mail user agent o MUA, come ad esempio pine o elm). Le caselle di posta vengono in genere tenute in /var/spool/mail.

La stampa

Solo una persona alla volta può usare una stampante, ma è poco economico non condividerla tra vari utenti. La stampante viene quindi gestita da un software che implementa una coda di stampa: tutti i job di stampa vengono messi in una coda e quando la stampante ne ha finito uno gliene viene mandato un altro automaticamente. Questo solleva gli utenti dall’organizzazione della coda di stampa e dal litigare per il controllo della stampante.

Il software di stampa fa anche lo spool delle stampe sul disco, cioè il testo viene mantenuto in un file finché il job è in coda. Ciò permette ad un programma applicativo di inviare velocemente i job di stampa al software di coda; l’applicazione non deve così aspettare finché il job è realmente stato stampato per poter continuare. È veramente conveniente, dato che permette di stampare una versione di un file e non dover aspettare che abbia finito per farne una nuova completamente diversa.

La struttura del filesystem

Il filesystem è diviso in molte parti:

Di solito in un filesystem radice,

con /bin, /lib, /etc e /dev che formano un singolo filesystem,

/usr con i programmi ed i dati che non vengono modificati,

/var con quelli che vengono modificati (come i file di log), ed

/home con i file personali dei vari utenti.

A seconda della configurazione dell’hardware e delle decisioni dell’amministratore di sistema la divisione può cambiare, e potrebbe esserci anche un unico filesystem che comprende tutto.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Translate »