Introduzione al Calcolatore

La diffusione attuale dei computer è frutto di una costante evoluzione della tecnologia (da valvole termoioniche, a transistor, a circuiti integrati) che ne ha reso possibile l'utilizzo da parte di un pubblico sempre più ampio e non necessariamente specializzato: Mainframe, Minicomputer, Microcomputer, Home computer, Personal computer.

Malgrado le differenze, tutti i computer hanno in comune almeno le seguenti caratteristiche:


Gli utenti
Programmi applicativi
es. Word, Firefox
Il Sistema Operativo (S.O.)
es. Windows XP, Linux
La parte Hardware (Hw)
es. processore, memoria




Architettura del calcolatore

Un computer é composto da un gran numero di elementi interagenti.
Anche se qui rappresentiamo un pc fisso, gli stessi componenti sono presenti nei portatili e (a parte alcune eccezioni, come la tastiera) nei piú moderni palmari e dispositivi mobili.

  1. Video (Display)
  2. Scheda madre (Motherboard)
  3. CPU (Microprocessore)
  4. RAM (Memoria Primaria)
  5. Schede di espansione (grafica, rete, etc.)
  6. Alimentatore
  7. CD/DVD Drive
  8. HD (Memoria secondaria)
  9. Tastiera
  10. Mouse

Ma tutte queste componenti hardware interagiscono scambiandosi segnali elettrici!
Come può una persona riuscire a controllarne il funzionamento in maniera agevole?
Grazie al Sistema Operativo!




Il Sistema Operativo

Un S.O. è un particolare programma che agisce da intermediario fra utente e hardware di un computer
  • Il S.O. è responsabile del controllo e gestione dell'hardware che costituisce un computer e quindi di tutte le operazioni di base
  • Il S.O. dovrebbe permettere di utilizzare le componenti hardware nel modo più efficiente e efficace possibile
  • Il suo scopo è di fornire un ambiente nel quale gli utenti siano in grado di eseguire applicazioni
  • Il S.O. gestisce l'accesso degli utenti al sistema e tutti i processi in esecuzione
  • I S.O. moderni devono rendere possibile e conveniente l'utilizzo di un computer anche a utenti non esperti, facilitando l'interazione attraverso le periferiche disponibili
Esempi di Sistemi Operativi sono:
MS-DOS, Windows (XP, Vista, 7), Mac OS, OS/2, UNIX, Linux

Ognuno di questi S.O. fornisce all'utente un modo diverso di lavorare, di interagire con le componenti hardware, di realizzare i propri lavori, hobby e progetti scientifici e artistici




Da UNIX a Linux

UNIX fu sviluppato alla fine degli anni sessanta presso i laboratori Bell (Bell Labs) della AT&T introducendo una serie di principi tuttora ritenuti universalmente validi.
In particolare, UNIX doveva:
  • essere indipendente dall'hardware su cui doveva essere eseguito
  • fornire operazioni concettualmente semplici (fare una sola cosa ma farla bene)
  • favorire l'uso dell'output di un programma come input di un altro
  • fornire un ambiente di supporto alla programmazione
E inoltre
  • Multiutente e multitasking: più utenti possono collegarsi al sistema e eseguire task/processi contemporaneamente (con un meccanismo detto timesharing)

