sabato 31 dicembre 2016

Datagramma IP

Nella pila protocollare TCP/IP il datagramma è l'unità dati di livello rete ed è composto dai seguenti campi :


L'header IP è costituito dalle prime 5 righe (campo options escluso poichè opzionale e poco usato).Il campo Data sono i dati utili provenienti dai livelli superiori .
La lunghezza minima della parte di controllo è di 20 byte; difatti sono 5 righe a 4 byte ciascuno. La lunghezza massima è di 60 byte. Vediamo ora il significato di ogni singolo campo.

Version
Esistono più versioni di protocollo IP , come IPv4 o IPv6 . Questo campo indica come interpretare il datagramma, quindi quale versione di protocollo IP viene utilizzata.


IHL (Internet Header Length)
Denota la lunghezza dell'header , quindi l'inizio dell'informazione contenente i dati .
Sono 4 bit, perciò il piu' grande numero rappresentabile è 1111 = 15, da cui essendo un multiplo di 4 byte, si conclude che la massima lunghezza dell'header è di 15x4=60 byte.
Invece dal momento che la lunghezza minima della parte di controllo è di 20 byte il campo IHL non può avere valore minore a 5. Dunque il minimo valore consentito è 0101.

Type of service
Il campo TOS denota la precedenza dei livelli di traffico. In parole povere in base a specifiche combinazioni di questi 8 bit, per quel particolare datagramma si potrebbe voler minimizzare il traffico, massimizzare il throughput o l'affidabilita. Quindi verrano scelti percorsi ad hoc per tali esigenze. 

Packet length
Rappresenta la lunghezza dell'intero pacchetto IP, compresi i dati. E di 16 bit, dunque il suo valore massimo è 2^16=65536, ma in genere non supera i 1500 byte.


Ora, vista la prima riga del pacchetti IP, per capire i campi della seconda bisogna comprendere prima cosa si intende per frammentazione e perchè un pacchetto IP viene frammentato.

Frammentazione
La frammentazione è una delle operazione svolte dal livello 3 insieme ad indirizzamento e instradamento. E' opportuno frammentare poichè un pacchetto quando viaggia può avere a che fare con tecnologie differenti. Ad esempio un router che ha una interfaccia  che utilizza una tecnologia IEE 802.3 (Ethernet) supporta MTU di 1500 byte, oppure altre tecnologie che permettono la comunicazione a grandi distanze possono avere trame al massimo di 526 byte.
Dunque è facile intuire che se il nostro pacchetto è di 3000 byte e deve essere inoltrato verso una interfaccia di rete che utilizza tecnologia IEE 802.3 è opportuno frammentare il pacchetto in due informazioni da 1500 byte ciascuna.

Identifier
Il campo identificatore "marchia" i pacchetti numerandoli, secondo una numerazione progressiva. Pertanto è utile a riconoscere frammenti che appartengono alla stesso pacchetto,quindi alla stessa informazione. Ad esempio, ritornando all'esempio precedente, nel caso in cui il nostro pacchetto da inviare sia di 3000 byte e questo debba essere diviso in due, il campo Identifier per i due frammenti sarà lo stesso.

Fragment Offset
I frammenti di un singolo pacchetto devono essere a loro volta ordinati. Di questo se ne occupa il campo fragment offset che rappresenta lo spiazzamento del frammento . Questo campo,di 13 bit è 0 per il primo frammento ed è orientato al byte.

Flag
Il campo flag è di soli 3 bit. Il bit più significativo(More fragment) di tale campo se posto ad uno indica che ci sono più frammenti per quel pacchetto. Ad esempio 100. Se invece il bit meno significativo e posto ad 1 , significa "Don't Fragment", cioè non si vuole che questo pacchetto venga frammentato per varie esigenze. Quindi è come se si stesse chiedendo al router di trovare percorsi alternativi, quindi interfacce di uscita con tecnologie tali che ci permettano di non dover frammentare il paccheto. Se il router non riesce nell'impresa il livello 3 lo dirà ai livelli superiori che a loro volta decideranno le azioni da svolgere.

Time to leave
Tradotto in italiano è il tempo di vita del pacchetto. E' un numero di 8 bit che indica quanti router intermedi può attraversare il pacchetto. Ogni volta che il pacchetto arriva in un router questo ne decrementa il time to leave di una unità; se il time to leave di un pacchetto è 0 il router provvede a scartarlo.
Si usa il time to leave per evitare di creare cicli nella rete e che un pacchetto vi possa viaggiare indefinitamente. Quindi questo fa presupporre che i protocolli di instradamento non sono perfetti e vengono adottate alcune precauzioni come il TTL.

