SOFTWARE
Uno dei principali punti di forza dell’architettura di von Neumann è il fatto che
nella stessa unità di memorizzazione siano presenti sia i dati da elaborare sia il
software, cioè l’insieme delle istruzioni necessarie per elaborarli. Il software
rappresenta l’intelligenza del calcolatore: è ciò che consente alla macchina di
svolgere le sue attività e che la rende estremamente flessibile, permettendole di
risolvere problemi molto diversi tra loro.
Alla base del software vi è il concetto di algoritmo, definibile come una
sequenza di istruzioni la cui esecuzione consente di trattare l’informazione e di
risolvere uno specifico problema. Affinché un algoritmo possa essere eseguito
da un calcolatore, deve essere espresso in un linguaggio formale e non deve
presentare ambiguità. Tuttavia, queste non sono le uniche caratteristiche
richieste.
Gli algoritmi possono essere compresi anche facendo riferimento ad esempi
della vita quotidiana, come le ricette di cucina, le istruzioni di un
elettrodomestico o i procedimenti matematici. In tutti questi casi esiste un
esecutore, vi sono grandezze in ingresso e in uscita, le istruzioni sono
elementari, in numero finito ed eseguibili in un tempo finito, e l’esecuzione
ripetuta produce sempre lo stesso risultato. In ambito informatico l’esecutore è
il calcolatore, le grandezze in ingresso sono gli input e quelle in uscita sono gli
output, mentre le istruzioni elementari sono le operazioni che la CPU può
eseguire direttamente.
Un algoritmo può quindi essere definito come una sequenza finita di istruzioni
atomiche, cioè non ulteriormente scomponibili, non ambigue e finite, in grado
di produrre un risultato in un tempo finito. Gli algoritmi devono inoltre essere
eseguibili un numero illimitato di volte, producendo sempre lo stesso risultato:
si parla in questo caso di algoritmi deterministici.
Un esempio classico di confronto tra algoritmi è il problema di Alice e Bob, in
cui Alice deve indovinare un numero scelto da Bob ponendo domande a cui si
può rispondere solo sì o no. L’algoritmo basato sulla ricerca esaustiva prova
tutti i numeri uno per uno e nel caso peggiore richiede un numero di domande
pari al numero dei casi possibili. L’algoritmo basato sulla ricerca binaria,
invece, dimezza a ogni passo l’insieme dei numeri possibili e richiede un
numero di domande molto inferiore. Entrambi gli algoritmi sono corretti, ma
hanno efficienza diversa.
Gli algoritmi possono essere classificati in vari modi: algoritmi sequenziali, che
eseguono un’istruzione alla volta, e algoritmi paralleli, che eseguono più
istruzioni contemporaneamente; algoritmi deterministici, che seguono sempre
un percorso definito, e algoritmi non deterministici, che effettuano scelte
casuali.
La complessità di un algoritmo misura le risorse necessarie per la sua
esecuzione, come il tempo di calcolo, lo spazio di memoria e la banda
trasmissiva. Per uno stesso problema possono esistere più algoritmi corretti, che
però differiscono per la loro complessità computazionale. Alcuni problemi sono
risolubili, cioè esiste un algoritmo che fornisce una soluzione in tempo finito
per ogni possibile input, mentre altri sono non risolubili.
Tra i problemi risolubili si distinguono quelli trattabili, risolvibili in tempo
polinomiale, e quelli intrattabili, che richiedono tempi di calcolo esponenziali o
fattoriali, rendendo di fatto impossibile la loro risoluzione all’aumentare della
dimensione del problema. In questo contesto si introducono le classi di
complessità P e NP, che distinguono i problemi risolvibili rispettivamente da
algoritmi deterministici e non deterministici in tempo polinomiale.
Per rendere più semplice la programmazione, inizialmente si è sviluppato il
linguaggio assemblatore, che associa a ogni istruzione binaria del linguaggio
macchina una rappresentazione simbolica più comprensibile. Un programma
detto assembler traduce il codice assembly in linguaggio macchina. Tuttavia,
questo approccio resta complesso e poco intuitivo.
Per questo motivo sono nati i linguaggi di programmazione, più vicini al
linguaggio naturale e alla logica umana. Essi richiedono comunque una
traduzione in linguaggio macchina, che può avvenire tramite un compilatore,
che produce un programma oggetto, oppure tramite un interprete, che traduce ed
esegue le istruzioni una alla volta.
Il software è considerato un’opera dell’ingegno ed è regolamentato dal diritto
d’autore. Il produttore può concedere il codice sorgente o solo una licenza
d’uso. Esistono inoltre software shareware, freeware e software libero o open
source, che permettono l’uso e la modifica del codice secondo specifiche
licenze.
Tra le principali categorie di software vi è il software applicativo, che
comprende programmi di videoscrittura, fogli elettronici, presentazioni
multimediali, gestione di basi di dati, grafica, editor web e applicazioni per
dispositivi mobili. Le mobile app sono progettate specificamente per
smartphone e tablet e sfruttano caratteristiche come GPS e connettività.
Accanto al software applicativo è fondamentale il sistema operativo, che
consente il funzionamento del calcolatore. Il sistema operativo gestisce
l’interazione con l’utente, le risorse hardware e l’esecuzione delle applicazioni.
I suoi componenti principali sono il kernel, il gestore della memoria, il gestore
dei dispositivi di input/output, il file system, il gestore della rete e l’interprete
dei comandi. I moderni sistemi operativi gestiscono anche permessi e livelli di
privilegio per garantire un uso corretto delle risorse. Esempi di sistemi operativi
sono Unix, Linux, Windows e macOS.
Nei primi computer, i sistemi erano monoprogramma, cioè potevano eseguire
un solo programma alla volta e non disponevano di sistema operativo. I
programmatori scrivevano istruzioni e dati su schede perforate e dovevano
attendere ore prima di analizzare l’output, con la CPU spesso inattiva. Per
migliorare l’efficienza, venne introdotto il monitor, primo rudimentale sistema
operativo, che permetteva di organizzare e automatizzare l’esecuzione di più
programmi tramite job. Negli anni ’60 si sviluppò la multiprogrammazione,
che consentiva di avere più programmi in memoria centrale, eseguendone uno
per volta nella CPU mentre gli altri attendevano operazioni lente come I/O o
accesso alla memoria di massa. Con l’interazione tramite tastiera, le
applicazioni si distinsero in I/O-bound, interattive e con la CPU spesso in attesa
dell’utente, e CPU-bound, che richiedono un uso costante della CPU.
Il concetto di timesharing consente di suddividere il tempo della CPU tra più
processi. Un processo è un programma in esecuzione, dinamico, identificato da
un numero unico (PID), e può essere in stato pronto, in esecuzione o in attesa.
Quando un processo passa da in esecuzione a pronto, il sistema operativo salva
lo stato della CPU (registri) e ripristina quello del nuovo processo, operazione
nota come context switching. Lo scheduling può essere effettuato con strategie
come il round robin, in cui a ciascun processo viene assegnato un intervallo di
tempo, dopo il quale ritorna in coda se non terminato.
La multiprogrammazione richiede una gestione attenta della memoria centrale.
La RAM è limitata, quindi l’OS deve allocare spazio sufficiente a ciascun
processo, proteggere le aree di memoria dai conflitti e garantire l’efficienza
nell’uso delle risorse. Anche le periferiche richiedono gestione condivisa. Il
sistema operativo crea periferiche virtuali, in modo che ogni processo creda di
avere la periferica tutta per sé, mentre l’OS gestisce i conflitti reali. I driver
traducono comandi generici in istruzioni specifiche per il dispositivo fisico e
vengono spesso installati automaticamente quando si collega una nuova
periferica.
La gestione della memoria di massa è affidata al file system, che organizza
dati e programmi in file strutturati in cartelle, generando una struttura ad albero.
Ogni file e cartella ha nome, percorso, formato, dimensioni, data di creazione e
modifica e autorizzazioni. Alcuni file system consentono di creare link, che
simulano file o cartelle in altre posizioni. Le operazioni principali sui file sono
creare, leggere, modificare, rinominare o cancellare.
Il sistema operativo gestisce anche la rete, garantendo che utenti e applicazioni
possano comunicare senza conoscere dettagli dei dispositivi o dei protocolli
sottostanti. Controlla l’accesso alle risorse per la sicurezza dei dati. Le
interazioni in rete possono essere uomo–calcolatore locale, uomo–calcolatore
remoto tramite client e server, o uomo–uomo tramite calcolatori collegati a
server, come nelle chat o videoconferenze.
L’interfaccia con l’utente consente di comunicare con il sistema operativo e
include l’autenticazione, che garantisce accesso sicuro e personalizzazione
dell’ambiente. L’autenticazione può basarsi su conoscenza (password), possesso
(smart card) o caratteristiche fisiche (impronte digitali). Nei primi sistemi
operativi era presente solo la CLI, a linea di comando; dagli anni ’80 si sono
diffuse le GUI con finestre, icone e mouse, e recentemente si sviluppano
interfacce multimodali con input/output multipli.
La virtualizzazione permette di eseguire più sistemi operativi sulla stessa
macchina tramite un hypervisor, che crea macchine virtuali isolate, ognuna con
il proprio OS e applicazioni. Questo consente di superare i limiti di un singolo
sistema operativo e trasferire facilmente le macchine virtuali tra computer.
Infine, il sistema operativo deve proteggere il computer dai malware, software
progettato per danneggiare o infiltrarsi nel sistema. I tipi principali includono
virus, che si diffondono infettando altri programmi; worm, programmi autonomi
che si replicano in rete; trojan, che si presentano come applicazioni utili ma
nascondono funzioni dannose; ransomware, che limita l’uso del computer
chiedendo un riscatto; spyware, che raccoglie informazioni sull’utente; adware,
che mostra pubblicità indesiderata; e crimeware, usato per furti d’identità. La
difesa si basa su buonsenso nell’aprire file e navigare sul web, e sull’uso di
firewall e antivirus sempre aggiornati.
In sintesi, il sistema operativo coordina CPU, memoria, periferiche, file, rete e
interfaccia utente, permettendo l’esecuzione efficiente di processi, proteggendo
le risorse e garantendo sicurezza e interazione. La multiprogrammazione e il
timesharing massimizzano l’uso della CPU, il file system e i driver semplificano
la gestione dei dati e dei dispositivi,
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
-
Fondamenti di Informatica per Umanisti
-
Riassunto esame Informatica per umanisti, Prof. Campagnolo Alberto, libro consigliato L'umanista digitale, Teresa N…
-
Appunti Informatica
-
Appunti Informatica