A GPSS programozási nyelv

Tranzakciók

A szimulációs modell működését, mozgását biztosító elemeket – amelyeket a GPSS állít elő, mozgat a blokkokon keresztül, és semmisít meg – tranzakcióknak nevezzük.
A tranzakciók a GPSS alkotóelemei közé tartoznak. Míg a többi alapalkotóelemek és a berendezések a szimulációs modellben egy-egy rögzített, fix csomópontoknak tekinthetők, addig a tranzakciók mozognak e csomópontok között: kilépnek az egyikből; belépnek (vagy megkísérelnek belépni) a másikba; megállnak egy helyen; gyorsan végigfutnak sok blokkon, stb. A tranzakciók e mozgása elvben egymástól függetlenül történik: a tranzakciók csak akkor vannak hatással más tranzakciók futására, ha egyik a másikat késlelteti (pl. sorstatisztikában), vagy ha kijelölt blokkok (pl. a MATCH blokk) ilyenre kényszerítik azokat. A tranzakciók abban is különböznek a többi alkotóelemtől, hogy míg azokat a programozó határozza meg (név, sorszám, darabszám, kapacitás, stb.), addig a tranzakciót maga a szimulációs modell állítja elő, módosítja, vagy semmisíti meg.

A tranzakciók modellen belüli pályája gyakran előre meghatározott (leszámítva egyes véletlenszerűen változó elágazást), míg a többi alkotóelem állapota időben változik. A tranzakció időbeni lefutása ugyan lehet előre meghatározott is, de általában ez előre nem határozható meg. A tranzakció időbeni haladását nagymértékben befolyásolja a többi alkotóelem (különösen a blokkok, kiszolgálóegységek, raktárak, logikai kapcsolók, sorbanállások, és listák) állapota. Úgyszintén, befolyásoló tényező még a tranzakció prioritása is, de erről a későbbiekben lesz szó.

A szimulációs modellekben a tranzakció mindent ábrázolhat, ami akár fizikai, akár nem fizikai dolog, ami akár mozog a valóságban, akár egy helyben áll, amire akár hat az idő múlása, akár nem, stb. A számtalan lehetőség közül példaképpen néhány lehetségest sorolunk fel: a tranzakciók lehetnek üzenetek egy távadat-feldolgozási-hálózatban; üzenetek önálló karakterei egy olyan hálózatban, amely a betűket külön-külön továbbítja; egy program, amely a számítógépen fut (használja a központi egységet, a csatornákat, a perifériákat, stb.); gépek vagy alkatrészek egy megbízhatóságot vizsgáló szimulációs modellben; munkadarabok, amelyeken üzemek, szerszámgépek dolgoznak; autók, amelyek a javítás különböző fázisain haladnak keresztül; járművek (kamionok, vonatok, metró szerelvények, hajók, buszok, taxik, stb.), amelyek úton vannak, fel- vagy lerakodnak, stb.; emberek, akik vásárlók, ügyfelek, vendégek, utasok, nézők, stb.; telefonhívások egy telefonhálózatban; ügyiratok egy hivatalban; központi vezérlőprogram egy valós idejű rendszerben; csatornavezérlő programok (egy-egy tranzakció minden egyes adatcsatornához); egy vezérlőelem, amely egy ismert idődiagram alapján különböző állapotokat kérdez le, ill. dolgoz fel; egy időegység (pl. nap), amelynek modellen keresztüli végigfutása különböző cselekvéseket indít el: rendelés feladását, ellátmány fogadását, ki- és befizetések teljesítését, stb.; és így tovább.

Minden tranzakciónak vannak paraméterei, és van egy prioritása, amelynek alapján valamely prioritási osztályhoz tartozik. Van továbbá egy futási ideje, amely több vagy kevesebb lehet attól függően, hogy a tranzakció futása során milyen késleltetéseket szenved. Mindezeket együtt a tranzakciók tulajdonságainak nevezzük. A tranzakciók tulajdonságait a tranzakció standard numerikus attribútumai bocsátják a modell rendelkezésére. Lehetőség van ezen kívül arra is, hogy a tranzakciókról másolatokat készítsünk. Ezt sorozatnak, vagy tranzakció sorozatnak nevezzük. A másolatokat külön útra küldhetjük, futásukat összekapcsolhatjuk, stb.

