This shows you the differences between two versions of the page.
|
so:cursuri:curs-08 [2019/04/07 22:28] razvan.deaconescu |
so:cursuri:curs-08 [2019/04/10 23:07] (current) razvan.deaconescu [Utilitate apeluri reentrante] |
||
|---|---|---|---|
| Line 149: | Line 149: | ||
| În cazul folosirii programelor cu thread-uri, trebuie folosite versiunile reentrante ale funcțiilor de bibliotecă. | În cazul folosirii programelor cu thread-uri, trebuie folosite versiunile reentrante ale funcțiilor de bibliotecă. | ||
| + | |||
| + | ==== Implementare de thread-uri în Java și Python ==== | ||
| + | |||
| + | În Java și Python implementările de thread-uri sunt cu suport din partea sistemului de operare. Adică o operație de creare a unui thread rezultă în crearea unui thread în kernel space (kernel-level threads). | ||
| + | |||
| + | Pentru a verifica acest lucru accesăm subdirectorul ''lang/'' unde avem fișierul sursă ''MultithreadingTest.java'' și ''threading_demo.py''. Pentru a compila fișierul ''MultithreadingTest.java'' folosim comanda ''make''. | ||
| + | |||
| + | Rularea ambelor programe duce la crearea de a câte unui thread în momentul apăsării tastei ''ENTER''. Pentru Java rulăm comanda: | ||
| + | <code> | ||
| + | $ java MultithreadingTest | ||
| + | Press ENTER to create new thread ... | ||
| + | |||
| + | Press ENTER to create new thread ... | ||
| + | Thread 12 is running | ||
| + | |||
| + | Press ENTER to create new thread ... | ||
| + | Thread 13 is running | ||
| + | |||
| + | Press ENTER to create new thread ... | ||
| + | Thread 14 is running | ||
| + | |||
| + | Press ENTER to create new thread ... | ||
| + | Thread 15 is running | ||
| + | [...] | ||
| + | </code> | ||
| + | Durează ''SLEEP_TIME'' secunde ca thread-urile să își încheie execuția. | ||
| + | |||
| + | Pentru Python rulăm: | ||
| + | <code> | ||
| + | $ python threading_demo.py | ||
| + | Press ENTER to create new thread ... | ||
| + | |||
| + | Thread 140481023772416 is runningPress ENTER to create new thread ... | ||
| + | |||
| + | |||
| + | Thread 140481015379712 is running | ||
| + | Press ENTER to create new thread ... | ||
| + | |||
| + | Press ENTER to create new thread ... | ||
| + | Thread 140481006987008 is running | ||
| + | |||
| + | Thread 140480796948224 is running | ||
| + | Press ENTER to create new thread ... | ||
| + | [...] | ||
| + | </code> | ||
| + | La fel, durează ''SLEEP_TIME'' secunde ca thread-urile să își încheie execuția. | ||
| + | |||
| + | Pentru a verifica faptul că sunt într-adevăr create thread-uri noi rulăm în altă terminal comenzile de mai jos pentru Java: | ||
| + | <code> | ||
| + | $ ps -efL | grep Multithreading | wc -l | ||
| + | 35 | ||
| + | $ ps -efL | grep Multithreading | wc -l | ||
| + | 36 | ||
| + | $ ps -efL | grep Multithreading | wc -l | ||
| + | 37 | ||
| + | $ ps -efL | grep Multithreading | wc -l | ||
| + | 43 | ||
| + | </code> | ||
| + | Observăm creșterea numărului de thread-uri pe măsură ce le creăm folosind opțiunea ''-L'' a comenzii ''ps'' (pentru //lightweight process//). | ||
| + | |||
| + | La fel procedăm și pentru Python: | ||
| + | <code> | ||
| + | $ ps -efL | grep threading_demo | wc -l | ||
| + | 2 | ||
| + | $ ps -efL | grep threading_demo | wc -l | ||
| + | 4 | ||
| + | $ ps -efL | grep threading_demo | wc -l | ||
| + | 8 | ||
| + | </code> | ||
| + | |||
| + | De avut în vedere că în Python, deși thread-urile au suport în kernel și au potențialul de a rula simultan, nu vor face aceste lucru din cauza unui lock global din interpretorul Python numit GIL ([[https://wiki.python.org/moin/GlobalInterpreterLock|Global Interpreter Lock]]). Este vorba de CPython, intepretorul de referință Python. IronPython nu are GIL și poate rula cu adevărat în paralel thread-uri cu suport de la nivelul nucleului. | ||