Articolo pubblicato sul n. 96 di MCmicrocomputer (Edizioni Technimedia Srl - Roma) nel maggio 1990
Amighevole: Ohibo'. Ciuchini e Suatoni parevano proprio averci preso la mano. E non mi lasciano piu' parlare... Bando agli scherzi (e sottolineo scherzi!) questo mese torneremo a parlare di ADPnetwork (vera e propria) ovvero del software di rete che permette la comunicazione tra processi in esecuzione su macchine diverse, fisicamente collegate tra loro attraverso una architettura di interconnessione circolare, formata da tanti collegamenti dedicati quante sono le macchine in rete. Come piu' volte ribadito, non si tratta di un semplice bus seriale condiviso (come puo' essere ad esempio quello dell'architettura Ethernet) ma di una struttura di interconnessione distribuita deterministica in cui ogni macchina in rete puo' iniziare il suo accesso sulla rete indipendentemente dall'attivita' delle altre macchine sulla medesima struttura. Puo' anche succedere (e questo Ethernet... semplicemente se lo scorda) che nello stesso istante piu' macchine eseguano scambio di file o, piu' in generale, scambio di messaggi. E quando dico "stesso istante" mi riferisco alla sua accezione "fisica" del termine e non semplicemente "logica". Eppure, come per Ethernet, si tratta di un solo filo che "visita" tutte le macchine in rete. Dov'e' il trucco ? Nessun trucco: solo illusionismo...
ADPnetwork vs Ethernet
Avevo
detto che non scherzavo piu' e invece ci sono cascato di
nuovo. Ma quale illusionismo ??? Si tratta solo ese
esclusivamente di pura realta' (dei fatti). Spieghiamoci
meglio. La differenza sostanziale che intercorre tra
ADPnetwork ed Ethernet sta nel fatto che la prima e' una
architettura di rete deterministica, la seconda no. Per
quando vi possa sembrare strano (posto che chi mi legge non
sia esperto di reti a basso livello) Ethernet quando accede
alla rete lo fa per tentativi. Nel senso che prima di
accedervi controlla che nessun altro stia utilizzando la
struttura fisica (infatti una sola macchina per volta puo'
accedere al bus seriale in scrittura), ma nell'attimo in cui
decide di utilizzarla non puo' essere certo di ottenerne
l'uso esclusivo. Ci prova... se gli va bene puo' iniziare la
sua trasmissione, altrimenti abortisce la transazione e
ritenta dopo un intervallo di tempo calcolato da un
algoritmo pseudocasuale. Infatti, nel medesimo istante, due
o piu' macchine possono avere la voglia di trasmettere su
Ethernet e quindi simultaneamente testare la disponibilita'
del supporto fisico ottenendo tutte esito positivo (supporto
disponibile) ma prima di iniziare la vera e propria
trasmissione e' necessario un secondo test atto ad
identificare questo genere di collisioni. Il meccanismo in
se' e' abbastanza semplice: tra l'altro ne abbiamo gia'
parlato un bel po' di mesi fa (forse anni!) in Appunti di
Informatica sotto il "capitolo" Arbitraggio distribuito non
deterministico. Il modo piu' semplice per ottenere
l'arbitraggio e' di disporre di una linea aggiuntiva "di
servizio" mantenuta bassa quando il supporto di trasmissione
non e' utilizzato e alta quando lo e', da parte della
macchina utilizzante. Ogni macchina che intende utilizzare
la connessione testa la linea di servizio per vedere lo
stato. Se e' "basso", la pone "alto" e inizia a trasmettere,
se e' "alto" attende la liberazione del supporto. Puo'
seccedere, come detto, che simultaneamente piu' macchine
testino lo stato della linea di servizio e, sempre
contemporaneamente, queste macchine, trovato lo stato
"basso" si appoprino del bus alzando tale linea di servizio
e cominciando a trasmettere. E' chiaro che si ottiene una
bella collisione che deve essere avvertita dalle stesse
macchine trasmettitrici che, man mano che mandano il loro
messaggio, devono testarne la "leggibilita'" rileggendolo
contemporaneamente. Ora, se rileggendo via via il messaggio
trasmesso non vi sono discrepanze tra quanto inviato e
quanto letto, vuol dire che la trasmissione procede bene ed
effettivamente il bus e' stato acquisito dalla macchina in
quesione. Se invece una macchina scrive "pippo" e legge "pluto"
vuol dire che qualcun altro (credendo come quest'ultima di
avere uso esclusivo della connessione) sta trasmettendo
simultaneamente: in questo caso occorre abortire la
trasmissione da parte di tutte le macchine coinvolte nella
collisione ritentando la comunicazione dopo un intervallo di
tempo calcolato grazie ad una funzione pseudo casuale,
possibilmente calcolata con algoritmi diversi sulle varie
macchine (onde evitare, come i piu' attenti avranno intuito,
continui rimbalzi). ADPnetwork, invece, e' una architettura distribuita, deterministica: ogni macchina che intende accedere alla rete, puo' farlo in qualsiasi momento, senza assolutamente curarsi del fatto se nel medesimo istante altre macchine accedono alla rete. E in caso di "grosso carico" (ovvero di molte macchine che accedono contemporaneamente alla rete) non c'e' assoluto rischio che qualche macchina non riesca ad effettuare la sua trasmissione, ma solo che il suo messaggio sia recapitato con un ritardo maggiore rispetto al caso di "carico leggero". Come detto piu' volte, infatti, ogni macchina e' "proprietaria" del collegamento verso la macchina successiva del loop e quindi puo' disporne (a meno di riempimenti di buffer... ma questi, si sa, sono problemi secondari!) della rete in ogni momento, semplicemente inoltrando al "next node" il suo messaggio. Contemporaneamente anche altre macchine possono fare la stessa cosa e, ripeto, il maggiore o minore carico del sistema e' evidenziato semplicemente da un "naturale" degrado delle prestazioni, ma non c'e' assoluto rischio di attesa infinita (starvation) da parte di qualche nodo. Di contro, ogni macchina sara' interessata non solo ai pacchette da essa spediti o ricevuti, ma anche da tutti i pacchetti in transito da una macchina ad esssa "precedente" ad una macchina ad essa "successiva". Considerato poi che ADPnetwork per garantire una tolleranza ai guasti dovuti a caduta del supporto fisico necessita di pacchetti di Ack che confermano l'avvenuta ricezione del pacchetto trasmesso (e il senso di circolazione e' sempre il medesimo) succede che qualsiasi macchina trasferisca un messaggio su qualsiasi altro nodo, vengono coinvolte tutte le macchine collegate in rete: o per recapitare il pacchetto al destinatario, o per inoltrare il pacchetto di Ack (la conferma) al mittente. Quindi potenza si', ma anche ampio dispiego di forze.
L'autoconfigurazione a basso livello
Perche' a basso livello ? Semplice: per distinguerla da quella ad alto livello. Ma non credo affatto di essermi spiegato a sufficienza. Infatti, per configurazione ad alto livello intendo la capacita' delle singole macchine (gia' in rete, ovvero confgurate a basso livello) di conoscere la conformazione dei singoli nodi: nomi simbolici della macchine e device accessibili via rete su queste. Ma l'argomento non riguarda me, ma i "soliti" Ciuchini e Suatoni che si stanno occupando del Net-Handler e Net-Server della rete. Ma torniamo ad ADPnetwork "allo stato puro", ovvero quale mezzo "logico" di comunicazione interprocess-internodes. Sono passati diversi mesi dall'ultimo appuntamento riguardante il software di rete propriamente detto, e molte modifiche sono state apportate per aumentare le prestazioni generali del sistema. In figura 1 e' mostrato il nuovo formato dei pacchetti di rete (in seguito denominati frame per non confonderli coi dos packet di Ciuchini e Suatoni). La principale differenza rispetto alla (pre)release 3.0 e' che ogni macchina e' identificata a basso livello da un NetID di 16 bit e a livello del Net-Handler dal consueto nome simbolico di massimo 9 caratteri. E a differenza, sempre, della versione precedente, ogni macchina sceglie automaticamente un NetID (attraverso un algoritmo pseudo casuale) e nessuna operazione e' quindi richiesta da parte dell'operatore per inizializzare il singolo nodo. E' chiaro, inoltre, che ogni nodo non puo' semplicemente scegliere "a caso" il suo NetID, ma, in un certo senso, deve sincerarsi che nessun'altra macchina si chiama (o intende chiamarsi) nello stesso modo.
Se state
pensando che cio', in un sistema completamente distribuito
come ADPnetwork, e' assolutamente impossibile avete proprio
ragione. E non sto dando (ancora) i numeri. Si sa, infatti,
che in mancanza di un "distributore centralizzato" di NetID
le singole macchine non possono mettersi tra loro d'accordo
in modo da avere ognuna un NetID differente in quanto
nessuna potrebbe mai essere certa che l'ID scelto anche
temporaneamente da ognuna non sia stato scelto
contemporaneamente anche da altri. E non c'e' niente da fare
a riguardo, se non scendere ad opportuni compromessi. E' necessario, allora, istituire una forma di riconoscimento "propria proposta" ben piu' affidabile del solo NetID che potrebbe essere uguale a quello di un altro. Ovviamente non esiste un metodo assolutamente certo per riconoscere il proprio messaggio proposta come tale, ma possiamo spingerci al punto da rendere particolarmente improbabile una collisione di questo genere. In figura 2 e' mostrato il formato del pacchetto di autoconfig. Il campo destinatario e', ovviamente, non significativo, dal momento che tale messaggio e' diretto a tutte le macchine in rete. Segue il campo mittente: qui la macchina che "vuole configurarsi" mette la sua proposta di NetID. Nei tre campi successivi la macchina mittente mette alcune informazioni aggiuntive, come detto, per abbassare notevolmente la probabilita' che un'altra macchina in rete prenda per suo il pacchetto in questione. Le informazioni riguadano l'ammontare della memoria libera in quell'istante, l'identificatore al processo che sta effettuando l'operazione e l'indirizzo della porta sulla quale il processo di autoconfigurazione aspetta l'esito. Oltre a questo il NetID e' funzione sia di un algoritmo pseudocasuale che dell'orologio interno delle singole macchine. In questo modo, per avere ancora una collisione, e' necessario che in due macchine si verifichino contemporaneamente i seguenti eventi: le due macchine hanno esattamente la stessa architettura, stessa espansione di memoria e schede installate; hanno effettuato i loro rispettivi boot esattamente nello stesso istante e i loro orologi interni "tamponati" non sono sfasati temporalmente nemmeno di un solo tick di sistema; le due macchine eseguono al boot esattamente la stessa procedura, lanciando i medesimi programmi contemporaneamente. Come dire che per verificarsi una collisione "di vedute" ce ne vuole davvero parecchia (di sfortuna). Il campo Stamp (implementato anche nel frame standard) permette a qualsiasi macchina in rete di uccidere eventuali "zombi" in circolazione. Se si verifica ad esempio che una macchina immette un frame sulla rete e poi muore (va in crash, ad esempio), tale frame (o al piu' il relativo ack) potrebbero finire per circolare "all'infinito" sulla rete dato che ogni macchina rimasta continuerebbe a reinoltrarlo non riconoscendolo come proprio. Per venire meno a questo inconveniente, quando un frame qualsiasi passa per una qualsiasi macchina, prima di reinoltrarlo (e posto che nessun altro nodo abbia gia' provveuto) il nodo "reinoltrante" lo marchia col suo NetID nel campo Stamp in modo tale che se ripassa di nuovo da quel nodo, vuol dire che la macchina destinataria non esiste piu' e quindi lo si puo' tranquillamente uccidere (lett.: "non reinoltrare"). E chiaro che se oltre a morire la macchina destinataria (o mittente) muore anche la macchina che ha settato lo Stamp il frame restera' comunque in vita e quindi in circolazione. E' per questo motivo (fig.1) che nella struttura del frame standard ho previsto addirittura due Stamp distinti da far settare a due macchine diverse: il "casino" e' ancora possibile, ma le probabilita' che cio' si verifichi scendono ancora...
Concludendo
Come avrete notato, per i soliti motivi di spazio, non e' stato possibile effettuare una trattazione piu' particolareggiata del meccanismo di autoconfigurazione a basso livello. Del resto, pero', non era nemmeno nostro intento un maggiore livello di dettaglio, dato che ADPnetwork non sara' un prodotto di pubblico dominio (non cercatelo su MClink: discorso analogo per l'ADPmttb) e non possiamo certo svelarvi proprio-proprio tutto. Questi articoli, comunque, hanno valore didattico e chi volesse cimentarsi in imprese simili (magari per altre macchine, cosi' non ci fa concorrenza...) trovera' sicuramente (almeno speriamo) spunti validi per risolvere facilmente un po' di problemi nemmeno tanto banali. Se poi qualcuno intendesse interfacciarsi con la nostra rete con macchine non Amiga, inutile dirlo, avrebbe tutto il supporto necessario all'operazione. Se qualcuno e' interessato: buon lavoro!
Impaginato originale... Articolo pubblicato su www.digiTANTO.it - per ulteriori informazioni clicca qui |