Protocol
Questo campo risponde alla semplice domanda " A quale protocollo di livello trasporto va mandato questo pacchetto ?". Quindi identifica i vari protocolli , ad esempio il valore 6 indica il protocollo TCP e il valore 17 indica il protocollo UDP.  Questi valori sono consultabili sugli RFC publicati dalla IANA.

Checksum
Si occupa di fare un controllo sull'integrità del solo header IP, ma non dei dati.Quindi è un controllo errore abbastanza Ligth questo che fa il livello 3, proprio perché si presuppone che della integrità dei dati se ne occupi il livello collegamento.
La checksum consiste nel complemento ad 1 della somma dei byte dei campi di controllo.
Ogni router quando arriva il pacchetto calcola la propria checksum e vede se coincide con quella presente sul datagramma. Se dovesse essere diversa allora il pacchetto viene scartato.
Si noti che la checksum e il TTL sono gli unici due campi del pacchetto IP che vengono aggiornati di router in router.


Indirizzi IP sorgente e destinazione
Gli indirizzi IP svolgono la funzione di identificare univocamente un host nella rete. Ogni volta che viene generato un pacchetto vengono inseriti indirizzo IP sorgente e destinazione per raggiungere l'host destinatario.


Data
Nel campo data infine ci andranno i dati provenienti dai livelli superiori. In particolare la PDU del livello trasporto.




domenica 2 ottobre 2016

Progetto Android: codice fiscale

Dopo il primo esempio di generatore di codice fiscale in Java, ci poniamo la questione di risolvere lo stesso problema mediante un applicazione Android.
In questo post renderò disponibile la mia versione di generatore di codice fiscale.
Immergersi nella creazione di tale tipo di applicazione potrebbe essere utile a permettervi di comprendere i primi passi per sviluppare applicazioni per dispositivi mobili (almeno per me lo è stato).
Essendo un esempio, la grafica è abbastanza scarna, ma, se qualcuno desidera migliorarla metto a disposizione il codice sorgente per ulteriori sviluppi.
L'applicazione si presenta con una splash screen di durata 3 secondi, ma sensibile al touch se non si aspira ad attendere i fatidici secondi di attesa.


A seguire, l'app ci porrà di fronte 5 finestre che domanderanno rispettivamente il nome,il cognome,il sesso,la data di nascita e la città natale.
Sulla falsa riga del famoso libro "Il venditore di tempo" decidiamo di chiamare la persona di cui ambiamo a calcolare il codice fiscale Tizio Qualunque.




Ovviamente,per ciascuna finestra sussistono gli appositi controlli.Ad esempio provando ad inserire una qualsiasi data fantasiosa l'applicazione non proseguirà:


Dal momento che il 1995 non è un anno bisestile, febbraio non ha 29 giorni,dunque errore.
Inoltre è importante che il formato della data sia del tipo g/m/anno,come ad esempio 25/09/1958.
La stessa cosa accade in caso di inserimento di città inesistente:


Dopo aver adeguatamente compilato tutti i campi necessari passiamo al calcolo del codice fiscale di Tizio Qualunque che sarà:



E con questo è tutto, l'obiettivo di generare il codice fiscale di Tizio Qualunque è stato raggiunto.

Al seguente link metto a disposizione il file APK dell'applicazione appena illustrata : Codice fiscale . Basta solo scaricarlo e installarlo sul dispositivo Android con la procedura qui indicata-> Installare file APK.
Suggerisco inoltre ulteriori modifiche all'applicazione che potrebbero essere quella di gestire il fenomeno dell'omocodia, oppure fare il 'reverse' del codice fiscale. Cioè dal codice fiscale ottenere il sesso,la data di nascita e la città di nascita(con relativa provincia).



venerdì 12 agosto 2016

Esempio di prima applicazione Android : Convertitore Euro-Lira

Se siete alle prime armi con Android e in cerca di una applicazione con cui esercitarvi, successiva al classico "Hello World" vi propongo questo semplicissimo esempio di convertitore da Euro a Lira e viceversa .
L'implementazione è di facile realizzazione ,non a caso è un esempio di prima applicazione strumentale per comprendere i primissimi concetti e fattibile anche senza la piena conoscenza di tutti i componenti Android .
Propongo ora la mia versione dell'applicazione ,il cui APK è scaricabile qui -> Euro-Lira .Da questo è possibile ottenere il codice sorgente utile per osservare come l'applicazione viene realizzata.
Vediamo ora cosa fa con qualche esempio .
Ricordandosi la formula di conversione 1 Euro = 1936,27 Lire ,ecco un esempio di funzionamento in cui si desidera tramutare da Euro a Lira :


2 Euro corrispondono a 3827,54 Lire 

