/* A closed queueing network with multiserver CPU and disks */ # include "user.h" int nterm, ncpu, ndisk; double lambda, mucpu, mudisk, p1; parameters() { iopt(IOP_METHOD,VAL_SSSOR); iopt(IOP_PR_FULL_MARK,VAL_YES); iopt(IOP_PR_MARK_ORDER,VAL_CANONIC); iopt(IOP_PR_MC_ORDER,VAL_TOFROM); iopt(IOP_PR_MC,VAL_NO); iopt(IOP_MC,VAL_CTMC); iopt(IOP_PR_PROB,VAL_NO); iopt(IOP_PR_RSET,VAL_YES); iopt(IOP_PR_RGRAPH,VAL_YES); iopt(IOP_ITERATIONS,20000); fopt(FOP_ABS_RET_M0,0.0); fopt(FOP_PRECISION,0.00000001); nterm = input("number of terminals"); ncpu = input("number of CPUs"); ndisk = input("number of disks"); lambda = 5.0; mucpu = 50.0; mudisk = 20.0; p1 = 0.80; } rate_type rate_tcpu() { if ( mark("pcpuq") < ncpu ) return(mark("pcpuq")*mucpu); else return(ncpu*mucpu); } rate_type rate_tdisk() { if ( mark("pdq") < ndisk ) return(mark("pdq")*mudisk); else return(ndisk*mudisk); } net() { place("pterm"); init("pterm",nterm); place("pcpuq"); place("pbrch"); place("pdq"); trans("tterm"); trans("tcpu"); trans("tct"); priority("tct",100); trans("tcd"); priority("tcd",100); trans("tdisk"); ratedep("tterm",lambda,"pterm"); ratefun("tcpu",rate_tcpu); probval("tcd",p1); probval("tct",1.0 - p1); ratefun("tdisk",rate_tdisk); iarc("tterm","pterm"); oarc("tterm","pcpuq"); iarc("tcpu","pcpuq"); oarc("tcpu","pbrch"); iarc("tct","pbrch"); oarc("tct","pterm"); iarc("tcd","pbrch"); oarc("tcd","pdq"); iarc("tdisk","pdq"); oarc("tdisk","pcpuq"); } assert() { return(RES_NOERR); } ac_init() { fprintf(stderr,"\nCentral Server Model \n\n"); pr_net_info(); } ac_reach() { fprintf(stderr,"\nThe reachability graph has been generated\n\n"); pr_rg_info(); } reward_type avgcustcpu(){ return(mark("pcpuq"));} reward_type smcustcpu(){ return(mark("pcpuq")*mark("pcpuq"));} reward_type utilcpu(){ if(mark("pcpuq") > 0) return(1); else return(0); } reward_type tput_cpu() { return(rate("tcpu"));} reward_type avgcustdisk(){ return(mark("pdq"));} ac_final() { pr_expected("cpu queue length", avgcustcpu); pr_expected("Second moment, cpu queue length",smcustcpu); pr_value("Variance, cpu queue length", expected(smcustcpu) - expected(avgcustcpu)); pr_expected("utilization of cpu", utilcpu); pr_expected("throughput of cpu", tput_cpu); pr_expected("disk queue length", avgcustdisk); }