/ / Rozlišovanie medzi vláknami Java a vláknami OS? - java, linux, jvm, multithreading, posix

Rozlíšenie medzi vláknami Java a vláknami OS? java, linux, jvm, multithreading, posix

Ako rozlíšim bežiace vlákna Java a pôvodné vlákna?

V Linuxe bude existovať rodičovský proces pre každý podradený proces a hovoria, že 0 je rodič všetkých procesov, bude existovať rodičovské vlákno všetkých rozvetvených vlákien Java?

Ako zistím, ktoré vlákno Java súvisí s vláknom OS (ak vlákno Java zakazuje natívne vlákno procesu).

Existuje nejaká konvencia pomenovávania vlákien Java a vlákien OS?

Môže byť spustené vlákno Java pozastavené alebo zničené z iného kódu Java?

odpovede:

63 pre odpoveď č. 1

V systéme Linux sú vlákna Java implementované pomocounatívne vlákna, takže program Java používajúci vlákna sa nelíši od natívneho programu používajúceho vlákna. „Vlákno Java“ je iba vlákno patriace do procesu JVM.

V modernom systéme Linux (systém využívajúci NPTL) majú všetky vlákna patriace k procesu rovnaké ID procesu a ID nadradeného procesu, ale odlišné ID vlákna. Tieto ID môžete vidieť spustením ps -eLf, Stĺpec PID je ID procesu, PPIDstĺpec je ID rodičovského procesu a stĺpec LWP je ID vlákna (LightWeight Process). „Hlavné“ vlákno má ID vlákna, ktoré je rovnaké ako ID procesu a ďalšie vlákna budú mať rôzne hodnoty ID vlákna.

Staršie systémy Linux môžu namiesto NPTL používať implementáciu vlákien „linuxthreads“, ktorá nie je plne kompatibilná s POSIX. V systéme linuxthreads majú vlákna rôzne ID procesov.

Môžete skontrolovať, či váš systém používa NPTLalebo linuxthreads spustením systémovej knižnice C (libc) ako samostatného programu a na výstupe by sa mala zobraziť položka „Available extensions“ (Dostupné rozšírenia). Mala by sa v nej uviesť buď „Native POSIX Threads Library“ alebo linuxthreads. Cesta do knižnice C sa líši v závislosti od systému do systému: môže to byť /lib/libc.so.6, /lib64/libc.so.6 (v 64-bitových systémoch založených na RedHat) alebo podobne /lib/x86_64-linux-gnu/libc.so.6 (v moderných systémoch založených na Debiane, ako je Ubuntu).

Na úrovni OS nemajú krivky mená, tie existujú iba v rámci JVM.

Na pthread_kill() C funkciu je možné použiť na odoslanie signálu do akonkrétne vlákno, ktoré by ste mohli použiť na pokus zabiť toto konkrétne vlákno mimo JVM, ale neviem, ako by naň JVM reagovalo. Mohlo by to iba zabiť celé JVM.


8 pre odpoveď č. 2

Neexistuje žiadny štandard; to úplne závisíimplementáciu Java, ktorú práve používate. Tiež nemiešajte „natívne vlákna“ a „natívne procesy“. Proces je izolovaná entita, ktorá „nevidí do adresného priestoru iných procesov. Vlákno je niečo, čo beží v adresnom priestore natívneho procesu a ktoré môže vidieť v pamäti iných vlákien rovnakého procesu.

To, čo vidíte na Linuxe, je niečo iné: Niektoré verzie systému Linux vytvárajú záznam v tabuľke procesov pre každé vlákno rodičovského procesu. Tieto "procesy" nie sú skutočnými procesmi (v zmysle izolácie). Sú to vlákna, ktoré je možné uviesť v zozname ps Príkaz. Proces, ktorý ich vytvoril, nájdete pomocou rodičovského PID (PPID).


5 pre odpoveď č. 3

Môže fungovať vlákno Java pozastavené alebo zabité z inej Java kód?

Teoreticky áno. V praxi Thread.kill() a Thread.suspend() metódy sú zastarané, pretože nie sú bezpečnés výnimkou veľmi obmedzených situácií. Základným problémom je, že zabíjanie alebo pozastavenie vlákna Java pravdepodobne zkazí ďalšie vlákna, ktoré od neho závisia, a zdieľané dátové štruktúry, ktoré mohli byť v strede aktualizácie.

Ak „iný kód Java“ znamená inýJVM, potom je šanca, že to bude fungovať, ešte menšia. Aj keď ste prišli na to, ako poslať príslušný signál vlákna, výsledky sú úplne nepredvídateľné. Moja stávka je, že „cieľový“ JVM by spadol.


4 pre odpoveď č. 4

Neexistuje žiadne všeobecné riešenie, ako sa vlákna vlákna Java mapujú na vlákna OS, ak vôbec. Každá implementácia JVM to môže urobiť iným spôsobom.

K dispozícii je tiež čistá implementácia vlákna Java zelené vlákna, Toto sa používa ako záložné riešenie, ak nie sú podporované natívne vlákna alebo ak systém nie je viacvláknový. Vo vašom OS neuvidíte žiadne zelené vlákna.

Môže byť spustené vlákno Java pozastavené alebo zničené z iného kódu Java?

Ak beží na rovnakom JVM, áno, so stopom (). Ale to nie je dobré riešenie a môže to fungovať alebo nie. Interrupt () umožňuje vlákno tak bezpečne vypnúť.

Neexistuje spôsob, ako zabíjať vlákna mimo JVM, o ktorých viem. Ak operačný systém skutočne podporuje zabíjanie vlákien, neočakával by som, že Java aplikácia bude potom fungovať správne!