Knowledge Team





Prvotno je http://www.coopsoft.com/ar/ForkJoinArticle.html

Vidličku-Pripojte sa vývoj v Java ™ SE

Vetvenie alebo rozdelenie záťaže na viac úloh pre paralelné spracovanie a spojenie výsledkov dohromady je technika používaná v mnohých vedeckých, číslo chrumkavý aplikácií. Mnoho ďalších aplikácií by mohli mať prospech z vidlice, spojiť spracovanie, ale s použitím vedecký prístup nemusí byť v ich najlepšom záujme.

Tento článok predstavuje “trápne paralelný” fork-join prístup, ktorý pracuje dobre pre každodenné, multi-core aplikácie v jazyku Java ™ SE, ME, rovnako ako Android. ™ (3000 slov)

Čo je to Vidličku-zapojiť?

Myslite na rázcestí, kde každá cesta nakoniec príde zase dohromady – sa pripojí.

Vidličku-Pripojte sa prestávky aplikácie do niekoľkých častí pre paralelné spracovanie a pripojí výsledky na konci.

Obrázok 1: Vidličku-Pripojte sa štruktúra

Povedzme, že máme rad tisíc čísel. Musíme urobiť postup na každej z týchto čísel a pridajte celkom.

Výpis 1: Array Processing

for (int i = 0; i < 1000; i++) {
total += doProcedure(array[i]);
}

V prípade, že proces trvá jednu sekundu (čas wall-hodiny) dokončiť, potom to bude trvať 1000sekunda (viac ako 16½ minút), na dokončenie tejto úlohy.

Vidličku-Pripojte sa mohol

  • samostatná (vidlice), veľké pole do desiatich polí sto prvkov každý,
  • spracováva každé pole na samostatné CPU, a
  • Po dokončení pripojiť výsledkov.

To by trvať sto sekunda (len niečo málo cez 1 ½ minúty), desatina pôvodného času. K dispozícii, tým rýchlejšie Výsledkom je, že viac CPU je.

To je to, čo vedecká práca na počítači je o – súčasne spracovanie humongous množstvo dát, ako budú k dispozícii toľko CPU. Táto abstrakcia silne podobá štandardný vedecký model rozdeľuj a panuj.

Rozdeľ a panuj je prírodný paradigma pre paralelné algoritmy. Po rozdelení problém do dvoch alebo viacerých čiastkových problémov, spôsob rieši čiastkové problémy paralelne. Typicky, čiastkové problémy sú riešené rekurzívne a teda ďalší krok delenia sa získa ešte čiastkové problémy riešenia paralelne.

Obrázok 2: Rozdeľ a panuj

Problémy s pomocou fork-join vedecký model pre každodenné aplikácie

Vytvorenie úloh nie je problém; sú len objekty. Problémom je vysoký počet vlákien, spracovanie úloh pri plnení týchto úloh potrebujete:

  • pripojenie
    Prístup vzdialených služieb (DBMS, zasielanie správ, a mnoho ďalších) vyžaduje pripojenie k vzdialenej službe. Všeobecne platí, že vzdialené služby používajú vlákno zvládnuť pripojenie a to vyžaduje pamäť, prepínanie kontextu, synchronizáciu a koordináciu. Čím viac pripojení k službe, tým viac zdrojov služba potrebuje, a menej spojenie pre iné úlohy v JVM. To sa týka každého užívateľa.
  • zámky
    Zámky sú vrah k vysokému výkonu. Mŕtve / živé zámky, inverzie priorít, hladovanie, convoying a režijné (ktorá stúpa exponenciálne s dĺžkou zoznamu čakajúcich úloh), sú niektoré z problémov pomocou zámkov.
  • semafory
    Čím viac závity, ktoré chcú povolenie súčasne, tým viac závity, ktoré musia čakať na dostupnosť povolenia. To nás privádza späť ku všetkým problémom pomocou zámkov.
  • cache koherencia
    Pri viacerých procesory prístup / aktualizovať rovnakej premennej vnútri riadku vyrovnávacej pamäte, (blok dát skopírovaných z hlavnej pamäte, ktorá obsahuje mnoho polí), môže pamäťová jednotka znehodnotiť riadok vyrovnávacej pamäte. To nie, len spomaľuje aplikácie, môže to mať vplyv na ďalšie aplikácie tiež.
  • rozsiahla pamäť
    Čím viac objektov alebo ich väčšie objekty, viac pamäte. Aktívnejší závity manipulačné úlohy, tým viac pamäte pri použití. Samozrejme, to znamená, že veľké pamäťové úlohy potrebujú škrtenia.
  • Potreba hrať pekný
    Si aplikácie nemusia byť jediná aplikácie bežiace na počítači. Keď sa jedna aplikácia ošípané zdroje, všetci cítia bolesť. Hra pekná s ostatnými vracia k tomu, čo sme sa všetci naučili v detstve. To isté platí pri vývoji softvéru, ktorý nepracuje ako samostatná aplikácia.

