doruceni signalu KILL procesu ktery neprerusitelne spi
Dan Lukes
dan at obluda.cz
Fri Sep 12 14:10:28 CEST 2003
Divacky Roman wrote:
> uvazoval jsem o tom a prisel jsem na tohle:
>
> kdyz prerusim ten tsleep tak se vrati s nejakou error hodnotou, coz pri typicke
> konstrukci
>
> neco();
> if (nekde_neco){
> tsleep(nekde...);
> }
> neco_dalsiho();
>
> by melo byt schopno osetrit to, ze ten tsleep neuspel a zachovat se podle toho
> (tj. odemcit zamky atd. jaks popisoval predtim) - podle nastaveni nekde_neco
Pokud se bavime stale o SIGKILL, pak kod programu uz nema dostat
rizeni. Je tedy celkem lhostejne, co se za volanim tsleep nachazi a zda
jsou tak ci onak osetrene nejake navratove kody.
Problem je s "post-KILL" cleanupem - zavirani souboru, soketu
odalokovavani pameti a jinych zdroju, ktere proces pouzival.
> doopravdy jediny problem ted zustava to, co by se stalo kdybych killnul proces
> ktery dela nejake IO v tom tsleepu a po killnuti toho procesu to IO nakonec
> uspelo - zapise to neco nekam -> problem
V tsleepu se nic nedela - tam se jen ceka na udalost. Jinak ale mate
pravdu - komplikace spociva proste v tom, ze "neprerusitelny" tsleep se
nedela pro nic za nic - ten se dela u takovych veci, kde je nepripustne,
aby byla akce prerusena. A vy ji chcete prerusit a provest cleanup -
jenze ten nemusi byt, za aktualniho stavu systemu, mozny.
Namatkou me napada vznik dead-locku nad nejakymi systemovymi zamky.
> 1) pockat, zadna IO netrva dele jak rekneme x sekund (to je ale dost hloupe)
> 2) nejak odtracovat ktere IO se zavolalo a osetrit to (bohuzel to nemam poneti
> jak by se dalo nejak inteligentne udelat)
I analyzu, ze se neprerusitelny tsleep pouziva jen pri cekani na IO je
nutne udelat - ja to nevidim jako trivialni tvrzeni ...
> 3) nechat si z procesu vm_space a udelat z nej neco jako kernelovy "/dev/null"
> (tj. zapis nic neudela, cteni vraci nulu) - to ovsem dost dobre nevim jak delat
To by, v zasade, asi nebyl problem - jenze je otazka, co jste tim
dosahl. Proces v tomto stavu stale existuje (kvuli evidentci onoho
vm_space) ale uz nedostane rizeni. To je shodne se soucasnym stavem.
Jediny rozdil ve vasem pripade je pamet je fakticky uvolnena, kdezto v
soucasnem stavu je (typicky) odswapovana na disk (kde je mista dost).
Dalsi problem je prave "post-exit" cleanup. Patrne i v tomto systemu
budete chtit uvolnit procesem uzivane zdroje. Bud' to udelate po
skonceni onoho tsleepu (pak je to ale shodne se soucasnou situaci), tedy
shodnym postupem jako v soucasne dobe (a jen tezko lze hovorit o
likvidaci procesu), nebo je budete chcit udelat hned - a je treba
opatrne analyzy, zda je skutecne bezpecne "behem" preruseneho
neprusitelneho tsleepu volat systemove funkce, coz je nutnou soucasti
clean-upu (mohly by pri tom byt uvolneny zdroje, ktere byly alokovany ku
prilezitosti vyrizovani neceho, na co ten tslep ceka - a nejde jen o pamet).
A bez toho vam ten proces stale zustane "nezastrelitelnym" procesem az
do konce behu systemu tak jako tak.
Dan
More information about the Users-l
mailing list