# data[].attributes.body
Addizione:
100101+11=
1110010101+1100110=

Sottrazione:
1001101-1101=
11001100-1011=

Moltiplicazione:
10010011*110=
101101*10=

Divisione:
101101/101=
11011101/111=

# data[].attributes.body
Per rilevare e correggere errori utilizziamo codici ridondanti.
1) Codici di rilevazione di errore: consentono di individuare la presenza di un errore;
2) Codici a correzione di errore: consentono di indivduare e correggere gli errori.

# data[].attributes.headline
E' possibile rilevare e correggere l'errore su 1 BIT?

# data[].attributes.subject
E' possibile rilevare e correggere l'errore su 1 BIT?

# data[].attributes.body
A----> 000         AB=1
B----> 001         AC=1  BD=1
C----> 010         AD=2  CD=1
D----> 011

# data[].attributes.body
Le informazioni si propagano lungo il canale sotto forma di 0 e 1. Lo scambio digitale di informazioni è costituito da un flusso di elettroni che generano un campo magnetico e sono soggetti a rumori elettromagnetici.
Dobbiamo introdurre un meccanismo che permette di risolvere l'errore.
In presenza di un errore  possiamo:
-scartare un messaggio;
-richiedere la riga del messaggio;
-migliorare la qualità del canale;
-effettuare la correzione del messaggio.
Come correggere l'errore?
Ridondanza: il codice deve contenere delle configurazioni non utilizzate disposte i modo che un errore trasformi la configurazione valida in una non utilizzata.
Distanza minima di un codice: si definisce distanza minima di un codice la distanza minima che c'è tra due configurazioni qualunque.

# data[].attributes.body
1)011110101001010=nHex;
2)AD7C1=nDec;
3)10110010101=nDec;
4)FFADC=nBin;
5)2635=nHex
6)815=nBin

# data[].attributes.body
Cos'è
È un sistema numerico composto dai numeri da 0 a 9. I numeri da 10 a 15 sono rappresentati dalle lettere A, B, C, D, E, F.

# data[].attributes.body
CASA:
C --> 1101001

A --> 1010011
S --> 1000111
A -->1101001

# data[].attributes.body
E' un codice non pesato, nel passaggio da una parola a quella successiva cambia solo un bit.

# data[].attributes.headline
Codice ASCII (American Standard Code for Information Interchange)

# data[].attributes.subject
Codice ASCII (American Standard Code for Information Interchange)

# data[].attributes.body
Codice utilizzato per far corrispondere ogni stringa di bit ad ogni tasto della tastiera, è un codice a 7 bit (128 caratteri) e non è ridondante.

# data[].attributes.body
Cos'è
È un sistema numerico composto da 1 (acceso) e da 0 (spento). Viene usato dalle macchine.

# data[].attributes.body
FCFS (First Come First Served): Fa arrivare i processi in coda, il primo ad arrivare è il primo ad essere eseguito (non fa distinzioni tra processi), è di tipo non-preemptive

SJF (Shortest Job First): Dispone anch’esso di coda ma, al contrario del FCFS, viene eseguito il processo più rapido. È di tipo preemptive e non preemptive

Round Robin: Tutti i processi hanno accesso alla cpu, è inoltre presente un real-time, ovvero, se non è possibile eseguire un processo dai 10 ai 100 ms si passa direttamente a quello successivo fino all’esecuzione di tutti i processi. Il passaggio da un processo all’altro richiede una piccola quantità di tempo, più il time-slice è piccolo, più è efficiente mentre, se è grande assomiglia di più ad un FCFS

A priorità: I processi vengono suddivisi ed eseguiti in base alla loro priorità

MLFQ (MultiLevel Feedback Queue): Simile alla tipologia “a priorità” tranne per il fatto che, in ogni priorità vi è un FCFS

# data[].attributes.headline
Gli obiettivi delle politiche di scheduling:

# data[].attributes.subject
Gli obiettivi delle politiche di scheduling:

# data[].attributes.body
Massimizzare l’utilizzo della cpu

Massimizzare il throughput del sistema

Minimizzare il tempo di risposta del sistema

Minimizzare il tempo di attesa tra un’esecuzione e l’altra e il tempo di permanenza di un processo nel sistema

# data[].attributes.body
Parte del sistema operativo che attiva a turno, in sequenza, i processi in attesa di esecuzione

Il Job Scheduler si occupa della pianificazione del processo

Le politiche di gestione o schedulazione descrivono i meccanismi con i quali vengono scelti i processi da assegnare alla cpu

Il Job Scheduler sospende il processo in esecuzione e lo mette in coda ai processi pronti

# data[].attributes.body
Evita lo spreco di tempo della cpu

È possibile liberare spazio nella RAM spostando i processi inattivi sul disco (swapping)

Carica, nello spazio liberato, il processo da eseguire (caricamento)

Se ho processi di dimensioni maggiori rispetto alla memoria centrale si identificano le parti del programma che sono “alternative” tra loro e vengono caricati nella stessa zona di memoria (overlay)

