Dokumentace může být pěkně matoucí, takže zde je „skutečný " Model systému Linux:
- v linuxovém jádře se něco, co lze spouštět (a plánovat), nazývá „proces“,
- každý proces má systémově jedinečné ID procesu (PID) a ID skupiny vláken (TGID),
- normální proces má PID=TGID a žádný jiný proces tuto hodnotu TGID nesdílí,
- proces „vláknový“ je proces, jehož hodnotu TGID sdílejí jiné procesy,
- několik procesů sdílejících stejné TGID také sdílí přinejmenším stejný paměťový prostor a obslužné programy signálů (někdy i více),
- Pokud má „vláknový“ proces PID=TGID, může být nazýván „hlavním vláknem“,
- volání
getpid()
z jakéhokoli procesu vrátí své TGID (=PID "hlavního vlákna"), - volání
gettid()
z jakéhokoli procesu vrátí své PID (!), - pomocí
clone(2)
lze vytvořit jakýkoli druh procesu systémové volání, - o tom, co je sdíleno mezi procesy, se rozhoduje předáním konkrétních příznaků
clone(2)
, - číselné názvy složek, které můžete uvést pomocí
ls /proc
jako/proc/NUMBER
jsou TGID, - číselné názvy složek v
/proc/TGID/task
jako/proc/TGID/task/NUMBER
jsou PID, - i když nevidíte všechny existující PID s
ls /proc
, stále můžete udělatcd /proc/any_PID
.
Závěr :z hlediska jádra existují pouze procesy, z nichž každý má své vlastní jedinečné PID, a takzvané vlákno je jen jiný druh procesu (sdílení alespoň stejného paměťového prostoru a obsluhy signálů s jedním nebo několika dalšími -s).
Poznámka: implementace konceptu "vlákna" v Linuxu vedla ke zmatení slovní zásoby, a pokud getpid()
lže vám nedělá to, co jste si mysleli, je to proto, že jeho chování odpovídá kompatibilitě POSIX (vlákna mají sdílet společné PID).
V Linuxu není absolutně žádný rozdíl mezi vláknem a procesem. Pokud se podíváte na clone(2), uvidíte sadu příznaků, které určují, co je sdíleno a co není sdíleno mezi vlákny.
Klasické procesy jsou jen vlákna, která nic nesdílejí; můžete sdílet, jaké komponenty chcete pod Linuxem.
To není případ jiných implementací OS, kde jsou mnohem podstatnější rozdíly.
Vlákna jsou procesy pod Linuxem. Jsou vytvořeny pomocí clone
systémové volání, které vrací ID procesu, které lze poslat signálem přes kill
systémové volání, stejně jako proces. Procesy vláken jsou viditelné v ps
výstup. clone
volání je předáno příznaky, které určují, jak velká část prostředí nadřazeného procesu je sdílena s procesem vlákna.