VyÜlo v t²denφku: COMPUTERWORLD
╚φslo:11/95
RoΦnφk:1995
Rubrika/kategorie: Co (ne)najdete ve slovnφku

zp∞t do archivu Φlßnk∙ | rejst°φk | p°edchozφ Φlßnek | nßsledujφcφ Φlßnek

Ji°φ Peterka

Reentrant

Jeden moudr² pßn kdysi dßvno prohlßsil, ₧e nelze dvakrßte vstoupit do tΘ₧e °eky. M∞l tφm na mysli, ₧e v∞ci se m∞nφ, Φas plyne, a nic nenφ p°esn∞ takovΘ, jakΘ to b²valo n∞kdy d°φve. Mohli bychom ale obdobnou moudrost aplikovat i na programy, nap°φklad ve smyslu: äNelze dvakrßte vstoupiti do tΘho₧ k≤du"? Co by to ale p°esn∞ znamenalo, a byla by to pravda, nebo nebyla?

Ujasn∞me si nejprve, co by znamenalo ävstoupiti dvakrßte do tΘho₧ k≤du". Jak jsme si ji₧ uvedli v p°edminulΘm p°φsp∞vku tΘto rubriky, na tΘma äSubroutine vs. Coroutine", existuje zßsadnφ a principißlnφ rozdφl mezi k≤dem jako takov²m (kter² je statickΘho charakteru), a jeho dynamickou instancφ (exemplß°em), kterß vznikß volßnφm p°φsluÜnΘho k≤du. Z tohoto pohledu pak ävstoupiti do k≤du" neznamenß nic jinΘho, ne₧ p°edßnφ °φzenφ (skokem Φi volßnφm) p°φsluÜnΘmu k≤du a vytvo°enφ jeho dynamickΘ instance. Tak₧e otßzka tedy znφ: je mo₧nΘ opakovan∞ volat urΦit² kus k≤du, resp. opakovan∞ mu p°edat °φzenφ formou skoku? Odpov∞∩ pak bude zßle₧et na tom, zda od p°φsluÜnΘho k≤du m∙₧e existovat vφce jeho dynamick²ch instancφ Φi nikoli. A to zase zßvisφ na tom, jak je p°φsluÜn² k≤d napsßn.

Uka₧me si to na typickΘm p°φkladu podporogramu, kter² odpovφdß n∞jakΘ procedu°e Φi funkci vyÜÜφho programovacφho jazyka (nap°. vznikl p°ekladem takovΘto procedury Φi funkce). Mß-li tato procedura Φi funkce n∞jakΘ lokßlnφ prom∞nnΘ, pak tyto jsou charakteristickΘ prßv∞ svou älokßlnostφ" v danΘm procedurßlnφm bloku - co₧ znamenß nejen to, ₧e vn∞ bloku jsou nep°φstupnΘ, ale p°edevÜφm to, ₧e vznikajφ a₧ se spuÜt∞nφm bloku, a s jeho ukonΦenφm zase zanikajφ. Jsou tedy prßv∞ tφm, co tvo°φ relevantnφ Φßst dynamickΘ instance (dynamickΘho exemplß°e) p°φsluÜnΘho procedurßlnφho bloku. Nynφ ale velmi zßle₧φ na tom, jak konkrΘtn∞ je napsßn k≤d tohoto bloku. Pokud by si svΘ lokßlnφ prom∞nnΘ vytvß°el (tzv. alokoval) na p°edem pevn∞ danΘm mφst∞ v pam∞ti - nap°φklad v oblasti, kterou si pro tento ·Φel vyhradil p°φmo uprost°ed sebe sama, ävynechßnφm" dostateΦnΘho poΦtu byt∙ - pak by se d∞ly zajφmavΘ v∞ci. P°i prvnφm spuÜt∞nφ bloku (prvnφm p°edßnφ °φzenφ) by vÜe prob∞hlo hladce, a blok by si vytvo°il svΘ lokßlnφ promn∞nnΘ na pat°iΦnΘm mφst∞ korektnφm zp∙sobem. Stejn∞ by ale postupoval p°i ka₧dΘm svΘm dalÜφm volßnφ - op∞t by si na p°edem pevn∞ danΘm mφst∞ vytvo°il novou sadu sv²ch lokßlnφch prom∞nn²ch. Pokud by ale Ülo nap°φklad o rekurzi (Φi jin² zp∙sob novΘho volßnφ, ke kterΘmu dojde jeÜt∞ p°ed ukonΦenφm p°echozφho volßnφ), pak by si nßÜ podprogram sßm p°epsal svΘ vlastnφ lokßlnφ prom∞nnΘ!