A tranzakciók tulajdonságait megváltoztató blokkok az előbbi tulajdonságok szerint csoportosítva és ábécésorrendben a következők:

ALTER
ASSIGN
COUNT
GENERATE
INDEX
LOOP
MARK
SELECT
TERMINATE
ALTER
GENERATE
PRIORITY
TERMINATE
ADVANCE
ASSEMBLE
BUFFER
GATE
GATHER
LINK
MARK
MATCH
TEST
TRANSFER
UNLINK
ASSEMBLE
GATHER
SPLIT
TERMINATE

A GPSS-modellben előforduló bármely állapotváltozást gyakorlatilag mindig az indít el, hogy egy tranzakció belép valamely blokkba, és a GPSS a blokknak megfelelő funkciót végrehajtja.

Mielőtt a tranzakciók tulajdonságainak részletesebb tárgyalásába kezdenénk, egy fontos tényre hívjuk fel az olvasó figyelmét: a GPSS bármely gépi időpontban egy és csakis egy tranzakció futását segíti elő. Megjegyezzük, hogy itt a gépi idő a programfutási időt, és nem a szimulált időt (l. az időkezelés fejezetét) jelenti!

A tranzakció paraméterei

Minden tranzakció rendelkezhet 0..100 paraméterrel. A paraméterek 1..100-ig terjedő sorszámmal jelölhetők. Ezek a paraméterek a tranzakció részei (mondhatni "zsebei"), amelyekben a programozó a modell műveleteivel értékeket helyezhet el, azokat törölheti, felülírhatja és megváltoztathatja. A paraméterek félszó vagy szó hosszúságúak lehetnek, ami egyben meghatározza a paraméterekben elhelyezhető tartalom értékkészletét is. Félszó esetén ez előjeles,15 bites, egész típusú szám: -32768..+32767 (azaz -215..215-1), ill. szó esetén pedig előjeles, 31 bites, egész típusú szám: -2147483648..+2147483647 (azaz -231..231-1). A paraméterek számát és méretét a programozó határozza meg a GENERATE (azaz a tranzakciókat előállító) blokk F, ill. G operandusában (hiányzó operandus esetén 12 félszó a feltételezett). A későbbiekben ezek a tulajdonságok meg nem változtathatók. Az egyazon GENERATE blokkból származó tranzakciók paramétereinek száma és hossza nem feltétlenül ugyanaz, mivel az operandusokban standard numerikus attribútumok is megadhatók.

A paramétereknek semmiféle előre meghatározott jelentése nincs. Értelmezni, és egy képzeletbeli tartalommal, céllal ellátni a programozó joga, és kötelessége. Ilyen alapon a paramétereket általános paramétereknek is nevezhetnénk. A paraméterek tartalmukban és jelentésükben egymástól függetlenek. Egy felhasználó pl. az egyik paraméterbe elteheti az üzenet hosszát, a másikba a terminál sorszámát, a harmadikba az üzenet típusát, stb.; a másik felhasználó az egyik paraméterbe beteheti a kivét vagy betét jellegét, a másikba az összeg nagyságát, a harmadikba a kamatlábat, a negyedikbe a dátumot, az ötödikbe az óraidőt, és így tovább. A paraméterek ilyen logikai jelentésének semmi jelentősége nincs a szimulációs modell működése szempontjából.

Az összes paraméter kezdeti értéke nulla. A paraméterek értékeinek tetszőleges változtatására az ASSIGN blokk hivatott (amellett, hogy más blokkok is tehetnek speciális értékeket a paraméterekbe).

A GPSS-ben az indirekt címzés csak a paraméterek felhasználásával megengedett. A paraméterek értéke értékőrzőkbe kimenthető. Egyik tranzakció sem tudja a másik tranzakció paramétereit elérni: sem kiolvasni, sem átírni. A kiolvasás csak közvetett úton, az értékőrző segítségével történhet, de ez is csak akkor, ha a másik ezt aktívan támogatja, azaz leteszi paraméterének értékét az értékőrzőbe, ahonnan aztán már bármely tranzakció átveheti.

