Domanda

Diciamo che ho due buffer. Produttore riempie tampone # 1, poi si riempie Buffer 2 #. Il consumatore consuma un buffer di una volta, ed è molto lento. Mentre sta consumando buffer di # 1, il produttore è pronto a riempire un altro buffer, ma sono tutti pieni, e il consumatore non ha ancora finito con # 1. Così, le attese di produttori.

Invece di aspettare, voglio il produttore per aggiornare il buffer di "libero". Cioè, mentre il consumatore sta consumando buffer di # 1, il produttore dovrebbe scrivere nuovi dati sul buffer # 2 non appena ha pronto (la Dati "vecchio" viene sovrascritto e perso). Se il consumatore non ha finito ma con # 1, e il produttore ha più dati da scrivere, si dovrebbe scrivere nuovo il # 2, e così via. Quando il consumatore finalmente consuma tutti i dati a # 1, si deve immediatamente iniziare a consumare i dati appena scritti nel buffer # 2, e il produttore dovrebbe tenere sull'aggiornamento # 1.

(immaginate il produttore sta acquisendo fotogrammi video in tempo reale ad alta velocità, mentre il consumatore è lentamente elaborando, il consumatore non importa se si salta qualche telaio, ma deve sempre elaborare l'ultimo fotogramma acquisito. Il produttore, invece, non può rallentare né aspettare, perché deve acquisire ogni fotogramma).

C'è un modo per fare questo genere di cose con i semafori? Si tratta di un ben noto problema di concorrenza? E, nel caso, è possibile estendere questo problema per n> 2 buffer?

Grazie!

È stato utile?

Soluzione

Bene, si può solo avere un buffer (coda) dei buffer. Qualche tipo di struttura della coda sincronizzato per determinare quali tamponi vengono utilizzati. Questo potrebbe funzionare per n> = 2 buffer.

Credo che avrebbe funzionato in questo modo: Produttore comincia a scrivere per tamponare 1, ma non lo rimuove dalla coda. Dei consumatori inizia a consumare dal buffer 1, e lo rimuove dalla coda. Una volta buffer di 1 è pieno, il produttore controlla la coda per vedere quali buffer sono disponibili, e vede solo tampone 2 è disponibile. Il produttore inizia a scrivere nel buffer 2. Quando il buffer 2 è pieno, controllerà di nuovo la coda e vedere che il buffer 2 è ancora disponibile, in modo che scriverà di nuovo. Una volta che il consumatore è fatto con tampone 1, rimuoverà tampone 2 dalla coda e il luogo del buffer 1 indietro. Una volta che il produttore è fatto con 2, si vedrà solo tampone 1 è disponibile e iniziare a scrivere ad esso. Spero che questo sia quello che stavi descrivendo. (Non mi piace trattare con appena i semafori, io preferisco usare strutture dati più elevate, ad esempio. Code).

Per far fronte a molteplici produttori, introdurre un'altra coda per determinare quali tamponi vengono utilizzati da un produttore. Così ora si avrà una coda il produttore e una coda di consumo, e penso che gestisce tutte le situazioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top