Estratto del documento

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,

Anteprima
Vedrai una selezione di 9 pagine su 38
Appunti Informatica per umanisti Pag. 1 Appunti Informatica per umanisti Pag. 2
Anteprima di 9 pagg. su 38.
Scarica il documento per vederlo tutto.
Appunti Informatica per umanisti Pag. 6
Anteprima di 9 pagg. su 38.
Scarica il documento per vederlo tutto.
Appunti Informatica per umanisti Pag. 11
Anteprima di 9 pagg. su 38.
Scarica il documento per vederlo tutto.
Appunti Informatica per umanisti Pag. 16
Anteprima di 9 pagg. su 38.
Scarica il documento per vederlo tutto.
Appunti Informatica per umanisti Pag. 21
Anteprima di 9 pagg. su 38.
Scarica il documento per vederlo tutto.
Appunti Informatica per umanisti Pag. 26
Anteprima di 9 pagg. su 38.
Scarica il documento per vederlo tutto.
Appunti Informatica per umanisti Pag. 31
Anteprima di 9 pagg. su 38.
Scarica il documento per vederlo tutto.
Appunti Informatica per umanisti Pag. 36
1 su 38
D/illustrazione/soddisfatti o rimborsati
Acquista con carta o PayPal
Scarica i documenti tutte le volte che vuoi
Dettagli
SSD
Scienze matematiche e informatiche INF/01 Informatica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher immensamentedafne di informazioni apprese con la frequenza delle lezioni di Informatica per gli umanisti e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli studi di Genova o del prof Gaggero Tomaso.
Appunti correlati Invia appunti e guadagna

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community