Többszálú
Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2016. március 16-án áttekintett
verziótól ; az ellenőrzések 43 szerkesztést igényelnek .
A multithreading ( eng. Multithreading ) egy platform (például egy operációs rendszer , egy virtuális gép stb.) vagy egy alkalmazás olyan tulajdonsága, amely abból áll, hogy az operációs rendszerben generált folyamat több futó szálból állhat. párhuzamosan ", majd időben enni előírt rendelés nélkül . Egyes feladatoknál ez a szétválasztás a számítógépes erőforrások hatékonyabb felhasználását eredményezheti .
Az ilyen szálakat végrehajtási szálnak is nevezik (az angol thread of execution szóból ); néha "szálnak" (az angol szál szó szerinti fordítása ) vagy informálisan "szálnak" nevezik.
Leírás
A multithreading lényege a kvázi-multitasking egy végrehajtható folyamat szintjén, vagyis az összes szál a folyamat címterében fut le. Ezenkívül egy folyamat minden szála nem csak közös címteret használ, hanem közös fájlleírókat is . Egy futó folyamatnak legalább egy (fő) szála van.
A multithreading (mint programozási doktrína ) nem tévesztendő össze sem a multitaskinggal , sem a multiprocessing -el , annak ellenére, hogy a többfeladatos működést megvalósító operációs rendszerek hajlamosak a többszálas működést is megvalósítani.
Egy adott rendszer többszálú megvalósításának előnyei a többfeladatos rendszerhez képest a következők:
- Egyes esetekben a program egyszerűsítése közös címtér használatával.
- A folyamathoz képest kevesebb idő kell a szál létrehozására.
Egy adott rendszer többszálas megvalósításának előnyei az egyszálashoz képest a következők:
- Egyes esetekben a program leegyszerűsítése a különböző, gyengén összekapcsolt, egyidejű végrehajtást igénylő részfeladatok végrehajtásának külön többszálú alrendszerbe történő átlapolása miatt.
- Folyamatteljesítmény javítása a processzorszámítások és az I/O műveletek párhuzamosításával.
Abban az esetben, ha a végrehajtási szálak viszonylag összetett interakciót igényelnek egymással, többfeladatos problémák, például holtpontok léphetnek fel.
Hardver implementáció
A hagyományos processzorokon a szálkezelést az operációs rendszer kezeli. A szál addig fut, amíg hardveres megszakítás nem történik, rendszerhívás nem történik, vagy amíg az operációs rendszer által a számára kijelölt idő le nem telik. Ezt követően a processzor átvált az operációs rendszer kódjára, amely elmenti a szál állapotát (kontextusát), vagy átvált egy másik szál állapotára, aminek szintén van ideje a végrehajtásra. Ilyen többszálú átdolgozással kellően nagy számú processzorciklust fordítanak a kontextust váltó operációs rendszer kódjára. Ha a száltámogatás hardverben van megvalósítva, akkor maga a processzor képes lesz váltani a szálak között, és ideális esetben több szálat is végrehajtani egyidejűleg minden órajelben. Az operációs rendszer és a felhasználó számára egy ilyen fizikai processzor több logikai processzornak tekinthető.
A többszálú feldolgozásnak két formája valósítható meg a hardveres processzorokban:
Szál megvalósítási típusok
- Egy szál a felhasználói térben. Minden folyamatnak van egy száltáblázata, amely hasonló a kernel folyamattáblájához. A hátrányok közé tartozik:
- Nincs időzítő megszakítás ugyanazon a folyamaton belül
- Ha blokkoló rendszerkérést használ egy folyamaton, annak minden szála blokkolva lesz.
- A megvalósítás összetettsége
- Áramlás a kerneltérben. A folyamattáblázat mellett van egy száltábla is a kerneltérben.
- "Fibers" ( eng. fibers ). Több felhasználói módú szál fut egyetlen kernel módú szálon. A kernelterületi szál jelentős erőforrásokat fogyaszt, elsősorban a fizikai memóriát és a kernelmódú verem kernelmódú címtartományát. Ezért bevezették a "szál" fogalmát - egy könnyű szálat, amely kizárólag felhasználói módban fut. Minden szálnak több "szála" lehet.
Szál interakció
Többszálú környezetben gyakran vannak olyan feladatok, amelyek megkövetelik néhány szál felfüggesztését és újraindítását, mások munkájától függően. Ezek különösen a hozzáférési konfliktusok megelőzésével kapcsolatos feladatok, amikor ugyanazokat az adatokat vagy eszközöket párhuzamos futtatható szálakból használják. Az ilyen problémák megoldásához speciális objektumokat használnak a szál interakcióhoz, például kölcsönös kizárásokat (mutexet), szemaforokat, kritikus szakaszokat, eseményeket stb. Ezen objektumok közül sok kernelobjektum, és nemcsak ugyanazon folyamat szálai között használható, hanem különböző folyamatok szálai közötti interakcióra is.
- A mutex egy olyan szinkronizálási objektum, amely egy speciális jelzési állapotba kerül, amikor nem foglalt egyetlen szál sem. Mindig csak egy szál birtokolja ezt az objektumot, innen ered az ilyen objektumok neve (az angol kölcsönösen kizáró hozzáférés - kölcsönösen kizáró hozzáférés) - a megosztott erőforrásokhoz való egyidejű hozzáférés kizárva. Az összes szükséges művelet után a mutex felszabadul, így a többi szál hozzáférést biztosít a megosztott erőforráshoz. Egy objektum támogathatja a rekurzív rögzítést másodszor is ugyanazon szálon keresztül, növelve a számlálót a szál blokkolása nélkül, majd többszöri felszabadítást igényel. Ilyen például a Win32 kritikus része . Vannak azonban olyan implementációk, amelyek nem támogatják ezt, és a szál holtpontra jut , amikor rekurzív rögzítést próbálnak végrehajtani. Például ez a FAST_MUTEX a Windows kernelben.
- A kritikus szakaszok a mutexekhez hasonló szinkronizálást biztosítanak, azzal a különbséggel, hogy a kritikus szakaszokat képviselő objektumok csak egyetlen folyamaton belül érhetők el. Az események, mutexek és szemaforok egyfolyamatos alkalmazásszálakban is használhatók, azonban egyes operációs rendszerek (például Windows NT) kritikus szakaszainak megvalósítása gyorsabb és hatékonyabb [1] [2] mechanizmust biztosít a kölcsönös kizáráshoz. szinkronizálás - a "get" és a " release" a kritikus szakaszon egyetlen szál esetére van optimalizálva (nincs versengés), hogy elkerüljük az operációs rendszer kerneléhez vezető rendszerhívásokat.
- A szemaforok olyan rendelkezésre álló erőforrások, amelyeket egyszerre több szál is megszerezhet, amíg az erőforráskészlet ki nem ürül. Ezután a további szálaknak meg kell várniuk, amíg a szükséges mennyiségű erőforrás ismét rendelkezésre áll.
- Fejlesztések. Egy objektum, amely 1 bitnyi információt tárol „jelzett vagy nem”, amelyen a „jel”, „visszaállítás nem jelzett állapotba” és „vár” műveletek vannak meghatározva. A jelzett eseményre való várakozás a művelet hiánya a szál végrehajtásának azonnali folytatásával. Ha várakozik egy jel nélküli eseményre, egy szál végrehajtása felfüggesztésre kerül mindaddig, amíg egy másik szál (vagy egy megszakításkezelő második fázisa az operációs rendszer kernelében) nem jelzi az eseményt. Lehetőség van több eseményre várni „bármely” vagy „minden” módban. Lehetőség van olyan esemény létrehozására is, amely az első - és egyetlen - várakozó szál felébresztése után automatikusan visszaáll jelzés nélküli állapotba (ilyen objektum a "kritikus szakasz" objektum megvalósításának alapja). Aktívan használják MS Windowsban, mind felhasználói, mind kernel módban. Van egy hasonló objektum a Linux kernelben, kwait_queue néven.
- Feltételes változók (condvars). Hasonló az eseményekhez, de nem olyan objektumok, amelyek memóriát foglalnak el - csak a változó címét használjuk, a "változó tartalma" fogalma nem létezik, egy tetszőleges objektum címe használható feltételváltozóként. Az eseményektől eltérően a feltételváltozó jelzett állapotba állítása nem jár következményekkel, ha jelenleg nincsenek szálak a változón. Egy esemény beállítása hasonló esetben magában foglalja a "jelzett" állapot tárolását magában az eseményben, ami után a következő szálak, amelyek meg akarnak várni az eseményre, azonnal, megállás nélkül folytatják a végrehajtást. Ahhoz, hogy egy ilyen objektumot teljes mértékben kihasználhassunk, szükséges a „engedje fel a mutexet és várja meg a feltételváltozót atomosan” művelet is. Aktívan használják UNIX - szerű operációs rendszerekben. Az események és feltételváltozók előnyeiről és hátrányairól szóló megbeszélések a Windows és a UNIX előnyeiről és hátrányairól szóló megbeszélések kiemelkedő részét képezik.
- IO befejező port (IOCP). Az operációs rendszer kernelében implementált és rendszerhívásokon keresztül elérhető „queue” objektum „a struktúrát a sor farkába helyezi” és „a következő struktúrát veszi a sor fejéből” műveletekkel - az utolsó hívás felfüggeszti a végrehajtást. ha a sor üres, és amíg más szál nem indítja el a put hívást. Az IOCP legfontosabb jellemzője, hogy a struktúrák nem csak explicit rendszerhívással helyezhetők el benne felhasználói módból, hanem implicit módon az operációs rendszer kernelén belül is, az egyik fájlon végrehajtott aszinkron I / O művelet eredményeként. leírók. E hatás eléréséhez a "fájlleíró társítása IOCP-vel" rendszerhívást kell használnia. Ebben az esetben a sorban elhelyezett struktúra tartalmazza az I / O művelet hibakódját, illetve a művelet sikeressége esetén a ténylegesen bevitt vagy kimeneti bájtok számát. A befejezési port megvalósítása korlátozza azon szálak számát is, amelyek egyetlen processzoron/magon futnak le, miután egy struktúra érkezett a sorból. Az objektum az MS Windowsra jellemző, és lehetővé teszi a bejövő kapcsolódási kérelmek és adattömbök feldolgozását szerverszoftverben olyan architektúrában, ahol a szálak száma kevesebb lehet, mint a kliensek száma (nincs szükség külön szál létrehozására erőforrásköltségekkel minden új ügyfél esetében).
- ERESOURCE. Mutex, amely támogatja a rekurzív rögzítést, megosztott vagy kizárólagos rögzítési szemantikával. Szemantika: Egy objektum lehet szabad, vagy tetszőleges számú szál által megosztott módon rögzíthető, vagy csak egy szál által megszerezhető exkluzív módon. Bármilyen, ezt a szabályt sértő rögzítési kísérlet a szál blokkolását okozza, amíg az objektumot fel nem szabadítják, és lehetővé teszik a rögzítést. Vannak TryToAcquire típusú műveletek is - soha nem blokkolja a szálat, vagy rögzíti, vagy (ha blokkolni kell) a FALSE-t adja vissza anélkül, hogy bármit is tenne. A Windows kernelben használják, különösen a fájlrendszerekben - például bármely valaki által megnyitott lemezfájl megfelel az FCB struktúrának, amelyben 2 ilyen objektum található a fájlmérethez való hozzáférés szinkronizálására. Ezek egyike - lapozó IO erőforrás - kizárólag a fájlmetszési útvonalon kerül rögzítésre, és biztosítja, hogy a metszés időpontjában a fájl ne rendelkezzen aktív I / O-val a gyorsítótárból és a memórialeképezésből.
- lerohanás elleni védelem . Egy félig dokumentált (a hívások a fejlécfájlokban vannak, de nem a dokumentációban) objektum a Windows kernelben. Számláló "növelés", "csökkentés" és "várás" műveletekkel. A várakozás blokkolja a szálat, amíg a csökkentési műveletek a számlálót nullára nem csökkentik. Ezenkívül a növelési művelet meghiúsulhat, és az aktuálisan aktív várakozási idő jelenléte az összes növelési művelet meghiúsulását okozza.
A terminológia kritikája
Az angol thread kifejezés „szál”-nak való fordítása a programozással kapcsolatos kontextusban ellentmond a „szál” általános nyelvi kontextusban való fordításának, és ütközéseket okoz a Data stream kifejezéssel .
A „folyam” kifejezés azonban a hetvenes években a Mir kiadó által készített külföldi szakirodalom fordításaihoz kapcsolódik. Jelenleg "akadémiai körökben" (vagyis a tankönyvekben, oktatási segédletekben, egyetemi kurzusokban, szakdolgozatokban stb.) referenciának számít. A "szál", "szál" stb. kifejezések szakzsargonnak minősülnek .
Lásd még
Irodalom
- Kunle Olukotun. Chip többprocesszoros architektúra – technikák az áteresztőképesség és a késleltetés javítására. - Morgan and Claypool Publishers, 2007. - 154 p. — ISBN 159829122X . (Angol)
- Mario Nemirovsky, M. Tullsen dékán. többszálú architektúra. - Morgan and Claypool Publishers, 2013. - 1608458555 p. — ISBN 1608458555 . (Angol)
Jegyzetek
- ↑ Jeffrey Richter . "Jeffrey Richter. Windows szakembereknek. Hatékony WIN32 alkalmazások készítése a 64 bites Windows sajátosságaihoz igazítva. 2001
- ↑ MSDN http://msdn.microsoft.com/en-us/library/ms682530%28VS.85%29.aspx Archiválva : 2011. december 23. a Wayback Machine -nél
Linkek