Uinc folyamatok a windows

Kedves olvasók, ami (még)
Nem tudom, ki ez, és mit Dzh.Rihter SDK.

Eljárások a Windows

Eljárás nevükön egy példánya már futó programot.

Bár első pillantásra úgy tűnik, hogy a koncepció a program és a folyamat szinte azonos, akkor alapvetően különböznek egymástól. A program egy statikus sor utasítást, és a folyamat egy sor források és a felhasznált adatok a program végrehajtása során. Folyamatot Windows az alábbi összetevőkből áll:

- adatstruktúra, amely tartalmazza az összes információt a folyamat, beleértve egy listát a nyitott kezeli a különböző rendszer erőforrásait, egyedi folyamat azonosítója, a különböző statisztikai adatok, stb.;

- Az egyedi áramlási azonosítója;

- Tartalom sor processzor regiszterek, amelyek tükrözik az állam a processzor;

- Két halom, amelyek közül az egyik használható, ha az áramlás a kernel módban, és a másik - a felhasználói módban;

- A zárt terület memória néven helyi áramlási memória (cérna helyi tároló, TLS) és használt alrendszerek futásidejű könyvtárak és DLL.

Hogy minden szál működik, az operációs rendszer hozzárendel mindegyikük egy bizonyos CPU. Így illúzióját keltik egyidejű menetek végrehajtása (természetesen igaz párhuzamosság lehetséges többprocesszoros számítógépek). A Windows rendszer végre megelőző menetrendi alapuló prioritásokat, amelyek mindig fut a patak a legmagasabb prioritású, futásra készen. Kiválasztott a munka elvégzésére áramlás egy bizonyos ideig, az úgynevezett kvantum. Quantum meghatározza, hogy meddig a patak fut, amíg az operációs rendszer nem szakítja meg. Végén a kvantum operációs rendszer ellenőrzi, hogy készen áll a másik szál azonos (vagy nagyobb) prioritási szinten. Ha ilyen áramlatok kiderült, hogy az aktuális téma kerül felosztásra másik kvantum. Azonban a szál nem tud teljes mértékben kihasználja a kvantum. Amint a másik szál nagyobb prioritású futásra kész, az áram kénytelen, akkor is, ha a kvantum még nem járt le.

Valahányszor megszakítás történik az időzítés a fluxus kvantum levont 3, és így tovább, amíg el nem éri a nullát. Frekvencia váiaszidözitő függ a hardver platform. Például, a legtöbb egyprocesszoros x86 rendszerekben 10ms, és a legtöbb többprocesszoros x86 rendszerek - 15ms.

Windows Ütemezés thread-szinten, nem pedig folyamatokat. Egyértelműnek tűnik, mivel a folyamatok önmagukban nem teljesül, de csak források és a kontextust a végrehajtás a szálak. Ezért, amikor tervez patakok, a rendszer nem figyel arra, amit tartoznak, milyen folyamat. Például, ha a folyamat A 10 futtatható szálak, és a folyamat a B - két áram 12 és az összes azonos prioritású, minden egyes szál kap 1/12 CPU idő.

A Windows van egy 32 prioritási szinten, 0 31. Ezek a következőképpen csoportosíthatók: 31-16 szintek valós idejű; 15-1 dinamikus szintek; 0 - rendszerszintű fenntartott nullázás oldalak áramlás (nulla oldalas téma).

Amikor egy folyamat jön létre, ez van rendelve az egyik hat prioritást az osztályban:

Valós idejű osztály (érték 24)

Kiváló minőségű (érték 13)

Haladja meg a normál osztály (10-es értéket)

Normál osztályban (érték 8),

Az alábbiakban normál osztályban (érték 6)

és tétlen osztály (érték 4).

processzoraffinitás

Ha az operációs rendszer fut a gépen, amely több mint egy processzor, az alapértelmezett szál fut minden rendelkezésre álló processzor. Ugyanakkor bizonyos esetekben egy sor processzorok, amelyek a patak tudja kezelni, lehet korlátozni. Ezt a jelenséget nevezzük kötelező a processzorok (processzoraffinitási). Meg lehet változtatni a processzor affinitás programban, Win32-tervezési feladatokat.

- Megnyitja egy képfájlt (EXE), amely kerül sor a folyamatban. Ha a végrehajtható fájl nem Win32 alkalmazás, a kép támogatását kérik (támogatás image) futtatni ezt a programot. Például, ha a futtatható fájl kiterjesztésű .bat, futni cmd.exe, stb