Tému vývoja multi-core je, aby sa súperením, úlohy súťažiť o rovnaké zdroje, na minimum.

V prípade, že dynamický rozklad paradigma rozdeľ a panuj vyhovuje vašim potrebám, potom si prečítajte tento článok o vysoko výkonné DSE verziu Tymeac. Inak funkčné ostrôžka Framework môže lepšie vyhovovať vašim potrebám.

Funkčné ostrôžka Framework

Java ™ SE / ME multi-core aplikácie, rovnako ako aplikácie pre Android ™, ktoré nemožno použiť model Rozdeľ a panuj, nespracúvajú veľké matice čísel, či nemajú výpočtovej intenzívny štruktúry potrebujú funkčné vetvenia rámec pre parallelizing aplikácie , Konkrétne, treba vysádzať prácu do svojich funkčných prvkov, skôr než sa rozkladajú poľa do rovnakých čiastkových úloh.

Obrázok 3: Funkčné ostrôžka Framework

Funkčné vetvenia rámec má dva základné atribúty. To musí:

  • Limit tvrdenia.
  • Byť jednoduchý na používanie a trápne paralelné.

Súperenie limit

Vedenie počet aktívnych, konkurenčných závity na absolútne minimum je prvoradá. Najjednoduchší spôsob, ako obmedziť vlákno tvrdenie je použitie prahov pre každé vlákno fondu obsluhou fronty úloh. Pozri tento článok na High Performance prioritných front v jazyku Java SE za príklad toho, ako s použitím počkajte, zoznamy možno ušetriť závitov zdroja.

Opakované použitie prostriedkov skôr než získavanie nových kópií zdrojov je víťaz all-around. Musíme vziať do úvahy nielen úloha kód, ale aj riadenie zdrojov kód rovnako.

Vezmite si príklad úlohy, ktoré potrebujú prístup k databáze, ktorá vyžaduje [java.sql.] Vyhlásenie. Použitím fronty požiadaviek, úloha kód môže zdieľať rovnaký príkaz pre mnoho prístupov skôr než získajú nové vyhlásenie pre každý prístup. Zdieľanie vyhlásenie je obrovská úspora režijných a obmedzuje sporu v rámci konania kóde.

Čo je to trápne paralelný?

Trápne paralelné algoritmy sú tie, ktoré môže vyriešiť veľa podobných, ale nezávislých úloh súčasne s malú alebo žiadnu potrebu koordinácie medzi úlohami. Tieto druhy problémov, také ľahké paralelizáciu, že jeden je takmer “trápne” hovoriť o tom, aké ľahké je získať veľa spracovateľov efektívne.

Trápne paralelný roztok môže ľahko vyklopiť do niekoľkých úplne nezávislých komponentov, z ktorých každý vykonávajúca na samostatnom procesore.

Obrázok 4: trápne Paralelné

Napríklad:
Firma môže potrebovať automatizovaný cenovú ponuku systému. Ak chcete vytvoriť ponuku, systém potrebuje položky základnú cenu (cena databázy), zľava zákazníka za tovar a poštovné (databázy zákazníkov), a základné náklady na dopravu (odosielateľ databázy.)

Tradične, program pristupuje každú databázu sériovo, čaká na každý prístup dokončiť pred prechodom na ďalší prístup.

V paralelnom systéme, program Forks () požiadavka na tri fronty, každý prístupné závitu bazéna, čaká, až posledný prístup dokončí a pripája () výsledky dohromady.

Obrázok 5: Cena Quote

Vyššie uvedená cena citácie je príkladom synchrónneho požiadavke, kedy volajúci čaká na dokončenie. Je to len malý krok vpred pridať podporu pre asynchrónne alebo autonómne žiadosť, kde volajúci nebude čakať na dokončenie.

