Dobrý článek Přidám o něco detailnější pohled
Při čtení některých příspěvků jsem se dozvěděl, jak je to jednoduché. Procesory si rozdělí spuštěné programy .... a je to !! ¨
Ve skutečnosti je to značně složité .....
S uvedeným článkem souhlasím, ale chci upozornit na to, že důvod, proč je tak malý nárůst výkonu je ukryt hluboko v jádru operačního systému.
Všechny příspěvky k tomuto článku, které jdou trochu hlouběji, začínají od threadů procesu - aplikace, které využívají multitasking a mají přidělena jednotlivá jádra procesoru. Dále je někde uvažován vliv synchronizace zase na uvedené urovni threadů procesu. V jednom příspěvku je i zmínka o synchronizaci v jádru pomocí spinlocků. V mém příspěvku chci odktýt, že právě synchronizace je tím, co způsobuje že dual nemaká tak, jak by si někdo přál.
Začnu od libovolného časového úseku, v jehož rámci jsou aktivní oba prováděcí toky jader dualu, úmyslně mluvím o časovém úseku a prováděcích tocích, protože časová kvanta a thready jsou úplně něco jiného. Časové kvantum souvisí s multitaskingem a thread je prováděcí tok procesu.
Začnu tím, že v jednom časovém úseku mužou obě jádra zpracovávat kód jádra operačního systému, nebo můžou mít přiděleny dva paralelní thready jednoho procesu, pak je ještě možné spřažení jader, ale k tomu později, toť vše.
Není možné, aby v jednom časovém úseku jedno jádro zpracovávalo kód jádra operačního systému a druhé jádro mělo přidělen thread procesu.
Není možné, aby v libovolném časovém úseku mělo jedno jádro přidělen thread jednoho procesu a druhé jádro mělo přidělen thread druhého procesu.
Později vysvětlím jaká omezení systému to způsobují, jestli si myslíte, že tomu tak není, nečtěte dál příspěvek ... a začněte psát svůj, v kterém uvedené zpochybníte a důkladně zdokumentujete ... neuchylujte se k osočování, jakého je dnes svědkem autor článku ....
Teď pro ty, co nemají zkušenost v programování ve Win32 API vysvětlím základy, až potom se zmíním jak celý systém funguje ......
Operační systém zajišťuje jednu správu hardvaru , jednu správu jednoho paměťového prostoru, jednu správu procesů a jejich threadů.
Program tvoří jeden primární proces. Spouštíme-li druhou instaci programu, vytvoří se synovský proces, například druhé okno Průzkumníka.
Proces má jeden primární thread, popřípadě další synovské thready. O použití synovských threadů, rozhoduje programátor při vytváření programu.
Program běží tak, že threadu (vpřípadě dvojjádra dvěma threadům) jeho procesu přidělí operační systém procesor na jedno časové kvanto, vyjímečně to může být více časových kvant.
Časový kvant je časový úsek řádové v desítkách milisekund, na který je v rámci multitaskingu přidělován procesor threadům ve všech spuštěných procesech. Velikost časového kvanta závisí na prioritě procesu, na tom zda se jedná o proces v popředí nebo na pozadí atd.
Multitasking je prováděn v rámci správy procesů a threadů operačního systému, zajištťuje přidělování procesoru spuštěným procesům v časových kvantech stále dokola, takže je vytvářen dojem, že běží všechny programy současně. Multitasking může přidělit procesor jenom některým procesům, některé múže nechat čekat, to závisí na prioritě procesu.
Proces je vlastně instancí spuštěného programu. Proces má svůj vlastní virtuální paměťový prostor o velikosti 2 GB v kterém má uložen svůj kód. Tento virtualní paměťový prostor je umístěn ve spodní části prostoru dostupného systému o velikosti 4 GB. Horní 2 GB prostoru patří operačnímu systému a proces nemá k němu v žádném případě přístup. Virtuální prostor vytváří operační systém při aktivování procesu v rámci multitaskingu společně s vytvořením tkzv. prostředí procesu. Mapuje do něj soubor programu exe, dynamické knihovny dll, další mapované soubory, paměť ze stránkovacího soboru, dynamickou paměť ram ... používá stránkování .. dál to není třeba rozvádět .. Zabere to nějakou část režie, společně s další mohutnou režií, která je prováděna jako činnost jádra operačního systému se to jeví v Správci úloh systému tak, že procesor stojí a nic nedělá.
Proces je nečinný - inertní. K spuštění potřebuje vlastnit aktivní thread, systém mu musí přidělit procesor, který začne provádět kÓd v jeho virtuálním paměťovém prostoru v rámci přiděleného časového kvanta. V případě dvojjádra má aktivní dva thready.
Primární thread je vytvářen automaticky při vytváření procesu, vlastní registry procesoru a zásobník který je umístěn ve virtuálním paměťovém prostoru procesu, dále vlastní frontu zpráv a vlastní hlavní okno programu. Synovské thready, které vytváří programátor podle uvážení, vlastní to samé, ale nemusí vlastnit okno. Když je threadu přidělen procesor, načte registry a zásobník a začné provádět kód, když končí tak uloží registry a zásobník. Přidělené časové kvantu nemusí thread ani celé využít, protože je z důvodů synchronizace zastaven.
V případě jednoho aktivního threadu - jednojádra, když je thread zastaven, je zbytek kvanta okamžitě odňat, když není zastaven, je ukončen po uplynutím kvanta.
V případě dvou aktivních threadů - dvoujádra, je-li jeden thread zastaven, musí počkat !! na druhý thread, ten když je zastaven, tak je zbytek kvanta okamžitě odňat, když není zastaven, je ukončen po uplynutí kvanta.
Teď už je to složitější: Jednojádro a program s jedním primárním threadem, nebo s dalšími synovskými thready. Dvojjádro a program s jedním primárním threadem, nebo s dalšími synovskými thready. S tím také souvisí umění prográmátora napsat optimální kód, kolik a jaké thready použít atd, jak správně uvádí autor článku !!!
Tady musím skončit, abych popsal jak funguje synchronizace a taky se zmínit o jádru operačního systému, které v žádném případě nezahálí, ale dvojjádro mu moc nepomůže.
Už je asi jasné, že synchronizace je vlastně čekání jednoho jádra na druhé.
Taky musím zdůvodnit, proč dvojjádro může pracovat pouze v jednom !!! aktivním procesu nebo v jádru operačního systému. Prostě systěm nemá nástroje pro synchronizaci procesů a aktivní proces v jednom časovém kvantu používá všechny prostředky systému. A proč nemúže jedno jádro zpracovávat kód jádra systému a druhé aplikaci, to by to dopadlo, systém by si běžel svojí cestou ... a nikdo by se s ním nedomluvil, buďto by byl někde daleko vepředu nebo pozadu. Samozřejmě co jsem teď napsal důkladně zdokumentuji ....
A ještě na konec k odezvě systému. Na jednojádru není procesor vždy primárním threadem, musí se přepnout v dalším kvantu na primární thread a zpracovat událost. Na dvojjádru většinou jedno jádro je primárním threadem a proto reaguje trochu rychleji.
Možná budu pokračovat zítra ...... to závisí kolik nadávek za to co jsem napsal obdržím ...