- Win32 objektum létrehoz egy „folyamat”.

- Ez létrehoz egy primer áram (verem „flow”, és a környezeti objektum).

- A Win32 alrendszer bejelentett egy új folyamat és cérna.

- Úgy kezdődik, végrehajtását az elsődleges patak.

A folyamat megszakad, amikor:

- A bemeneti függvény értéke az elsődleges vezérlési.

- Az egyik eljárási áramokban az úgynevezett ExitProcess funkciót.

- Az áramlás a másik folyamat hívott függvény TerminateProcess.

1. példa: A program létrehoz egy „számológép” folyamat.

Kernel tárgy, sőt, a szerkezet által létrehozott kernel és csak neki. A felhasználói alkalmazás csak akkor küldi leíró (fogantyú) a tárgy, és ellenőrzik az objektumot kernel használatával Win32 API függvényeket.

Hogyan lehet felfüggeszteni az áramlás? Nagyon sok módja van. Íme néhány közülük.

Sleep () függvény felfüggeszti ügymenetmodell egy előre meghatározott számú milliszekundum. Ha az argumentum megad 0 ms, akkor történik a következő pillanatban. Takarmány lemondania kvantum CPU idő, de azonnal megjelenik a témák listája indításra kész. Más szóval megtörténhet szándékos kapcsolási patakok. (Vagy inkább egy kísérlet, hogy megváltoztassák. Végtére is, a következő egy végrehajtási szál lehet, ugyanaz.)

WaitForSingleObject () függvény felfüggeszti a szálat, amíg, amíg az egyik két esemény:

- időtúllépés;

- a várt tárgy kerül a riasztás (jelez) állapotban van.

By visszatérési érték is lehet érteni, hogy a két esemény történik. Várják a várakozás-help funkció leginkább kernel objektumok, például objektum „eljárás” vagy „stream” meghatározása, amikor a teljes munkájukat.

WaitForMultipleObjects funkciót vezetünk objektumtömbbe egyszerre. Számolni lehet a műveletet még egyszer az összes objektum, vagy az egyik közülük.

2. példa A program létrehozza két azonos áramlási, és vár a befejezését.
Streams egyszerűen írni egy szöveges üzenetet, amelyet a nekik szállított inicializálása során.

Mutex (a Mutex) a kernel létrehozott objektumok CreateMutex () függvényt. Mutex van két állam - Sport és ingyenes. Mutex jó, hogy megvédje a személyazonosságát a forrás ugyanakkor utalnak rá, a különböző szálak.

3. példa Tegyük a program használ egy erőforrás, például egy fájl vagy tár. WriteToBuffer () függvényt hívjuk a különböző szálak. Ütközések elkerülése érdekében, miközben hivatkozva a puffer a különböző szálak, használjuk egy mutexet. Mielőtt rátérnénk a puffer számíthat mutex.

Semaphore (szemafor) létrehozott CreateSemaphore () függvény. Ez nagyon hasonlít a mutexek, de vele ellentétben egy szemafor egy számláló. Szemafor nyitható, ha a számláló értéke nagyobb, mint 0, és zár, amikor a számláló értéke 0. szemaforral általában „zárja” egyenértékű készlet erőforrások (komponensek), ilyen sorban, lista, stb

4. példa A klasszikus példa a használata szemaforhoz sorban elemeket, amelyek kezeljük több szálat. Streams „pick up” elemet a sorból. Ha a sor üres, az áramlás kell „aludni”, várva az új elemeket. Elszámolására a sorban álló tételeket egy szemafor.

Megjegyzés. Ebben a példában, úgy véljük, hogy az eljárások maguk hozzátéve egy elem a sorban, és távolítsa el a sorból biztonságosak szempontjából többszálú. Nem fogunk még foglalkozni a azok végrehajtásáról. akkor nézd meg ezt a 9. példában részletesen.

Események (Event), valamint a mutex két állam - meghatározott és eldobjuk. Az események olyan utasítás-reset és autoreset. Amikor egy szál várakozási (várjon-függvény a menedzsment) autoreset esemény, egy ilyen esemény automatikusan törlődik. Ellenkező esetben az esemény újból be kell állítani kézzel, hívja ResetEvent () függvényt. Tegyük fel, hogy több patak várják ugyanazokat az eseményeket, és ha munkát. Ha ez egy olyan esemény volt a autoreset, ez lehetővé teszi, hogy a munka csak egy szál (mert azonnal hazatérése után a várakozási funkció esetén automatikusan visszaáll!), És más szálak fog várni. Ha ez egy olyan esemény volt a kézi-reset, akkor minden szál lesz ellenőrzés, és az esemény marad a bekapcsolt állapotban, amíg egy szál kéri ResetEvent ().

