[python] Ukončení zaneprázdněného threadu

Bystrousak na seznam.cz Bystrousak na seznam.cz
Pátek Duben 25 16:13:36 CEST 2008


Moc tomu nerozumím, takže se omlouvám, jestli budu plácat nesmysly;
Není to bezpečnostní chyba? Pokud si něco vezme paměť a OS jí po sestřelení neuvolní, zdá se mi to jako potenciální riziko, které by mohlo být zneužito nějakým škodlivým virem..

> ------------ Původní zpráva ------------
> Od: superman <feed na centrum.cz>
> Předmět: Re: [python] Ukončení zaneprázdněného threadu
> Datum: 24.4.2008 21:43:38
> ----------------------------------------
> Odstřelení threadu se obecně lidi brání, protože to je dost drastická 
> věc, která mimo jiné může uvést i Váš program do neschopnosti dál 
> pokračovat. Uvědomte si, že každý thread má svůj zásobník, a při 
> násilném odstřelení threadu operační systém většinou zásobník neuklízí, 
> ale nechá ho jakožto blok paměti v adresovém prostoru procesu být a 
> nikdy ho neuvolní. Je to proto, že na zásobníku mohou být proměnné a 
> data, které používají jiné thready, a pokud thread odstřelíte násilně, 
> operační systém se domnívá, že je to nouzová akce, a že ostatní thready 
> netuší o tom nic. A proto jim nechá zásobník s daty k dispozici, pokud 
> by je náhodou jiné thready používaly.
> 
> Zatímco při slušném způsoby ukončení, kdy se thread sám ukončí, operační 
> systém po něm uklidí vše i zásobník.
> 
> V praktickém programu pak zejména ve 32 bitovém systému máte omezený 
> adresový prostor obvykle kolem 2 GB, a po určitém poměrně malém počtu 
> takto násilně odstřelených threadu (kolem tisícovky) zaplníte celý 
> adresový prostor procesu neuklizenými zásobníky, které nemáte jak 
> uvolnit a můžete se dostat do stavu, kdy prostě program nebude schopen 
> pokračovat v běhu, neboť nebude mít kam namapovat paměť.
> 
> Proto se thready opravdy násilně neodstřelují, ale pouze se threadu 
> nastaví příznak "hele threade, ukonči se prosím". A běžící thread 
> příznak dostatečně často čte, řekněme třeba stokrát za sekundu, a 
> jakmile zjistí, že by se měl ukončit, tak prostě se sám ukončí, čím se 
> předejde výžše uvedenému zlu.
> 
> Miloslav Ponkrác
> 
> 
> Jakub Lužný napsal(a):
> > Zdarec :-)
> >
> > Vytvořím vedlejší thread pomocí modulu threading a dám mu za úkol čekat. 
> > Spustím ho, a v hlavním threadu dám pořád dokola něco vypisovat. Když potom 
> > ale dám KeyboardInterrupt, tak se hlavní thread ukončí, ale vedlejší zůstane 
> > viset na tom čekání. Je nějakej způsob, jak thread ukončit i s tím čekáním?
> >
> > #!/usr/bin/env python
> > import threading
> >
> > def thread1():
> > 	while(1):
> > 		čekej_do_nekonečna()
> >
> > t1 = threading.Thread(target = thread1)
> > t1.start()
> >
> > while(1):
> > 	print "blbnu :)"
> > _______________________________________________
> > Python mailing list
> > Python na py.cz
> > http://www.py.cz/mailman/listinfo/python
> >
> >
> >   
> 
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
> 
> 
> 


Další informace o konferenci Python