Sto cercando di trovare un modo per evitare la fame nel mio programma, un problema produttore / consumatore (due thread, uno per ogni ruolo) con quattro livelli di priorità (quattro deque
s).
In sostanza, il thread del consumatore rimuove sempre dalla massima priorità deque
finché non viene lasciato nulla, piuttosto che rimuove la priorità media deque
e così via.
Potrebbe esserci fame: cosa succede se la massima priorità deque
è sempre piena di elementi, il thread di consumo è occupato per rimuoverli e gli elementi a bassa priorità non vengono mai prelevati?
Mi è stato detto di implementare una sorta di meccanismo di invecchiamento, controllando se gli elementi hanno speso troppo tempo in un deque
: in questo caso, prendili, azzeri il loro timer e inseriscili in deque
con priorità più alta.
Sembra bello, quindi ho iniziato a creare un thread del controller che potesse svolgere questo compito: durante la progettazione sono sorte alcune domande e non riesco a trovare una risposta.
Come posso procedere a scoprire il timeout ottimale dopo il quale il thread del controller rimuove l'elemento e lo inserisce in un deque con priorità più alta? Quanti elementi con timeout scaduto verranno rimossi (uno è troppo piccolo, tutti gli elementi potrebbero essere troppi se deque
ha tutti gli elementi con timeout scaduto)?
EDIT : ho provato l'approccio di UmNyobe, ecco un possibile output (ogni numero è il numero di elementi in quel deque
; il numero più a sinistra è la massima priorità deque
, più a destra il basso priority deque
):
// max prio deque has 3 elements, low prio has 7, others are empty
// first round: remove 4 elements with max prio and one with min prio
3 0 0 7
2 0 0 7
1 0 0 7
0 0 0 7
0 0 0 6
// second round: remove one element with min prio
0 0 0 5
// third round: remove one element with min prio
0 0 0 4
// fourth round: remove one element with min prio
// and so on...
0 0 0 3
0 0 0 2
0 0 0 1
0 0 0 0
Sto implementando un proxy con priorità alle connessioni: ad esempio, il caricamento di un video di YouTube mostrerà subito il giocatore (perché ho dato la massima priorità, e rimuovendo 4 elementi con il prio max alla volta il video è presto mostrato) ma gli elementi stilistici della pagina impiegheranno un po 'di tempo per essere caricati (perché ho dato loro la priorità minima, e rimuovendo un elemento con basso prio alla volta, i pulsanti e le anteprime delle immagini impiegheranno un po' per apparire).
Forse dovrei invertire l'ordine di rimozione: ogni X round, rimuovi uno con max prio e quattro con basso prio, non lo so.
EDIT 2 : forse avrei dovuto indicare che gli elementi memorizzati in deque
sono richieste di connessione. Quindi, le connessioni in sospeso per lo streaming video hanno il prio max e saranno rimosse 4 contemporaneamente da deque
; le connessioni in sospeso per gli elementi stilistici hanno un valore minimo e verranno rimosse 1 contemporaneamente.
Quello che voglio dire è che gli elementi memorizzati in deque
non sono task, thread o altri lavori indipendenti che faranno qualcosa: sono ciò di cui è fatta una pagina web. Quindi, è meglio dare meno priorità agli elementi stilistici della pagina web, ma dovrebbero essere caricati poco dopo (immediatamente?). Vengono caricati gli elementi max prio.