c_multiprocessing
Rozdíly
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| Obě strany předchozí revizePředchozí verzeNásledující verze | Předchozí verze | ||
| c_multiprocessing [2014/01/14 21:20] – [vlakna/threads] djbuldog | c_multiprocessing [2025/08/28 10:09] (aktuální) – upraveno mimo DokuWiki 127.0.0.1 | ||
|---|---|---|---|
| Řádek 2: | Řádek 2: | ||
| * Multiprocessing se dělá buď kvůli paralelnímu zpracování úlohy (jedna část řídí program, další části vykonávají nějakou činnost) nebo kvůli výkonu (čím víc CPU zapojíme do výpočtu, tím rychleji bude výsledek) | * Multiprocessing se dělá buď kvůli paralelnímu zpracování úlohy (jedna část řídí program, další části vykonávají nějakou činnost) nebo kvůli výkonu (čím víc CPU zapojíme do výpočtu, tím rychleji bude výsledek) | ||
| - | * Procesy, Vlákna/ | ||
| - | * fork() - dělá kopii programu, kopie nesdílí žádné zdroje | + | ===== Pojmy ===== |
| - | * clone() - obdoba fork, ale kopie sdílí mezi sebou paměť, file deskriptory, | + | |
| - | * phreads knihovna - pouze interní vlákna? LWP? může běžet na 1 CPU | + | |
| - | + | ||
| - | ===== pojmy ===== | + | |
| * multitasking | * multitasking | ||
| * multithreading | * multithreading | ||
| * multiprocessing | * multiprocessing | ||
| - | ===== vlakna/threads ===== | + | ====== Vlákna/ |
| - | * vlákno bývá označováno jako tzv. LWP - lightweight process | + | * vlákno bývá označováno jako tzv. LWP - lightweight process |
| * vlákno se spouští uvnitř procesu a dokáže sdílet jeho systémové prostředky | * vlákno se spouští uvnitř procesu a dokáže sdílet jeho systémové prostředky | ||
| - | * [[https:// | + | * [[https:// |
| + | * [[http:// | ||
| + | |||
| + | |||
| + | |||
| + | ===== User space/level threads (ULT) ===== | ||
| - | * user space/level threads (ULT) | ||
| * Vlastnosti | * Vlastnosti | ||
| * Správu vláken provádí tzv. vláknová knihovna (thread library) na úrovni aplikačního procesu, JOS o jejich existenci neví | * Správu vláken provádí tzv. vláknová knihovna (thread library) na úrovni aplikačního procesu, JOS o jejich existenci neví | ||
| Řádek 34: | Řádek 33: | ||
| * Jádro přiděluje procesor pouze procesům, takže dvě vlákna téhož procesu nemohou běžet současně, i když je k dispozici více procesorů ... prý to jde nějak vynutit řikal frebauer, ale jestli to nebylo v kernel space :) nějakej set mask nebo co.. | * Jádro přiděluje procesor pouze procesům, takže dvě vlákna téhož procesu nemohou běžet současně, i když je k dispozici více procesorů ... prý to jde nějak vynutit řikal frebauer, ale jestli to nebylo v kernel space :) nějakej set mask nebo co.. | ||
| - | * kernel space/level threads (KLT) | + | ===== kernel space/level threads (KLT) ===== |
| * skutečný paralelismus, | * skutečný paralelismus, | ||
| * Výhody: | * Výhody: | ||
| Řádek 44: | Řádek 44: | ||
| * Systémová správa je režijně nákladnější než u čistě uživatelských vláken | * Systémová správa je režijně nákladnější než u čistě uživatelských vláken | ||
| * Klasické plánování není spravedlivé: | * Klasické plánování není spravedlivé: | ||
| + | |||
| + | ====== Praxe ====== | ||
| * Knihovna Pthreads poskytuje unifikované API: | * Knihovna Pthreads poskytuje unifikované API: | ||
| Řádek 50: | Řádek 52: | ||
| * Pthreads je tedy systémově závislá knihovna | * Pthreads je tedy systémově závislá knihovna | ||
| - | * Vlákna Linux: | + | * Vlákna/LWP Linux: |
| * Linux nazývá vlákna tasks | * Linux nazývá vlákna tasks | ||
| * Vytváření vláken je realizováno službou clone() | * Vytváření vláken je realizováno službou clone() | ||
| - | * clone() umožňuje vláknu (task) sdílet adresní prostor s rodičem | + | * [[fork|fork()]] |
| - | * fork() | + | * vytvoří zcela samostatný proces s kopií prostoru rodičovského procesu. |
| - | * clone() vytvoří vlákno, které dostane odkaz (pointer) na adresní prostor rodiče | + | * Uplaťnuje se přitom **CoW** (copy-on-write). Mechanismus CoW namapuje virtuální pamět potomka na fyzickou paměť rodiče. Až pří zápisu do paměti jakéhokoliv z procesů se přislušné modifikované stránky kopírují do nové stránky ve fyzické paměti |
| + | * clone() | ||
| + | * vytvoří vlákno, které dostane odkaz (pointer) na adresní prostor rodiče | ||
| + | * umožňuje vláknu (task) sdílet adresní prostor s rodičem | ||
| + | * samotná funkce clone se v programu většinou nepoužívá (využívají ji knihovny jako pthreads) | ||
| + | * pthreads | ||
| + | * [[http:// | ||
| + | * Poslední implementací je implementace NPTL (Native POSIX Thread Library). Tato implementace se opět vrací k mapování 1:1 (one-to-one, | ||
| + | * fork je programátorsky jednodušší | ||
| + | * když se ukončí vlákno, někdo by měl vyzvednout návratovou hodnotu (funkce pthread_wait nebo tak) | ||
| + | * vlákna sdílý paměť, otevřené soubory (fd), sockety, signály (bacha na obsluhu signálu, např používání sleep) | ||
c_multiprocessing.1389730803.txt.gz · Poslední úprava: (upraveno mimo DokuWiki)
