Google
 

Trailing-Edge - PDP-10 Archives - decuslib10-05 - 43,50337/07/gpsswe.rnm
There is 1 other file named gpsswe.rnm in the archive. Click here to see a list.
00100	.paper size 55,67
00200	.nofill
00300	                 
00400	.b 20
00500	.lm 5
00600	               GGG   PPPP    SSS    SSS    SSS
00700	              G   G  P   P  S   S  S   S  S   S
00800	              G      P   P  S      S      S
00900	              G      PPPP    SSS    SSS    SSS
01000	              G GGG  P          S      S      S
01100	              G  G   P      S   S  S   S  S   S
01200	              GGGG   P       SSS    SSS    SSS 
01300	.page
01400	.title Inledning
01500	.lm 0
01600	
01700	.test page 10
01800	1_. Inledning
01900	.b 1
02000	.lm 5
02100	.fill
02200	.p 5,1,6
02300	     GPSSS {r en simulaklass f`r fl`den av objekt
02400	mellan k`er, lager och behandlingsstationer. Klassen, 
02500	som har prefixet SIMULATION,
02600	ger SIMULA n}gra av de anv{ndbara procedurerna i
02700	Gordons GPSS. 
02800	Det inkluderar deklarationer av f`ljande klasser :
02900	.b 1
03000	.nofill
03100	.lm 6
03200	        1_. TRANSACTION, som definierar objekten
03300	        2_. FACILITY   ,    - " -       stationer
03400	        3_. STORAGE    ,    - " -       lagerutrymmen
03500	        4_. QUEUE      ,    - " -       k`er
03600	.b 1
03700	.lm 5
03800	.fill
03900	.p 5,1,4
04000	     Procedurerna m`jligg`r f`r objekten att g} in i och
04100	l{mna resurserna.
04200	Statistik p} resurs-utnyttjandet samlas automatiskt och
04300	skrivs ut i slutet av simuleringen
04400	.p 5,1,5
04500	     De avancerade satserna i GPSS har ersatts av de mer
04600	flexibla SIMULA satserna som HOLD( - - ), ACTIVATE och
04700	REACTIVATE. Men det finns en procedur WAIT__UNTIL som 
04800	till}ter villkorliga inplaneringar av h{ndelser f`r objekten.
04900	Objekten kan tilldelas prioritet f`r att 
05000	}stadkomma f`rst-in-f`rst-ut, sist-in-f`rst-ut och andra
05100	ordningar.
05200	
05300	.p 5,1,6
05400	      Med andra procedurer kan man fr}ga efter det tillf{lliga
05500	utnyttjandet av en resurs. Man kan ocks} fr}ga efter 
05600	utskrift  av statistik under en simulering, och modellen kan }terst{llas
05700	s} att en ny simulering med andra indata kan g`ras i samma k`rning.
05800	_#ven helt olika simulerings-modeller kan simuleras under en k`rning.
05900	.p 5,1,5
06000	     Med GPSSS kan simuleringsprogram skrivas 
06100	 p} samma enkla och korta s{tt som med GPSS. 
06200	Anv{ndningen av SIMULA som basspr}k bibeh}ller den
06300	h`ga standarden p} programstrukturen, s}som blockstrukturen,
06400	procedurer, aritmetik, str{nghantering och in och utmatning.
06500	
06600	.b 2
06700	.title Resurserna
06800	.lm 0
06900	.test page 10
07000	2_. Resurserna
07100	.lm 5
07200	.p -5,1,6
07300	K`er
07400	.b 1
07500	.i 5
07600	      K`erna kan utnyttjas av objekten n{r som helst.
07700	Det finns ingen begr{nsning p} storleken av dem.
07800	Statistiken inneh}ller :
07900	.b 1
08000	.lm 8
08100	.test page 6
08200	.nofill
08300	1_. hur m}nga objekt som totalt befunnit sig i k`n
08400	2_. st`rsta antal objekt i k`n
08500	3_. aktuella inneh}llet i k`n
08600	4_. genomsnittliga inneh}llet i k`n
08700	5_. genomsnittliga tiden objekten befunnit sig i k`n.
08800	.b 1
08900	.lm 0
09000	.test page 8
09100	Behandlingsstationer
09200	.lm 5
09300	.fill
09400	.p 5,1,6
09500	      Stationerna kan bara utnyttjas av ett objekt i taget.
09600	De objekt som vill g} in i en upptagen behandlingsstation
09700	placeras i en ink` knuten till stationen ifr}ga.
09800	D{rifr}n tas sedan objekten i prioritetsordning 
09900	in i stationen d} den {r ledig.
10000	Den statistik som ges {r :
10100	.b 1
10200	.lm 10
10300	.nofill
10400	.test page 6
10500	 1_. genomsnittliga utnyttjandet av stationen
10600	 2_. antal objekt som anv{nt stationen
10700	 3_. den genomsnittliga tid objekten till-
10800	
10900	    bringat i stationen.
11000	.lm 10
11100	 4_. aktuella inneh}llet i stationen
11200	.b 1
11300	.lm 0
11400	.fill
11500	Lager
11600	.b 1
11700	.lm 5
11800	.p 5,1,11
11900	           Ett lager kan ha ett visst maximalt utrymme f`r-definierat.
12000	Det ges med satsen SET__STORAGE( N, <max__utrymme>);
12100	Ett objekt, som inte f}r plats i ett lager, placeras i
12200	v{ntan p} plats i en k`.
12300	Ordningen ut ur k`n d} den inneh}ller flera objekt 
12400	{r {ven h{r efter prioritet.
12500	 Det utrymme ett objekt tar
12600	anges som andra parameter i utrycket enter__storage( N,
12700	<erfoderligt__utrymme>);
12800	Objektet kan d} den l{mnar lagerutrymmet frig`ra utrymme 
12900	som skiljer sig fr}n det utrrymme som kr{vdes d} den
13000	kom dit. Det anges med : leave__storage( N, <frigjort__utrymme>)
13100	Statistiken inneh}ller :
13200	.b 1
13300	.lm 10
13400	.test page 6
13500	.nofill
13600	1_. maximala lagerutrymmet
13700	2_. genomsnittliga inneh}llet
13800	3_. genomsnittliga utnyttjandet
13900	4_. totala antalet objekt i lagerutrymmet
14000	5_. tiden i lagerutrymmet per enhet som
14100	   utnyttjat lagerutrymmet
14200	6_. st`rsta  antalet objekt i lagerutrymmet
14300	7_. aktuella antalet objekt i lagerutrymmet
14400	.fill
14500	
14600	.b 2
14700	.title Programstrukturen
14800	.lm 0
14900	.test page 10
15000	3_. Programstrukturen
15100	.lm 5
15200	.p 5,1,4
15300	     GPSSS kan anv{ndas som prefix till ett block eller
15400	som prefix till en klass. Den ska anv{ndas precis som
15500	standard system klasserna SIMSET och SIMULATION.
15600	.test page 8
15700	     Anv{ndarprogrammet kan ses som uppdelat i tv} delar.
15800	 
15900	.nofill
16000	.b 1
16100	   1. definition av objektens attribut och aktiviteter.
16200	
16300	.b 1
16400	   2. huvudprogrammet som initierar och kontrollerar
16500	      simuleringen. Huvudprogrammet m}ste speciellt
16600	      skapa det f`rsta objektet.
16700	
16800	.b 1
16900	.fill
17000	.p 5,1,4
17100	     F`ljande triviala exempel visar
17200	en modell d{r kunder anl{nder slumpm{ssigt i tiden till
17300	ett system och l{mnar densamma efter 10 minuter. 
17400	
17500	.nofill
17600	.lm 10
17700	.p 0,1,21
17800	OPTIONS(/search "libsim[106,306])
17900	BEGIN
18000	.b 1
18100	  EXTERNAL CLASS gpsss ;
18200	  gpsss(1,1,1) BEGIN
18300	.b 1
18400	    transaction CLASS kund ;
18500	    BEGIN
18600	      ACTIVATE NEW kund
18700	      DELAY Uniform(0,15,u);
18800	      hold( 10 ) ;
18900	    END ;
19000	.b 1
19100	    COMMENT  *  HUVUDPROGRAMMET *  ;
19200	    ACTIVATE NEW kund DELAY 0 ;
19300	    hold( 100 ) ;
19400	.b 1
19500	  END GPSSS exempel ;
19600	.b 1
19700	END program
19800	.fill
19900	.lm 5
20000	.p 5,1,4
20100	     Huvudprogrammet startar simuleringen med att
20200	aktivera den f`rsta kunden och v{ntar sedan 100
20300	tidsenheter, som {r tiden f`r simuleringen.
20400	
20500	.p 5,1,8
20600	     Objekten i anv{ndarprogrammet {r 
20700	definierade som klasser med
20800	prefixet TRANSACTION. Klassen TRANSACTION definierad
20900	i GPSSS har  prefixet PROCESS s} h{ndelser 
21000	f`r objekten  inplaneras  med
21100	dom vanliga SIMULA satserna. I programmet genererar
21200	varje kund sin efterf`ljare och l{mnar systemet
21300	efter 10 minuter.
21400	
21500	.p 5,1,8
21600	    H{r f`ljer en lista av de procedurer som beh`vs
21700	f`r att anv{nda resurserna 
21800	tillsammans med n}gra andra procedurer  :
21900	.b 1
22000	.p 0,1,9
22100	.nofill
22200	.lm 10
22300	A) Procedurer f`r objekten
22400	   -----------------------
22500	.b 1
22600	- enter__station  ( n )
22700	- leave__station  ( n )
22800	- enter__storage  ( n )
22900	- leave__storage  ( n )
23000	- enter__queue    ( n )
23100	- leave__queue    ( n )
23200	.b 1
23300	.p 0,1,5
23400	B) Procedurer i huvudprogrammet
23500	   ----------------------------
23600	.b 1
23700	- set__storage  ( n , max__contents )
23800	- restart
23900	.b 1
24000	.p 0,1,8
24100	C) Objektens attribut
24200	   ------------------
24300	.b 1
24400	- priority
24500	- time__mark
24600	- id
24700	.b 1
24800	.p 0,1,12
24900	D) Anv{ndar-procedurer
25000	   -------------------
25100	.b 1
25200	
25300	- gpsss__time
25400	- wait__until  ( Boolskt uttryck )
25500	- standard__report
25600	- contents__station  ( n )
25700	- contents__storage  ( n )
25800	- contents__queue    ( n )
25900	- waiting__station   ( n )
26000	- waiting__storage   ( n )
26100	- waiting__queue     ( n )
26200	.b 1
26300	.p 0,1,4
26400	E) Global variabel
26500	   ---------------
26600	.b 1
26700	- U
26800	.b 1
26900	.p 0,1,9
27000	F)  Procedurer i version GPSSST
27100	    ---------------------------
27200	.b 1
27300	- trace__objects
27400	- station__name      (n,new__name)
27500	- storage__name      (n,new__name)
27600	- queue__name        (n,new__name)
27700	- trans__name        ( new__name )
27800	- hold__until__ready
27900	- outtime           ( time )
28000	- begin__time        ( time )
28100	.b 1
28200	.fill
28300	.title Transaktionerna
28400	.b 2
28500	.lm 0
28600	.test page 10
28700	4_. Transaktionerna
28800	.lm 5
28900	.p 5,1,5
29000	     Varje objekt har tre attribut f`r-definierade :
29100	.b 1
29200	.lm 10
29300	.nofill
29400	          integer   ID ;
29500	          real      TIME__MARK, PRIORITY ;
29600	.b 1
29700	.fill
29800	.lm 5
29900	.p 5,1,5
30000	N{r ett objekt skapas s} s{tts PRIORITY till noll och
30100	TIME__MARK till aktuella tiden. ID ges det v{rde som
30200	motsvarar objektets ordning i simuleringen.
30300	
30400	.p 5,1,11
30500	     PRIORITY anv{nds av systemprocedurerna n{r ett
30600	objekt ska placeras i en ink` eller
30700	n{r ett objekt g`r en WAIT__UNTIL.
30800	Ink`erna {r de k`er  objekten placeras i innan
30900	de ska anv{nda en station eller ett lager.
31000	 Objekt vars
31100	PRIORITY {r minst g}r ur k`n f`rst. N{r PRIORITY {r 
31200	lika f`r flera objekt {r ordningen f`rst-in-f`rst-ut
31300	om PRIORITY {r st`rre eller lika med noll och 
31400	sist-in-f`rst-ut om PRIORITY {r mindre {n noll.
31500	Anv{ndaren kan allts} definiera olika ordningar genom
31600	att {ndra p} PRIORITY under simuleringen. Simulasatserna
31700	HOLD, ACTIVATE och REACTIVATE anv{nder inte 
31800	PRIORITY.
31900	
32000	.p 5,1,3
32100	     TIME__MARK anv{nds inte av GPSSS men anv{ndaren
32200	kan utnyttja TIME__MARK f`r att f} ut tiden som ett
32300	objekt har tillbringat i en resurs.
32400	
32500	.p 5,1,3
32600	     Procedurerna som definierar h{ndelser f`r objekten
32700	och deras motsvarighet i GPSS visas nedan.
32800	
32900	.b 1
33000	.nofill
33100	.test page 10
33200	.lm 8
33300		     GPSSS                   GPSS
33400		     -----                   ----
33500		                        
33600		 ENTER__STATION (N)        SEIZE    N
33700		 LEAVE__STATION (N)        RELEASE  N
33800		 ENTER__STORAGE (N, SIZE)  ENTER    N, SIZE
33900		 LEAVE__STORAGE (N, SIZE)  LEAVE    N, SIZE
34000		 ENTER__QUEUE   (N)        QUEUE    N
34100		 LEAVE__QUEUE   (N)        DEPART   N
34200	.lm 5
34300	.fill
34400	
34500	.p 5,1,5
34600	     Parametern N {r ett heltal som identifierar en 
34700	resurs. Hur m}nga behandlingsstationer, lager och
34800	k`er anv{ndaren t{nker utnyttja anges som parametrar
34900	till GPSSS, enligt f`ljande :
35000	
35100	.nofill
35200	.p 0,1,3
35300	     GPSSS( max__queues, max__stations, max__storages)
35400	             [ k`er ] [ behandlings-] [ lager ]
35500	                      [ stationer   ]
35600	
35700	.fill
35800	.p 5,1,4
35900	     Numreringen av resurserna beh`ver inte vara
36000	konsekutiv, bara N h}ller sig fr}n 1 till max__queues,
36100	max__stations och max__storages respektive.
36200	
36300	.title Huvudprogrammet
36400	.b 2
36500	.lm 0
36600	.test page 10
36700	5_. Huvudprogrammet
36800	.lm 5
36900	.p 5,1,6
37000	     Huvudprogrammet initierar simuleringen, anropar
37100	proceduren STANDARD__REPORT om statistik ska skrivas
37200	ut och avslutar simuleringen. Den kan
37300	dessutom anv{nda vissa procedurer som beskrivs senare.
37400	H{r n{mns de tv} procedurer som {r speciella f`r 
37500	huvudprogrammet. De {r :
37600	.b 1
37700	.lm 10
37800	.nofill
37900	           - RESTART          och
38000	           - SET__STORAGE( N, <maximalt utrymme> )
38100	.lm 5
38200	.fill
38300	.p 5,1,6
38400	       RESTART "nollst{ller" GPSSS s} att en ny simulering kan g`ras.
38500	Den nya simuleringen kan vara samma modell med andra indata,
38600	eller en helt ny modell.
38700	Proceduren anropar STANDARD__REPORT, tar bort
38800	alla objekt och resurser, s{tter GPSSS__TIME
38900	till noll och den globala variabeln U f`r
39000	slumpdragningar till 987654321.
39100	.p 5,1,4
39200	     SET__STORAGE skapar ett lager med dess
39300	maximala utrymme.
39400	Om  lager anv{nds innan de har skapats
39500	p} detta s{tt kommer dess utrymme s{ttas
39600	till 1 000 000.
39700	
39800	.title Globala procedurer
39900	.b 2
40000	.lm 0
40100	.test page 10
40200	
40300	
40400	6_. Globala procedurer
40500	.lm 5
40600	.p 5,1,4
40700	     Anv{ndarprocedurerna, se sid. 5, ber`r
40800	simuleringstiden och hur resurserna
40900	har utnyttjas.
41000	.p 5,1,6
41100	     REAL PROCEDURE GPSSS__TIME; <- - - -> ;
41200	ger tiden f`r simuleringen sedan simuleringen startade
41300	eller sedan proceduren RESTART anv{ndes sista g}ngen.
41400	Proceduren ers{tter SIMULA proceduren TIME som inte
41500	ska utnyttjas.
41600	
41700	.p 5,1,6
41800	     De sex sista procedurerna, se anv{ndarprocedurer sid. 5
41900	ger ett heltal som motsvarar : 
42000	.nojustify
42100	.b 1
42200	antalet objekt som v{ntar p} att f} utnyttja en resurs
42300	( WAITING__ )  eller
42400	.b 1
42500	det aktuella inneh}llet i en resurs  ( CONTENTS__ ).
42600	.b 1
42700	
42800	.justify
42900	.p 5,1,9
43000	     STANDARD__REPORT skriver ut statistik p} utnyttjandet
43100	av resurserna. Tidsintervallet f`r vilken statistiken g{ller, 
43200	{r tiden mellan tv} konsekutiva anrop av proceduren, eller
43300	d} den anropas f`r f`rsta g}ngen tiden fram till dess.
43400	Som f`rebild till  utformningen av statistiken har dess
43500	motsvarighet i GPSS anv{nts.
43600	Proceduren anropas automatiskt av GPSSS d} hela simuleringen
43700	{r klar.
43800	
43900	.p 5,1,8
44000	     WAIT__UNTIL( <boolskt uttryck> ) {r en kraftfull
44100	procedur. Den kan anv{ndas av ett objekt eller av 
44200	huvudprogrammet. Den passiverar f`rst,
44300	och aktiverar igen n{r uttrycket blivit TRUE. Uttrycket
44400	testas efter varje h{ndelse i simuleringen. Objekten
44500	passiverade av WAIT__UNTIL placeras i en v{ntk` i 
44600	prioritetsordning. Huvudprogrammet som inte har PRIORITY attributet
44700	testas alltid sist av proceduren.
44800	
44900	.title Version GPSSST
45000	.b 2
45100	.lm 0
45200	.test page 10
45300	7_. Version GPSSST
45400	.lm 5
45500	.p 5,1,3
45600	     I version GPSSST har anv{ndaren m`jligheter att
45700	f} utskrifter av varje objekts v{g genom systemet.
45800	_#ven tidpunkterna f`r h{ndelserna skrivs  ut.
45900	
46000	.p 5,1,3
46100	     Det finns tv} typer av utskrifter. Den f`rsta
46200	ordnar proceduren TRACE(n) och den andra TRACE__OBJECTS.
46300	
46400	.p 5,1,5
46500	     TRACE(n) ger utskrift efter hand ett objekt g}r in
46600	i eller l{mnar en resurs.
46700	 TRACE(n) anropas automatiskt i GPSSST
46800	om TRACE__ON s{tts TRUE i b`rjan av anv{ndarprogrammet.
46900	.b 1
47000	.nofill
47100	utskriftsexempel :
47200	.b 1
47300	   .. 
47400	   .. 
47500	   ..
47600	object   5   entering   station   2 at time     12:03
47700	object   4   leaving    storage   1 at time     12:39
47800	   ..
47900	   ..
48000	   ..
48100	.fill
48200	.p 5,1,7
48300	     TRACE__OBJECTS kan anropas n{r en (del-) simulation
48400	{r klar. F`rst skrivs de objekt som l{mnat simuleringen
48500	 ut. Sedan kommer de objekt som v{ntar p} plats  
48600	 i en behandlingsstation, eller ett lagerutrymme, och sist de 
48700	objekt som fortfarande {r passiverade av WAIT__UNTIL.  Objekten {r
48800	ordnade efter deras attribut ID. 
48900	
49000	.p 5,1,5
49100	     Varje objekt f`ljs av dess h{ndelser och sedan
49200	objektets tid i respektive resurs. Om anv{ndaren
49300	endast `nskar utskrift p} objektens tid i resurserna
49400	s{tts TIME__SPENT__ONLY := TRUE.
49500	.b 1
49600	.nofill
49700	.test page 22
49800	utskriftsexempel :
49900	.lm 10
50000	.b 1
50100	       object   4
50200	       ----------
50300	.b 1
50400	.b 1
50500	Entered  storage   1 at time       10:51
50600	Entered  queue     1 at time       10:51
50700	Leaved   queue     1 at time       11:41
50800	Entered  station   1 at time       11:41
50900	Leaved   station   1 at time       12:39
51000	Entered  queue     3 at time       12:39
51100	Leaved   queue     3 at time       12:54
51200	Entered  station   4 at time       12:54
51300	Leaved   station   4 at time       13:53
51400	Leaved   storage   1 at time       13:53
51500	.b 2
51600	
51700	Time spent in  storage   1 :       03:02
51800	Time spent in  queue     1 :       00:49
51900	Time spent in  station   1 :       00:58
52000	Time spent in  queue     3 :       00:16
52100	Time spent in  station   4 :       00:59
52200	.lm 5
52300	.fill
52400	.b 1
52500	.p 5,1,4
52600	     Statistik f`r proceduren TRACE__OBJECTS samlas
52700	endast om OBJECT__TRACE__ON s{tts TRUE.
52800	Detta m}ste allts} g`ras innan simuleringen s{tter
52900	ig}ng.
53000	
53100	.p 5,1,7
53200	     F`r att f} en mer l{ttl{st text i 
53300	de utskrifter  trace-procedurerna ger 
53400	kan man tilldela objekten och resurserna andra namn med
53500	procedurerna :
53600	.b 1
53700	.nofill
53800	TRANS__NAME  ( <namn> ),      QUEUE__NAME  ( N, <namn>)
53900	STATION__NAME( N, <namn>) och STORAGE__NAME( N, <namn>)
54000	.b 1
54100	.fill
54200	.p 5,1,6
54300	     I denna version anges tidsenheten 
54400	simuleringen ska utnyttja med 
54500	en fj{rde parameter till GPSSST.
54600	 _#ven antalet decimaler p} sekunderna
54700	ska anges ( femte parametern ).
54800	.b 1
54900	.nofill
55000	GPSSST(  , , , <tidsenheten> , secdec) BEGIN/CLASS
55100	.b 1
55200	.p 5,1,6
55300	     De tidsenheter som kan anv{ndas {r :
55400	.b 1
55500	.lm 10
55600	.nofill
55700			's'  f`r  sekunder
55800			'm'  f`r  minuter
55900			'h'  f`r  timmar
56000	.lm 8
56100	         och    'd'  f`r  dagar
56200	.lm 5
56300	.fill
56400	.p 5,1,4
56500	     Om anv{ndaren inte vill ha sekunder utmatade
56600	s{tts secdec till -1.
56700	
56800	
56900	.title Programexempel
57000	.b 2
57100	.lm 0
57200	.test page 10
57300	8_. Programexempel
57400	.lm 5
57500	.b 1
57600	.p 5,1,7
57700	    Program-exempel 1, sid. 14, visar en simulering av
57800	en dator. Job inkommer slumpm{ssigt i tiden
57900	och placeras i en in-k`. N{r minnesutrymme {r tillg{ngligt
58000	h{mtas jobet, och g}r alternerande mellan CPU-tid och
58100	I/O-tid.
58200	Efter 10 s}dana looper l{mnar jobet
58300	systemet.
58400	.p 5,1,6
58500	Storage 1 representerar minnet, station 1 CPU'n
58600	och queue 1 och 4 ger statistik p} tider genom
58700	systemet respektive v{ntetider p} CPU'n.
58800	.p 5,1,4
58900	   Huvudprogrammet anv{nder RESTART f`r att
59000	simulera tv} pass med olika minnesstorlekar.
59100	.p 5,1,7
59200	     Sid. 15 visar en l{karmottagning som ska
59300	simuleras. D{r finns tv} provtagningsrum och tv}
59400	l{kare. Patienterna som anl{nder slumpm{ssigt i
59500	tiden ska f`rst till ett provtagningsrum och sedan
59600	till en l{kare. Fr}n v{ntrummen g}r patienterna till
59700	det rum som f`rst blir ledigt.
59800	
59900	.p 5,1,10
60000	     V{ntrummen f}r representera k`er, QUEUE 1 och
60100	QUEUE 2, och  provtagningsrummen  behandlingsstationer,
60200	STATION 1 och STATION 2. L{karna f}r
60300	ocks} bli behandlingsstationer, STATION 3 och STATION 4.
60400	F`r att f} statistik p} utnyttjandet av hela l{karstationen
60500	 f}r den representera ett lager, STORAGE 1, med ett
60600	maximal utrymme av exempelvis  25 patienter. 
60700	.p 5,1,6
60800	.title
60900	.page
61000	.nofill
61100	.b 2
61200	       GPSSS  @VERSIKT
61300	       ---------------
61400	.b 10
61500	Simulation CLASS gpsss( max__queues,
61600	max__stations, max__storages )  ;
61700	BEGIN
61800	  CLASS queue;     < - - - - - - - - >;
61900	  CLASS facility;  < - - - - - - - - >;
62000	  CLASS storage;   < - - - - - - - - >;
62100	  Process CLASS transaction ;
62200	  BEGIN
62300	    PROCEDURE enter__queue(n);  < - - >;
62400	    PROCEDURE leave__queue(n);  < - - >;
62500	    PROCEDURE enter__station(n);  < - >;
62600	    PROCEDURE leave__station(n);  < - >;
62700	    PROCEDURE enter__storage(n);  < - >;
62800	    PROCEDURE leave__storage(n);  < - >;
62900	    PROCEDURE priority__into(queue); <>;
63000	   < - - - - - - - - - - - - - - - - >;
63100	  END of class transaction ;
63200	  PROCEDURE wait__until ;   < - - - - >;
63300	  PROCEDURE  waiting-   -queue   ; < >;
63400	            contents-   -station ; < >;
63500	                        -storage ; < >;
63600	  PROCEDURE standard__report ;  < - - >;
63700	  PROCEDURE restart ;  < - - - - - - >;
63800	 < - - - - - - - - - - - - - - - - - >;
63900	END
64000	.page
64100	.b 1
64200	       KLASSEN  TRANSACTION
64300	       --------------------
64400	.b 10
64500	process CLASS transaction ;
64600	.b 1
64700	BEGIN 
64800	   REAL time__mark, priority;
64900	   INTEGER id ;
65000	   REF(head) occurrences;
65100	.b 1
65200	   PROCEDURE trace(n);
65300	.b 1
65400	   PROCEDURE enter__station (n);
65500	   PROCEDURE leave__station (n) ;
65600	   PROCEDURE enter__storage (n, units__required) ;
65700	   PROCEDURE leave__storage (n,units__released);
65800	   PROCEDURE enter__queue (n);
65900	   PROCEDURE leave__queue (n) ;
66000	.b 1
66100	   time__mark := gpsss__time ;
66200	   transid := transid + 1 ; id := transid ;
66300	.b 1
66400	   IF object__trace__on THEN occurrences:-NEW head;
66500	   INNER;
66600	   IF object__trace__on THEN 
66700	   final__wait (finished__objects);
66800	   IF nextev==NONE THEN ACTIVATE Main DELAY 0;
66900	.b 1
67000	END CLASS TRANSACTION ;
67100	.page
67200	.b 1
67300	      PROGRAM-EXEMPEL 1
67400	      -----------------
67500	.b 1
67600	OPTIONS(/search:"libsim[106,346]");
67700	BEGIN EXTERNAL CLASS gpsss;
67800	 gpsss(4,1,1) BEGIN
67900	.b 1
68000	 transaction CLASS job;
68100	 BEGIN INTEGER i,size,u1;
68200	 ACTIVATE NEW job DELAY Negexp(1/20,u);
68300	 size := Randint(1,10,u);u1 := u;
68400	 enter__queue(1);enter__storage (1,size);
68500	.b 1
68600	 FOR i := 1 STEP 1 UNTIL 10 DO BEGIN
68700	 enter__queue (4);enter__station (1);
68800	 leave__queue(4);hold(Negexp(1,u1));
68900	 leave__station(1);hold(Uniform(0,5,u1));
69000	 END;
69100	.b 1
69200	 leave__storage(1,size);leave__queue(1);
69300	 END;
69400	 set__storage(1,10);
69500	 ACTIVATE NEW job;
69600	 hold(300);	standard__report;
69700	 hold(300);	restart;
69800	 set__storage(1,15);ACTIVATE NEW job;
69900	 hold(300);
70000	 END
70100	END
70200	.page
70300	.b 1
70400	      L_#KARMOTTAGNINGEN
70500	      -----------------
70600	.b 10
70700	            L_#KARHUSET 
70800	.b 2
70900	===============  IN  ===============
71000	!                                  !
71100	!                                  !
71200	!  V_#NTRUM  till  PROVTAGNINGAR    !
71300	!                                  !
71400	!                                  !
71500	!======  IN  ============  IN  =====
71600	!                 !                !
71700	!                 !                !
71800	! PROVT  RUM  1   ! PROVT  RUM  2  !
71900	!                 !                !
72000	!                 !                !
72100	!=====  UT  =============  UT  =====
72200	!                                  !
72300	!                                  !
72400	!     V_#NTRUM  till  L_#KARNA       !
72500	!                                  !
72600	!                                  !
72700	!=====  IN  =============  IN  =====
72800	!                 !                !
72900	!                 !                !
73000	!   L_#KARE   1    ! L_#KARE   2     !
73100	!                 !                !
73200	!                 !                !
73300	======  UT  =============  UT  =====
73400	.page
73500	.b 1
73600	      PROGRAM-EXEMPEL 2
73700	      -----------------
73800	.b 10
73900	BEGIN COMMENT l{karmot. med provt.;
74000	  EXTERNAL CLASS gpssst,gpssso;
74100	  gpssso(3,4,1,'m',-1) BEGIN
74200	.b 1
74300	    transaction CLASS patient(t1,t2);
74400	    REAL t1,t2;
74500	.b 1
74600	    BEGIN PROCEDURE till__station(n);
74700	      INTEGER n;
74800	      BEGIN enter__queue(n);wait__until(
74900	      	contents__station(n)=0 OR
75000	      	contents__station(n+1)=0);
75100	      	leave__queue(n);
75200	      	IF contents__station(n)=0 THEN
75300	      	enter__station(n) ELSE
75400	      	enter__station(n+1);
75500	      	hold(IF n=1 THEN t1 ELSE t2 );
75600	      	IF station(n).occupier==THIS
75700	      	transaction THEN leave__station(n)
75800	      	ELSE leave__station(n+1);
75900	      END of till__station ;
76000	.b 1
76100	      IF id<10 THEN ACTIVATE NEW patient(
76200	      Normal(60,20,u1),Uniform(20,120,u2))
76300	      DELAY Negexp(2/60,u);
76400	      enter__storage(1,1);FOR i:=1,3 DO
76500	      till__station(i);leave__storage(1,1);
76600	    END patient ;
76700	.b 1
76800	    INTEGER i,u1,u2;u1:=123987;
76900	    u2:=789123;  outfit;
77000	    ACTIVATE NEW patient(Normal(60,20,u1),
77100	    Uniform(20,120,u2)) ;
77200	    hold__until__ready;trace__objects;
77300	  END;
77400	END
77500	.page
77600	.b 1
77700	       DEFINITIONER
77800	       ------------
77900	.b 10
78000		OPTIONS(/e/search:"libsim[106,346]");
78100		EXTERNAL CLASS gpssst ;
78200		gpssst CLASS gpssso ;
78300		BEGIN
78400		  PROCEDURE outfit ;
78500		  BEGIN
78600		    object__trace__on := TRUE ;
78700		    time__spent__only := TRUE ;
78800		    trans__name("Patient");
78900		    queue__name( 1,"provt. k`n" ) ;
79000		    queue__name( 3,"""l{kark`n""" ) ;
79100		    storage__name( 1 ,"L_#KARHUSET" ) ;
79200		    station__name( 1 ,"provrum 1 " ) ;
79300		    station__name( 2 ,"provrum 2 " ) ;
79400		    station__name( 3,"""l{kare 1""") ;
79500		    station__name( 4,"""l{kare 2""") ;
79600		    begin__time(9.00);
79700		  END;
79800		END  OF  GPSSSO
79900	.page
80000	.lm 0
80100	.b 1
80200	.paper size 70,70
80300	
80400	***************************    -VERSION 4.1-
80500	***   MONTREAL  GPSSS   ***
80600	***  SIMULATION REPORT  ***
80700	***************************
80800	.b 2
80900	
81000	PASSE  =  1
81100	.b 2
81200	START  TIME=       09:00
81300	END    TIME=       17:14
81400	.b 2
81500	
81600	* STATIONS *
81700	************
81800	.b 1
81900	              AVERAGE                AVERAGE
82000	   STATION   UTILISATION  ENTRIES   TRANSIT TIME   STATUS
82100	.b 1
82200	      1         0.73         6        01:00        FREE
82300	      2         0.57         4        01:11        FREE
82400	      3         0.68         5        01:07        FREE
82500	      4         0.49         5        00:48        FREE
82600	.b 3
82700	
82800	
82900	* STORAGES *
83000	************
83100	.b 1
83200	                  AVG.     AVG.               THRU  TIME      CONTENTS
83300	STORAGE  CAPACITY CONTENTS  UTIL. ENTRIES      / UNIT       MAX    NOW
83400	.b 1
83500	   1       25       2.93  0.1170     10        02:25          6      0
83600	.b 3
83700	
83800	
83900	* QUEUES *
84000	**********
84100	.b 1
84200	                  MAX.     CURRENT     AVG.         AVG.
84300	QUEUE   ENTRIES  CONTENTS  CONTENTS  CONTENTS     TIME/TRANS
84400	.b 1
84500	   1      10         2         0       0.39         00:19
84600	   3      10         1         0       0.07         00:03