In questo esempio di conversione da Euro a Lira basta inserire nella EditText sotto la TextView il cui testo è "EURO"  la cifra desiderata ,toccare il bottone "Converti" e si ottiene la corrispondente cifra in Lire .

Il procedimento inverso ,ossia la conversione da Lire a Euro è speculare al precedente con la sola differenza che la cifra desiderata va inserita all'interno della EditText sotto la TextView il cui testo è "LIRA".


 6528 Lire corrispondono a 3,37 Euro 
                                                                                           
                                                
Ovviamente dal file APK messo a disposizione è possibile ottenere il codice sorgente attraverso piccoli accorgimenti facilmente individuabili sul Web  . Lo stesso ragionamento vale per l'installazione del file APK sul dispositivo ,il cui procedimento è anche disponibile qui : https://zangariappunti.blogspot.it/2016/07/how-to-install-apk-files.html .

venerdì 29 luglio 2016

How to install APK files

If you need to install an application outside Google Play for different reasons, you have to learn what is an APK file and how to intall it.
An APK file is an application package created for Android devices ,used to distribuite and to install  Android components.
Now let's see how to install it .
From your Android device you have to go  to Settings , scroll to Security and select Unkown Source.






The next step is to find the .apk  and download it  on your smartphone,tablet ,or computer. In this phase you have to be careful to malware, and download the APK from trusted Web sites .
Finally , you can find the APK file (using a File Manager) ,install it and it's done!
After the end of installation , is  recomended deselect Unkown Source , to avoid
 downloading dangerous applications .


lunedì 23 maggio 2016

Cos'è un firewall?

Sentiamo sovente parlare di firewall,di configurare un firewall e cosi via. Ma cos'è veramente un firewall in termini spiccioli? 
Un firewall(muro di protezione) è un modulo software o anche hardware posto tra un sistema affidabile e uno inaffidabile . Generalmente, il sistema non fidato è considerato internet(rete esterna) e il sistema fidato è considerato una rete locale (LAN) . Il firewall limita l'accesso di rete tra questi due domini,controlla e registra tutte le connessioni e al limite,a seconda della configurazione, potrebbe anche bloccarle . 
In alcuni casi è possibile prevedere  una rete parzialmente fidata ,detta zona smilitarizzata ,DMZ(demilitiarized zone).
Questo terzo dominio contiene sistemi che devono essere isolati dalla rete interna(cosi' da mantenerne l'integrità), ma che hanno bisogno di comunicare con l'esterno . Si pensi ad esempio ad un web server. 
In questo schema le connessioni sono consentite da internet ai calcolatori della DMZ e dalla rete locale alla rete internet,ma non da internet alla rete locale e ne dalla DMZ alla rete locale.



 

venerdì 13 maggio 2016

Traduttore testo-binario

Vi siete mai chiesti come suona il vostro nome in codice binario? Probabilmente no ,ma, se per eccesso di curiosità siete "ansiosi" di tradurre un testo in binario ,metto a disposizione una semplice GUI che realizza questo compito :

Ecco come si presenta la GUI


In realtà non si tratta di una vera e propria interpretazione da testo a binario ,ma , il tutto consiste in una traduzione dei caratteri(che compongono la stringa) in un numero univoco  secondo l'alfabeto Unicode. Questo numero viene poi tradotto in binario. Quindi,ricapitolando, è una traduzione da testo ad Unicode,e da Unicode a binario. 
Per chi non lo sapesse l'alfabeto Unicode è un sistema di codifica del testo,che assegna un numero ad ogni carattere .

mercoledì 11 maggio 2016

Memoria virtuale: Come facilita la vita dei programmatori?

Per permettere la multiprogrammazione è necessario caricare più processi possibile in memoria .Ma non è necessario che l'intero processo si trovi completamente in RAM per essere eseguito ; difatti, i processi non vengono mai caricati interamente in memoria centrale, ma "a pezzi". Lo stesso ragionamento è valido per il sistema operativo ad esempio.
Chi è avvezzo alla programmazione non avrà difficoltà ad immaginare questa situazione : si pensi per esempio ad un programma che contiene codice per gestire delle eccezioni o situazioni di errore. Spesso,sono porzioni di codice che verranno eseguite raramente e quindi non è necessario avere sempre il relativo codice in memoria. Insomma anche nei casi in cui è necessario disporre di tutto il programma è possibile che non serva tutto in una volta . Inoltre,per il principio di località  se la CPU sta eseguendo una certa istruzione,probabilmente la prossima istruzione ad essere eseguita sarà nelle vicinanze di quella correntemente in esecuzione.
Questo meccanismo di caricare "a pezzi" un programma è permesso dalla memoria virtuale.
Cos'è la memoria virtuale?
 La memoria virtuale è una tecnica che permette di eseguire i processi che possono anche non essere completamente in memoria . Non è altro che un meccanismo di separazione tra la memoria logica com'è vista dall'utente dalla memoria fisica . Cosi facendo i programmi possono essere anche più grandi della memoria fisica ,tanto vengono caricati a pezzi e quando si ha bisogno del "pezzo" non caricato in memoria ,ma che risiederà bensi' sul disco(page fault),lo si carica,oppure lo si rimpiazza con un altro pezzo di processo in memoria centrale se questa è piena(esistono degli appositi algoritmi di rimpiazzo delle pagine) . Questa tecnica ,inoltre, permette di aumentare il grado di multiprogrammazione poichè ogni programma ha bisogno di meno memoria fisica e questo permette di caricare più programmi in memoria,ottenendo una maggiore produttività della CPU senza aumentarne il tempo di risposta(http://zangariappunti.blogspot.it/2016/04/scheduling-della-cpu.html).L'unico svantaggio di questo meccanismo è di non essere semplice da realizzare e può ridurre le prestazioni del sistema .