PodstatnΘ je tedy to, jak²m zp∙sobem si urΦit² procedurßlnφ blok (äkus k≤du") alokuje svΘ lokßlnφ prom∞nnΘ, resp. kde a jak²m zp∙sobem si vytvß°φ svou dynamickou instanci. Pokud to d∞lß tak neÜikovn∞, ₧e vytvo°enφm jednΘ svΘ dynamickΘ instance p°epφÜe Φi jinak zniΦφ svΘ p°φpadnΘ jinΘ instance, pak je z°ejm∞ na mφst∞ °φci, ₧e ädo tohoto k≤du nelze vstoupit vφcekrßt", mφn∞no souΦasn∞. V odbornΘ poΦφtaΦovΘ terminologii se takov²to k≤d oznaΦuje jako nereentrantnφ (angl.: non-reentrant). Jeho opakem je pak k≤d reentrantnφ. Ten si svΘ lokßlnφ prom∞nnΘ (dynamickou instanci) alokuje obvykle na zßsobnφku, tak₧e si je ani p°i opakovanΘm volßnφ nep°episuje. Do takovΘhoto k≤du tedy lze ävstupovat vφcekrßt", bez jak²chkoli omezenφ.

Reentrantnost urΦitΘho k≤du je nap°φklad nezbytnou podmφnkou pro mo₧nost p°φmΘ i nep°φmΘ rekurze, resp. rekurzivnφho volßnφ podprogramu. Stejn∞ tak je reentrantnost nutnou podmφnkou k tomu, aby jeden a tent²₧ k≤d mohlo souΦasn∞ sdφlet vφce proces∙, program∙ Φi ·loh, provozovan²ch ve vφceu₧ivatelskΘm Φi alespo≥ vφce·lohovΘm prost°edφ. P°itom re₧ie, pot°ebnß za zajiÜt∞nφ reentrantnosti (p°ipadajφcφ nap°. na pou₧itφ zßsobnφku mφsto pevn²ch mφst v pam∞ti) je v∞tÜinou tam malß, ₧e ji obvykle lze zcela zanedbat. Mohlo by se tedy zdßt, ₧e nereentrantnφ k≤d by m∞l b²t spφÜe v²jimkou ne₧ pravidlem.

Existuje vÜak jeden velmi v²znamn² p°φklad nereentrantnφho k≤du, kter² touto svou vlastnostφ komplikuje ₧ivot mnoha lidem - zejmΘna pak programßtor∙m. Jde o ästar² Üpatn²" operaΦnφ systΘm MS DOS. Jak mnozφ zaΦφnajφcφ programßto°i s hr∙zou zjiÜ¥ujφ, a mnohdy a₧ na zßklad∞ osobnφch praktick²ch zkuÜenostφ, do tohoto operaΦnφho skuteΦn∞ änelze vstoupit vφcekrßt". ProblΘmy to zp∙sobuje p°edevÜφm t∞m, kte°φ pro tento operaΦnφ systΘm pφÜφ nejr∙zn∞jÜφ rezidentnφ programy - pokud tyto rezidentnφ programy cht∞jφ pou₧φvat slu₧by operaΦnφho systΘmu MS DOS, musφ postupovat velmi obez°etn∞. Musφ si v₧dy nejprve zjistit, zda v danΘm okam₧iku DOS prßv∞ äb∞₧φ" (provßdφ n∞jakou svou systΘmovou slu₧bu) nebo nikoli. Pokud ano, musφ rezidentnφ program ponφ₧en∞ poΦkat, a₧ se nereentrantnφ veliΦenstvo DOS urßΦφ skonΦit.

Jste-li programßtory, a chcete-li se o nereentrantnosti DOSu dozv∞d∞t vφce, stejn∞ tak jako o technikßch obchßzenφ tΘto nep°φjemnosti, obra¥te se rad∞ji na jinou ne₧ oficißlnφ odbornou literaturu. V tΘ byste toti₧ hledali marn∞.


zp∞t do archivu Φlßnk∙ | rejst°φk | p°edchozφ Φlßnek | nßsledujφcφ Φlßnek
Tento Φlßnek m∙₧e b²t voln∞ Üφ°en, pokud se tak d∞je pro studijnφ ·Φely, na nev²d∞leΦnΘm zßklad∞ a se zachovßnφm tohoto dov∞tku. Podrobnosti hledejte zde, resp. na adrese http://archiv.czech.net/copyleft.htm