Java. Párhuzamos feldolgozás imitálása ...
2008-09-25T13:22:35+02:00
2008-09-27T23:15:43+02:00
2022-07-02T10:05:28+02:00

  • Javában általában nem hardverspecifikusan programozol. Ez azt jelenti, hogy bármennyi és bárhány magos proci van a gépben a program ugyan az, ugyan arra a feladatra. "Párhuzamos programot" akkor is írhatsz javában (és futtathatsz), ha egyetlen 1 magos proci van a gépedben.

    Arról a virtuális gép automatikusan gondoskodik, hogy a szálakat szétossza magok/procik között egy több feldolgozó egységet tartalmazó környezetben.


    Ez termeszetesen ugy hulyeseg ahogy van.

    A JVM-nek halvany goze sincs arrol, hogy a te feladatodat hogy lehet legoptimalisabban vegrehajtani. Szinten nincs tudomasa arrol, hogy az altalad hasznalt eroforrasok atbocsatokepessege mekkora, vagy hogy ezektol hogy fugg az altalad irt program futasa.

    Sokkal hatekonyabb rendszert lehet csinalni, ha a rendelkezesre allo hardvert te osztod be a hardver konkret jellemzoinek ismereteben, nem pedig a JVM-re bizod, hogy majd kisakkozza.

    De ehhez mar termeszetesen tisztaban kell lenni azzal, hogy melyik hardver milyen tulajdonsagokkal bir, stb.


    A teljes feldolgozasi ido csokkentese celjabol (tehat egyes reszfeladatok egyedi idejenek csokkentese nem lenyeges) szimmetrikus tobbszalu programot (minden szal ugyanazt csinalja) akkor erdemes irni, ha egy szal feladata elvegzese soran jelentos ideig var eroforrasra ezert az alatt az ido alatt a feladatra szant cpu core mennyiseg masik hasonlo szalon haladhatna. Ennek hatasara lehetseges hogy a tobbszalusag okozta atbocsatokepesseg novekedes tulszarnyalja a context switching okozta koltsegnovekedest.

    Ezenkivul szokas tobbszalu programot irni kulonbozo reszfeladatok kulon szalra tetelevel, ha ezen reszfeladatok egymastol nem kolcsonosen fuggenek.

    Pl. tobbmagos rendszeren kulon szal a halokartya minel nagyobb teljesitmennyel olvasasara, ami egy queue-ba behajigalja a halokartyarol jovo adatot es mast nem csinal. Az adat feldolgozasa pedig masik szalon/szalakon. Igy pl. a halokartyat kezelo bufferben kevesebb backlog keletkezik, mintha ez a szal vegezne a feldolgozast is.


    Szoktak meg kulon szalat adni a szemetgyujtesnek is.
    Mutasd a teljes hozzászólást!
  • Javában általában nem hardverspecifikusan programozol. Ez azt jelenti, hogy bármennyi és bárhány magos proci van a gépben a program ugyan az, ugyan arra a feladatra. "Párhuzamos programot" akkor is írhatsz javában (és futtathatsz), ha egyetlen 1 magos proci van a gépedben.

    Arról a virtuális gép automatikusan gondoskodik, hogy a szálakat szétossza magok/procik között egy több feldolgozó egységet tartalmazó környezetben.

    Ha szerencsétlen merevlemezen egyszerre több fájlt akarsz feldolgozni, annak nem lesz jó vége. Ettől lesz lassú az egész, a feldolgozási idő kismillió proci esetén sem változik.
    Miért? Mert a proci általában gyorsabban számol, mint ahogy a fájlokból kiolvasnád az adatokat.

    Ha viszont a fájlokból csak nagyon egyszerű, kis számú, kis méretű adatokat kell kiolvasni, a feldolgozó (számoló) műveleted pedig nagyon bonyolult, akkor megközelítőleg kijöhet az, amit elképzeltél, hogy majdnem fele annyi idő alatt végzel a számításokkal egy 2 magos procin a párhuzamos programoddal, mint amennyi idő alatt egy egyszerű szekvenciális progival végeznél.

    A Thread osztály és a Runnable interface a barátod, úgy, ahogy a gugli és a Sun tutorialjai is.
    Mutasd a teljes hozzászólást!
  • 1 proci de 2 magos (vagy négy).


    Akkor ez nem párhuzamos feldolgozás imitálása, hanem párhuzamos feldolgozás.
    --
    Sorry - this page has moved
    Mutasd a teljes hozzászólást!
  • Bocsi !

    Helyesbítek.
    1 proci de 2 magos (vagy négy).
    Egyszerre dolgozni a két mag.
    Így felére esne a feldolgozási idő vagy nem ?
    Amúgy windows alatt.

    Vagy ehhez 2 processzoros gép kell, hogy tényleg csökkenjen a feldolgozási idő ?

    És a fájlok a fájlrendszeren vannak.
    Mutasd a teljes hozzászólást!
  • Ha a diszkről olvasás a problémád, akkor a fájlokat becuppantod a memóriába 1 szálon, aztán a fájlokra történő feldolgozást már többszálúan végzed. Végül pedig visszaírod őket a diskre.


    Igen, ez egy olyan eset, amikor gyorsabb lehet a párhuzamos feldolgozás, bár még mindig elég két szál. :)
    --
    Sorry - this page has moved

    Mutasd a teljes hozzászólást!
  • Nem feltétlenül kell az egész folyamatnak párhuzamosnak lennie.
    Ha a diszkről olvasás a problémád, akkor a fájlokat becuppantod a memóriába 1 szálon, aztán a fájlokra történő feldolgozást már többszálúan végzed. Végül pedig visszaírod őket a diskre.
    De hogy konkrétan mi képezi az erőforráskorlátot ehhez kicsit kevés az info. Az se mind1, hogy mekkora és milyen mennyiségű fájlról van szó és hogy a végrehajtás folyamata mennyire erőforrásigényes. Lehet a dolgok jó végiggondolásával és harmonizálásával hatékonyabb 1 szálú feldolgozást lehet csinálni, mint egy végiggondolatlan többszálúsággal.
    Mutasd a teljes hozzászólást!
  • Hm... szálakkal simán meg lehet csinálni, de ha valahol szűk keresztmetszet van, akkor a végeredmény akár lassabb is lesz.

    Olvasunk fájlokat, tegyük fel 50MBájt/mp körül. Szekvenciálisan. Ha kettő fájl olvasol, akkor ideális esetben 25-25MBájt/mp lesz, de az olvasófej a két állomány között ugrál, lehet, hogy 5-5MBájt/mp lesz az olvasott mennyiség (random access time).

    Akkor tudsz gyorsítani a párhuzamos feldolgozással, ha a párhuzamosan beolvasandó az állományok fizikailag másik merevlemezen vannak ÉS nem a CPU szűk keresztmetszet.

    Ha a CPU kevés, akkor hiába osztod több szálra, a szálak közötti váltás lassít a folyamaton, és végeredményben oda fogsz jutni, hogy egy szálon, szekvenciálisan hamarabb végez a feladattal a gép.

    A többszálúság külön tudomány.
    --
    Sorry - this page has moved
    Mutasd a teljes hozzászólást!
  • "És így jelentősen csökkenne a feldolgozási idő !"


    Miért is?
    Mutasd a teljes hozzászólást!
  • Sziasztok !

    Párhuzamos feldolgozás imitálása 1 processzoros gépen, Jávában .


    Leírom mire gondoltam.

    Vegyük azt az alap programot ami fájlokat dolgoz fel.
    Hogy pontosan mit csinál velük az most nem lényeg.
    A program egy könyvtárból veszi a fálokat. Veszi az elsőt, meghívja rá a függvényt ami feldolgozza a fájlt, ezután veszi a következő fájlt, ... és így tovább amíg el nem jut az utolsóig.
    Ez eddig érthető.

    Ha azt szeretném, hogy a fájlokra úgy hívja meg a feldolgozó függvényt a program, hogy miután meghívta az elsőre , ne várja meg amíg az első fájllal végez hanem a következőre is meghívja, ... és így tovább,
    akkor a fájlok feldolgozása párhuzamosan történne.
    És így jelentősen csökkenne a feldolgozási idő !

    Ezt hogyan lehet megoldani sima 1 procis pc-n ?

    Vagy netalántán a Java-ban ez már megvan oldva valahogyan ?
    Mutasd a teljes hozzászólást!
abcd