Zdravím.
Obecné zadání:
Existuje (malý)buffer mimo kontrolu aplikace, který je plněn velkým množstvím dat. Rychlost přitékání dat se průběžně mění. Pokud nejsou data z bufferu vytažena před zaplněním, pak jsou nejstarší data přepsána. Data jsou do bufferu vkládána po kvantech a vytáhnout jdou zase jen po jednotlivých kvantech. Aplikace data z bufferu vytahuje a zpracovává. Zpracování může být časově náročné a je nutné data třídit a podle obsažených informací také různě zpracovávat.
Obecné řešení:
Existuje vlákno, které data z bufferu vytahuje a vkládá do většího bufferu, ze kterého je vytahují další vlákna, která tato data zapracovávají.
Otázka:
Jak předávat řízení mezi vlákny?
Moje odpověď:
Nelze se spolehnout na to, že ostatní vlákna předají řízení včas zpět čtecímu vláknu. Proto bude mít čtecí vlákno maximální prioritu a při každém vyprázdnění bufferu se vždy na krátký čas uspí sleep(). Vzhledem k tomu, že se rychlost přitékání dat může měnit a chci zajistit ostatním vláknům co nejvíce času na zpracování dat, bude se doba sleep měnit. Jestliže se čtecí vlákno probudí a při pokusu o čtení z bufferu zjistí, že je prázdný, zvětší se doba po kterou se uspí. Pokud se probudí a v bufferu něco je, patřičně se doba zkrátí (podle počtu přečtených kvant). Tím by se měla doba uspání čtecího vlákna udržovat optimální.
Tak a teď k dotazu:
Je to správný přístup? Nelze to řešit nějak efektivněji, nebo lépe? Nemůžu si pomoct, ale pořád se mi na tom něco nezdá.
Díky
Petr
Fórum › Java
Zpracování dat v reálném čase - vlákna
kdyz pouzivas vlakna tak se o predavani rizeni stara system.. co by me trapilo vic je to prepisovani starsich hodnot.. muzes skoncit tak ze se predbehnes a nacitaci vlakno ti to bude prepisovat treba jen o jedno dopredu .. pak se nacitani na moment zastavi a najedou mas data o kolo pozadu..
pripadne semafor a pri prepisovani si zabrat i pozici odkud se data zpracovavaji a posunout pred pozici kam se vkladaj...
To KIIV :
Nevím jestli si dobře rozumíme. Do prvního bufferu prostě data přitékají a já jej nijak neovlivním - kromě toho, že můžu data vytáhnout. (Data která vytáhnu se z bufferu odstraní.) Systém se sice o předávání řízení stará, ale pokud budu mít běhuschopné vlákno s maximální prioritou, tak pravděpodobně systém nikdy nepředá řízení vláknům s nižší prioritou. Pokud budou mít všechna vlákna stejnou prioritu, tak zase riskuji, že se opozdím ve čtení a prošvihnu nějaká data. Tedy jediné řešení které vidím je, že se čtecí vlákno s maximální prioritou čas od času vzdá řízení a na čas umožní předat řízení vláknům s nižší prioritou. Aby se čtecí vlákno s nejvyšší prioritou stalo neběhuschopným a systém mohl předat řízení ostatním může se uspat metodou sleep(), nebo čekat na wait() (notify()).
Pokouším se tedy vyřešit, jak dát ostatním vláknům maximální možný čas ke zpracování dat, ale neprošvihnout přitom nějaká data ze vstupního bufferu.
jo takhle je to mysleny.. moc to resis.. vlakna se o sebe umi postarat a kdyz mas stejnou prioritu tak se neprepinaj zrovna pomalu...
ale furt to nebezi na realtime systemu a tim spis java je strasnej paskvil na pokus o realtime..
zalezi spis kolik tech dat tak prumerne muze byt a odkud je beres.. pokud z nejakyho streamu tak se proste neztrati
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Input v realném čase — založil MatyMal
String do tab. WPF v reálnem čase — založil Martin
HTTP - zpracovani dat — založil Kuba
Poslání dat do vlákna — založil eximik
Export dat z Excelu do zpracovani v Deplhi — založil Miki79
Moderátoři diskuze