MokaByte Numero 04 - Gennaio 1997 |
|||
|
Step-to-Step
nei threads |
||
di |
Prima puntata | ||
Da questo mese si parlerà dei programmiMultiThread. Vediamo quindi come potrà svolgersi questa serie diarticoli atti a spiegare questa fantastica branca della programmazione.Innanzitutto ci sarà un articolo (lo state leggendo) nel quale sifarà un po' di teoria (si sa che ci vuole), poi vedremo (il meseprossimo) un esempio molto semplice dove si risolverà un problema con la costruzione di alcune piccole applicazioni che svolgeranno partedi esso e ne comunicheranno i risultati al richiedente, quindi ci metteredi fronte a un grosso problema con un risvolto pratico (dopo tanta teoriaci vuole...) e vedremo come si può risolverlo e come effettivamentelo risolveremo. Di questo problema per ora non si accennerà niente,sia perchè dobbiamo ancora definirlo, sia perchè sarebbetroppo complicato da spiegare per una persona digiuna di programmazionedistribuita, come si pensa possa esserlo un ipotetico lettore di questoarticolo.
Piccola spiegazione teorica
Innanzitutto qualche piccola
definizione:cos'è un programma MultiThread? È un programma
che puòeseguire più parti di se stesso (thread) contemporaneamente.
Ineffetti è una conseguenza del multitasking (vedi articolo
teoricointroduttivo - ndr).
Infatti esso è la possibilità di un sistema operativo dieseguire
più programmi contemporaneamente. Se al posto del programmasi usa
solo una procedura (o comunque una sottoparte del programma) eccoche abbiamo
il multithread. È questa una definizione un po' semplificata,non me
ne vogliano gli esperti e tutti coloro che mettono i puntini sullei, ma era
necessaria per fare capire a tutti di cosa si sta parlando. Comeho detto,
questo mese ci soffermeremo su una descrizione generale di unprogramma multithread,
evitando di entrare nel dettaglio dello sviluppo,quindi non si faranno esempi
pratici.
Struttura del programma
Innanzitutto vediamo come
deve essere strutturatoun programma per usare queste potenzialità.
La base di questo programmadeve essere la classe generica Thread, dalla quale
deriveremo la classeche ci serve. Da notare che adesso si ragiona a oggetti,
ma in effettiè possibile, per quanto un po' più incasinato
creare un programmamultithread in C puro.
Questa classe derivata da "Thread" conterrà due membrifondamentali,
che chiameremo Start e Stop. Esse attivano e fermano il thread.A questo punto
il programma è praticamente fatto. La funzione mainrichiama tutte
le classi thread e le attiva.
Esiste un altro modo per fare la stessa cosa e sfrutta le possibiltà
offerte da una rete TCP/IP (come per esempio Internet, anche se basta una
Intranet, anche senza nessun WebServer). Si tratta di fare tanti piccoliprogrammini
(o programmoni) che girano anche su più macchine e checomunicano tra
di loro tramite porte socket (vedi l'articolo sui socketnel secondo numero
di questa rivista).
In effetti questa seconda ipotesi fa più parte della programmazione
distribuita piuttosto che del multithreading, ma è una possibilità
molto interessante, relativamente facile da implementare in Java e che,sopratutto,
gode del vantaggio offerto da una rete mondiale come puòessere internet.
Immaginate la possibilità di avere n computer, tutti collegati assieme
e che ogni computer abbia la possibilità di eseguire una certa funzione
mandando su una porta un certo comando e attendendo il risultato. Il programma
vero e proprio si limiterebbe a scomporre il problema in tante parti ea darle
in pasto ai vari computer, attendendo poi il risultato. Comodo,vero? In effetti
un qualcosa di simile è già stato fattoe quasi tutti lo abbiamo
già utilizzato. Sto parlando delle DLL(dinamic link library) che occupano
tanto spazio nella directory di Windows.
Essi sono porzioni di codice che possono essere richiamate da piùprogrammi,
anche contemporaneamente, e che evitano di dover duplicare procedure,con
gran risparmio di spazio.
Idea da sviluppare
Immaginiamo quindi di avere
un ipotetico problema(adesso ne prendo uno a caso, ma in seguito, quando
si faranno esempi praticise ne studierà uno che abbia qualche utilità)
e di volerlorisolvere utilizzando la tecnica precedentemente spiegata.
Innanzitutto bisogna dire che ciò è conveniente quando siha
a disposizione una rete di calcolatori, ma la procedura funziona correttamente
anche su una sola macchina (solo che così è più lenta).
Diciamo per semplicità che il problema è di implementareuna
piccola calcolatrice con le due operazioni fondamentali (addizionee moltiplicazione,
sottrazione e divisione possono essere ricavate da queste,e anche la moltiplicazione
in effetti può essere ricavata dall'addizione,ma semplificherei troppo
il programma). Abbiamo quindi due procedure: adde mult.
Diciamo per comodità che esse hanno entrambe due parametri e neritornano
sempre uno (questo era naturale). Supponiamo altresì chela add
usi la porta 10000 e la mult la porta 10001.A questo
punto vediamo un po' come potrebbe essere l'implementazione diqueste funzioni.
Prendiamo ad esempio la add.
Procedura Add
A questo punto vediamo come il nostro programmapuò risolvere il seguente problema:
(a+b)+(c*d)
Naturalmentele procedure citate in questo esempio non sono funzionali in
quanto senon si mette un controllo è impossibile eseguire contemporaneamente
due somme o due moltiplicazioni in quanto le porte sarebbero occupate.
Per fare ciò occorre che la funzione (thread) si duplichi ogni nuovo
operazione che viene proposta.
Quindila vera funzione add sarebbe così:
Bene,per questa puntata direi che ci si può fermare qui. Il prossimo
mese vedremo di fare un esempio che effettivamente potrà girareefficaciemente
su una macchina (o, meglio ancora, su una rete) e si metterà,finalmente,
un po' di codice in modo da rendere pratica la spiegazioneteorica che si
è spiegata in questa parte. Il risultato saràun'applicazione
che può girare in una qualsiasi macchina di unaipotetica rete (la
programmazione distribuita è pensata per le reti,ma si può
tranquillamente usare anche sulla stessa macchina), lanciandoi calcoli da
fare su una porta di un indirizzo.
Praticamente: a ogni macchina della rete è associato un indirizzoIP
e questo verrà usato per identificare la macchina dove si trovala
risorsa, poi ci saranno un certo numero di programmini che userannoalcune
porte per i dati. L'applicazione usarà l'IP e la porta perfare i suoi
calcoli. Nota per gli utilizzatori di macchina "stand-alone":se si mantiene
sempre lo stesso IP il programma girerà correttamente,anche se si
perderà un po' lo scopo dell'articolo e, naturalmente,un po' di velocità.
|
||
|
||
MokaByte rivista web su Java |
||
|