Se ho dimensioni diverse da riservare per ogni processo, posso pensare di riservare una zona fissa di memoria (questo processo velocizza lo swapping e riduce la frammentazione della memoria)

# data[].attributes.body
Capacità, da parte del processore, di elaborare contemporaneamente più programmi e di gestirli l'uno indipendentemente dall'altro. Nel multitasking effettivo, il blocco di un programma non deve provocare il blocco degli altri programmi in esecuzione, né tanto meno il blocco del sistema operativo e quindi del computer stesso. Le fasi di attesa vengono usate per eseguire altri processi

# data[].attributes.body
Il S.O. gestisce l’esecuzione concorrente di più programmi (ovvero contemporaneamente in esecuzione), per permettere ciò però, la cpu, deve “distribuirsi” fra tutti i programmi. Ogni programma per essere eseguito necessita di una macchina virtuale che viene creata dal S.O.

# data[].attributes.body
Il modello a cipolla (o Onion Skin) è formato da un insieme di programmi organizzati in modo che, ognuno di essi, vada ad occuparsi di un compito specifico. Gli strati del modello sono:

1. Nucleo (kernel)

2. Gestore della memoria

3. Gestore delle periferiche

4. File system

5. Interfaccia utente (shell)

6. Programmi applicativi

I livelli più esterni si interfacciano maggiormente con l’utente, mentre quelli più interni con l’hardware.

La struttura dell’ Onion Skin mostra i programmi secondo una gerarchia nella quale lo strato si serve di quello inferiore. Ognuno di questo visualizza gli strati sottostanti come uno unico.

Il kernel è sempre caricato nella RAM mentre i programmi vengono caricati solo quando l’utente li visualizza.

# data[].attributes.body
S.O.

Gli editor

I traduttori

Il linker

Il loader

I debugger

# data[].attributes.body
Se tutti questi test vanno a buon fine, il pc, è pronto ad operare: viene quindi caricato il kernel (il nucleo del sistema operativo).

Il BIOS è detto firmware, ovvero non è né hardware né software, non è, infatti, programmabile dal programmatore ma è “programmato” dal produttore dell’hardware

Il S.O.è un gruppo di programmi i quali gestiscono il funzionamento del computer agendo come intermediario tra l’utente e il calcolatore. Il S.O. è sempre attivo, dall’accensione allo spegnimento dell’elaboratore. Tutto ciò che accade all’elaboratore viene infatti gestito dal S.O.

# data[].attributes.body
1. Se il test di autodiagnostica (POST) della scheda madre ha esito positivo, viene emesso un segnale acustico e si procede con il test sulla scheda video

2. Avviene il conteggio della memoria dinamica, ovvero viene visualizzata la memoria totale della RAM presente nel pc

3. Vengono eseguiti controlli su tutti i dispositivi input, come il mouse, la tastiera ecc.

4. Vengono eseguiti gli ultimi controlli sulle ultime periferiche: disco fisso, check di collegamento alla stampante, al modem ecc.

# data[].attributes.body
Durante l’avvio di sistema, il programma boot, viene caricato nella RAM e mandato in esecuzione. Il BIOS (Basic Input-Output System) è memorizzato dal produttore dell’hardware, quest’ultimo, appena viene alimentato, manda in esecuzione un programma di autodiagnostica per verificare il corretto funzionamento di ogni singolo componente.

# data[].attributes.body
Per il sistema operativo ogni file viene riconosciuto come una stringa di numeri binari ma ha anche un descrittore che consente la visualizzazione di alcune informazioni associate al file.

1. Nome

2. Identificatore

3. Tipo

4. Locazione

5. Dimensione

6. Data e Ora

7. Utente proprietario

8. Permessi

# data[].attributes.body
Il file system è composto da 2 parti principali :

1. File utente

2. File di sistema

L'utente grazie al file system può memorizzare e accedere in modo veloce ai file.

# data[].attributes.body
Il file system è la parte dell' OS che gestisce la memorizzazione di dati nella memoria.
I file vengono organizzati in directory.
Il file system rappresenta l'interfaccia tra utente e sistema.

# data[].attributes.body
1. Allocare/deallocare in memoria i processi;

2. Sapere le parti di memoria in uso e quelle libere;

3. Swapping: Scambio dati  tra memoria principale e disco.

# data[].attributes.body
Il gestore della memoria è
un componente del O.S che gestisce la memoria principale(RAM).

# data[].attributes.body
Il calcolatore elabora segnali digitali, bisogna trasformarli in codici binari.
-CODICE: consente di rappresentare un dato insieme di simboli mediante un altro insieme di simboli;
-ALFABETO: l'insieme finito di simboli;
-PAROLA: una sequenza finita di simboli dell'alfabeto.
CODICE RIDONDANTE: numero di configurazione utilizzate minore uguale al numero di configurazioni disponibili.
CODICE NON RIDONDANTE: numero di configurazione utilizzate minore e uguale al numero di configurazioni disponibili.

# data[].attributes.headline
Operazioni in binario [Compresi esercizi] (Bertolero, Iudicelli)

# data[].attributes.subject
Operazioni in binario [Compresi esercizi] (Bertolero, Iudicelli)