Uživatelské nástroje

Nástroje pro tento web


c_multiprocessing

Toto je starší verze dokumentu!


Multiprocessing

  • 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/Threads, Lightweight procesy … zajímavá prezentace link
  • fork() - dělá kopii programu, kopie nesdílí žádné zdroje
  • clone() - obdoba fork, ale kopie sdílí mezi sebou paměť, file deskriptory, signály. bacha, četl jsem, že funkce umí udělat jak fork, tak pthread_create… podle toho s jakýma atributama je zavolána. Mohou z toho tedy plynout stejná omezení jako pro pthread
  • phreads knihovna - pouze interní vlákna? LWP? může běžet na 1 CPU

pojmy

  • multitasking
  • multithreading
  • multiprocessing

vlakna/threads

  • 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
  • user space/level threads (ULT)
    • Vlastnosti
      • Správu vláken provádí tzv. vláknová knihovna (thread library) na úrovni aplikačního procesu, JOS o jejich existenci neví
      • Přepojování mezi vlákny nepožaduje provádění funkcí jádra
      • Nepřepíná se ani kontext procesu ani režim procesoru
      • Aplikace má možnost zvolit si nejvhodnější strategii a algoritmus pro plánování vláken
    • výhody
      • Rychlé přepínání mezi vlákny (bez účasti JOS)
      • Lze použít i v OS, který vlákna nepodporuje; je nutná pouze vláknová knihovna
      • Rychlá tvorba a zánik vláken
      • Uživatelský proces má plnou kontrolu nad vlákny (např. může zadávat priority či volit plánovací algoritmus)
    • Nevýhody
      • systémová volání z jakéhokoliv vlákna blokuje činnost všech vláken. Systémové volání totiž zablokuje celý proces a předá řízení systému. Částečným řešením je nevolat funkce blokující systémová volání. Ono je to i logické, protože ty user space vlákna nikdy neběží paralelně (na více procesorech)
      • 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)
    • skutečný paralelismus, blokování jednoho vlákna neovliní vlákna další
    • Výhody:
      • Volání systému neblokuje ostatní vlákna téhož procesu
      • Jeden proces může využít více procesorů (skutečný paralelismus uvnitř jednoho procesu – každé vlákno běží na jiném procesoru)
      • Tvorba, rušení a přepínání mezi vlákny je levnější než mezi procesy
      • I moduly jádra mohou mít vícevláknový charakter
    • Nevýhody:
      • Systémová správa je režijně nákladnější než u čistě uživatelských vláken
      • Klasické plánování není spravedlivé: Dostává-li vlákno své kvantum, pak procesy s více vlákny dostávají více času
  • Knihovna Pthreads poskytuje unifikované API:
    • Nepodporuje-li JOS vlákna, knihovna Pthreads bude pracovat čistě s ULT
    • Implementuje-li příslušné jádro KLT, pak knihovna Pthreads toho bude využívat
    • Pthreads je tedy systémově závislá knihovna
  • Vlákna Linux:
    • Linux nazývá vlákna tasks
    • Vytváření vláken je realizováno službou clone()
    • clone() umožňuje vláknu (task) sdílet adresní prostor s rodičem
    • 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
c_multiprocessing.1389730803.txt.gz · Poslední úprava: (upraveno mimo DokuWiki)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki