Strutture dati simultanee ad albero con tempo di aggiornamento costante e senza blocco?


20

Ultimamente ho letto un po 'di letteratura e ho trovato strutture di dati piuttosto interessanti.

Ho studiato vari metodi per ottenere i tempi di aggiornamento fino a tempo di aggiornamento nel caso peggiore [1-7].O(1)

Di recente ho iniziato a cercare strutture di dati prive di blocchi, per supportare un accesso simultaneo efficiente.

Qualcuno di questi casi peggiori stato usato nell'implementazione di strutture dati senza lock?O(1)

Chiedo perché; a me sembrano l'ovvia estensione pratica di questo "miglioramento teorico".


  1. Tarjan, Robert Endre. "Aggiornamento di un albero di ricerca bilanciato nelle rotazioni O (1)". Lettere di elaborazione delle informazioni 16, n. 5 (1983): 253-257.

  2. Driscoll, JR, N Sarnak, DD Sleator e RE Tarjan. "Rendere persistenti le strutture di dati". In Atti del diciottesimo simposio annuale ACM sulla teoria dell'informatica, 109–121. STOC '86. New York, NY, USA: ACM, 1986.

  3. Levcopoulos, C. e Mark H. Overmars. "Un albero di ricerca bilanciato con O (1) Peggior tempo di aggiornamento del caso." Acta Inf. 26, n. 3 (novembre 1988): 269–277.

  4. Fleischer, Rudolf. Un semplice albero di ricerca bilanciato con O (1) tempo di aggiornamento peggiore dei casi

  5. Dietz, Paul F e Rajeev Raman. "Un albero di ricerca delle impronte digitali con tempo di aggiornamento costante". Lettere di elaborazione delle informazioni 52, n. 3 (1994): 147-154.

  6. Lagogiannis, George, Christos Makris, Yannis Panagis, Spyros Sioutas e Kostas Tsichlas. "Nuovi alberi di ricerca bilanciati dinamici con tempo di aggiornamento costante peggiore". J. Autom. Lang. Pettine. 8, n. 4 (luglio 2003): 607–632.

  7. Brodal, Gerth Stølting, George Lagogiannis, Christos Makris, Athanasios Tsakalidis e Kostas Tsichlas. "Alberi di ricerca delle dita ottimali nella macchina del puntatore." J. Comput. Syst. Sci. 67, n. 2 (settembre 2003): 381–418.


2
Si prega di considerare l'aggiunta di collegamenti ai documenti come cortesia per le persone che desiderano indagare sul problema.
Raffaello

3
Va bene, aggiunto nei collegamenti ai rispettivi articoli.
AL

1
Suggerisco di ripubblicare su cstheory.SE (con un link qui) se non si ottiene presto una risposta utile.
JeffE,


Prima ho usato la libreria Strutture dati prive di blocchi pratici . Supportano alcune strutture di dati ad albero prive di blocchi. Forse hai quello che stai cercando.
Reza,

Risposte:


4

non aiuta di per sé. In una struttura di dati senza blocco deve esserci un'unica istanza atomica quando la struttura dei dati sembra cambiare. Tutte leinvarianti rappresentativedevono essere in vigore sia immediatamente prima che immediatamente dopo quell'istante atomico.O(1)

Ciò significa che se stai apportando una modifica alla struttura dei dati la caratteristica importante è che puoi fare tutte le mod su una struttura di dati privata e quindi scambiare le modifiche in una singola istruzione atomica.

La libertà di blocco è generalmente più semplice quando le strutture dei dati sono immutabili ( puramente funzionali ). È sufficiente mantenere un puntatore globale alla versione corrente della struttura dei dati. I lettori non devono bloccare nulla. Le modifiche alla struttura dei dati vengono effettuate scambiando il puntatore globale su una struttura di dati immutabile a un'altra.

Ad esempio: se hai un albero bilanciato puramente funzionale:

  1. Registra il puntatore globale corrente sulla radice dell'albero.
  2. Crea un nuovo albero che inserisce o elimina un nodo. (Questo è logaritmico nel tempo e nello spazio nel numero di nodi attualmente nella struttura e implica la creazione di nuovi nodi dal punto di modifica fino alla radice e il semplice puntamento di tutto ciò che è nuovo alle vecchie parti della versione precedente della struttura dei dati. )
  3. Confronta atomicamente e scambia il puntatore globale con il root. (Si noti che ciò potrebbe non riuscire se si è verificata un'altra modifica tra il momento in cui è stato registrato il vecchio puntatore radice e ora. Se ciò accade, tornare al passaggio 1 e riprovare. Questo è il cosiddetto "controllo della concorrenza ottimistico".)

Nota che la parte più importante è ciò che ho detto sopra sulla necessità di mantenere invarianti di rappresentanza. Di solito non è sufficiente disporre di un algoritmo che comporti una modifica atomica nel mezzo dell'albero. Perché? Ad esempio: potresti avere un thread del lettore che sta eseguendo un attraversamento preordine dell'albero. Se si modifica un nodo che è un antenato del nodo che stanno attualmente leggendo, si annulleranno le condizioni preliminari che ritenevano fossero state applicate. Il lettore deve essere in grado di lavorare con la struttura dei dati esattamente come prima della modifica, o esattamente come sarà dopo aver effettuato la modifica. Non qualcosa nel mezzo.

O(log(N))O(N)


Penso che le tecniche di attesa attive, ad es. Con confronta e scambia, siano di solito chiamate "lock free", quindi ci sono alcune vie d'uscita, anche nell'impostazione mutabile.
Raffaello

Non ho familiarità con il termine attesa attiva (e Google non aiuta). (Se stai parlando del lavoro di Kogan e Petrank, questo sta mostrando come trasformare gli algoritmi senza blocco in senza attesa.) Ho aggiunto una modifica su come gestire la mutabilità per la libertà di blocco in generale.
Wandering Logic,

Per "attesa attiva" intendo qualcosa di simile a while ( !P ) { noOp(); } doWork();dove noOppotrebbe essere un sleepo simile.
Raffaello

Nella parte Modifica , hai menzionato la tecnica per rendere le strutture di dati mutabili prive di blocco. Come indicato, copiamo l'intera struttura dei dati, modifichiamo la copia e quindi usiamo la primitiva CAS. Tuttavia, come rendere Copyatomico il passaggio? Sembra essere un altro problema difficile di atomic snapshot.
hengxin,

@hengxin: pensa alla primitiva CAS come a un operatore "pubblica". Prima che la struttura dei dati venga pubblicata, solo il thread che esegue le modifiche ha accesso ad essa. Dopo che la struttura dei dati è stata pubblicata, è immutabile. La fase di copia non deve essere atomica perché l'unica cosa che un thread potrebbe copiare è una versione pubblicata, che è immutabile. Se due thread tentano contemporaneamente di mutare, entrambi copiano la stessa struttura di dati immutabile, modificano le loro copie locali e quindi una delle operazioni CAS ha esito positivo e l'altra non riesce. Quello che fallisce deve ricopiare e aggiornare.
Wandering Logic,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.