Szinkron és aszinkron aljzatok ablakok
bevezetés
Ebben a tanulmányban azt vizsgáljuk a modell a Windows Sockets. Összehasonlítjuk a szinkron és aszinkron Window Sockets API, és miért van, hogy aszinkron modell, valamint aszinkron bővítése Window Sockets jobb teljesítményt nyújt a Windows.
szinkron Megnyerő
Szinkron Window Sockets API mintájára alapján a standard Berkeley Sockets API. Kompatibilitás a két felület (API) is nagyon hasznos. Különösen akkor, ha a régebbi UNIX-kódrészletet kell portolni a Windows.
Általában a szinkron funkció Window Sockets API összpontosított eljárási programozás blokkoló foglalatok. Programok írni és olvasni a foglalathoz blokkoló módon, teljesen támaszkodva az operációs rendszer. Szinkron API munka jobban parancssori-orientált többfeladatos Unix-szerű rendszerek. Ez nem a legjobb választás a Windows.
Hogy oldja meg a problémát a blokkoló hívások a Windows-orientált rendezvények, Winsock API utánozza blokkoló hívások segítségével a blokkoló horog, amely magában foglalja az esemény hurok. Sajnos, ez a vetélkedés blokkoló hívások ablak aljzatok vannak bizonyos korlátai. Különösen egyetlen blokkoló hívás lehet aktív ebben a pillanatban. Ezek a korlátozások közvetlenül elérje a felhasználói interfész a program.
Annak ellenére, hogy a program blokkolt „pihenő”, amíg a várható hálózati esemény, mert a Windows van elfoglalva, akkor nem igazán jelenleg blokkolja. Nem lenne helyes azt mondani, hogy ez a várakozás a ciklusban, amely kezeli a Windows üzeneteket, mint a következő példában:
Ha az ablak üzenetet, a kijelölt blokkoló program kerül a Windows Message Queuing, továbbadják az ablak eljárást a programban. A felhasználói felület a programhoz tartozó aktív marad. A felhasználó kiválaszthatja a menüpontokat és nyomja meg a gombot, amely ezután kell küldeni a programot. Problémák merülhetnek fel, ha a felhasználó kiválaszt egy menüpont, amely felhívja a másik hálózat működését. Mivel a program már blokkolja a hálózati funkciók nem nevezhető más hálózati funkció, és az eredmény egy kísérlet arra, hogy végezze el a hálózat működését egy tévedés.
Ennek elkerülése érdekében a rendezvény, a Windows program, amely a szinkron blokkolja az API, meg kell győződnie arról, hogy a következő hálózati műveletet nem lehet elindítani, amíg a program blokkoló módban. A programnak tartalmaznia kell tiltani az összes menüpont, és gépelés, ami oda vezethet, hogy a dob többi hálózati műveletek, és ez egy bonyolult folyamat, különösen, ha sok szempontból, vagy teljesen kikapcsolni a felhasználói felület több üzenetet kapni az egér és a billentyűzet és a kijelző egér - homokóra.
Az első kiviteli alak előnyösebb a szempontból a felhasználó. A felhasználó nem tudja futtatni a következő parancsot a hálózathoz, de legalább a többi elérhető lesz a rendszer. A felhasználó átválthat egy másik futó programot, és folytatni, amíg az első programot vár a hálózati funkció. Ahhoz azonban, hogy ezt a feladatot a programozó nem könnyű.
A második esetben, a felhasználó szembesül kurzor - homokóra befejezéséig a hálózat működését, amikor lehetett volna ebben az időben, hogy végre hasznos munkát. Multitasking a Windows hatékonyabb közeg, mint egy folyamat, mert a hálózat foglalt.
Mindkét esetben lehetetlen hogy két hálózati műveletek ugyanabban az időben ugyanazt az alkalmazást. A felhasználó nem tudja egyszerre elküldeni a levelet, és ellenőrizze az új üzeneteket a szerveren.
A probléma a szinkron Window Sockets API megoldható két módon. Mindkettő nem-blokkoló foglalatok. Az első módszer az, hogy a darabok nem-blokkoló foglalatok és válassza () funkció ellenőrzi a feltétel az érdeklődés aljzat. Ezután a socket olvasni és írni a rendelkezésre álló adatok vagy adat, amely továbbításra váró. Ahhoz azonban, hogy elkerüljük azt a problémát blokkolja a hívást válassza () függvényt kell meghívni a timeout paraméter nullával egyenlő, ami a nem-blokkoló működését. Egyszerűen szólva, a funkció kiválasztásához () kell nevezni, hogy ne zárja le a rendszert, hogy támogassa a üzenetsorába és ugyanakkor lehetővé teszi az üzenetek elérik a Windows kernel. Ehhez a kódot kell használni, hasonlít egy blokkoló horog:
Annak ellenére, hogy ez a kód működik, ez egy szerencsétlen döntés. Meg kell égetni üresjárati CPU időt, miközben semmi nem lesz hatékony - a hurok fut select () függvény. Ez a módszer is, hogy gazdaságilag nem dobja ki a rendszer erőforrásait, és nem alkalmas arra az esetre - orientált Windows operációs rendszert.
Hatékonyabb megoldást az összes problémát blokkoló foglalatok - a használata aszinkron expanziós Window Sockets API.
Külön köszönet: NiFi [UInC] Motrichuk Alexander, Dave Roberts.
Minden dokumentum és program ezen az oldalon összegyűjtöttük az oktatási célokat szolgál, nem vagyunk felelősek semmilyen következményekkel bekövetkezett következtében az ilyen anyagok alkalmazásának \ programokat. Ön használja az összes fenti a saját kockázatára.