Tornando a noi...
Ora,dovrebbe essere semplice rispondere alla domanda posta nel titolo del post (Come facilita la vita dei programmatori?). La risposta è semplice, questi, infatti non necessitano affatto di preoccuparsi della quantità di memoria fisica disponibile per i motivi sopra citati.
La  memoria virtuale viene realizzata per tramite della paginazione su richiesta . Con questa i "pezzi dei processo" ,di cui parlavo prima ,si dicono pagine e chi si occupa di "spostare" le pagine da memoria a disco e viceversa ,è il paginatore.

domenica 8 maggio 2016

Systems of Linear Equations : Gaussian algorithm in java

Gaussian elimination(named after Carl Friedrich Gauss) is an algorithm for solving systems of linear equations . It consists to trasform a matrix into an upper triangular matrix . 
In this post I propose you a small java application that solves linear equations using gaussian algorithm. 
If you click here,you can download the jar file of the application : Gaussian elimination

How does it work?
As soon as you open the application , you will see a window dialog that will ask you the number of linear equations .


Insert the equation number and click the button "OK". After that, you have to insert  the coefficient of the " n "  variables of the system :

Then ,click the button "Calculate".
Here's an example:
Let's consider this system of linear equations:

Solutions will be :







mercoledì 27 aprile 2016

Scheduling della CPU

Lo scheduling della CPU risponde alla seguente domanda : "A quale processo in attesa (processo in ready queue ) assegnare la CPU ?".
Prima di iniziare è bene ricordare che per processo si intende un programma in esecuzione e i possibili stati di un processo ,secondo appunto (senza troppa fantasia) il diagramma degli stati di un processo .


Gli algoritmi di scheduling possono essere vari ,ma i criteri da soddisfare nella scelta dell'algoritmo migliore possono essere i seguenti.


  • Utilizzo della CPU . La CPU deve essere occupata il più possibile e il carico deve essere bilanciato tra i vari processori per migliorare le prestazioni.
  • Throughput . E' la misura del numero di processi eseguiti nell'unita di tempo ; rappresenta la produttività della CPU. Ci possono essere processi con CPU burst lunghi o più corti .Che vuol dire? Ad esempio la CPU può eseguire un processo in un ora,poichè questo processo richiede molta elaborazione, oppure 10 processi in un secondo.
  • Turnaround time: E' il tempo necessario ad eseguire un processo. Rappresenta la somma dei tempi passati dal processo nell'ingresso in memoria,nell'attesa nella ready queue,durante l'esecuzione e nelle operazioni di I/O.
  • Tempo di attesa :Il tempo di attesa passato nella ready queue.
  • Tempo di risposta :E' la misura del tempo che intercorre tra una richiesta e l'ottenimento di una risposta .
Si noti come è necessario aumentare i primi due punti e diminuire gli ultimi tre(infatti sono dei tempi). Di solito si preferisce ottimizzare la varianza piuttosto che i valori medi . Cioè un sistema il cui tempo di risposta sia prevedibile è migliore di un sistema con tempi di risposta migliore in alcuni casi,ma molto variabile.

Un elemento molto importante coinvolto nell'algoritmo di scheduling è il dispatcher,che è l'elemento che si occupa di fare il " lavoro sporco" .Cioè è colui che si occupa dei cambi di contesto; preleva il processo scelto dallo scheduler e passa il controllo della CPU.

Diamo ora un occhiata ai tre algoritmi di scheduling più semplici FCFS,SJF e Round Robin .