Existuje mnoho, mnoho situácií, kedy vetvenia prácu do jeho súčasťou je žiaduce:

  • Potom sa hra aplikácie, kde sa môžeme vidlica akciu do oddelených zložiek. Výhodou je, vzrušenie; čím viac segmentov udalosti odohrávajú súbežne, zaujímavejšie hru.
  • Vezmite aplikácie s viacerými animáciou, kde môžeme vidlica každú animáciu spustiť na vlastnom procesorom.
  • Vezmite operácie spracovania obrazu, kde každý pixel v obraze, musí mať farbu zvrátiť. Rámec môže ľahko distribuovať obrazových dát do viacerých úloh, ktoré môžu pracovať nezávisle na sebe.
  • Potom sa finančné inštitúcie, kde re-oceňovania portfólio zahŕňa komponenty, ktoré komunikujú s rôznymi trhoch po celom svete.
  • Vezmite aplikácie zdravotnej starostlivosti, kde jednotlivé testy sú súčasťou v diagnóze.

Je to snaha vidieť len to, čo aplikácie nemožno použiť paralelizáciu s funkčnou vetvenia rámca.

Ako by tento rámec vyzerať v aplikácii Java ™?

Rámec pre vetvenie žiadosti do svojich funkčných prvkov je potrebné:

Viem, že komponenty (frontu) pre každú operáciu vyžiadanie (funkcia). Jednoduchý Trieda obsahujúci názov funkcie String a zoznam pridružené frontu je základná Java programovanie ™.

Výpis 2: Funkcia Class

public class Function {

private String name; // Function name
private Queue[] que; // Queues for this Function
}

Umiestnite žiadosť (obsahujúca vstupné objekty) do každej z frontov vracajúcich Objekt Array volajúcemu alebo ignorovať vrátenej objekty.

Výpis 3: Put vo fronte

public Object[] fork(Queue[] que, Object request) {

Object[] return_obj = new Object[] {null, null, null};

for (int i = 0; i < que.length; i++) {
putInQueue(que[i], return_obj [i], request);
}

return return_obj;
}

Počkajte na dokončenie / timeout alebo nečakajte.

Výpis 4: Wait/no Wait

public boolean join(Object[] obj) {

/* when all elements are non-null, return true
* wait for a while
* after an interval, return false
*/

}

Vrátiť výsledky volajúceho alebo ignorovať objekty

Obrázok 6: Návrat do volajúcemu

Ak chcete vytvoriť tento rámec by sme:

  1. Je potrebné zachovať skutočný úloha kód, ktorý robí prácu
  2. Potrebujete udržiavať zoznam front a funkcií
  3. Potrebujete udržať triedu “start up”, ktorý načíta fronty a funkcie do pamäte

(1) Kód, ktorý robí prácu, by mal vyzerať takto:

Výpis 5: Work Code

public static Object main(Object obj) {}

Main () metóda, ktorá prijíma objekt (vstup od volajúceho) a vráti objekt (výsledok práce.)

(2) sme mohli udržiavať frontu a funguje ako objekty v jednoduchom zozname triedy.

(3) Spustite mohol jednoducho načítať triedy List do pamäte s novým (Zoznam trieda) a začať so závitmi pre každé fronte.

Ako prosté volania môže vyzerať:

Výpis 6: Simple Call

Framework fw = new Framework();

// For each call:
Function
func = fw.getFunction(name);
Object[] back =
func.fork(request};

Tento rámec je jednoduchý na používanie, trápne jednoduché.

Zhrnutie

Zatiaľ sme videli, ako vetvenia žiadosť do svojich funkčných prvkov môže pracovať ako vložená súčasť jednotnej žiadosti (v rámci rovnakého JVM). Ak chcete byť praktické, musíme tiež vytvoriť rámec prístupný z iných JVM je. Jednoducho, musí podporovať mnoho užívateľov hovorov súčasne ako server.

Čo je server

Aké zmeny musíme vykonať nadviazať tento jednoduchý rámec na server?

  1. Musíme oddeliť volajúceho z práce.
  2. Musíme zabezpečiť zotavenie po chybe.
  3. Musíme podporovať rámca, ktorý je vzdialený objekt.
  4. Musíme zaistiť bezpečnosť.
  5. Musíme zabezpečiť administratívne funkcie pre ovládanie servera.

Oddelenie

Prvá zmena je oddelenie požiadavka sprostredkovanie obchodu (to je metóda vyššie vidlice ()), z vlastným spracovaním. Musíme oddeliť, ale sledovať, každú žiadosť v jedinečnom objekte.

Výpis 7: Dopyt Object

