Michele Liberi software

versione 1.03, 1 settembre 2022

Michele Liberi
mail: mliberi@gmail.com
cell: 3485211456

liberix

lrm, gestore di risorse logiche

lrm (Logical Resource Manager) è un demone che una volta lanciato si pone in ascolto su una porta TCP/IP. La porta di default è la 1120.

L'accesso ai servizi forniti da lrm avviene a mezzo del comando lra. La comunicazione tra client e server tuttavia è regolata da un protocollo basato su stringhe quindi è possibile utilizzare qualunque programma che sia in grado di effettuare una connessione TCP/IP, inviare e ricevere stringhe, come ad esempio il comando telnet.

Può lavorare in cluster con un altro demone lrm per fornire un servizio in alta affidabilità. Il secondo demone può essere in ascolto su un altro server (configurazione consigliata in ambienti di produzione), o su un'altra porta dello stesso server (configurazione consigliata solo in ambienti di test).

lrm implementa il concetto di risorsa logica, un'estensione del concetto di semaforo. A differenza del semaforo, pensato per una stringente serializzazione degli accessi, una risorsa logica può permettere accessi multipli fino ad un numero massimo, cioè può avere grado di parallelismo maggiore di uno. lrm realizza un meccanismo semplice, robusto e affidabile per serializzare l'accesso a "risorse" mediante l'utilizzo di una coda FIFO: le richieste di accesso alla risorsa vengono soddisfatte nello stesso ordine con cui arrivano.

Se hai mai dovuto utilizzare un file di lock per sincronizzare o serializzare due o più lavori asincroni (anche se girano su macchine diverse), troverai utile questo servizio. Perché è più efficiente, ricco di funzioni, ed utilizzabile in rete. Quindi un unico server lrm può essere usato da più macchine connesse in rete.

È molto più di un meccanismo che implementa un semaforo o un file di lock in quanto le risorse logiche possono esistere con quantità maggiore di uno, e ciò consente di avere un grado di parallelismo nell'utilizzo di risorse.

lrm è in grado di rilevare automaticamente eventuali situazioni di deadlock, le richieste che causerebbero un deadlock non vengono soddisfatte.

Lo scenario che avevo in mente quando ho progettato lrm è il seguente:

  1. quando un client vuole accedere in modo esclusivo ad una risorsa si connette al server lrm e chiede di acquisire la risorsa
  2. quando la richiesta può essere soddisfatta, il server assegna la risorsa e risponde
  3. il client viene "svegliato" dalla risposta e può continuare con la garanzia di avere accesso esclusivo alla risorsa
  4. quando lo ritiene opportuno il client può rilasciare la risorsa

Se il client termina, per qualsiasi motivo, la connessione TCP/IP si chiude (attività svolta dal TCP/IP quindi a livello kernel), il server se ne accorge e rilascia tutte le risorse detenute da quel client.

Ci sono alcuni vantaggi nell'utilizzare questo schema rispetto ai tradizionali meccanismi dei files di lock o dei semafori:

Il server lrm mantiene inoltre un insieme di variabili super globali e persistenti, cioè variabili di rete. Questo consente la sincronizzazione di processi basati sul valore di variabili.

Un ambiente di rete per le variabili d'ambiente consente dei meccanismi di comunicazione tra processi che girano su macchine diverse e anche su sistemi operativi diversi.

lrm garantisce che l'accesso a queste aree sia gestito in modo atomico. Non c'è limite alla lunghezza del nome di una variabile, né alla lunghezza del valore in essa contenuto.

Le variabili d'ambiente vengono automaticamente definite nell'ambiente dei comandi lanciati tramite il comando lra, e possono essere utilizzate per generare dei contatori unici.