5. példa: Ez egy másik példa egy többszálú alkalmazás. A program két stream; Egy előkészíti az adatokat, és a második a szerver. Ésszerű összevessünk munkájukat. Itt patakok kell működnie viszont. Először is, az első folyam adatokat előállítására része. Akkor küld egy második áramot, és az első időközben előkészíti a következő rész, és így tovább Az ilyen szinkronizálás szükség két Juke autoreset.

PulseEvent () függvény beállítja az eseményt, majd hozza vissza a reset állapotban; amelyben ez felér hívó szekvencia SetEvent () és ResetEvent (). Ha PulseEvent nevezett az eseményre állítani manuálisan, minden szál vár erre a tárgyra, hogy ellenőrzése. Ha telefonál az esemény PulseEvent autoreset ébred csak az egyik várakozó szálak. És ha egyik sem az áramok nem vár a rendezvény célja, hogy a függvényhívás nincs hatása.

7. példa megvalósítani a funkció NextFrame () az előző példában gördül a fájl manuálisan keretben.

Talán várható időzítő - a legkifinomultabb kernel objektum szinkronizálását. tűntek, kezdve a Windows 98 időzítők CreateWaitableTimer funkciót, és, valamint események, autoreset nélküle. Ekkor az időmérőt kell állítani SetWaitableTimer funkciót. Az időzítő megy egy riasztási állapotot időtúllépés. Mégsem „ketyeg” időzítés funkció CancelWaitableTimer. Érdemes megjegyezni, hogy megadhatja a visszahívási funkció, amikor az időzítő beállítását. Ez lesz végrehajtva, ha az időzítő lejár.

8. példa írása Program Service segítségével WaitableTimer'y. Szolgáltatás srabatyvat alkalommal egy nap reggel 8 órakor és „pikat” 10-szer. Mi használ a két időmérő, az egyik egy visszahívási funkció.

Kritikus szakaszok. A szinkronizálás felhasználói módban.

Kritikus szakasz biztosítja, hogy a darab programkód, bekerített akkor nem kell elvégezni egyszerre. Szigorúan véve a kritikus szakasz nem tárgya kernel. Ez egy szerkezet, amely több zászlók és valamilyen (nem fontos) kernel objektumot. A belépő a kritikus szakaszban először ellenőrizte zászlók, és ha kiderül, hogy már elfoglalt egy másik szál, majd a szokásos várakozási funkciót. A kritikus szakasz méltó az a tény, hogy a vizsgálat, elfoglalt, vagy nem, a program nem megy be a kernel módú (nem tart várni-funkció), és csak ellenőrzött zászlókat. Emiatt úgy gondoljuk, hogy a szinkronizálás segítségével kritikus szakaszok a leggyorsabb. Ez a szinkronizálás az úgynevezett „szinkronizálás felhasználói módban”.

9. példa Tekintsük ismét az összes elemet. Az egyik lehetőség a végrehajtás - a kétszeresen láncolt lista. Abból a szempontból, a menet művelet ez veszélyes hozzáadni, illetve kivenni a sorból. Fennáll annak a lehetősége, hogy több szálat egyidejűleg kezdenek újjáépíteni indexek és a sorban állás kapcsolat megszakad. Ennek elkerülése érdekében használjon kritikus szakasz.

rendszermag objektum leírók függ az adott folyamat (folyamat specifikus). Egyszerűen fogalmazva, kezelni tárgy kapott egy folyamat, nincs értelme a másik. Azonban vannak olyan módon, hogy működjön együtt az azonos kernel tárgyak különböző folyamatokat.

Először is, ez az örökség a leíró. Amikor létrehoz egy objektumot, megadhatja, hogy ez lesz öröklik gyermek leíró (amelyeket ez a folyamat) folyamat.

Másodszor, a kettős leíró. DuplicateHandle függvény objektum másolata leíró egyik folyamat egy másik, azaz sőt, úgy a rekord a táblázat kezeli egy folyamat létrehoz egy másolatát, hogy a másik asztalnál.

