[LUGOS] Reentrant!!!

Jaka Močnik jaka at gnu.org
Thu Apr 22 21:16:53 CEST 2004


On Thu, 2004-04-22 at 15:28 +0200, Novak Dusan ITICMC wrote:
> Pozdravljeni!
lep pozdrav!

> A mi lahko kdo razloži kaj pomeni "reentrant" izraz v Linuxu…mislim da
> nekaj podobnega kot "preemptive".
reentrant pomeni na linuxu isto kot povsod drugje in nima posebne
povezave z "preemptive": določen del kode (npr. funkcija) je
"reentrant", če se lahko _isti_ primerek kode v pomnilniku izvaja obenem
v več "nitih izvajanja". v praksi to pomeni, da koda ne sme uporabljati
skupnih spremenljivk, temveč le tiste na skladu (saj je sklad običajno
vezan na nit, tako da ima vsaka nit svojo kopijo spremenljivk na
skladu), za dostop do npr. globalnih spremenljivk, ki si jih delijo vse
niti, je potrebno izrecno zakleniti vstop v del kode, ki to počne, z
nekim sinhronizacijskim objektom (recimo mutexom, semaforjem, ipd.).

> Želel, bi nabaviti SuSe 9.0 professional, ki ima v osnovi različico
> jedra 2.4.21…
> 
> Ali je tukaj že v osnovi vključena podpora za "reentrant" ali
> "non-reentrant".
reentrancy nima veze z jedrom. to je stvar tega, kako je napisan nek del
kode.

"preemptiveness" je nekaj popolnoma drugega in se običajno prevaja v
"predkupnost", v tvojem kontekstu pa je verjetno mišljena predkupna
večopravilnost, kar pomeni, da operacijski sistem ob nekem pogoju
(izteku časovne rezine, prihod opravila z višjo prioriteto) prekine
izvajajoče se opravilo in začne izvajati drugo opravilo. tej zamenjavi
izvajajočega se opravila pravimo "preemption". druga vrsta
večopravilnosti je kooperativna ("cooperative") večopravilnost, v kateri
lahko pride do zamenjave izvajajočega se opravila šele, ko samo opravilo
to dovoli (ta "dovolitev" je lahko implicitna (ob uporabi nekaterih
sistemskih klicev) ali pa izrecna (pogosto ime za tak klic je yield)).

kooperativno večopravilnost pozna npr. Appleov OS do različice 9 in
Winblows 3.x.

linuxovo jedro od nekdaj pozna predkupnost v uporabniškem načinu
(user-space preemptiveness), kar pomeni, da se lahko izvajajoči se
proces prekine kadarkoli, medtem ko teče v uporabniškem prostoru. v
prostoru jedra (npr. med izvajanjem sistemskega klica) se lahko
izvajajoče se opravilo zamenja le ob nekaterih dogodkih (preemption
points), tipični primeri so čakanje na semafor ali klic yield(). jedra
različice 2.6 in 2.4 z t.i. "preemption patchem" (med slednja spada tudi
tisto, ki pride z MontaVistinim Linuxom 3.0 CGE, ki ga pogosto
uporabljate v vašem velespoštovanem podjetju) pa poznajo polno
predkupnost tudi v prostoru jedra, kar pomeni, da se lahko izvajajoče se
opravilo prekine _kadarkoli_, bodisi med izvajanjem v uporabniškem
načinu ali med izvajanjem sistemskega klica v prostoru jedra. to je
(zavoljo nižje latence) zelo zaželjeno v (real-time) okoljih, ki
zahtevajo zelo hiter odziv na nekatere dogodke.

lp,
	jaKa

-- 

email: jaka at gnu.org
w3:    http://fish.homeunix.org/people/jaka





More information about the lugos-list mailing list