Az eljárások fonalak és szálak tengelyek ablakok
1. Az eljárások fonalak és szálak OSWindows
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.;
- egy egyedi azonosítót a menet;
- a tartalmát a CPU regiszterek egy sor tükrözi az állam a processzor;
- két köteg, amelyek közül az egyik használni, amikor a menet kernel módban és egy másik - a felhasználói módban;
- fedett terület memória nevezett szál helyi tárolási (cérna helyi tároló, TLS) és alrendszerek használt, futásidejű könyvtárak és DLL.
Ahhoz, hogy minden szál a munka, az operációs rendszer hozzárendel mindegyikük egy bizonyos CPU. Így illúzióját keltik egyidejű végrehajtása szálak (persze 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 végrehajtásra a legmagasabb prioritású szál futásra kész. Válogatott végrehajtani a szál fut egy bizonyos ideig, az úgynevezett kvantum. Quantum meghatározza, hogy meddig egy szál fut, amíg az operációs rendszer nem fogja megszakítani vele. Végén a kvantum az operációs rendszer ellenőrzi, hogy a végrehajtásra kész egy másik szál azonos (vagy nagyobb) prioritási szintet. Ha az ilyen szálak nem rendelkezik, az aktuális szál van rendelve egy 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 aktuális szál elmozdul, akkor is, ha a kvantum még nem járt le.
Amikor van egy időzítő megszakítás a kvantum a menet kivonjuk 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 x86 egyprocesszoros rendszerben ez 10 ms és legfeljebb többprocesszoros rendszerek x86 - 15 ms.
Windows tervezés végzik a szálszinten és nem folyamatokat. Egyértelműnek tűnik, mivel a folyamatok önmagukban nem teljesül, de csak források és a kontextust a végrehajtási szál. Ezért, amikor tervez menet, a rendszer nem figyel arra, amit tartoznak, milyen folyamat. Például, ha folyamat A 10 futtatható szálak, és az eljárás B - két 12 izzószál és az összes azonos prioritással, mindegyikük megkapja 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 - valós idejű szinten; 15-1 - a dinamikus szinten; 0 - rendszer szintű, fenntartott oldal nullázást folyamat (nulla-oldal menet).
A prioritás minden szál (menet bázis prioritás) összege a prioritása a folyamatba, és a relatív prioritása a menet is. Hét relatív prioritása szálak:
Normál: ugyanaz, mint a folyamatban;
Fent normál: 1 a kiemelt folyamatot;
Timecritical: beállítja az alap prioritását egy szál Realtime class 31,
más osztályok számára - 15;
Idle: beállítja az alap prioritását egy szál Realtime 16. osztályba
más osztályok számára - 1.
Ha az operációs rendszer fut a gépen, amely több mint egy processzor, akkor alapértelmezés szerint a menet fut a rendelkezésre álló processzor. Ugyanakkor bizonyos esetekben egy sor processzorok, amelyen egy szál futhat, lehet korlátozni. Ez a jelenség a processzor affinitás (processoraffinity). Meg lehet változtatni a processzor affinitás programot át Win32 # 8209; a tervezési funkciót.
2. létrehozásának folyamata
- 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 fájl kerül végrehajtásra rasshireniem.bat, fuss cmd.exe, stb
- Létrehoz egy Win32 tárgy „folyamat”.
- hozzon létre egy primer menetes (verem, összefüggésben, és a „menet” objektum).
- Win32 alrendszer bejelentett egy új folyamat és cérna.
- Úgy kezdődik a végrehajtása az elsődleges téma.
3. A folyamat végrehajtásáról
A folyamat megszakad, amikor:
- A bemeneti funkció elsődleges menet visszanyerje ellenőrzés.
- Az egyik a szálak a folyamat okozta a funkciót ExitProcess.
- A menet a másik folyamat hívott függvény TerminateProcess.
Példa: A program létrehoz egy folyamat „számológép”.
int main (int argc, char * argv [])
ZeroMemory (si, sizeof (SI));
ZeroMemory (pi, sizeof (pi));
if (CreateProcess (NULL, «C: \\ Windows \\ calc.exe» !, NULL, NULL, HAMIS,
0, NULL, NULL, si, pi))
// bezárása folyamatban, és menet kezeli.
4. Hozzon létre egy szál
5. lezárása szálak
Ha a szál végét
- a szál a függvény.
- A szál magától destructs, okozva ExitThread.
- Más izzólámpa, vagy egy harmadik eljárás okozó TerminateThread.
- a folyamat tartalmazó szál.
6. létrehozása szálak
A szál lehet létrehozni egy olyan rendszer segítségével hívást CreateFiber láncfonal eljárással vagy megkaphatjuk a aktuális szál keresztül ConvertThreadToFiber funkciót. A váltás a szálak lehet elhelyezni keresztül SwitchToFiber funkciót. de a hívás lehet csak a rost.
Példa: A program létrehozza a négy szál, amelyek mindegyike végez váltás a következő szál, ha a kapcsolók számát 10-nél nagyobb, a munka befejeződött.
#define _WIN32_WINNT 0x0400
érvényteleníti WinAPI Func (void *)
printf ( «Fiber száma% d \ n», Counter% 4);
SwitchToFiber (rost [Counter% 4]);
int main (int argc, char * argv [])
rost [0] = CreateFiber (0, Func, NULL);
rost [1] = CreateFiber (0, Func, NULL);
rost [2] = CreateFiber (0, Func, NULL);
rost [3] = CreateFiber (0, Func, NULL);
// váltani az első szál szükséges átalakítani az aktuális téma a szál
7. Destruction szálak
Kényszeríteni a pusztítás a szálak használt DeleteFiber funkciót. Szintén a megsemmisítése szál használható minden funkciót elpusztítására szálak.
Függessze fel az a munka szálak is használhatók a különböző módokon.
Sleep () függvény felfüggeszti a menet a megadott számú milliszekundum. Ha az argumentum megad 0 ms, akkor történik a következő pillanatban. Menet feladni kvantum CPU idő, hanem azonnal megjelenik a témák listája indításra kész. Más szóval lesz a szándékos kapcsolási szálak (vagy inkább egy kísérlet, hogy megváltoztassák -, mert a következő szál elvégzésére lehet, ugyanaz).
Példa. A program létrehozza a folyamat „számológép”, és 15 másodperc múlva megöli.
int main (int argc, char * argv [])
memset (StartUpInfo, 0, sizeof (STARTUPINFO));
Ha (CreateProcess (NULL, «C: \\ Windows \\ calc.exe», NULL, NULL, HAMIS,
NORMAL_PRIORITY_CLASS, NULL, NULL, StartUpInfo, ProcessInfo))
TerminateProcess (ProcessInfo.hProcess, 0);
WaitForSingleObject () függvény felfüggeszti a szálat, amíg, amíg az egyik két esemény:
- lejár timeout;
- a várható 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 # 8209; a legtöbb funkció lehet kernel objektumok, például objektum „eljárás” vagy „szál”, hogy meghatározza, mikor 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.
Példa. A program létrehozza két azonos szálak és vár befejezését. Menet egyszerűen írni egy szöveges üzenetet, amelyet a nekik szállított inicializálása során.
előjel nélküli ThreadFunc (void * arg)
char ** str = (char **) arg;
MessageBox (0, str [0], str [1], 0);
int main (int argc, char * argv [])
char * InitStr1 [2] =; // karakterláncot az első menet
char * InitStr2 [2] =; // karakterláncot a második menet
előjel nélküli hosszú hiba uThreadIDs [2];
hThreads [0] = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) ThreadFunc,
hThreads [1] = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) ThreadFunc,
// Várja meg, amíg a szálak befejezni munkájukat
WaitForMultipleObjects (2, hThreads, IGAZ, INFINITE);
Az előadás tárgyalja a különböző WIN API funkciók és lépéssorozatot létrehozására és dolgozik a folyamat, cérna és foloknami vmindouz létrehozásakor alkalmazásokat, azok használatát és tulajdonságait. A teljes tájékoztatás céljából, felhasználása és szintaktikai összes Win32 API funkciók használatához a rendszer segítségével MSSDK, amely része a BorlandDelphi CBuilder vagy programozási környezetek, valamint az MSDN, szállított részeként VisualC programozási rendszer.