És végül, az elnevezés a kernel objektum. Amikor létrehoz egy atommag a szinkronizációs objektum (mutexek szemafor várható timer esemény) lehet kijelölni a nevét. Egyedinek kell lennie a rendszerben. Aztán egy másik folyamat is megnyithatja a kernel objektum, meghatározva a funkciók Megnyitás ... (OpenMutex, OpenSemaphore, OpenWaitableTimer, OpenEvent) nevét.

Sőt, ha hívja a létrehozása funkciót. (), A rendszer először ellenőrzi, hogy ha már van egy kernel objektum azonos nevet. Ha nem, akkor létrehoz egy új objektumot. Ha igen, akkor a kernel ellenőrzi, hogy milyen típusú az objektum és a hozzáférési jogokat. Ha a típus nem felel meg, vagy a hívó fél nem rendelkezik teljes körű hozzáférés az objektumot, hívja létrehozása ... funkció nem működik, és visszatérési értéke NULL. Ha minden jól megy, akkor csak létrehoz egy új leíró (fogantyú) a már meglévő kernel objektum. Kód GetLastError függvény visszatér (is), hogy mi történt: egy új objektumot, vagy a Create () által visszaadott egy meglévőt.

Ezért, hogy szinkronizálja szálak belül különböző folyamatok lehet pontosan ugyanaz, mint az azonos. Csak meg kell pontosan közvetíti a szinkronizációs objektumot leíró egyik eljárás a másikra módszerek bármelyikével fent felsorolt.

10. példa Számos alkalmazás induláskor ellenőrzi, hogy egy másik példánya a program fut. A szabványos módon, hogy végre ezt a tesztet - segítségével elemzi mutexek.

Más mechanizmusok (foglalatok, cső)

Csatornákat használnak adatátvitel az egyik irányban a szülő és a gyermek folyamatok között vagy két gyermek folyamatok. olvasási / írási művelet egy csatornához hasonló hasonló műveleteket fájlokat.

Nevezett csatornákat használnak kétirányú kommunikáció a szerver folyamat és egy vagy több ügyfél folyamatban. Névtelen csatornák használják faylopodobny felület, de, ellentétben az első, szintén alkalmas az adatcserét a hálózaton keresztül.

Socket - absztrakt tárgy utal az egyik végét a hálózati kapcsolat, beleértve az internetet. A Windows aljzatok két fajtája van: konnektorok és datagram aljzatok patakok. Windows Sockets Interface (WinSock) alapul BSD socket verzió, de vannak bővítmények, amelyek specifikusak a Windows.

Üzenetek Windows (ablak üzenetek)

Beszél a Windows nem beszélve az ilyen fogalmakat, mint az ablakok (windows), üzenetek (üzenet), üzenetsort (Message Queuing), stb

Ablak - ez (négyszögletes) területet a képernyőn, amely megjeleníti az alkalmazás (ha az látható, természetesen), és információt kap a felhasználó. A Windows tartoznak folyik. A patak egy ablakot hoz létre úgy a tulajdonos ezt az ablakot. Flow lehet a tulajdonosa több ablakot.

A Windows ellenőrző üzeneteket. Minden esemény az ablakon, majd egy üzenetet küld neki, a teremtés és pusztítás ablakok, billentyűzet, egér mozgását, festési és mozgó ablakok, stb Értesítések ablakban lehet küldeni a rendszer és a felhasználói alkalmazások. Minden ablak van hozzárendelve olyan függvény ablak eljárás (ablak eljárás), és amely az úgynevezett amikor az üzenet feldolgozása.

Az üzenetek nem csak az ablakon, de a legtöbb áramlását. Minden szál, amely birtokolja az ablak egy üzenetet sorban. Jellemzően a szál, hogy birtokolja az ablakot, csak az érintettek, amely feldolgozza az üzeneteket küldött az ablakok.

Ha az objektum kezeli kernel folyamat-függő, ablak fogantyúk belül egyedi Deskop. Ezért az egyik folyamat nem nehéz megszerezni, és használja a kilincs tartozó másik technológiai folyamatból.

Küldés ugyanazt az üzenetet az egyik alkalmazásból a másikba nem, hogy más, mint egy módja folyamatok közötti kommunikációt.

12. példa A program úgy találja, az ablakot a cím „számológép”, és bezárja azt küldésével WM_CLOSE.

Kapcsolódó cikkek