A tranzakciók paramétereire a Pn, P*n, és n standard numerikus attribútummal lehet hivatkozni, ahol n a paraméter sorszáma. Pn és n az n-edik paraméter tartalmát, P*n pedig az n-edik paraméter által meghatározott másik paraméter tartalmát jelenti.

A tranzakció prioritása

Minden tranzakciónak van prioritása. Az egyes prioritásokat a 0..127 konstansok jelzik. Ezek közül a legalacsonyabb a 0, legmagasabb a 127. A tranzakció prioritását a tranzakciót előállító GENERATE blokk E operandusa határozza meg (hiányzó E operandus esetén 0 a feltételezet prioritás), és ezt menet közben a PRIORITY blokkal lehet megváltoztatni.

Az azonos prioritású tranzakciók sorbaálláskor ún. prioritási osztályokat alkotnak. A prioritási osztályok a tranzakciók egyes listákban (l. lejjebb) elfoglalt sorrendjét kétszintűvé teszik:

A tranzakció prioritására a PR standard numerikus attribútummal lehet hivatkozni.

A tranzakció futási ideje

A tranzakció megőrzi "születésének" (azaz a GENERATE blokkból történő kilépésének) időpontját. Ezt az időpontot MARK időnek nevezik. A MARK-idő és az aktuális óraidő (l. az időkezelés fejezetében) különbsége adja a tranzakció futási idejét: (tranzakció futási ideje) = (pillanatnyi abszolút óraidő) - (szóban forgó tranzakció MARK-ideje).

A GENERATE blokkon kívül a programon belül bárhol megjelenő MARK blokk is beállíthatja a MARK-időt, mégpedig a mindenkori abszolút óraidő értékére. Így tehát a tranzakció futási ideje kétfajta értelmű:

Egy adott tranzakció futási ideje más tranzakciók által hozzá nem férhető, csak közvetetten; mindkét tranzakció aktív hozzájárulásával vehető, ill. adható át.

A tranzakció futási idejére az M1 standard numerikus attribútummal lehet hivatkozni. (Ez a hivatkozás egyben azt is jelenti, hogy a fenti különbséget a rendszer képezi és bocsátja a program rendelkezésére, így nem a programozónak kell a kivonásról gondoskodnia.)

A paraméter futási ideje

A MARK blokkal a tranzakció egy kiválasztott paraméterébe bármikor be lehet tenni a pillanatnyi abszolút óraidőt. Ennek felhasználásával a paraméter (mindig az a paraméter, amelybe a MARK blokk az időpontot betette) futási ideje a következőképpen határozható meg: (paraméter futási ideje) = (pillanatnyi abszolút óraidő) - (a szóban forgó tranzakció adott paraméterének tartalma).

Megjegyezzük, hogy célszerű a paraméter futási idejének képzéséhez felhasznált paramétert szó hosszúságúnak választani, mivel az abszolút óraidő könnyen túlhaladhatja és gyakran túl is haladja a félszó lehetséges maximális tartalmát (a 32767-et).

A paraméter futási idejére az MPn, MP*n standard numerikus attribútummal lehet hivatkozni, ahol n a paraméter sorszáma. (Ez a hivatkozás egyben azt is eredményezi, hogy a rendszer képzi az előbbi különbséget, és már ezt bocsátja a program rendelkezésére.)

A tranzakció MATCH-állapota

A tranzakció MATCH-állapotba akkor kerül, ha az ASSEMBLE, GATHER, vagy MATCH blokkok valamelyikébe belép. A MATCH-állapot mindhárom blokkban mást és mást jelent, de közös jelentése az, hogy a tranzakció sorozatának egy vagy több másik tagjára várakozik (match: illeszt). MATCH-állapotban a tranzakció futása fel van függesztve A MATCH-állapot kezdetben soha sincs beállítva, azt csak a felsorolt blokkok állítják be, és csak a sorozat megfelelő számú tranzakciójának beérkezése állítja vissza. A MATCH-állapot meglétére a GATE blokkal lehet rákérdezni. A tranzakció MATCH-állapotát csak a vele egy sorozata tartozó más tranzakciók tudják levizsgálni.

