




















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
Appunti lezioni informatica più esempi di esercizi
Tipologia: Appunti
1 / 28
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!





















L’information Technology Il computer può esser visto sotto due differenti aspetti: la parte logica e la parte fisica. ➢ La parte logica è costituita da tutte quelle operazioni che il computer riesce a fare = da un punto di vista logico il computer è un dispositivo che realizza la possibilità di scomporre processi complessi in lunghe sequenze di azioni molto semplici eseguibili in serie → il computer esegue queste operazioni e fornisce la risposta che descrive il processo. Il computer non può fare cose che una qualsiasi persona non riesce a fare, il vantaggio difatti è che il computer riesce a fare le stesse cose ma in maniera molto più veloce = il computer non è altro che una macchina a cui si dà un input, la quale risponde in maniera veloce e rapida fornendo un output. Ci sono cose che anche al computer sono precluse, in termini di calcoli, che quindi anche il computer non riesce a compiere in un tempo accettabile, come ad es. decriptare una password. ➢ La parte fisica è tutta ciò che è tangibile = da un punto di vista fisico il computer è un dispositivo costituito da una serie di circuiti elettronici ed elettrici, in cui passa o meno corrente. ↓ Solitamente al computer si dà una sequenza di lampi di corrente = i calcolatori “capiscono” solo due condizioni ossia il passaggio o meno della corrente elettrica, difatti assumono solo due stati: “ aperto ” e “ chiuso ” → i due stati aperto o chiuso vengono rappresentati dai due bit 0 e 1 (l’entità minima di informazione all’interno di un elaboratore prende il nome di bit) → tutta l’informazione quindi deve esser codificata in questo modo, con sequenze di 0 e 1, queste vengono chiamate sequenze binarie. Per poter far elaborare l’informazione ad un calcolatore occorre codificarla nel linguaggio binario (digitalizzarla). Le prime applicazioni erano principalmente di tipo numerico. I modi possibili per porre gli elementi 1 all’interno di sequenze 3 sono 8. Ad oggi Il metodo di codifica più diffuso tra i produttori di hardware e di software prende il nome di codice ASCII (si tratta di uno standard stabilito a tavolino). Ad ogni lettera, simbolo e numero viene assegnato una determinata una certa sequenza di bit → in questo modo si riesce con 7 bit (2^7 = 128), poi allungati ad 8 bit, a codificare tutti i simboli necessari, ossia quelli della tastiera. Il computer risponde con la codifica in binario. La codifica ASCII codifica i simboli, mentre quella precedente i numeri, per cui sono 2 cose diverse, nell’ASCII è il simbolo 0, l’altro è il numero 0 → bisogna fare attenzione al tipo di dato. Lettere e numeri non costituiscono le uniche informazioni utilizzate dagli elaboratori ma si stanno diffondendo sempre di più applicazioni che utilizzano ed elaborano anche altri tipi di informazione: diagrammi, immagini, suoni → spesso in questi casi si parla di applicazioni di tipo multimediale.
Digitalizzazione immagini Nel caso dell’immagine la digitalizzazione avviene inserendo l’immagine all’interno di una griglia con un determinato numero di quadretti con l’obbiettivo di approssimare l’immagina. Ad ogni quadrato si stabilisce un bit, per cui poi l’immagine sarà codificata tramite una sequenza di bit (es. stringa binaria = 0000000 0111100 0110000 0100000). Alla fine si otterrà un certa immagine con una certa risoluzione → la risoluzione indica in numero di righe e colonne della griglia. Quello che si ottiene nella codifica è un’approssimazione della figura originaria, la rappresentazione sarà più fedele all’aumentare del numero di pixel, ossia al diminuire delle dimensioni dei quadratini della griglia in cui è suddivisa l'immagine = è possibile infittire la griglia in maniera tale da non perdere informazioni o comunque in maniera impercettibile. La codifica quindi ha perdita di informazioni, si parla infatti di codifica loss ≠ la codifica dei numeri invece non comporta perdita di informazioni, in questo caso c’è possibilità di ritorno, si parla infatti di codifica loss less. Assegnando un bit ad ogni pixel è possibile codificare solo immagini senza livelli di chiaroscuro → per codificare le immagini con diversi livelli d’intensità di grigio si usa la stessa tecnica: per ogni pixel si stabilisce il livello medio di grigio a cui viene assegnata convenzionalmente una rappresentazione binaria → in questo caso però per memorizzare un pixel non è più sufficiente un solo bit = ad esempio, se usiamo quattro bit possiamo rappresentare 2^4 =16 livelli di grigio, mentre con otto bit ne possiamo distinguere 2^8 =256 ecc. Analogamente possiamo codificare le immagini a colori → in questo caso si tratta di individuare un certo numero di sfumature di colore differenti e di codificare ogni sfumatura mediante un'opportuna sequenza di bit → per ciascun pixel quindi viene fatta una codifica del colore del pixel, per cui si avrà non più solo un bit ma 8, 16 bit ecc. La codifica di un’immagine pixel per pixel è una codifica che mi dà la mappa dei bit, il formato è infatti bitmap. Il numero di byte per codificare una immagine dipende dalla risoluzione e dal numero di colori che ogni pixel può assumere (le sequenze di 8 bit vengono chiamate byte). Passaggio Decimale-Binario Per rendere un numero decimale binario si esegue delle divisioni per 2 annotando i resti delle divisioni ed il quoziente finale → la sequenza numeri di elementi di 0 e 1 rappresenta la codifica binaria del numero decimale. La decifrazione binario invece è posizionale, quindi a seconda di dove metto lo 0 e l’1 può esser una duina, una quattrina ecc → bisogna moltiplicare ogni bit della stringa per la potenza di 2 corrispondente all’indice della cifra considerata e sommando tutti i risultati.
La CPU o microprocessore è un chip integrato costituito da una piccola piastra di silicio sulla cui superficie sono stati creati milioni transitor miniaturizzati. La CPU è nella scheda madre ← esso compie molte operazioni al secondo, per cui si riscalda molto, difatti c’è bisogno di una ventola per raffreddarlo. I tempi di lavoro della CPU sono scanditi dal clock, il quale è un orologio interno che dà la frequenza di operazioni al processore. Ogni istruzione ha un suo battito di clock, queste istruzioni scandiscono il ciclo di fde → la frequenza di clock determina quindi la velocità della CPU = per cui uno stesso processore con clock diversi può esser più o meno performante. Se il clock è veloce, il processore non ce la fa a stargli dietro, se è troppo lento le capacità del processore sono inutilizzate. È possibile fare l’ over clock , che consiste nel modificare il tempo di clock. Il processore non è un blocco unico ma è composta da 3 unità: l’unità di controllo, unità logico-aritmetica e i registri. ➢ Unità di controllo (UC) = si occupa di coordinare le attività che vengono svolte all’interno del processore, esegue operazioni finalizzate al trasferimento dati tra RAM e registri e al controllo dell’esecuzione dei programmi. Il processore svolge la sua attività in modo ciclico: ad ogni ciclo viene corrisposta l’esecuzione di un’istruzione macchina → in particolar modo ad ogni ciclo vengono svolte diverse attività chiamate fetch-decode-execute = si ha una serie di ripetizione a tempo di clock di fetch-decode-execute. ▪ Si legge, cioè si carica, dalla memoria principale la prossima istruzione da eseguire (fetch). ▪ Si decodifica l’istruzione e si caricano eventuali dati dalla memoria (decode). ▪ Si esegue l’istruzione (execute). ▪ Si memorizza un eventuale risultato (informazione elaborata) in memoria. L’unità di controllo coordina queste 3 attività e dice all’ALU quando fare la sua attività = preleva i dati e li interpreta e fa eseguire l’istruzione alla ALU. ➢ Unità logico aritmetica (ALU) = è costituita da un insieme di circuiti in grado di svolgere fisicamente le operazioni matematiche e logiche sui dati che sono contenuti nei registri e memorizzare il risultato in uno dei registri generali ← essa scrive e legge i dati all’interno dei registri generali. In alcuni elaboratori oltre alla ALU si può avere un processore specializzato, ossia il coprocessore matematico che è un processore specializzato in determinati compiti e operazioni matematiche particolari. ➢ Registri = essi sono delle unità di memoria estremamente veloci contenute nella CPU e contengono dell’informazioni di necessità immediata per il processore, come le istruzioni da eseguire, i dati da elaborare , e informazioni accessorie (es. eventuali anomalie generate dall’esecuzione) sullo stato
all’interno della CPU = è la fotografia in ogni stato di tutto ciò che c’è nei registri. La memorai registri contiene sia gli ingressi che le uscite della ALU. Le dimensioni dei registri sono di pochi byte (4,8). Esistono 2 tipi di registri: o Quelli speciali, utilizzati dalla UC per scopi particolari. o Quelli di uso generale, dove vi sono le operazioni da eseguire (registri aritmetici).
Memoria centrale (RAM = random access memory) Essa memorizza e fornisce l’accesso a dati e programmi in esecuzione. La memoria contiene almeno due tipi di informazioni: la sequenza di istruzioni che devono essere eseguite dal processore e l’insieme di dati (informazioni) su cui tali istruzioni operano. Essa ha capacità limitate (alcuni GB L→ le misure della RAM sono solitamente 2/4/8 GB. La RAM non conviene prenderla gigantesca perché la quantità di operazioni che la macchina può eseguire sono limitate), ed è volatile, per cui quando spengo il computer qualsiasi cosa presente lì viene cancellata. Ciò che rende la RAM indispensabile è la velocità di accesso = la CPU riesce ad accedere alla RAM tramite dei BUS rapidi che permettono di esprime alla CPU la propria potenza di calcolo. ↓ In modo specifico la memoria centrale è una sequenza di cella in cui si inseriscono bit: ogni cella non contiene un bit ma una parola, che è un byte o 2 byte o un multiplo di byte → le parole di uno stesso calcolatore hanno tutte la stessa lunghezza. Qualsiasi cella di memoria ha un accesso diretto , poiché ciascuna cella di memoria è identificata da un numero (indirizzo) che ne specifica l’esatta posizione all’interno della memoria ← questo è fondamentale xkè aumenta fortemente le prestazioni. La memoria centrale è detta RAM (Random Access Memory), cioè “memoria ad accesso casuale” → non significa che i dati sono sparpagliati a caso, bensì vuol dire che per qualsiasi cella scelta a caso il tempo di accesso è lo stesso (tempo d’accesso ~ 10ns, cioè 10-8 secondi). Esiste una memoria più veloce della RAM, ossia la CACHE. Nello schema di funzionamento di un calcolatore il processore continuamente preleva informazioni ed istruzioni dalla memoria centrale e scrive in essa informazioni = c’è un dialogo tra processore e RAM → il problema è che la memoria centrale, il bus ed il processore lavorano a velocità diverse e la velocità complessiva del sistema è determinata dal componente più lento. Per accelerare questa interazione si impiega questa memoria ad alta velocità localizzata tra processore e memoria centrale → le informazioni prima vengono cercate dal processore nella CACHE, se poi qui non vengono trovate allora il processore chiede alla memoria centrale di fornire l’elemento richiesto. Ci sono alcune tecniche per decidere cosa memorizzare nella CACHE. È dimostrato statisticamente che per la maggior parte delle volte gli utenti accedono sempre alle stesse informazioni e chiedono al computer sempre le stesse operazioni ← se dati ed istruzioni più frequentemente usati dal processore si trovano nella cache allora si ha una grande velocizzazione delle operazioni (si evita il tempo che è necessario per accedere alla RAM tramite il bus). Memoria ROM (read only memory) La ROM è una memoria di sola lettura e contiene poche cose ma molti utili → solitamente il contenuto è stato registrato in fase di costruzione del computer e non può essere modificato, in realtà non è proprio così, ad esempio talvolta quando si aggiorna il sistema si aggiorna anche il BIOS e questo viene riscritto nella ROM. ↓ Ogni volta che viene acceso il computer esegue un piccolo programma contenuto nella ROM che è un programma che fa diagnostica iniziale della macchina = la parte della ROM che avvia il sistema è detto BIOS (= basic input/output system) → questo programma permette di avviare con sicurezza il sistema operativo. Il BIOS è un tipo di firmware (software non modificabile). In fase di avvio del PC il programma di bootstrap presente nel BIOS effettua test diagnostici di base (identifica il processore, controlla la quantità di RAM e ne verifica il funzionamento, esamina l’hard disk, controlla lo stato delle periferiche collegate e legge il settore dell’hard disk in cui sono contenute le istruzioni per l’ avvio del sistema), per permettere il caricamento del sistema operativo (POST: power-on self test), inoltre carica nella memoria centrale (RAM) la parte principale del sistema operativo ( kernel ).
Interfacce ingresso uscita (I/O) Chiamati anche periferiche , essi vengono impiegati per far comunicare il calcolatore con l’ambiente esterno = la loro funzione primaria è quella di consentire l'immissione dei dati all'interno dell'elaboratore (input), o l'uscita dei dati dall'elaboratore (output). Solitamente hanno limitata autonomia rispetto al processore centrale (←sono completamente gestiti, controllati e coordinati dal processore). Così come le memorie di massa, anche i dispositivi di I/O sono collegati ad dei circuiti (CONTROLLER) che gestiscono il coordinamento
L’unità centrale (case) ha una serie di porte all’esterno attraverso le quali il computer comunica col l’esterno, le porte principali sono le porte parallele, le porte seriali, le porte USB, le porte serial ATA. I terminali, ossia le porte di uscita sono la tastiera, mouse, monitor, stampanti, modem, … Dispositivi di collegamento (BUS) Il processore e le altre componenti del pc comunicano per mezzo di impulsi elettrici. Questi impulsi viaggiano in piste di rame tracciate sulla scheda madre, queste vengono chiamate bus → per cui i bus sono tutti i collegamenti all’interno del computer. A seconda di quali bus si va ad osservare questi hanno nomi specifici. In ogni pista possano passare in contemporanea 32 o 34 bit. Il bus che collega la CPU agli altri dispositivi del computer, fra cui la memoria centrale, si chiama system bus. In ogni istante di tempo il bus collega due unità funzionali: una trasmette i dati e l’altra li riceve ← questo processo viene controllato dall’unità centrale di elaborazione. SCHEDA MADRE (MB) La scheda madre (motherboard) è il supporto per la connessione di tutti i componenti interni del computer e contiene inoltre una serie di circuiti (chipset, cache, BIOS) adibiti al controllo delle varie parti. Come indicato dal suo nome, la scheda madre è una scheda master, a forma di un grande circuito stampato che ha soprattutto dei connettori per le schede d'estensione, per la RAM, il processore, ecc → si tratta di una serie di slot, ossia di posti dove posizionare una serie di componenti del computer. Vi si trovano inoltre le prese per il collegamento dell'hard disk e dei drive per i dischi mobili (floppy e CD). Architettura : tipologia di progettazione adottata dalla scheda madre per scambiare i dati tra CPU e le periferiche inserite (consiste nella posizione dei BUS = come i dati devono fluire all’interno della scheda). L'architettura, in quest’ultimo caso, può essere: ➢ Parallela : (parallelismo spaziale) in un unico calcolatore diverse operazioni (processi) vengono eseguite simultaneamente da più processori. Si ha più processori che possono collaborare e comunicare per compiere una determinata azione (i processori si smistano compiti, questa distribuzione del compito aumenta le prestazioni). Questo è utile per algoritmi di decriptazione. La prima macchina (supercomputer) ad avere questa architettura fu la CDC 6600 nel 1964. ➢ Pipeline : (parallelismo temporale) le operazioni vengono suddivise in stadi successivi da più componenti hardware. Si tratta di un’ architettura seriale = un solo processore che fa più cose in istanti di tempo successivi impercettibili all’essere umano, per cui sembra che le operazioni vengano svolte in parallelo. ➢ Seriale : la CPU esegue un’operazione alla volta.
➢ Socket per la CPU, è una parte fondamentale della MB che accoglie la CPU ← nelle schede embedded (o in quelle vecchie e molto economiche) è assente, e il processore è saldato direttamente sullo stampato. Il socket ha una serie di piedini (pin) che permettono il passaggio dati tra CPU e MB. ➢ Slot per la RAM che possono essere di diversi tipi quanti sono i tipi di RAM. ➢ Chipset = l'insieme di chip che si occupano di smistare e dirigere il traffico di informazioni passante attraverso il Bus di sistema, fra CPU, RAM e controller delle periferiche di input/output (come Floppy disk, Hard disk ecc.). ➢ ROM (Read Only Memory) = è la piccola memoria presente su tutti i personal computer, che in alcuni casi può essere riprogrammata, contenente il BIOS della scheda madre. ➢ CMOS = piccola memoria RAM, in cui sono memorizzate le impostazioni del BIOS. Il CMOS è un semiconduttore che richiede pochissima energia per funzionare. Quando il Personal Computer viene spento, per mantenere memorizzate le impostazioni del BIOS, utilizza una piccola batteria al litio CC = sulla scheda madre c’è una piccola batteria che permette il mantenimento delle informazioni della scheda madre. ➢ Bus di espansione = si tratta di un collegamento dati generico punto-multipunto, progettato per permettere di collegare alla scheda madre delle altre schede di espansione alloggiate su connettori (slot), che ne estendono le capacità. In linea di principio ad un bus può essere collegato hardware di ogni tipo: schede video aggiuntive, schede audio professionali, schede acquisizione dati, unità di calcolo specializzate, scheda video, ecc… Schede di Espansione Schede che espandono le funzioni della scheda madre per pilotare dispositivi interni od esterni. Scheda video su cui si connette il monitor → dalla scheda video dipendono il numero di colori del monitor, la risoluzione massima, la velocità grafica (di giochi, filmati, ecc.) e tutto ciò che riguarda in generale le prestazioni grafiche = permette di ottimizzare le prestazioni del video. Scheda audio , attraverso cui il computer è in grado di produrre o registrare suoni. Per le connessioni dirette alla rete (senza modem) occorre invece dotarsi di una scheda di rete. Modem = MODulatore-DEModulatore di segnale. Dispositivo per la trasmissione e la ricezione in forma analogica o digitale → un modem prende le informazioni digitali contenute in un computer e le converte sotto forma di suoni analogici, che possono essere inviati attraverso una linea telefonica analogica convenzionale. I modem possono anche riconvertire in informazioni digitali i suoni analogici in arrivo (venivano realizzate delle onde apposite per decodificare gli 0 e 1) → il primo procedimento è noto come modulazione e il secondo come demodulazione ; da qui il termine modem. La velocità con cui i modem sono in grado di scambiare i dati si misura in Kbit/secondo (Kbps) ovvero il numero di bit che il modem riesce a trasferire in un secondo. Tipi di modem: ➢ Standard (analogico) = trasferiscono dati alla velocità di 56 Kbps, che rappresenta comunque la capacità massima della linea (normale linea telefonica).
Ci sono vari componenti di un SO : ▪ Gestore dei processi (programmi in esecuzione) ▪ Gestore della memoria principale ▪ Gestore della memoria secondaria ▪ Gestore delle Periferiche (dispostivi di I/O) ▪ Gestore dei file e del file system ▪ Gestore dei sistemi di protezione ▪ Gestore del networking ▪ Sistema di interpretazione dei comandi (interfaccia utente) Il gestore dei processi → un processo è un programma in esecuzione, un processo necessita di certe risorse, tra cui tempo di CPU, memoria file, dispositivi di I/O, per portare a termine il suo compito ← tutto ciò viene fornito dal gestore dei processi. ↓ Il SO è responsabile delle seguenti attività coinvolte nella gestione dei processi: creazione e cancellazione dei processi sospensione e riesumazione dei processi = la sospensione avviene quando ci sono troppi processi in memoria, la riesumazione si ha ad esempio nel caso di una stampante. fornire meccanismi per sincronizzazione dei processi, comunicazione tra processi, ed evitare, prevenire e risolvere i deadlock = i deadlock si hanno quando si pianta il computer o un programma: il gestore dei processi cerca di prevenirlo, gestirlo o risolverlo. In un primo momento vi erano sistemi monoprogrammati (anche detti mono-tasking ) → in sistemi di questo tipo è possibile eseguire un solo programma alla volta = i programmi devono essere eseguiti in modo sequenziale e si può mandare in esecuzione un programma solo quando quello precedente ha terminato l'esecuzione (es. MS/DOS) La politica di gestione in cui il processore lavora in modo sequenziale i vari processi viene chiamata FIFO (=first enter, first out). Nel caso dell’esecuzione mono-tasking il processore ha tutta una serie di processi da eseguire → qualunque processo P alterna fasi di esecuzione a fasi in cui è bloccato in attesa di qualche evento esterno → un processo può essere in attesa che sia terminata un’operazione di input di dati oppure in attesa di poter usare una risorsa in quel momento occupata ← lo svantaggio sono i momenti di attesa. La velocità di elaborazione di un calcolatore (quindi il tempo in cui un processo è in esecuzione) è dell’ordine del milionesimo di secondo, quindi molto minore dei tempi di lavoro delle periferiche di input/output, a volte dell’ordine di secondi, o addirittura i tempi di reazione umani. In un’esecuzione sequenziale, mentre il processo attivo è bloccato in attesa di eventi esterni, il processore rimane inattivo, in uno stato chiamato idle , e risulta pertanto sottoutilizzato. Si tratta di uno stato in cui il processore è fermo e non ha richieste. Questi stati idle vanno limitati e ridotti.
La soluzione per migliorare sia la produttività che la qualità del servizio è quella di lavorare contemporaneamente. In realtà, contemporaneamente non è esatto, infatti, poiché vi è un solo processore nel caso di un computer il servizio non è realmente eseguito in parallelo ma avviene alternando il servizio tra i vari clienti. In questo modo i tempi di inattività sono eliminati → si parla difatti di multi-tasking. In questo caso più programmi vengono eseguiti contemporaneamente sullo stesso processore. Il numero di processi attivi viene detto grado di multiprogrammazione del sistema. Dal punto di vista del processore, in ogni istante vi è un solo processo in esecuzione → se l'alternanza tra i processi è frequente (ad esempio ogni 10 millisecondi), l'utente ha l'impressione che l'esecuzione dei programmi sia veramente simultanea. Un processo quindi può trovarsi in tre diversi stati: 1) In esecuzione = quando sta utilizzando il processore (tutta la CPU è a lui dedicata). 2) In attesa = (bloccato), quando è in attesa del verificarsi di un evento esterno (terminazione di un’operazione di input/output o altro). 3) Pronto = quando è potenzialmente in condizione di poter utilizzare il processore che è occupato da un altro processo. Il processo viene creato, quando viene creato il processo è pronto, successivamente c’è l’attesa, una volta che il processore gli viene dedicato è in esecuzione, talvolta all’esecuzione si alterna momenti di attesa di un evento esterno, successivamente torna ad esser pronto, infine a seguito di ulteriori esecuzioni si ha la terminazione del processo. Il multi-tasking funziona efficacemente se il S.O. è in grado di offrire alcune assicurazioni: ➢ Il cambio di contesto deve essere invisibile al processo = l’utente deve aver l’impressione che il processore stia dedicando tutto il tempo a lui. ➢ Il processore riprende il servizio o il compito esattamente nel punto in cui era stato interrotto. ➢ Il processore deve avere un cronometro che gli permetta ogni n secondi di sospendere il servizio che sta effettuando per passare a servire un altro cliente → la politica di gestione in cui il processore divide il suo tempo tra i vari processi assegnando a ciascuno un certo intervallo di tempo è implementata nei S.O. multi-tasking e prende il nome di strategia politica Round-Robin. Gestore di memoria principale → la memoria principale è un grande insieme di parole, ognuna identificata univocamente con un indirizzo, e può considerarsi come un deposito di dati velocemente accessibili da CPU e dispositivi di I/O. Tale memoria è volatile e perde i dati in caso di system failure. Il SO è responsabile delle seguenti attività: ▪ Tenere traccia delle aree di memoria correntemente utilizzate nella RAM e dei rispettivi utenti. ▪ Decidere quale processo caricare in memoria quando dello spazio si rende disponibile. ▪ Allocare o liberare (deallocare) spazio in memoria, a seconda delle richieste. Gestore di memoria secondaria → poiché la memoria principale è volatile e troppo piccola per contenere tutti dati ed i programmi permanentemente, il calcolatore deve prevedere anche una memoria secondaria, di supporto a quella principale. La maggior parte dei calcolatori utilizza dischi come supporti di memoria secondaria, per memorizzare sia dati che programmi. Il SO è responsabile delle seguenti attività per gestire i dischi:
- Gestione dello spazio libero. - Allocazione dello spazio. - Schedulazione dei dischi.
Noi abbiamo la percezione che i file siano fisicamente organizzati per come li abbiamo organizzati noi nel file system anche nell’hard-disk→ in realtà nell’hard-disk i file non sono organizzati gerarchicamente ma sono uno dopo l’altro (siamo noi che organizziamo nel file system). Il numero di file che devono essere memorizzati su un disco può essere estremamente elevato → si ha quindi la necessità di mantenere i file in una forma ordinata. Un unico spazio (contenitore) di file è scomodo perché le operazioni di ricerca di un file e di creazione di un nuovo file diventano onerose (non è possibile avere due file con lo stesso nome) → l'idea è quella di raggruppare i file in sottoinsiemi (seguendo magari dei criteri di tipo logico). Organizzazione gerarchica → tutti i sistemi operativi forniscono operazioni per creare delle directory (cartelle). Una directory (cartella) è costituita da un insieme di file. Dalla directory principale si dipanano tutte le restanti cartelle, ogni cartella è un file → ogni file nell’hard-disk è memorizzato tramite un suo numero, indirizzo → i numeri sono le celle di inizio di ciascun file presente nella cartella (avere un file all’interno di una cartella non è altro che avere i numeri contenuti all’interno della cartella). I nomi dei file sono locali alle directory (si possono avere due file con lo stesso nome purché siano in due directory diverse = il nome del file non è solo ad es. pippo.txt bensì è il nome del file e il rispettivo percorso deve esser fatto per esser raggiunto) → in questo modo l’indice conterrà due tipi di oggetti: nomi di file e nomi di directory. Senza la strutturazione in directory, tutti i file potrebbero essere identificati semplicemente mediante il loro nome. Nel caso di un’organizzazione gerarchica a più livelli si deve specificare l'intera sequenza di directory che lo contengono, a partire dalla radice dell'albero. Ad esempio il file libro1 di narrativa italiana è univocamente identificato dalla sequenza: A:\Biblioteca\Narrativa-Ita\libro1 ≠ la directory Pautasso di Utenti è identificata dalla sequenza: A:\Utenti\Pautasso. Il carattere “\” (slash) viene usato come separatore = dà la sequenza delle directory. ↓ Una sequenza di questo tipo può essere vista come il cammino che si deve compiere per raggiungere un determinato file a partire dalla radice dell'albero, ed è chiamata pathname assoluto (non vi possono esser 2 file con lo stesso pathname ma solo con lo stesso name) ≠ il pathname relativo è invece il percorso che si deve compiere per raggiungere il file a partire dalla directory nella quale siamo (directory corrente). ↓ Tale organizzazione porta 2 conseguenze: 1) Quando si ha dei settori danneggiati nell’hard-disk è necessario formattare tutto e questo comporta perdere tutto = quando si formatta un hard-disk vengono allineate allo stesso modo le polarità e poi successivamente vengono creati i settori e le tracce su cui riscrivere → le parti danneggiate poi vengono marcate, su cui poi non si può andare a scrivere. Questo tipo di formattazione si chiama formattazione approfondita. Col passare del tempo però l’hard-disk è pieno di parti danneggiate in cui non è possibile scrivere nulla, questo comporta un appesantimento enorme delle prestazioni. Defrag permette di fare la deframmentazione dell’hard-disk = esso prende tutti i file dell’hard-disk e
li copia da un'altra parte, poi elimina tutti le parti in cui non era possibile scrivere per poi mettere i file tutti insieme a blocchi. 2) C’è però un altro tipo di formattazione: formattazione veloce = qui l’hard-disk viene formattato molto più veloce questa comporta di andare ad eliminare tutti i riferimenti dentro le directory ai file in esso contenuto (non si può accedere più da nessuna parte a quella cella). Nell’hard-disk continuano ad esserci i dati contenuti nella directory ma manca il riferimento a quella, questo permette di riscriverci subito → si tratta di una rimozione unsafe. Per organizzare gerarchicamente i file, il sistema operativo deve fornire all'utente anche un insieme di operazioni sulle directory, per esempio: ▪ Creare una nuova directory ▪ Rimuovere una directory ▪ Ridenominare una directory ▪ Elencare il contenuto (l'insieme di file e sotto-directory) di una directory ▪ Copiare o spostare i file da una directory ad un'altra. Gestore della protezione → per protezione si intende un meccanismo per la gestione degli accessi al sistema ed alle risorse degli utenti da parte di programmi, processi o altri utenti = ad es. tiene traccia non della sovrapposizione dei file ma di quanto spetta a ciascun utente. Il SO deve:
Il software applicativo si divide in 2 parti: ➢ Utilità di Sistema = programmi che servono per migliorare la gestione e la sicurezza della macchina (antivirus, compressione file, programmi diagnostici, programmi di backup, di installazione, ottimizzazione, …) ➢ Strumenti di sviluppo = programmi che servono per la creazione di nuovi applicativi (compilatori di linguaggi di programmazione, programmi per la creazione di oggetti multimediali, elaborazione di audio, video e immagini, …) Ci sono poi altri tipi di software: 1) Il software shareware → è dato in prova gratuita per un periodo di tempo limitato (es 30 giorni) a partire dal momento dell'installazione. Una volta scaduti i termini, se l'utente è soddisfatto e vuole continuare ad usare il prodotto, deve acquistarlo. I programmi shareware alla scadenza possono: avvisare l'utente del mancato pagamento, ma continuare a funzionare, o smettere di funzionare o funzionare in modalità ridotta. 2) Il software pirata → la copiatura del software è consentita unicamente come copia di riserva per l'utente che lo ha acquistato. 3) Il software freeware → è gratuito e può essere copiato e usato liberamente (eccetto rivenderlo ad altri). Si tratta di solito di programmi relativamente semplici, messi a disposizione del pubblico per motivi pubblicitari (di solito sono versioni semplificate di prodotti a pagamento, oppure versioni di lancio per nuovi software). La Free Software Foundation si occupa di eliminare le restrizioni sulla copia, sulla redistribuzione, sulla comprensione e sulla modifica dei programmi per computer = promuove lo sviluppo e l'uso del software libero → il software libero è software distribuito in modo che chiunque ne abbia il permesso di uso, copia e distribuzione in forma modificata o meno, gratis o a pagamento (per far ciò il codice sorgente deve essere disponibile). L'espressione software libero si riferisce alla libertà dell'utente di (= un programma è software libero se l'utente ha tutte queste libertà):
codice sorgente ne è un prerequisito.
tutta la comunità ne tragga beneficio ← l'accesso al codice sorgente ne è un prerequisito.
Problemi, procedure effettive ed esecutori Usualmente i problemi che ci troviamo ad affrontare nella quotidianità possono ricondursi all’elaborazione di una serie di informazioni. L’uomo compie una serie di azioni (fisiche o mentali) che alla fine “producono” la soluzione del problema. Quindi un problema è caratterizzato da: ▪ Un insieme di dati di partenza ▪ Un risultato cercato ▪ Una soluzione: procedura che genera il risultato a partire dai dati di partenza
La conoscenza di come si risolve un problema e la capacità di risolverlo sono competenze distinte (es. ognuno è capace di riconoscere un volto, ma come avviene questo riconoscimento?) → può capitare di trovarsi di fronte ad un problema la cui soluzione debba essere attuata non da noi, ma da un altro soggetto (anche un calcolatore) ← il soggetto può non sapere come risolvere il problema, sebbene possa dichiarare la sua disponibilità ad attuare la soluzione nel momento in cui gli venisse insegnata. La procedura di soluzione deve allora essere realizzata in fasi distinte e successive: ➢ Analisi del problema e identificazione di una soluzione da parte del primo soggetto. ➢ Descrizione della soluzione da parte del primo soggetto in termini comprensibili al secondo soggetto. ➢ Interpretazione della soluzione da parte del secondo soggetto. ➢ Attuazione della soluzione da parte del secondo soggetto. La procedura di soluzione deve essere descritta in una forma che l’esecutore sia in grado di interpretare in modo corretto, inoltre deve specificare delle azioni che l’esecutore è in grado di attuare ← ogni esecutore è caratterizzato dalle sue capacità di interpretazione e di attuazione. I calcolatori sono degli esecutori di soluzioni che esseri umani hanno precedentemente identificato e descritto. I calcolatori hanno una notevole velocità di esecuzione e possono ripetere la stessa operazione producendo sempre lo stesso risultato un numero elevato di volte. Il calcolatore in quanto esecutore è caratterizzato da: ➢ Un linguaggio che è in grado di interpretare, con il quale devono essere descritte le soluzioni che vuole che esso attui. ➢ L’insieme delle azioni che è in grado di compiere. ➢ L’insieme delle regole (istruzioni) che a ogni costrutto linguistico sintatticamente corretto associano le rispettive azioni da compiere. Se un problema è particolarmente semplice, l’esecutore potrebbe essere in grado di eseguire la soluzione direttamente ← es. determinare la superficie di un cerchio di raggio r → se il risolutore non conosce la formula risolutiva la si deve indicare esplicitamente, in termini di operazioni che lui riesce a compiere: s = π r^2 → se l’esecutore non conosce come elevare un numero al quadrato, si ha che la soluzione contiene a sua volta un problema la cui soluzione deve essere descritta in modo esplicito = si deve scomporre il problema in sotto-problemi più semplici, e questi in sotto-sottoproblemi. Ci si ferma quando si giunge ad un problema elementare o primitivo la cui soluzione corrisponda ad una azione elementare che può essere direttamente compiuta dall’esecutore = risolvere un problema equivale a risolvere una opportuna successione di problemi più semplici (= stabilire una gerarchia di problemi ). Ad ogni scomposizione di un problema in sotto-problemi può essere associata una PROCEDURA EFFETTIVA quando vengano considerati come elementari tutti i sotto-problemi → l’insieme dei sotto-problemi viene risolto da una procedura effettiva quando:
Le proposizioni usate da un linguaggio formale descrivono due classi principali di entità: Le OPERAZION I che devono essere eseguite I DATI , cioè gli oggetti sui quali si devono eseguire le operazioni. I dati possono essere costanti o variabili: ▪ I dati costanti sono dati che rimangono inalterati durante l’esecuzione dell’algoritmo da quando ha inizio a quando termina → es. nell’Algoritmo Del Gioco dell’11 è una costante il numero di oggetti (due) preso dal primo giocatore. ▪ I dati variabili , o semplicemente variabili, sono coppie <nome, valore> che possono essere immaginati come scatole che hanno come etichetta il nome e come contenuto il valore. Alle variabili quindi deve essere assegnato esplicitamente un valore → all’inizio di un algoritmo le variabili hanno un valore indeterminato. Le variabili hanno lo stesso uso dei pronomi nel linguaggio naturale = servono per riferirsi ad un oggetto (generalmente un valore numerico) indipendentemente dal valore specifico di questo → es: nell’Algoritmo delle Radici sono presenti le variabili: a, b, c, x 1 e x 2. L’istruzione di assegnazione è quella particolare istruzione che permette di definire il valore attuale di una variabile → tale valore rimane inalterato fino a una nuova assegnazione alla variabile. L’assegnazione viene eseguita nei seguenti passi: si valuta l’espressione di destra e poi si attribuisce il valore determinato alla variabile. Forma generale = <nome ← espressione>. Regola = ogni volta che una variabile appare a destra dell’istruzione di assegnazione ←, è necessario che un valore sia già stato assegnato a quella variabile → Es: nel caso a ← 2 , b ← 3, c ← a+b , allora si ha c=5; nel caso x ← 2, x ← x+3 , allora si ha x=5. Vettori Le variabili considerate fino ad adesso sono dette variabili scalari ≠ una variabile vettore (array) è una coppia <nome, insieme di valori>. Può essere immaginata come una scatola che ha un nome e che è divisa in tanti comparti ognuno dei quali è numerato e può un valore (in generale non è ordinato). Ogni valore è individuato dal nome della variabile seguito dal numero del comparto detto indice. Per il nostro esempio, la notazione usata sarà: vocali [i] con i indice di posizione , un numero compreso tra 0 e 4 → la dimensione di un vettore è il numero dei suoi elementi → in fase di dichiarazione di una variabile vettore si specifica la sua dimensione che non è più modificabile successivamente → dato un vettore di dimensione N, gli indici vanno per convenzione da 0 a N-1 oppure da 1 ad N. L'istruzione di assegnazione ad un vettore è analoga a quella per una variabile ordinaria, con la differenza che si deve specificare anche a quale posizione ci stiamo riferendo → es: consideriamo il nostro vettore vocali di dimensione 5 , allora possiamo scrivere vocali [3] ← E oppure vocali [0] ← I ottenendo questo. Non possiamo scrivere vocali [-5] ← U oppure vocali [122] ← A , perché nel primo caso non si possono contare posizioni negative, e nel secondo non si possono indicare posizioni successive a 4 (o 5).
MATRICE = essa è l’estensione del concetto di vettore = è un insieme di valori che sono indicizzati facendo ricorso a due o più indici. La notazione usata è: M[i,j] → per una matrice a 2 dimensioni l’indice i è detto indice riga e j indice colonna. Per una matrice l'assegnazione avviene come per il vettore, con la differenza di dover specificare due indici. Istruzioni Le istruzioni possono essere divise in 6 categorie:
operazioni aritmetiche e le assegnazioni. Es: l’istruzione: 5+3; l'istruzione: 3 mod 2 (mod sta per modulo ovvero resto della divisione intera). ➢ Istruzioni di salto = istruzioni che alterano il normale ordine di esecuzione delle istruzioni di un algoritmo, specificando esplicitamente quale sia la successiva istruzione da eseguire. Si distinguono in istruzioni di salto condizionato e incondizionato a seconda che debba essere verificata una condizione per poter attuare il salto oppure no. Nei linguaggi di programmazione “strutturati” non sono usate. ➢ Istruzioni di inizio/fine esecuzione = indicano quale istruzione dell’algoritmo debba essere eseguita inizialmente e quale determini la fine dell’esecuzione. ➢ Istruzioni di ingresso/uscita = istruzioni che indicano una trasmissione di dati o messaggi fra l’algoritmo e tutto ciò che è esterno all’algoritmo. Tali istruzioni si dicono di ingresso o lettura quando l’algoritmo riceve dati dall’esterno, si dicono di uscita o scrittura quando i dati sono comunicati dall’algoritmo all’esterno. ➢ Istruzioni condizionali = istruzioni che controllano il verificarsi di condizioni specificate e che in base al risultato determinano quale istruzione eseguire. Nota: si altera il flusso del programma in funzione della condizione (se è vera o falsa). Si presentano nella forma: se … allora … altrimenti ; if … then … else. ➢ Istruzioni di loop o di ciclo = determinano il ripetersi di una stessa serie di istruzione fintanto che una condizione rimane verificata (vera) o non verificata (falsa). Tale condizione può essere testata sia prima che dopo l’esecuzione, per la prima volta, della serie di istruzioni. Si presentano nelle forme: fintanto che … esegui ( … for … do …) oppure esegui … fintanto che (… repeat … until). Le istruzioni di controllo devono determinare (calcolare) la verità o falsità di un enunciato (5>3 è la proposizione e il valore di verità è vero). Tale enunciato viene chiamato proposizione e si parla di valore di verità di tale proposizione. Una proposizione è un costrutto linguistico del quale si può dire se è vero o falso → il valore di verità di una proposizione è l’essere vera o falsa della proposizione → es: “3 è un numero pari” è una proposizione, “incrementa x di 10” non è una proposizione (= si tratta di un’azione, per cui non puoi rispondere con vero o falso).