Esclusione reciproca su rete - modello?

1

Voglio fare quanto segue:

Ho un numero di computer. Su ogni computer verrà eseguito un programma. Non esiste un server centralizzato.

Il programma può scegliere in base a criteri definiti per fornire a un altro computer i dati specificati. Mentre lo fa, l'altro computer non dovrebbe fare lo stesso. (Una sorta di sincronizzazione a 2 vie)

Facciamo un esempio. (C1 .. Cn sono i programmi in esecuzione su computer diversi)

C1 invia dati aggiornati C2. Mentre l'elaborazione è attiva, C2 non dovrebbe chiedere a C1 di aggiornare qualcos'altro.

L'idea era:

C1 invia un messaggio a C2: PauseExecution () C1 invia agli elementi C2 da elaborare (aggiorna alcuni dati su C2) C1 invia un messaggio a C2: ResumeExecution (). C2 invia un messaggio a C1: PauseExecution () C2 invia agli elementi C1 da elaborare (aggiorna alcuni dati su C1) C2 invia un messaggio a C1: ResumeExecution (). Ma ora sorge il problema più grande.

Se C1 invia un messaggio a C2 a Pausa e C22 invia allo stesso tiem un messaggio a C1 a Pausa, entrambi bloccerebbero.

Non esiste un server centralizzato / memoria condivisa per mantenere un semaforo.

C'è un altro pattern che può essere usato, in modo che n computer non blocchino?

Quindi questa domanda riguarda l'esclusione algoritmica.

O c'è un'altra soluzione per questo problema, se non è possibile utilizzare nessun semaforo o mutex?

    
posta Offler 13.02.2013 - 16:42
fonte

2 risposte

2

La parola chiave qui è transazione distribuita . Hit google con quello e troverete molti modi possibili, ma come già detto Karl un commit in due fasi è la soluzione tradizionale.

Dato che non esiste un'autorità centrale, ha senso non assumere nulla sugli altri sistemi finché non si ottiene un riconoscimento da parte loro che accettano i propri piani (prima fase). Solo quando tutti i sistemi coinvolti sono d'accordo eseguono la transazione / l'invio di dati / qualsiasi (seconda fase).

Tuttavia, a seconda della quantità di trasferimenti che hai e del numero di sistemi coinvolti, devi dare un'occhiata più da vicino ai possibili casi di inedia. Diciamo che i sistemi A e B vogliono continuamente inviare dati al sistema C e più o meno bombardarlo con commit di prima fase, cioè chiedono al sistema C se è disposto ad accettare un file da essi. Se ora desideri che un sistema D invii un file a C, potrebbe non ottenere mai un riconoscimento in base alla correttezza dei dettagli di implementazione specifici.

    
risposta data 13.02.2013 - 17:53
fonte
1

Per questo esistono numerosi algoritmi noti. Ricart-Agrawala sembra avere il minor numero di problemi. Fondamentalmente, invece di comandare un altro sistema per sospendere l'esecuzione, sospendi la tua esecuzione, invia una richiesta e attendi una risposta prima di non essere pronta. Quindi invii un altro messaggio quando hai terminato di eseguire la sezione critica. I diversi algoritmi hanno diversi modi per evitare il deadlock.

    
risposta data 13.02.2013 - 16:55
fonte

Leggi altre domande sui tag