private long unique_id; // unique identification of this request
private Object input; // input reference, if any
private boolean type; // type of request true=sync false=async
private Object[] output // the output objects from the tasks
private AtomicInteger next_output; // subscript to add an element to above
private Queue[] que_names; // list of all the queues in this function
private Queue agent; // future queue, if used
private AtomicInteger nbr_remaining; // queues remaining to be processed
private int wait_time; // max wait time for sync request

Čo je to pole “agent?”

Agent
Synchrónne požiadavka vráti pole objektov zo spracovania volajúcemu. Čo by mal rámec robiť s poľami objektu vrátil z asynchrónneho požiadavky? Rámec môže prípadne dať poľa objektov (ako vstup) do novej frontu pre spracovanie pomocou úlohu agenta. Týmto spôsobom úloha zástupcu môže konať na základe stavu dokončenia predchádzajúceho spracovania.

Napríklad:
Funkcia je vytvárať cenovú ponuku a poslať e-mailom užívateľovi ako asynchrónne požiadavku.

  1. Volajúci používa metódu asynchrónne fork().
  2. Rámcové vidlica žiadosť do svojich príslušných front.
  3. Keď posledné fronty dokončenie rámec prechádza Vrátený objekt poľa do úlohy činidla tým, že požiadavka do fronty určeného ako “agent.”
  4. Úloha Agent odošle e-mailovú návrate nič.

Zotavenie po chybe

Druhou zmenou je pridanie zotavenie z chýb, značku profesionality.

Čo môže ísť tady zle? “Všetko, čo sa môže pokaziť sa pokazí.” Zákon Murphyho.

Vycúvať

Mohli by sme mať vetvenia chybu. Ohraničené fronty môže byť plný alebo fronty by mohol byť zakázaný (viac na toto nižšie). Zotavenie po chybe mali zálohovať všetky fronty, ktoré úspešne vidlicových a informovať volajúceho problému. Napríklad:

  • Máme tri fronty (A, B, C), vo funkcii.
  • Fronty a B úspešne prijímať žiadosti.
  • Fronta C nedostane požiadavku, pretože front je plná.
  • Teraz ideme späť snaží vytiahnuť žiadosť zo všetkých frontov, ktoré úspešne vidlicu, takže môžeme ušetriť čas spracovania na chybných požiadaviek.

Výnimka / Error

Mohli by sme mať výnimku / chybu v konkrétnom zadaním kódu, ktorý robí prácu. Ak je to raz zlyhal, pravdepodobne zlyhá znova. Preto je vhodné vypnúť fronte, kým developer rieši problém. Keď úloha kód je čisté, nechceme, aby sa dolu servera. Chceme informovať server, ktorý máme novú kópiu úlohy kódu, ktorý je čistý a my chceme fronty povolená.

Stánok

Mohli by sme mať vyššie uvedené sa stalo v asynchrónny žiadosti, nazvaný stánok (synchrónny žiadosti time out a môže očistiť zo systému.) Vzhľadom k tomu, funkcie nemožno dokončiť, kým sa všetky Fronty dokončiť, musíme umiestniť pozastavená požiadaviek na pretiahnutia zozname. Ak fronty je opäť prevádzkyschopný, môžeme znovu spustiť spracovanie z zastavil zoznamu.

Mohli by sme mať závit bloku navždy na vonkajšie zdroje, alebo ísť do nikdy nekončiacej slučke. Či tak alebo onak, načasovanie udalostí v živote závitu, rámec môže rozpoznať túto situáciu a môže vymazať niť nahradí ju novou niťou.

Zrušenie

Mohli by sme mať volajúci chce zrušiť skôr predloženej žiadosti. Zrušenie je podobný časový limit chyby, ale je použiteľný ako pre synchrónnych a asynchrónnych požiadaviek. Aj keď zrušenie požiadavky je veľmi žiaduce, logika pre manipuláciu s zrušenie v žiadosti o viaczložkové nie je pre ľudí so slabým srdcom.

Monitoring

Načasovanie je k ničomu, ak démon vlákno sleduje časovanej udalosti hľadajú aktuálne alebo potenciálne problémy.

Oznámenia

No rámec môže zvládnuť všetky situácie; niekedy ľudský zásah je nutné. Mali by sme informovať správcu zaslaním správy cez čo sa rozumie organizácia používa (instant messaging, e-mail, alebo akékoľvek homegrown metódy.)

Vzdialený objekt