FCFS
FCFS è l'acronimo di "First Come First Served" ,tradotto significa che il primo arrivato è il primo ad essere servito .E' sostanzialmente il comportamento di una coda FIFO( per chi già la conoscesse).
E' sicuramente l'algoritmo più semplice,e come è facile intuire dal nome,la CPU viene assegnata al processo che la richiede per primo .Quando la CPU è libera viene assegnata al processo che si trova alla testa della coda . Un aspetto negativo di questo algoritmo è il tempo di attesa che può essere molto lungo( ricordo che il tempo di attesa è il tempo in attesa in ready queue) . Ad esempio ,prendendo in considerazione n processi ,di cui uno (chiamamolo P)ha CPU burst abbastanza grande ed n-1 sono veloci .Nel caso in cui il primo processo ad essere eseguito sia P gli altri processi aspettano per un tempo abbastanza lungo ,quindi il tempo medio di attesa aumenta . Inoltre l'algoritmo FCFS è senza prelazione ,cioè un processo che occupa la CPU non può essere interrotto ,trattenendola fino al momento del rilascio che avviene alla terminazione o alla richiesta di operazioni di I/O(coda di waiting).
Si noti come facendo "passare avanti" i processi con minore CPU burst il tempo medio di attesa diminuirebbe , questa è la logica seguita dal prossimo algoritmo mostrato.

SJF
SJF è l'acronimo di shortest job first . Questo algoritmo associa ad ogni processo la lunghezza della successiva sequenza di operazioni della CPU . Il processo con una minore lunghezza(più breve) di operazioni della CPU sarà quello eseguito per primo . I processi con uguale lunghezza vengono selezionati con logica FCFS. E' possibile dimostrare che questo algoritmo rende minimo il tempo di attesa per un dato insieme di processi . Ma non viene usato nello scheduler della CPU poichè sussiste un problema non di poco conto . E' facile intuirlo , come si fa a conoscere la durata della successiva richiesta della CPU? Non esiste alcun modo per determinarla ,ma in maniera "ingegneristica"  è possibile approssimarla  calcolando la cosidetta media esponenziale .
Sia Tn+1 il valore previsto per la successiva sequenza di operazioni della CPU e tn la lunghezza dell'n-esima sequenza di operazioni della CPU e sia "a" il peso associato ai due valori:
Tn+1=a*(tn)+(1-a)*Tn

tn contiene le informazioni più recenti perchè mi dice cosa è successo precendentemente, ma Tn rappresenta la storia passata ,il paramentro "a" rappresenta il peso sulla storia recente o su quella passata . In particolare "a" è compreso tra 0 e 1. 
Inoltre l'algoritmo SJF può essere con prelazione o senza prelazione . Se infatti dovesse arrivare nella ready queue un processo a cui è associata una sequenza di operazioni minore rispetto al processo che attualmente occupa la CPU,quest'ultimo viene sostituito con il processo a minore sequenza di operazioni .E il processo precedentemente in esecuzione viene posto in ready queue con una sequenza di operazioni che rappresenta il tempo residuo rimanente alla sua terminazione . L'algoritmo senza prelazione permette al processo correntemente in esecuzione di portare a termine la propria sequenza di operazioni . Lo scheduling SJF con prelazione si dice shortest remaining time first.
SJF è un caso particolare dell'algoritmo con priorità in cui si associa una priorità a ciascun processo ;infatti l'algoritmo SJF è un algoritmo con priorità in cui la priorità è l'inverso della lunghezza . Un problema relativo agli algoritmi con priorita è sicuramente la starvation che è la situazione in cui un processo con bassa priorità non viene mai servito ; è un problema serio . Sono stati scoperti addirittura processi con bassa priorità non eseguiti per anni ,è il caso dell IBM 7094 al MIT.
Una soluzione alla starvation è la tecnica dell'aging (invecchiamento) .Si tratta di far aumentare la priorità dei processi che attendono nel sistema da parecchio tempo .

Round Robin
L'algoritmo Round Robin o di scheduling circolare associa ad ogni processo un quanto di tempo( time slicing) che varia generalmente dai 10 ai 100 millisecondi . La ready queue è trattata come una coda circolare con logica FIFO,assegnando la CPU a ciascun processo per il quanto di tempo specificato.  Lo scheduler prende il primo processo dalla ready queue, imposta il timer in modo che invii un interrupt alla scadenza di un quanto di tempo e attiva il dispatcher per eseguire il processo . Le soluzioni possibili sono due : il processo termina la propria esecuzione con durata minore al quanto di tempo (bene :) ),quindi il processo rilascia volontariamente la CPU e lo scheduler passa al processo successivo ,oppure la durata della sequenza di operazioni è piu lunga di un quanto di tempo,in questo caso il timer scade e invia un interrupt al sistema operativo che esegue un cambio di contesto ,lo scheduler seleziona cosi il processo successivo secondo logica FCFS e il processo precedentemente in esecuzione viene messo nella coda circolare  . In questo caso l'algortimo è sicuramente con prelazione ,infatti un processo se non termina entro il suo quanto di tempo viene prelevato dalla CPU e riportato in ready queue.
La scelta del quanto di tempo è fondamentale . Se troppo grande ci si potrebbe portare ad un algoritmo di tipo FCFS ,se troppo piccolo si hanno troppi cambi di contesto e con conseguente overhead e rallentamento dell'esecuzione del processo. 
Si noti infine come con questo algoritmo non sussiste possibilità di starvation.

