====== 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) ===== Pojmy ===== * multitasking * multithreading * multiprocessing ====== Vlákna/threads ====== * vlákno bývá označováno jako tzv. LWP - lightweight process (jednoduše to není heavy full proces) * vlákno se spouští uvnitř procesu a dokáže sdílet jeho systémové prostředky * [[https://www.google.cz/url?sa=t&rct=j&q=&esrc=s&source=web&cd=5&cad=rja&ved=0CEwQFjAE&url=http%3A%2F%2Flabe.felk.cvut.cz%2Fvyuka%2FX33OSA%2FTema-05-Vlakna.ppt&ei=xpTVUpXSDYPy7Aby9oGIDQ&usg=AFQjCNFe11FFaEr2d1o8s_i5LtpVmCHDKg&bvm=bv.59378465,d.ZGU|prezentace vlákna]] [[http://www.linux.cz/noviny/1998-0809/clanek11.html|linux a vlákna]] * [[http://www.google.cz/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&cad=rja&ved=0CEgQFjAD&url=http%3A%2F%2Fwww.cosc.brocku.ca%2FOfferings%2F4P13%2Fslides%2Fthreads.ppt&ei=raqYUr6VK4uGywO74IK4BQ&usg=AFQjCNFCJuR0DNs0Vfo0vcw95Sf4bA4Ydw&sig2=kix-xucQPbYw7T-1KK30rA&bvm=bv.57155469,d.bGQ|Procesy, Vlákna/Threads, Lightweight procesy ... zajímavá prezentace]] ===== 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 ====== Praxe ====== * 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/LWP Linux: * Linux nazývá vlákna tasks * Vytváření vláken je realizováno službou clone() * [[fork|fork()]] * vytvoří zcela samostatný proces s kopií prostoru rodičovského procesu. * 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://www.root.cz/clanky/pridelovani-procesoru-procesum-a-vlaknum-v-linuxu/|článek o vláknech v linuxu na rootu]] * Poslední implementací je implementace NPTL (Native POSIX Thread Library). Tato implementace se opět vrací k mapování 1:1 (one-to-one, kernel vlakno = user space vlakno). Díky tomu odstraňuje nutnost použití dvou plánovačů. Implementace používá podobné techniky jako LinuxThreads (použití syscallu clone). Díky změnám v kernelu – např. přepracování syscallu clone, zavedení mapy alokovaných pid, O(1) plánovače, futexů a dalším – odstraňuje i výkonnostní problémy původní implementace LinuxThreads. Navíc je plně kompatibilní s normou POSIX. Tato implementace byla v době svého uvedení cca dvakrát výkonnější než NGPT. Uvedena byla přibližně ve stejné době jako NGPT – tj. v letech 2002/2003. Je součástí kernelu 2.6 a je plně integrována se současnou GNU C Library. * 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)