Többszálú programozás hogy működik?
A több szál, ha nincs több magod, akkor azt jelenti, hogy nagyon-nagyon gyorsan váltja az operációs rendszer azt, hogy mit is csinál. Azt hiszem 4 ms egy-egy szál ideje, annyi van neki, aztán következő, ameddig újra sorra nem kerül, mindez olyan gyors, hogy te nem látod a különbséget, teljesen olyan, mintha folyamatos lenne. Ahhoz, hogy egy ténylegesen egy időben történjen több proceszormag kell, de éppen az olyan feladatoknál, mint amit fent írsz, érdemes threadekkel megoldani. Egy szálon figyelheted a billentyűleütést, egy másikkal kirajzoltatod ha van változás, és növelsz egy változót, ami az időd.
Turbo Pascalhoz nem értek annyira, a példát másra bízom :)
A több szálú programozás (multi-threading):
Egy programod ténylegesen egy processzoron fut, az operációs rendszer egy folyamatként kezeli. Maga a program váltogat különböző szálak között. (Tehát kvázi egy programon belüli multitasking rendszer). Ez az eljárás nem használ ki több processzormagot, csak a programozást egyszerűsíti le.
A többprocesszoros programozás (multi-processing, multitasking):
Ténylegesen több operációs rendszer folyamatot indítasz el, melyek valamiképp összedolgoznak. Fontos megjegyezni, hogy itt komoly tervezést igényel a memóriaelérés és az információcsere megoldása. Ennek akkor van értelme, ha ki szeretnéd használni a több processzor, vagy több magos processzor lehetőségeit. Jellemzően komolyan processzorigényes alkalmazásoknál használják.
Vannak emellett kombinált megoldások is, melyeket a multi-threadinghez hasonlóan egyszerű megoldani, viszont nem lehet 100%-ig kihasználni a több processzor, illetve más erőforrások nyújtotta lehetőséget.
Jellemzően egyszerűbb játékok esetén egyik megoldást sem érdemes használnod. Az a játék, amire te gondolsz, nem igényel nagy processzorteljesítményt, ebből fakadóan egy egyszerű egyszálú ciklus megteszi a vezérlés, megjelenítés, stb. megoldására.
Érdekesség megjegyezni, hogy a videokártyák egyfajta kombinált megoldást használnak. Ott nagyon-nagyon sok processzor dolgozik, és a legtöbb számításhoz jól ki lehet használni a több processzoros megoldást. Némely integrált videovezérlő képes a CPU teljesítményét is használni.
Több szál pl amikor Windowson dolgozik egy program mint az állat, és te mégis tudod közben mozgatni az ablakát.
A többszálú programozás úgy működik, hogy a programod több szálon fut. Az operációs rendszerek többsége ezt biztosítja, amikor ők maguk több programot futtatnak egyszerre, valamilyen időosztásos módszerrel ütemezve hogy mikor melyik processz melyik magon futhat. És ha már a külön processzeket tudja kezelni, miért ne tudná kezelni az egy processz több szálát?
Az a lényeg, hogy olyan, mintha két programod futna ugyanabban a memóriatérben. Ennek előnyeivel és hátrányaival.
Folyt.:
"Egyszálú" esetben kitalálsz egy sorrendet, pl. porszívózás, főzés, mosogatás. A porszívózáshoz előveszed a porszívót, elpakolsz a földről, felporszívózol és elrakod a porszívót. Aztán előveszed a fűszereket, vizet, zöltséget pucolsz, stb. Megfőzöd a levest. Végül megnyitod a csapot és szépen mindent elmosogatsz.
Közben azonban látható, hogy ha így csinálod, akkor az egész napod elmegy az egészre, mert hát a mosogatásnál is, ha túl sok az edény és kicsi a szárító, meg kell várni, hogy egy adag megszáradjon. A főzésnél meg pláne vannak üresjáratok, mondjuk két keverés között. Ekkor kitalálod a többszálú házimunkavégzést:
Mind a három munkához kipakolsz (nem muszáj egyszerre), mondjuk a vizet épp nem hagyod megnyitva. Elkezdesz főzni, előpakolsz, stb. Viszont amíg a hagyma dinsztelődik, addig épp megnyithatod a vizet és mosogathatsz 1-2 poharat, vagy porszívózhatsz egy kisebb szobát. Aztán visszatérsz, keversz egyet, esetleg a zöldségeket elvagdosod. Ha közben megszáradtak a tányérok, akár mosogathatsz is. A kevergetések között viszont ki is tudsz porszívózni és el is tudsz mosogatni.
Az eredmény valójában az, hogy "egyszerre" takarítottál ki, mosogattál és még főztél is.
Ha van családod, párod, akkor csinálhatsz többmagú házimunkavégzést: a párod takarít és mosogat, te főzöl és pl. mosogatsz.
A példában a taskok az elvégzendő munkák, a szálak a munkák körülményei (kb.), a magok meg ti, akik a házimunkát végzitek.
A példa rengeteg nehzéségre is rámutat: minden task váltáskor a körülményeket úgy kell megváltoztatni, hogy az aktuális feladatot félbeszakítsd, az éppen átváltott feladatot meg folytatni tudd. Ilyesmi változtatások a víz elzárása, megnyitása, a kés letétele, felvétele, porszívó kikapcsolása, bekapcsolása, stb. Minél gyakrabban váltogatsz a feladatok között, annál nagyobb hányada megy el az időnek az előbbi átváltással kapcsolatos (valójában nem produktív) tevékenységekre. Ha meg minél ritkábban váltogatsz, annál kevésbé leszel hatékony. Azonban az is látszik, hogy nettó időnyerés akkor van, ha valamely feladatban van üresjárat.
Az erőforrások kezelése is látszik a példán. Ha pl. nem csak egyfélét, hanem kétfélét főzöl, akkor lehet, hogy az egyik edény mindkét étel készítéséhez kell, sőt, még el is kell mosogatni. Ekkor pl. az egyik kaja "várakozik" az edényre, amíg a másikat készíted benne. Ha több mag van, akkor azokat is össze kell hangolni, hiszen egy edényt nem mosogathatsz és főzhetsz benne levest egyszerre.
Még egy scenárió a példában: ugyanazt a taskot futtathatja két szál is! Ami azt jelenti, hogy mondjuk két tök egyforma levest főzöl. A task ugyanaz, hiszen a recept megegyezik, de a konkrét két leves különbözik! Lehet, az egyikben 2 fej hagyma van, a másikban meg 3, mert a recept ("pár fej" hagymát ír). A taskváltás (szálváltás) akkor történik, amikor az egyik levestől átmész a másikhoz, mert mondjuk mindkettőt kevergeted.
Ha két magon főzöl levest, akkor ketten készítetek egyszerre egy recept alapján a két külön kaját.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!