sabato 23 aprile 2016

Generazione del codice fiscale in java.

Il codice fiscale, introdotto per mezzo del decreto del Presidente della Repubblica il 29 settembre del 1973 ,  (605/1973) ,con lo scopo di rendere più efficiente l'amministrazione finanziaria ,è come noto associato all'identificazione univoca dei cittadini . In Italia è un codice alfanumerico composto da 16 cifre (si noti come sia a lunghezza non variabile) .
Qui è possibile consultare l'algoritmo di generazione del codice fiscale :

http://www.agenziaentrate.gov.it/wps/content/Nsilib/Nsi/Home/CosaDeviFare/Richiedere/Codice+fiscale+e+tessera+sanitaria/Richiesta+TS_CF/SchedaI/Informazioni+codificazione+pf/

Qui,invece vi propongo una mia semplice e se si vuole, anche banale interfaccia grafica atta alla generazione del codice fiscale .Si prenda ad esempio il generico cittadino pinco pallino nato ad Assago in provincia di Milano :


In questa applicazione non vengono gestiti i casi di omocodia . Si dice omocodia il "fenomeno" in cui due o più persone presentano un uguale codice fiscale calcolato con un generico algoritmo.  Se si vuole scaricare il file JAR , è possibile cliccare qui,scompattare il file e seguire le istruzioni:

CodiceFiscaleGUI

venerdì 22 aprile 2016

Parallel programming : Dining philosophers problem

Let's consider five philosophers that spend their whole life thinking and eating .
Philosophers share a round table sorrounded by five chair. At the center of the table there is a bowl of rice and the it is prepared with five dishes and five chopstick .




When a philosopher is thinking he doesn't interact with the others . When a philosopher is hungry he tries to catch the chopstick close to him( to the left,or the right). It's easy to understand that a philosopher can't eat with one chopstick( it's hard enough to use two.....:) ) ;so an hungry philosopher is able to eat only when  has got 2 chopstick at the same time . When the meal ends he will think again ,and so on.
Five dining philosophers is considered a classic synchronization problem because it represents the problem of resources allocation to different processes,avoiding deadlock.
Do you have any idea how to solve this problem?
I implemented a simple Java application to simulate philosophers problem ,you can download jar file from the link below :

FivePhilosophersGUI




In this example,when you see a green rectangle it means thath philosopher is eating,when it's red,it means that philosopher is eating .

venerdì 11 marzo 2016

Protezione dell' hardware : Dual-Mode

Un sistema operativo deve essere in grado di gestire i malfunzionamenti dei programmi ed evitare che da questi vada in errore l'intero sistema . MS-DOS non sopportava bene questi meccanismi di protezione ,il che lo rendeva molto vulnerabile a virus . Infatti il malfunzionamento di un programma mandava in crash l'intero sistema .
In questo post vi illustrerò uno dei meccanismi di protezione, il Dual-Mode.

Funzione Dual-Mode
Vi piacerebbe avere l'opportunità di accedere a tutte le risorse del sistema operativo ? Se si,pensate sia una buona idea ?
Per fortuna tutto questo non è possibile ,e per rispondere alla seconda domanda, sicuramente sarebbe una cattiva idea ,ergo non un buon meccanismo di protezione . Pensate ad un virus : avendo accesso garantito a qualsiasi parte del sistema ,potrebbe cancellare il sistema operativo ,modificarlo o chissà cos'altro . Basterebbe avere un po di fantasia ,metterla a disposizione di un po di malvagità e il danno sarebbe fatto .  Per fortuna esiste un meccanismo di protezione hardware denominato  Dual-Mode . Fondamentalmente, questo differenzia due modalità di esecuzione delle operazioni : modalità utente e modalità Kernel .
 Esiste dunque un bit di modo ( valore booleano che può assumere il valore 0 o 1) che differenzia tra la modalità kernel ( bit di modo=0) e modalità utente (bit di modo = 1) .
