




Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
riassunto di tutte le conoscenze di base necessarie per svolgere l'esame di informatica, il testo tratta di: architettura elaboratori sistemi operativi database network programmi applicativi
Tipologia: Dispense
1 / 8
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!





Algoritmo: Una procedura per risolvere, in un numero finito di passi, un problema Programma: Traduzione di un algoritmo in una serie di istruzioni eseguibili da un computer Linguaggio di programmazione: Linguaggio che permette la formalizzazione di un algoritmo in un programma Calcolatore (o elaboratore): macchina capace di effettuare trasformazioni sui dati (calcoli) Il calcolatore programmabile è una macchina universale: cambiando il programma residente in memoria, è in grado di risolvere I calcolatori sono costruiti assemblando componenti elettronici elementari per memorizzare dati ed eseguire programmi Informazioni inserite tramite sequenze di cifre 0, 1: 0: assenza di tensione elettrica 1: presenza di tensione elettrica un bit (binary digit), che può avere valore 0 o 1, è la più piccola quantità di informazione che può essere riferita un byte è una sequenza di 8 bit (256 valori) perché così ci si riesce ad avvicinare alla quantità di informazioni necessarie per più o meno tutto, come i livelli di grigio per passare dal bianco al nero in un’immagine oppure i caratteri di una lingua la capacità dell’elaboratore di eseguire successioni di operazioni in modo automatico è determinata dalla presenza di un dispositivo di memoria contenente i dati le operazioni da eseguire su di essi (i programmi) Il programma viene interpretato da una unità di elaborazione centrale. L’architettura di base del calcolatore è rimasta la stessa da anni, la sua caratteristica fondamentale è che dati e programmi risiedono nella memoria centrale. I suoi componenti sono:
L’architettura più consolidata per il calcolatore: prevede che la CPU, la memoria e le periferiche siano collegate attraverso un unico canale di comunicazione, il bus Il bus è fisicamente realizzato mediante un insieme di connettori elettrici Una delle caratteristiche del Bus è il numero di bit che riesce a trasportare contemporaneamente (ampiezza) In ogni transazione sul bus:
La CPU (Central Processing Unit) è in grado di eseguire dei programmi, cioè sequenze di istruzioni elementari È costituita da: ALU (unità aritmetico-logica) È un circuito in grado di eseguire operazioni aritmetiche e logiche su 2 o più operandi, rappresentati su n bit (es. 32 o 64 bit); oltre al risultato dell’operazione può produrre informazioni ulteriori. Il tipo di operazione selezionata, in un dato istante, dipende dallo stato della CU Alcune delle operazioni possibili sono quelle: aritmetiche, logiche, di confronto REGISTRI I registri sono dispositivi di memorizzazione che consentono un accesso molto veloce ai dati che contengono; hanno dimensioni prefissate (es. 32 o 64 bit). Nella maggior parte delle architetture, le operazioni della ALU si possono effettuare solo fra dati presenti nei registri. I registri generici hanno lo scopo di memorizzare gli operandi per le istruzioni della ALU ed il risultato. Alcuni registri hanno funzioni specifiche: Instruction Register (IR): contiene l’istruzione da eseguire Program Counter (PC): contiene l’indirizzo della locazione di memoria dove è memorizzata la prossima istruzione da eseguire UNITÀ DI CONTROLLO Preleva dalla memoria l’istruzione da eseguire (tale istruzione è determinata dal registro PC) e la salva nel registro IR Decodifica l’istruzione e capisce cosa deve essere fatto: che tipo di circuito della ALU deve essere attivato, dove reperire gli eventuali operandi, etc. Attiva la ALU e gestisce il risultato
L’orologio di sistema (Clock) invia impulsi ad intervalli regolari predefiniti alle altre componenti del sistema e la CPU utilizza questi impulsi per sincronizzare le sue attività. La velocità del clock, ovvero il numero di impulsi al secondo inviati dal clock, si misura in Hz. Maggiore è la velocità di clock, maggiore e la velocità della CPU (attenzione! none l’unico fattore per determinare la velocità di tutto il calcolatore). Attualmente, il clock di una CPU di un PC `e sull’ordine dei gigahertz (GHz), miliardi di cicli al secondo CICLO FDE (Fetch, Decode, Execute) Il processore esegue le istruzioni di un programma una alla volta in sequenza: estrae le istruzioni dalla memoria, le interpreta e le esegue una dopo l’altra. Il processore esegue ogni istruzione mediante una sequenza ben definita di operazioni detta ciclo di accesso, decodifica, esecuzione: Fetch: Lettura del contenuto della cella di memoria il cui indirizzo è il valore del registro PC Copia di tale contenuto nel registro IR Incremento del valore di PC in modo che punti all’istruzione successiva Decode: Analizza il codice dell’istruzione: seleziona il corrispondente circuito della ALU, trova gli eventuali operandi dell’istruzione se l’istruzione è di salto, modifica il valore del registro PC Execute: Attiva i circuiti della ALU
seguente istruzione: “somma il contenuto dei registri R1 e R3 e memorizza il risultato nel registro R4”. Supponendo di avere nel registro PC l’indirizzo 26 (o 0x0001A in esadecimale) dell’istruzione descritta sopra e che la dimensione dell’istruzione sia 4 byte. Fase di reperimento dell’istruzione (fetch): Lettura del contenuto della cella di memoria numero 0x0001A e copia di tale contenuto nel registro IR Incremento del valore di PC: PC=0x0001A +4=0x0001E Fase di decodifica (Decode): Selezionare il circuito della somma della ALU e selezionare i registri R1 e R3 come input ed il registro R4 come output Fase di Esecuzione (Execute): Attivare il circuito somma della ALU
Le memorie sono dispositivi per l’immagazzinamento delle informazioni, ogni memoria è costituita da celle a cui si accede tramite un indirizzo. Tipi di accesso: Diretto: ogni record può essere acceduto senza dover leggere gli altri record partendo dalla posizione corrente (ci vuole del tempo per raggiungere un record passando sopra a quelli prima senza leggerli, non è immediato) Sequenziale: leggere locazioni che non siano la successiva prevede di passare sopra tutti gli altri record, e necessita di un tempo proporzionale. Generalmente in un elaboratore vi sono tre tipi di memorie: Registri: contengono informazioni necessarie alla elaborazione della singola istruzione Memoria centrale: contiene dati e istruzioni attualmente elaborati dal processore Memorie di massa: contengono dati e programmi che non sono oggetto di elaborazione immediata RAM La memoria centrale o memoria principale, detta anche RAM (Random Access Memory, ovvero memoria ad accesso casuale, perchè qualsiasi cella può essere letta/scritta in un tempo, mediamente, costante), è la memoria in linea con il processore, che contiene i dati e i programmi che sono attualmente utilizzati/in esecuzione Un programma, quando non è oggetto di elaborazione, è memorizzato su memoria di massa (dischi), quando deve essere eseguito, viene caricato tutto o in parte, in memoria centrale. La RAM può essere considerata come una sequenza di celle ciascuna cella ha la dimensione di un byte (8 bit), ciascuno di essi è individuato nella memoria da un indirizzo che lo distingue da tutti gli altri, costituito da un numero variabile da 0 a 2N-1, dove N è la dimensione in bit della parola (ovvero dei registri del processore). Le operazioni che si effettuano sulla memoria sono operazioni di lettura e scrittura : Entrambe presuppongono l’utilizzo di un indirizzo che identifica univocamente la cella interessata all’operazione L’operazione di scrittura è distruttiva, cioè cancella l’informazione precedentemente contenuta nella cella L’operazione di lettura preserva il contenuto della cella indirizzata, poiché all’esterno della memoria centrale viene trasferita copia dell’informazione Le caratteristiche fondamentali della memoria centrale sono: accesso casuale (i.e. stesso tempo di accesso) ad ogni cella (indipendentemente dal suo indirizzo) velocità elevata (circa 10-7^ o meno secondi per un accesso) volatilità : quando il computer viene spento, i dati e i programmi presenti nella RAM vengono cancellati Un moderno personal computer ha in genere da 1 a 16 Gigabyte di memoria RAM (1GB = circa 1.000.000.000 byte)
La macchina hardware corrisponde alle componenti fisiche del calcolatore (quelle viste nella lezione precedente), mentre un sistema operativo è un programma che funge da interfaccia tra l’utente (e/o i programmi applicativi) e l’hardware del calcolatore. Il software può essere suddiviso in due grandi classi: programmi applicativi , che risolvono i problemi degli utenti: editor di testi, browser, visualizzatore di immagini... programmi di sistema , che controllano e coordinano l’utilizzo delle risorse hardware da parte dei programmi applicativi dell’utente. L’insieme dei programmi di sistema forma il sistema operativo (SO) Esistono vari tipi di sistemi operativi: Unix, DOS, Windows, Mac OS, Linux, Android. Elementi principali di un SO: Shell (guscio), l’interfaccia tra SO e utente (quello che vedi quando accendi il computer): è il programma che permette agli utenti di comunicare con il sistema e di avviare programmi applicativi. La shell può essere grafica (Windows, Mac OS, Linux, Android) oppure testuale (DOS ma anche Linux) Kernel (nucleo), l’insieme di programmi che realizzano le funzioni di base di un calcolatore: gestione della memoria principale, gestione di più programmi in esecuzione contemporaneamente, gestione della memoria di massa... GESTIONE DELLA MEMORIA SECONDARIA Poiché la memoria principale è volatile e troppo piccola per contenere tutti i dati e tutti i programmi in modo permanente, il computer è dotato di memoria secondaria (hard disk). Il SO garantisce una visione logica uniforme del processo di memorizzazione: Nasconde le caratteristiche fisiche della memoria di massa. Fornisce all’utente e a programmi applicativi un modello astratto secondo il quale i dati sono organizzati (cartelle): il File System I componenti base del modello sono i file e le cartelle un file è una sequenza di byte che contiene informazioni tipicamente “omogenee”, ad esempio un programma, un testo, un’immagine, una canzone. Per ogni file però vengono anche memorizzate ulteriori informazioni come: il nome, la data di creazione e l’ultima modifica, dimensione…. una cartella (directory) è un contenitore di file (e cartelle) FILE SYSTEM Il file è l’astrazione informatica di un archivio di dati, il concetto di file è indipendente dal mezzo sul quale viene memorizzato (che ha caratteristiche proprie e una propria organizzazione fisica). Un file system è composto da un insieme di file Il SO è responsabile delle seguenti attività riguardanti la gestione del file system: Creazione e cancellazione di file Creazione e cancellazione di directory Manipolazione di file e directory Codifica del file system sulla memoria secondaria Quasi tutti i SO utilizzano un’ organizzazione gerarchica del file system ad albero (o a grafo in alcuni casi). Nella figura i nodi rettangolari rappresentano le cartelle mentre i nodi circolari i file Un file è identificato dal percorso dalla radice dell’albero: il percorso del file “hi” è “/principale/A/hi” Possono esistere file con lo stesso nome se sono in cartelle diverse (ad esempio i file “e”) È possibile navigare all’interno del file system percorrendo gli archi in un qualsiasi verso. Ad esempio, se mi trovo nella cartella “A” e sto utilizzando una shell grafica, cliccando su “b” mi sposto nella cartella “b” Per riferirmi ad un file posso indicare: il percorso dalla radice dell’albero ( percorso assoluto ) il percorso a partire dalla mia posizione corrente ( percorso relativo ) Ad esempio, se mi trovo nella cartella “A” posso riferirmi a “d” semplicemente come “b/d” Nel SO Linux la radice, ed il carattere per separare le cartelle, sono indicati con / Il S O Windows utilizza una rappresentazione ad albero per ogni memoria di massa: La radice di ciascun albero è indicata con una lettera seguita da due punti e , ad esempio C:\oppure D:
Il carattere per separare le cartelle è \ il percorso assoluto del file “hi” `e “C:\principale\A\hi”
I primi SO erano tutti monotasking, cioè erano in grado di gestire l’esecuzione di solamente un programma per volta, mentre tutti i moderni SO sono multitasking, grazie all’utilizzo del gestore di processi GESTORE DI PROCESSI Con questo un SO consente il caricamento in memoria e l’esecuzione di più programmi che si alternano nell’uso della CPU. Per far ciò un programma dev’essere eseguito, sospeso e fatto ripartire più volte in poco tempo ed è quindi necessario memorizzare sia il programma che lo stato di esecuzione, cioè l’insieme delle informazioni che sono necessarie per far ripartire il programma dal punto esatto in cui è stato sospeso. In poche parole, il gestore dei processi “realizza” una macchina virtuale in cui ciascun programma opera come se avesse a disposizione un’unità di elaborazione dedicata: se sto eseguendo 3 programmi contemporaneamente, il gestore ci fa credere di avere 3 CPU. Per farlo “divide” la memoria in parti e assegna a ciascun programma un pezzo di memoria, quando questi non ci stanno più li sposta sul disco ed è per questo che se si aprono troppi programmi contemporaneamente diventano lenti (vedi gestore della memoria). Il SO è responsabile, tra le altre cose, delle seguenti attività riguardanti la gestione dei processi: creazione e terminazione dei processi sospensione e riattivazione dei processi comunicazione tra processi Esistono varie politiche per decidere quando e per quanto tempo assegnare la (le) CPU ad un processo: nei sistemi time-sharing ad ogni processo è assegnata la stessa quantità di tempo. Nel grafico i rettangoli neri indicano il tempo che la CPU ha dedicato ai 3 processi A, B, C. Lo spazio tra le linee tratteggiate indica il tempo impiegato per la sospensione del processo in esecuzione ed il ripristino del successivo. il gestore dei processi deve: assicurare che ogni processo non debba aspettare eccessivamente per ottenere la CPU (altrimenti l’utente si spazientisce!); in altri termini il tempo tra la sospensione e il ripristino di un processo non deve essere troppo lungo (nella figura, B viene sospeso all’istante 5 e riavviato all’istante 18 ( unità di tempo di attesa). massimizzare il tempo in cui la CPU esegue programmi e minimizzare il tempo speso a sospendere e ripristinare processi (la CPU deve eseguire programmi, non perdere tempo a fare altro!); in altri termini vogliamo mantenere piccolo la somma dei tempi tra le linee verticali tratteggiate (nell’esempio tale somma è 4 nei primi 25 istanti) GESTORE DELLA MEMORIA Il gestore della memoria si occupa di: Tenere traccia di quali parti della memoria sono usate e da chi Allocare e deallocare lo spazio di memoria quando necessario Decidere quali processi caricare quando diventa disponibile spazio in memoria Il gestore della memoria “realizza” una macchina virtuale in cui ciascun programma opera come se avesse a disposizione una memoria dedicata: MEMORIA VIRTUALE. Nei SO multi−tasking, più programmi possono essere caricati contemporaneamente in memoria, spesso però la memoria non è sufficiente per contenere completamente tutto il codice dei processi. Il gestore della memoria ci permette di barare realizzando una memoria “virtuale” molto più grande di quella fisica: Teniamo, per ogni programma, solo un sottoinsieme dei suoi dati e delle sue istruzioni. Il resto le parcheggiamo nella memoria di massa (tecnicamente nella cosiddetta area di swap) Quando la CPU richiede un’istruzione (o un dato) non in memoria, questa viene recuperata in fretta dalla memoria di massa, carica in memoria principale, e poi inviata alla CPU.
Le reti possono essere classificate in diversi modi: estensione geografica
La macchina hardware permette l’esecuzione di programmi applicativi, che interagiscono con le risorse della macchina hardware (CPU, memoria primaria e secondaria, dispositivi di I/O) tramite il sistema operativo. I programmi applicativi: risolvono i problemi degli utenti: fogli di calcolo, editori di testi, browser, visualizzatore di immagini e/o video… sono tipicamente realizzati/definiti tramite un linguaggio di programmazione ad alto livello (C++, Java, Python …) implementano uno o più algoritmi ALGORITMO Insieme ordinato (e finito) di passi eseguibili e non ambigui (per risolvere un problema) che giunge (certamente) a terminazione insieme ordinato di passi non necessariamente sequenza: possono essere disponibili più esecutori passi eseguibili da un esecutore in grado di compiere azioni fattive (e finite) e non ambigui l’esecutore deve essere in grado di associare univocamente un passo ad una (o più) azioni che giunge a terminazione in modo da trovare una soluzione ad un problema di interesse, anche se la natura di alcuni problemi potrebbe non necessariamente richiedere la terminazione (funzionamento del SO o la videosorveglianza). per evitare incomprensioni di comunicazione di algoritmi fra umani/esecutori bisogna fissare una convenzione per rappresentarli, cioè un linguaggio (di programmazione). PSEUDOCODICE Una notazione (linguaggio) meno formale per la rappresentazione di algoritmi è costituito dallo pseudocodice, non costituisce un vero e proprio linguaggio formale ma è utile quando si vogliono esprimere le componenti astratte di un algoritmo. Aiuta nel processo di sviluppo di un algoritmo (senza preoccuparsi del linguaggio di programmazione che poi sarà utilizzato) Adotta primitive, comuni a molti linguaggi strutturati di programmazione, che si possono raggruppare nelle seguenti classi principali: assegnamento : istruzione che assegna il risultato di un calcolo ad una variabile, che rappresenta un identificativo astratto di una locazione (o insieme di locazioni) in memoria sequenza : struttura di controllo che permette di eseguire le istruzioni secondo l’ordine in cui sono state scritte selezione : struttura di controllo che permette di scegliere l’esecuzione di un blocco di istruzioni tra due possibili in base a una condizione iterazione : struttura di controllo che permette di ripetere l’esecuzione di un blocco di istruzioni in base al valore di una condizione procedura : struttura che permette di riutilizzare una unità di programma (procedura)