A tranzakció MATCH-állapotát a GATE blokk két standard logikai attribútumnak megfelelő segédművelete tükrözi vissza: az M, és az NM.

Tranzakciók sorozata

A tranzakciók előállítása - a GENERATE blokkban - egyedileg történik. Gyakran szükség van azonban ugyanazon tranzakció több példányára is. Az egyes másolatok valódi jelentése lehet ugyanaz (pl. egy ügyiratról készült fotómásolatok), de lehetnek más jelentésűek is (pl. egy szállítmány beérkezése miatt a szállítólevelek több példányának, és más információknak különböző utakon történő elindulása és végigfutása a szállítmányt fogadó vállalatnál). A másolatok (és az eredeti tranzakció is) különböző, de azonos utakat is befuthatnak a modellen belül. A tranzakciókról másolatokat a SPLIT blokk készít, ezeket a másolatokat (vagy csak a másolatok egy részét) pedig - ha a későbbiekben szinkronizálni kell, vagy össze kell gyűjteni - az ASSEMBLE, GATHER, és MATCH blokkok gyűjtik össze.

A másolt tranzakció minden tulajdonsága (a paraméterek száma, hossza, tartalma, a prioritás, a MARK-idő, és így standard numerikus és standard logikai attribútumainak értékei) a másolat készítése pillanatában ugyanaz lesz. (Kivételt képez a sorszámozás esete.) A későbbiekben ezek közül egyesek (a paraméter tartalma, a prioritás, a MARK-idő, és így a standard numerikus, és standard logikai attribútumok értéke is) természetesen megváltozhatnak. A másolt tranzakcióról további másolatok is készíthetők, de ezek az újabb példányok is mind az eredeti sorozathoz fognak tartozni.

Egy tranzakció egy és csakis egy sorozathoz tartozhat. Minden sorozatnak csak egy őse lehet (akárhány másolás is történt vele, vagy korábbi másolataival kapcsolatban), de ez - és semelyik másolat - nincs kitüntetve semmiféle szempontból sem a sorozat többi tagjával szemben.

A sorozat taglétszámát standard numerikus attribútum nem adja meg, szükség esetén azt a másolatok készítésekor egy paraméterben kell tárolni.

Listák

A tranzakció mielőtt "megszületik", és miután "meghal", az inaktív tranzakciók között helyezkedik el. Az inaktív tranzakciók egy láncot alkotnak, amelyet mutatók kapcsolnak össze. "Megszületéskor" a tranzakció kilép - logikai szempontból - az inaktív tranzakciók láncából, és egy másik láncba, vagy más néven listába lép át. Fizikailag mozgásról szó sincs, a tranzakció helyén marad, csak az egyik lánchoz tartozó mutató átalakul egy másik lánchoz tartozó mutatóvá.

A GPSS-ben - az inaktív tranzakciók láncán kívül - a következő hat lista- (vagy lánc-) típus minden tranzakciót magában foglal:

Egy időben a listák és a tranzakciók között egy-a-több értelmű megfeleltetés van, azaz egy tranzakció egy időben csak egy listához tartozhat, de egy lista egy időben bármennyi tranzakciót összefoghat. A listákon belül az egyes prioritási osztályok külön tagozódnak. A listákban a tranzakció általában prioritásának megfelelő prioritási osztály allistájának a végére kerül.

Nézzük meg most a hat listát részletesebben!

A listák használatáról még annyit, hogy tranzakciók kizárólag meghatározott listapárok között mozoghatnak. Ezek a listapárok a következők: CEC-FEC, CEC-UC, CEC-MC, FEC-IC. Van még két egyirányú kapcsolat: inaktív tranzakciók-FEC, és CEC-inaktív tranzakciók.

A listák, és a tranzakciók mozgási lehetőségei