In modalità utente  un qualsiasi programma utente (scusate la cacofonia) non può accedere a risorse privilegiate ,non ne ha il diritto , lo può fare esclusivamente il sistema operativo . Se il programma ha bisogno di una di queste risorse ," chiede il servizio " al sistema operativo attraverso una System Call, se tutto va bene ,il sistema operativo passa in modalità kernel (cambiando il bit di modo) e soddisfa il servizio . Alla fine il controllo ritornerà all'utente con una successiva commutazione del bit di modo a modalità utente. Ad esempio il cambiamento del bit di modo è una funzione privilegiata e può essere svolta esclusivamente dal sistema operativo . Stessa cosa per le operazioni di I/O.
Inizialmente all'accensione del calcolatore , lo stato in cui ci si trova è in modalità kernel (è infatti necessario caricare il sistema operativo).
Come dicevo inizialmente, MS-DOS non sopportava questo meccanismo di protezione ,il che creava una marea di problemi e rende l'idea della mediocrità dello stesso.

mercoledì 9 marzo 2016

Differenza tra sistemi monoprocessore e multiprocessore

La CPU (unità di elaborazione centrale) è quel componente hardware che si occupa di curare tutte le funzioni di un computer basato sull'architettura di von Neumann (macchina a programma memorizzato) . E' dunque la componente fondamentale di un calcolatore . 
Un sistema con un solo processore ,dotato di una sola CPU principale è un sistema monoprocessore . In realtà un piccolo grado di parallelismo è dovuto ai vari controllori dei componenti( per esempio della memoria ) , ma si tratta di processori specializzati (guarda qui : http://zangariappunti.blogspot.it/2016/03/funzionamento-dei-dispositivi-di.html )  . L'uso di microprocessori specializzati insieme ad una sola CPU non rende un sistema monoprocessore in multiprocessore  . 
Negli ultimi anni i sistemi multiprocessore hanno iniziato a dominare il mondo della computazione . Questo tipo di sistema dispone di più CPU che condividono tra loro risorse (come il clock di sistema,le memoria ,il bus e i dispositivi periferici) . I sistemi multiprocessori hanno 3 principali vantaggi : migliori prestazione,maggiore affidabilità e  sono più economici, costano infatti di meno rispetto che avere più sistemi monoprocesore .

martedì 8 marzo 2016

Funzionamento dei dispositivi di Input/Output

Vi siete mai chiesti come fa il nostro computer a riconoscere la pressione della tastiera,i click del mouse,o l'uso di altre periferiche di I/O(Input/Output) ?  Se si, vediamo di scoprire cosa succede ,ma prima bisogna chiarire cos'è un sistema operativo e com'è fatto un dispositivo di I/O.
Sistema Operativo
Un sistema operativo è quel software che agisce da intermediario tra utente e hardware ; Ci permette di utilizzare in maniera efficiente i componenti hardware che fanno parte dei nostri computer.
Esempi di sistemi operativi sono Windows,MacOs,Linux,Unix ,ecc.  Il S.O. viene caricato in memoria all'avvio dal programma di bootstrap che si trova in una ROM o in una EEPROM . In realtà il bootstrap non carica l'intero sistema operativo,ma ne carica il kernel (nucleo) che è l'unico processo del sistema operativo sempre in esecuzione . Il bootstrap e le memorie in cui è contenuto sono dette firmware.
Dispositivi di I/O
I device di I/O sono il mouse,il monitor,la stampante,la tastiera ,ecc.
Ogni device di I/O ha al suo interno un controller (una sorta di piccolo processore) e un buffer locale che funge da memoria locale .
Ogni calcolatore è dunque composto da una CPU(Central Processing Unit o più familiarmente chiamata processore) e da questo insieme di controllori di dispositivi connessi mediante bus comuni. I sistemi operativi contengono per ogni controllore un driver del dispositivo che si coordina con il controllore e funge da interfaccia con il resto del sistema.

Vediamo ora di dare una risposta alla domanda nel titolo :
Appena il driver del controllore si accorge dell'operazione da intraprendere(per esempio click del mouse o pressione di un tasto della tastiera) ,il controllore trasferisce i dati dal dispositivo al buffer locale . Appena questa operazione finisce,il controllore manda un interrupt alla CPU. Un'interrupt non è altro che un evento asincrono , che richiede l'attenzione della CPU . Si dice asincrono perchè è in effetti impossibile sapere quando avverrà ,pensate ad un click del mouse . Appena la CPU termina il suo ciclo di clock salva il suo stato corrente e gestisce l'interruzione . Il modo più semplice per gestire le interruzioni  è attraverso il vettore di interrupt, che è  una tabella di puntatori salvata in genere nelle prime locazioni di memorie(le più basse) .L'accesso a questa sequenza di indici avviene per mezzo di un indice codificato dallo stesso segnale di interruzione,allo scopo di fornire l'indirizzo della procedura di gestione delle interrupt.
Se durante la gestione di un interrupt ne arriva un'altro quest'ultimo viene messo in coda ,la CPU infatti non gestisce gli interrupt a catena,ma in modo sequenziale . Appena termina la gestione degli interrupt la CPU riprende il suo lavoro .
Questa forma di I/O guidata dalle interruzioni è adatta al trasferimento di piccoli dati,ma pensate in caso di trasferimenti pesanti . In questo caso viene in aiuto il DMA(Direct Memory Access).Il DMA è un meccanismo che permette alla CPU di essere "sollecitata" il meno possibile . Viene infatti mandato alla CPU un interrupt "iniziale",questa delega al DMA la gestione del trasferimento in memoria (per questo accesso diretto alla memoria).
 Pensate per esempio ad una stampa di centinaia di pagine . Invece di mandare interrupt alla CPU per ogni blocco di byte,grazie al DMA viene mandato alla CPU un interrupt all'inizio e alla fine dell'operazione.

lunedì 7 marzo 2016

Stirling engine

I want to show you my Stirling engine ; it was invented by Robert Stirling who was a scottish clergyman.
.
Stirling engine is classified as external combustion engine which works through temperature difference . In fact if you look carefully this video ,you can see some candles which heat the can and the steel wool inside .

I built it with recycled materials . I hope you like my work .



.


Some scientist think that Stirling engine is the future of solar energy .
For more detailed informations you can click here : https://en.wikipedia.org/wiki/Stirling_engine

domenica 6 marzo 2016

Rappresentazione di oggetti in java

Come noto Java è un linguaggio di programmazione orientato agli oggetti, è ,dunque per noi centrale il concetto di oggetto .Vediamo in questo post come rappresentare graficamente un oggetto in Java ; Un oggetto è un istanza di una classe  . Spesso ,sopratutto per chi è alle prime armi, si tende a confondere il concetto di classe e di oggetto , vediamo di chiarirlo .
Una classe è un TIPO, è  la specificazione di un'idea che definisce il comportamento  e le caratteristiche comuni che ogni oggetto deve avere  (Per maggiori informazioni è possibile consultare il post precedente sulle classi).
Un oggetto viene creato a partire dalla classe .E' una variabile il cui tipo è definito dalla classe  e che attraverso l'operatore " . " può usufruire delle operazioni messe a disposizione da quest'ultima .
Vediamo degli esempi :

 Prendendo in considerazione la classe creata nel post "Cos'è una classe?" creiamo una variabile oggetto di tipo Automobile inizializzata al valore null . Il valore "speciale" null indica che l'oggetto non esiste,vediamone la rappresentazione grafica :

Se provassimo ad invocare un'operazione sulla variabile a , troveremmo una  eccezzione di tipo java.lang.NullPointerException .

Creiamo ora la variabile oggetto "a" attraverso l'operatore new. Si noti come il colore new è di colore diverso rispetto al resto della riga,questo significa che è parola chiave di java.

Vediamo graficamente :
E se ne modificassimo lo stato? Proviamo a"truccare" la nostra Ferrari modificandone la cilindrata  in 6000 cm^3
Come al solito aiutiamoci graficamente :
Abbiamo modificato la nostra Ferrari . Si noti che nell'ultima porzione di codice si è chiamata la stampa a video mediante il metodo println dell'oggetto out presente nella classe System . Dentro le parentesi del metodo println per stampare lo stato dell'oggetto si è fatto uso del metodo toString() già citato nel precedente post. In realtà avremmo potuto anche solo scrivere System.out.println(a) poichè java riconosce automaticamente che stiamo chiamando il toString().

Vediamo il risultato della stampa:




Per chi è nuovo nel mondo della programmazione inizialmente è molto utile disegnare un oggetto,per capirne il comportamento .

















Cos'è una classe ?

In Java , una classe non è altro che la concretizzazione di un'idea definita da metodi e attributi. Ad esempio se avete in mente un automobile ,senza troppa fantasia si può esplicitare una classe Automobile(per convenzione i nomi delle classi iniziano con lettera maiuscola). Gli attributi di questa potrebbe essere la cilindrata ,il modello,il numero di posti ,i cavalli,ecc. Le operazioni (i metodi) invece, potrebbero essere i classici metodi set e get,oppure un metodo che a partire dai cavalli ne calcola i KW . Insomma l'unico limite è esclusivamente la nostra fantasia .


E' sempre buona norma inserire il metodo String toString() in ogni classe, che è semplicemente la descrizione dello stato di un oggetto(istanza di una classe) .In realtà oltre al toString è buona norma inserire anche i metodi boolean equals (Object o) e int hashCode(),ma questo è un discorso più complesso .