Versenyhelyzet

A Wikipédiából, a szabad enciklopédiából

A versenyhelyzet (angolul race condition) egy hibalehetőség a digitális hálózatokban és a számítógépes programokban. Versenyhelyzet akkor áll fenn, ha a rendszer kimenete függ attól, hogy egymástól független folyamatok milyen sorrendben vagy mekkora időbeli eltéréssel hajtódnak végre.

A digitális technikában[szerkesztés | forrásszöveg szerkesztése]

Versenyhelyzet egy NEM és egy ÉS kapuból álló logikai áramkörben. A bemenő jel (A) megváltozásakor ∆t1 illetve ∆t2 idő kell ahhoz, hogy megváltozzon a NEM, illetve az ÉS kapu kimenő jele. Mivel az ÉS kapunak a NEM kapun át érkező bemenete később változik meg, mint a közvetlen bemenete, a kimenet egy rövid ideig 1 lesz, noha a logikailag helyes kimenet bármilyen bemenet esetén 0.

A digitális hálózatokban a versenyhelyzet a hazárdjelenségek egyike. Az egyes hálózati elemek eltérő jelterjedési ideje miatt a bemenet megváltozása egyes utakon hamarabb okoz változást, mint másokon, ezért a kimeneten rövid ideig hamis (sem a régi, sem az új kimenetnek nem megfelelő) állapot, ún. glitch jelenhet meg. A rendszernek lehetnek olyan részei, amik nem érzékenyek az ilyen glitchekre, más helyeken azonban katasztrofális hatásuk lehet (például egy órajel esetében, aminek az állapotváltásai időzítik a többi áramköri elem működését).

Olyan hálózatoknál, ahol a kimenet vissza van csatolva a bemenetre (sorrendi hálózat), a glitchek újabb állapotváltozásokat okoznak, és így a rendszer egyre távolabb kerülhet a tervezett működéstől; végül akár egy hibás stabil állapot is kialakulhat (kritikus versenyhelyzet).

A versenyhelyzetek elemzésének és elkerülésének egy lehetséges eszköze a Karnaugh-tábla. Egy másik eszköz a szinkron sorrendi hálózatok használata; ezekben a kimenetet nem közvetlenül, hanem valamilyen memóriaelemen keresztül csatolják vissza, ami a bemenet megváltozásától egy adott ideig nem veszi figyelembe a kimenet értékét, így az ennél rövidebb ideig tartó glitcheknek nincs hatása.

A számítástechnikában[szerkesztés | forrásszöveg szerkesztése]

A versenyhelyzet tipikusan a többszálas programokra és az elosztott rendszerekre jellemző. Az ilyen rendszerekben az egyes szálak vagy alrendszerek egymástól függetlenül, egyidejűleg működnek, ugyanakkor vannak közös erőforrások, amelyekhez mindannyian hozzáférnek. Ha az egyik szálnak a közös erőforrást érintő, egymásra épülő műveletei között egy másik szál is hozzáfér ugyanahhoz az erőforráshoz, az versenyhelyzetet okozhat:

Két szál mindegyike megnöveli eggyel egy közös változó értékét.
1. szál 2. szál Közös változó
0
0 0
1 + 0
1 1
1 1 1
1 2 + 1
1 2 2
A közös változó végső értéke a két szál időzítésétől függ.
1. szál 2. szál Közös változó
0
0 0
0 0 0
1 + 0 0
1 1 + 0
1 1 1
1 1 1


Az ilyen rendszerekben kölcsönös kizárással vagy hasonló technikákkal kell garantálni, hogy egy amíg egy adott szál összetartozó műveleteket végez egy közös erőforráson, addig a többi szál ne férhessen hozzá.