Tretia zmena podporuje rámca, ktorý je vzdialený objekt s možnosťou aktivácie / deaktivácie zachovanie zdrojov.

Vzdialené volanie metód prichádza v mnohých príchutiach:
základné
Vlastné Socket Factory
IIOP
Portable Object Adapter
ini
Inter Process Communication

Prostredie môže pozostávať z mraku sa samostatnými procesormi na mnohých rôznych miestach. Tvorba rámec flexibilné dáva dokonalý zmysel.

Zabezpečenie

Štvrtá zmena je pridanie zabezpečenia.

Technológie zabezpečenia Java ™ je súčasťou SE / ME platformy, to vyžaduje front-koniec server s bezpečnostnými triedami pre flexibilitu.

Funkcie správcu

Piaty zmena je pridanie funkcie správcu.

Záznam je nudná a hlavne k ničomu, kým sa niečo pokazí.

Štatistiky sú základom pre analýzu výkonnosti a ladenie.

Musíme zabezpečiť rozhranie do vnútornej štruktúry, takže užívatelia môžu sledovať a kontrolovať funkčnosť. To nie je moc dobré, keď nikto nevie, čo to robí. Akonáhle ľudia vedia, čo to robí, že pravdepodobne budú chcieť zmeniť.

Písanie Vidličku-join rámec, ktorý je jednoduchý na používanie a efektívne pre miestne hovory, je ťažké. Robiť rovnaké pre prístup k sieti je veľká akcia.

Ako dlho bude trvať, než postaviť taký server?

Asi 5-6sekundy. Len dosť dlho na to, aby rozbaliť jeden súbor.

Našťastie existujú general-purpose, vidlica-spojiť rámca podporujúce vlastnosti vyššie uvedené pre každý deň, multi-core aplikácie v jazyku Java ™ SE, ME a Android ™ sú dnes k dispozícii. A pretože rámec môže spustiť ako RMI server (štandardne / aktivovatelného, IIOP a POA), je k dispozícii pre aplikácie Java ™ EE.

Tymeac ™ pre Java ™ SE / ME / platformy Android ™ sú open source projekty Softvér udržiavané na
a môžete si stiahnuť najnovšie vydanie tam. , SourceForge.net

Záver

Vidličku-join rámec vyvinutý pre výpočtovo náročné komunít nemusí fungovať dobre pre každodenné použitie.

Väčšina Java ™ multi-core aplikácie je potrebné vysádzať prácu do svojich funkčných prvkov s profesionálne rámec triedy, ktorá sa ľahko používa, efektívne a open-source.

Referencie

Súbory na stiahnutie:

Stiahnite si najnovšiu SE vydanie Tymeac tu. Všetky dokumenty, skripty, triedy a zdroje.

Stiahnite si najnovšiu ME vydanie Tymeac tu. So všetkými dokladmi a zdroje.

Stiahnite si najnovšiu a vydanie Tymeac tu. S všetkou dokumentáciou a plné zatmenie projekty.

Stiahnite si najnovšiu DSE vydanie Tymeac tu. Rozdeľ a panuj verzie.

články:

Vysoko výkonný Rozdeľ a panuj verzia Tymeac – Java Vidličku-Pripojiť Conqueror

Vysoko výkonný Android ™ verzia Tymeac – Riadenie Vlákna vo Androidu

Použitie Počkajte, zoznamy pre účinnosť – Vysoký výkon prioritné fronty v Java SE

Java ™ SE Thread Container – Riadenie témy v Java SE

Ostatné:

Vidličku-spojiť frontu wiki – http://en.wikipedia.org/wiki/Fork-join_queue

Murphyho zákon – http://en.wikipedia.org/wiki/Murphy%27s_law

CPU Cache wiki – http://en.wikipedia.org/wiki/CPU_cache

Cache súdržnosť wiki – http://en.wikipedia.org/wiki/Cache_coherence

Trápne paralelný wiki – http://en.wikipedia.org/wiki/Embarrassingly_parallel

O autorovi

Edward Harned je softvérový vývojár so skúsenosťami cez tridsať rokov priemyslu. Najprv viedol projekty ako zamestnanec vo veľkých priemyselných odvetviach a potom pracoval ako nezávislý konzultant. Dnes, Ed je senior developer na družstevné Software Systems, Inc., kde za posledných dvanásť rokov sa použité programovanie Java ™, aby fork-join riešenie pre širokú škálu úloh.

 

Popular article:

  • Symbols World
  • Cliparts Library