| Obě strany předchozí revizePředchozí verzeNásledující verze | Předchozí verze |
| c_multiprocessing [2014/01/15 10:04] – djbuldog | c_multiprocessing [2025/08/28 10:09] (aktuální) – upraveno mimo DokuWiki 127.0.0.1 |
|---|
| |
| * 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/Threads, Lightweight procesy ... zajímavá prezentace [[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|link]] | |
| |
| |
| ===== Pojmy ===== | ===== Pojmy ===== |
| * vlákno bývá označováno jako tzv. LWP - lightweight process (jednoduše to není heavy full proces) | * 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 | * 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|zdroj]] [[http://www.linux.cz/noviny/1998-0809/clanek11.html|zdroj]] | * [[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) ===== | ===== User space/level threads (ULT) ===== |
| * 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. 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 | * 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 |
| * [[http://www.root.cz/clanky/pridelovani-procesoru-procesum-a-vlaknum-v-linuxu/|zdroj]] | * 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. | * 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) |