UNIX è il primo S.O. a essere (ri)scritto (nel 1973) in un linguaggio ad alto livello, il C (mutuamente influenzato da UNIX) invece che in Assembly (linguaggio macchina), disgregando la diffusa convinzione che solo con linguaggi di basso livello si potesse garantire un livello accettabile di efficienza

  • Diffuso rapidamente in ambito accademico grazie a licenze gratuite dei Bell Labs (fine anni '70)

  • Esistono numerosi dialetti, per tutte le macchine (da personal computer a mainframe), con stesse funzionalità di base e buona compatibilità

  • Nel 1992, lo studente (!) finlandese Linus Thorvald ha sviluppato (il kernel di) Linux, una versione open source di UNIX per PC Intel 386, utilizzando strumenti della Free Software Foundation.

Linux è oggi disponibile per tutte le piattaforme e i processori più diffusi... e adesso è anche facile da installare e da aggiornare!




UNIX in generale

  • Tutte le informazioni sono organizzate in file: documenti, sorgenti di programmi, applicazioni, immagini, ...
  • File System gerarchico: file (archivio) e directory (cartelle)
  • Due modalità di interazione con l'utente, con vantaggi complementari:

    • grafica, come sotto Windows (intuitiva, possibile anche per novizi, invita all'esplorazione...)

    • testuale, tramite shell interattiva (richiede maggiore conoscenza del sistema, più potente...)

  • Sia la shell che l'interfaccia grafica (basata su X Window System X11) forniscono, in modo diverso, le stesse funzionalità:

    • accedere al sistema
    • spostarsi nel file system
    • creare / modificare / eliminare file
    • eseguire applicazioni



Il file system

  • Un file è un contenitore di informazioni: un documento, un programma, i dati di un esperimento, una fotografia..., ma anche un dispositivo di input/output, una zona di memoria interna,... (in UNIX anche operazioni come accesso a periferiche o comunicazioni tra processi avvengono tramite file speciali)

  • Una directory è un file che indicizza altri file.

  • Ogni file ha un nome, che può contenere lettere, numeri, e i caratteri "." (punto) e "_" (sottolineatura o underscore) [meglio evitare gli spazi!!!]
    Spesso il nome di un file ha un suffisso o estensione, che ne indica il tipo (main.c indica un programma C, letter.txt indica un file di solo testo...)

  • UNIX è case-sensitive: una lettera minuscola e la corrispondente maiuscola sono diverse!!!
    Ad esempio, possiamo avere nella stessa directory i file piPPo e Pippo

  • I file sono organizzati in una struttura chiamata file system, rappresentabile come un albero (come analogia considerate un albero genealogico):
    • Una struttura con tre elementi: radice, nodi, archi (relazioni tra nodi)
    • La radice dell'albero è la directory /, detta root
    • I nodi sono file (i nodi interni sono directory)
    • Gli archi descrivono la struttura gerarchica (relazione padre-figlio)

Esempio di struttura di un file system UNIX




Directory importanti e Pathname

Alcune directory importanti:
  • Della root directory (indicata con /) abbiamo già parlato.

  • I file di ogni utente UNIX sono memorizzati in una directory del file system chiamata la home directory o home dell'utente (indicata con ~).

  • In ogni istante, ogni utente collegato al sistema si trova concettualmente posizionato in un ben preciso nodo del file system (detto directory corrente e indicato con .), da cui può spostarsi tramite opportuni comandi

  • La directory immediatamente sopra quella corrente è detta directory padre e indicata con ..

Nota: questa convenzione NON si generalizza aumentando il numero di .. per raggiungere la directory padre della directory padre e così via!

I percorsi (o path) sono rappresentati testualmente inserendo un simbolo / tra ogni padre e figlio (senza spazi). Per esempio:

/usr/       /usr/bin       /usr/bin/emacs

Un pathname specifica la precisa locazione di un file all'interno del file system.

  • pathname assoluto: dice come raggiungere un file partendo dalla radice del file system (quindi comincia sempre con /). Per esempio:
    /usr/bin/emacs

  • pathname relativo: dice come raggiungere un file partendo dalla directory corrente. Per esempio:
    ../../X11/man se la directory corrente è /usr/bin/emacs

  • Due file in directory diverse dello stesso albero possono avere lo stesso nome. Possiamo distinguerli usando il loro pathname assoluto, che li identifica in modo univoco nel file system:

      /usr/bin
      /bin/
      /usr/X11/bin/
      



La shell

La shell è un interprete di comandi: legge ciascuna linea di comando, ne interpreta le diverse componenti e la esegue

  • Ogni sistema UNIX mette a disposizione vari tipi di shell. Le shell più diffuse sono: (sh, bash, csh, tcsh): il default per voi è bash

  • Da X-Window si lancia come una qualunque applicazione (generalmente si chiama "Terminal" ed é elencata sotto "Accessori" o "Sistema"...)

  • La shell è un interprete di comandi che ripetutamente:

    • stampa un prompt
    • legge un comando scritto dall'utente e terminato con enter/return/invio
    • esegue il comando o segnala un errore se non è in grado di completarlo

  • I comandi possibili sono moltissimi, ma ne bastano pochi per cominciare...



Perché usare una shell testuale?

  • Potenza e semplicità: I comandi UNIX sono progettati per risolvere problemi specifici. Sono semplici (senza menu e opzioni nascoste) e proprio per questo potenti (es. grep parola filename)

  • Velocità e flessibilità: è più veloce scrivere pochi caratteri da tastiera piuttosto che cercare un programma opportuno e usare le operazioni che fornisce sulla base delle proprie specifiche esigenze

  • Accessibilità: permette di accedere efficientemente ad un sistema in remoto (es. ssh machine)




Sintassi dei comandi UNIX

La sintassi tipica dei comandi UNIX è la seguente:
comando  <opzioni>   <argomenti>

Opzioni:

  • Sono facoltative e influiscono sul funzionamento del comando
  • Consistono generalmente di un hyphen (il simbolo di trattino -) seguito da una sola lettera (es. ls -l). Possono avere un argomento (es. dvips -o p.ps p.dvi). Spesso più opzioni possono essere raggruppate insieme dopo un solo trattino (es. ls -al )
Argomenti:
  • Si possono avere più argomenti o anche nessuno
  • Alcuni argomenti sono opzionali. Se non specificati assumono valori di default



I comandi UNIX: Esempi

  • nessun argomento: il comando date mostra ora e data corrente
    date

  • un solo argomento: il comando cd cambia la directory corrente in quella specificata dal suo argomento
    cd ../emacs

  • un'opzione ed un argomento: il comando wc conta il numero di parole, caratteri, righe in un file di testo, in base all'opzione specificata
    wc -w elenco.txt conta le parole nel file elenco.txt
    wc -c elenco.txt conta i caratteri nel file elenco.txt
    wc -l elenco.txt conta le linee nel file elenco.txt

  • numero arbitrario di argomenti: il comando cat concatena e mostra sullo schermo il contenuto dei file passati come argomento
    cat orarioLUN.txt orariMAR.txt orarioMER.txt orarioGIO.txt

  • più opzioni ed un argomento di default: lista dettagliata (l,long) di tutti (a,all) i file, con dimensione (s,size). L'argomento di default è la directory corrente
    ls -als

Alcune informazioni utili
Per avere informazioni su di un comando e vederne tutte le opzioni possibili, provare l'opzione --help, oppure i comandi man o info (ad esempio, "ls --help", "man ls", "info ls")
La shell fa una completion automatica: se si scrive l'inizio di un comando o di un file e si batte TAB, la shell completa il nome per quanto possibile.



La directory corrente e comandi di navigazione

La linea di comando è concettualmente posizionata in una directory, la directory corrente (che all'inizio di ogni sessione è la home dell'utente collegato), nella quale vengono eseguiti i comandi.

Per fare riferimento a files o directory, oltre al path assoluto si può usare il path relativo, che parte dalla directory corrente.

Comando Significato
dirs stampa la directory corrente [working directory]
pwd stampa il pathname assoluto della director corrente
cd la home diventa la directory corrente
cd <nuovaDir> <nuovaDir> diventa la directory corrente
ls stampa il contenuto della directory corrente
ls <directory> stampa il contenuto di <directory>
ls -l stampa anche informazioni aggiuntive (diritti, dimensione...)
ls -a stampa anche files/directory che iniziano per "."

Esempio: visitando una home
Comando Significato
-> pwd stampa il pathname assoluto della directory corrente
-> ls lista la directory corrente
-> cd .. la direcory padre diventa la directory corrente
-> ls -sh mydocs lista la directory mydocs con opzioni size e human readable
-> cd la home diventa la directory corrente




Creare, cancellare, copiare e spostare file

Per creare un file si possono usare moltissimi comandi: il più semplice è touch. In generale, tutti i comandi che modificano un file lo creano se esso non esiste già.

Comandi per creare e cancellare file e directory
Comando Significato
touch <file> cambia l'orario di accesso e di modifica di <file>; se non esiste, lo crea
mkdir <dir> crea la directory <dir>
rmdir <dir> cancella la directory <dir>, ma solo se è vuota.
rm <f1> ... <fn> cancella i files <f1> ... <fn>
rm -r <dir> cancella la directory <dir> con il suo contenuto
rm -i ... cancella l'argomento chiedendo conferma
rm -f ... cancella l'argomento senza chiedere conferma

Comandi per spostare e copiare file e directory
cp <source> <dest> copia il file o directory <source> in <dest>
cp <f1> ... <fn> <dir> copia <f1> ... <fn> nella directory <dir>
cp -r <dir1> <dir2> copia <dir1> e tutto il suo contenuto in <dir2>
cp -i ... copia chiedendo conferma prima di sovrascrivere
cp -f ... copia senza chiedere conferma prima di sovrascrivere
mv <source> <dest> copia <source> in <dest> e rimuove <source>
mv <f1> ... <fn> <dir> sposta <f1> ... <fn> nella directory <dir>
mv -i ... muove chiedendo conferma prima di sovrascrivere
mv -f ... muove senza chiedere conferma prima di sovrascrivere




Emacs

Emacs è un editor di testo molto utilizzato sotto UNIX, che offre moltissime funzionalità: si tratta di un vero e proprio ambiente di sviluppo integrato, non grafico.

Per lanciare Emacs ed editare il file primofile, basta eseguire nella shell il comando

    -> emacs primofile &
La "e commerciale" (&) serve a lanciare Emacs in background, in modo da non bloccare l'esecuzione della shell.

Alcune cose da sapere (e sperimentare) su Emacs:

  • Emacs fa un backup del file chiamandolo primofile~.

  • Quando si modifica un file con Emacs, in realtà si modifica una copia del file tenuta da Emacs in un buffer (nell'esempio, un file chiamato #primofile#). Le modifiche vanno salvate per renderle permanenti.

  • Emacs permette di lavorare su più file alla volta. Non c'è bisogno di mandare in esecuzione più copie di Emacs. Il menu Buffer permette di passare da un file all'altro.

  • Se i caratteri della finestra di edit vi sembrano troppo piccoli per riuscire a lavorarci, lanciare Emacs col comando emacs -fn 10x20

  • Si può interagire con Emacs usando il mouse e i menu, oppure con opportune combinazioni di tasti. Un'introduzione all'uso di Emacs (con i tasti!!!) si trova nell'Emacs Tutorial, che si può invocare con C-h t oppure dal menu Help



Editing della linea di comando e comandi Emacs

Molte shell offrono funzioni di editing della linea di comando che sono "ereditate" dall'editor emacs.

Ecco alcune delle funzioni più utili:

    Ctrl-e va a fine riga
    Ctrl-a va a inizio riga
    Ctrl-k cancella il resto della linea (kill)
    Ctrl-y reinserisce la stringa cancellata (yank)
    Ctrl-d cancella il carattere sul cursore (delete)
    Ctrl-x Ctrl-s salva il file (save)
    Ctrl-x Ctrl-c esce da Emacs



I metacaratteri (wildcards)

Accade spesso di voler operare su più file contemporaneamente. Ad esempio, supponiamo di voler copiare tutti i file html di una directory nella sotto-directory html-src. Usando la wildcard  * (asterisco) si può scrivere semplicemente:

-> cp *.html html-src

I metacaratteri e il loro significato sono:

?
qualunque carattere
*
qualunque sequenza di caratteri

Se la shell trova un'espressione contenente metacaratteri in una linea di comando, la espande con tutti i nomi di file che "soddisfano" (match) l'espressione.

I seguenti esempi usano il comando echo, che rimanda sullo schermo ogni parametro.

  -> echo Ciao!
  Ciao!
  -> ls
  data-new data1 data2 inittab pippo pippo2
  -> echo data*
  data-new data1 data2
  -> echo data? 
  data1 data2
  ->



Visualizzare i file di testo

Comandi per visualizzare il contenuto di file di testo
less <file>
more <file>
visualizzano pagina per pagina il contenuto di <file>, che deve essere un file di testo
cat <f1> ... <fn> concatena i file <f1> ... <fn> e ne mostra il contenuto
sort <f1> ... <fn> mostra le righe in <f1> ... <fn> ordinate lessicograficamente

Per visualizzare correttamente file che non sono di testo occorre usare le corrispondenti applicazioni.

Come default, i comandi visti sopra dirigono il contenuto dei file sullo standard output.




Standard input, output e error

Per convenzione ogni programma UNIX comunica seguendo un analogo schema di input/output, che comprende tre canali
  • riceve l'input dallo standard input (stdin)
  • manda l'ouput allo standard output (stdout)
  • segnala gli errori sullo standard error (stderr)

Per default la shell associa stdin alla tastiera e stdout, stderr allo schermo del terminale utente.




Ridirezione

Il meccanismo della ridirezione permette di alterare il comportamento standard.

La shell permette di ridirigere stdin, stdout e stderr, connettendoli a generici file. Si usano per questo i caratteri speciali

>   >>   >&   <

Ad esempio, l'output del comando echo viene mandato su stdout, che per default è lo schermo. Possiamo ridirigere l'output nel seguente modo:

-> echo pippo Topolino
pippo Topolino
echo ristampa sullo schermo il resto della linea
-> echo pippo Topolino > file.txt
-> cat file.txt
pippo Topolino
->
L'output viene scritto nel file file.txt, cancellando il suo contenuto o creandolo se non esiste.
-> echo e anche Minnie >> file.txt
-> cat file.txt
pippo Topolino
e anche Minnie
->
L'output viene appeso al file file.txt.
-> ehco errore > file.txt
csh: ehco: command not found
->
Eventuali errori vengono scritti su stderr, che è ancora associato allo schermo.
-> ehco errore >& file.txt
-> cat file.txt
csh: ehco: command not found
->
Con >& si ridirige anche stderr.

Il comando sort (senza parametri) legge dallo standard input e scrive sullo standard output. Possiamo ridirigere input e/o output così:

-> sort < elenco.txt Stampa sullo schermo le linee di elenco.txt ordinate lessicograficamente.
-> sort < elenco.txt > eleOrd.txt Scrive in eleOrd.txt le linee di elenco.txt, ordinate lessicograficamente.



I processi

Un processo è un programma in esecuzione. Concettualmente, la shell esegue ripetutamente i seguenti passi:
  • stampa il prompt e attende l'input dell'utente;
  • legge la linea di comando;
  • espande eventuali alias e wildcard;
  • se il comando è un comando interno lo esegue, altrimenti:
    • individua il comando da eseguire nel file system;
    • lancia un processo per eseguirlo mettendosi in attesa;
  • quando l'esecuzione del comando termina, riprende l'esecuzione.

Poiché UNIX è un sistema multitasking, la shell permette di lanciare più processi in parallelo. Scrivendo

-> <comando> &

il comando <comando> viene eseguito in background, cioè la shell continua l'esecuzione subito dopo aver lanciato il processo, senza attenderne la terminazione.

I seguenti comandi e tasti speciali sono utili per la gestione dei processi:

jobs elenca i job della shell corrente, con il numero di job; quello marcato con + è il job corrente
fg
fg %
<n>
riporta in foreground il job corrente
riporta in foreground il job numero <n>
Ctrl-z combinazione di tasti che sospende il comando in esecuzione
bg %<n> riattiva in background l'esecuzione del job <n> (di quello corrente se senza argomenti)
Ctrl-c Combinazione di tasti che termina il comando in esecuzione
ps
ps -aux
elenca i processi (e pid) della shell corrente
elenca tutti i processi in esecuzione
kill -s <n>   <p>
kill -s <n>   %<j>
kill -l
invia il segnale <n> al processo con PID <p>
invia il segnale <n> al job <j>
elenca i segnali possibili (es. KILL)

Ad esempio, per lanciare emacs in background, le seguenti sequenze sono equivalenti:

-> emacs nome-file-da-editare &
->
-> emacs nome-file-da-editare
Ctrl-z

-> bg
->



Altri comandi utili

Elenchiamo qui altri comandi Linux di grande utilità. Per una loro descrizione più approfondita si faccia riferimento alla documentazione online di Linux, provando i seguenti:
<comando> --help
man <comando>
info <comando>.

quota mostra lo spazio disco che si ha a disposizione e l'occupazione attuale
Attenzione: con quota esaurita il login con GUI non funziona: usare Ctrl-Alt-F1 per login testuale e controllare la cache del browser.
gzip/gunzip compressione/decompressione di file
bzip2/bunzip2 compressione/decompressione di file
tar creazione di/estrazione da archivio, normalmente con compressione/decompressione
zip/unzip
rar/unrar
creazione di/estrazione da archivio, normalmente con compressione/decompressione
file <nome> mostra il tipo del file <nome>

Ad esempio, per creare l'archivio compresso di un progetto si può usare tar:

-> tar -zcvf arch.tgz projdir/


Esercizi

[01]  Partendo dalla vostra home directory esplorare il file system posizionandovi nella vostra directory padre. Elencare i files in essa contenuti.

[02]  Posizionandovi nella vostra home directory, create una nuova sottodirectory chiamata Num_Utili e copiateci il file di testo Rubrica.txt che trovate nella home directory della prof. Gori (~gorir).
Editare il file con emacs in modo da cancellare (con gli opportuni comandi emacs) tutte le righe che non contengono informazioni utili (es. righe vuote, righe di asterischi,....).

[03]  Creare nella propria propria home directory una nuova directory Num_Pers.
Creare poi un nuovo file MiaRubrica.txt nella directory Num_Pers.
Editare il file MiaRubrica.txt con emacs per inserire 5-6 nomi di amici con la città di provenienza e un recapito telefonico anche inventato (usare esattamente lo stesso formato dei dati utilizzato nel file Rubrica.txt).

[04]  Creare un nuovo file GenRubrica.txt nella nuova directory Num_Gen figlia della propria home directory in modo che contenga tutti i dati presenti nelle due rubriche precedenti (Rubrica.txt, MiaRubrica.txt), senza editare manualmente il contenuto dei files.

[05]  Creare un nuovo file OrdRubrica.txt nella home directory memorizzandoci i dati di GenRubrica.txt ordinati secondo l'ordine alfabetico, senza editare manualmente il contenuto dei files.

[06]  Individuare il comando con il quale si sarebbe potuto ottenere direttamente il file OrdRubrica.txt (nella home directory) a partire dai file MiaRubrica.txt e Rubrica.txt.

[07]  Spostare tutti i file con suffisso .txt delle directory Num_Pers e Num_Utili nella home directory e cancellare le directory Num_Pers e Num_Utili.

[08]  Indicare un comando che indichi la size di tutti i file contenuti nella home directory.

[09]  Eseguire la seguente sequenza di azioni:

  • Lanciare da shell l'editor emacs senza il comando &.
  • Indicare la combinazione di tasti che vi permette di sospendere l'esecuzione di emacs in modo da ottenere di nuovo l'uso della shell.
  • Indicare il comando che vi permette di riattivare in background l'esecuzione di emacs.
  • Qual è la differenza tra il comando bg e il comando fg? Se necessario per vedere la differenza ripetere la sequenza di azioni di sopra.

[10]  Scaricare dalla home directory della Prof. Gori (~gorir) il file eseguibile provami. Lanciare l'esecuzione di tale eseguibile (file binario) dando il comando da shell ./provami. Che succede?
Terminare l'esecuzione del programma provami sfruttando un'opportuna combinazione di tasti.

[11]  Eseguire di nuovo il comando ./provami. Aprire un'altra shell e usare una sequenza di comandi per bloccare l'esecuzione del processo provami.
Suggerimento: determinare il PID del processo e poi usare un'opportuna opzione del comando kill.