/* this program is to simulate a homogenerous parallel fork join queueing system */ #include "cpp.h" #define MAX_NUM_SERVER 20 facility_set server ("server", MAX_NUM_SERVER); event global_done ("global_done"); table response_time_tbl("rt_tbl"); /* store average response time of job */ int num_server; /* number of parallel servers */ int total_job; /* number of job to simulate */ long int N=0; /* total number of job completed */ float arrival_rate; /* job arrrival rate */ float service_rate; /* each task's service rate */ void input(); void generate_job(); void job(); void task(int i, event *ev); extern "C" void sim(int, char **); void sim(int argc, char *argv[]) { int m_e, m_p; set_model_name("fork_join"); create("sim"); m_e = max_events(5000); m_p = max_processes(5000); input(); /* input information */ generate_job(); /* create job */ global_done.wait(); report(); } void input() { printf("input number of parallel servers\n"); scanf("%d", &num_server); printf("input job arrival rate and task service rate\n"); scanf("%f %f", &arrival_rate, &service_rate); printf("input total number of jobs to simulate:\n"); scanf("%d", &total_job); if (num_server > MAX_NUM_SERVER){ printf("num_server > MAXIMUM allowed\n"); exit(0); } if (num_server < 1){ printf("num_server should be >= 2\n"); exit(1); } } void generate_job() { int i; float rate; create("gen_job"); for (i=1; i <= total_job + 50; i++) { hold(expntl(1.0/arrival_rate)); job(); } } void job() { double t1; int i, count; create("job"); event task_done_event("task_done"); /* create event for task synchronization */ count = 0; t1 = clock; for (i=0; i < num_server; i++) /* fork tasks */ task(i, &task_done_event); while (count != num_server) { /* wait for all task to complete */ task_done_event.clear(); task_done_event.wait(); count++; } /* job is done */ response_time_tbl.record(clock - t1); N++; if ( N == total_job) /* tell sim() the end of simulation */ global_done.set(); } void task(int i, event *task_done_event) { create("task"); server[i].reserve() ; /* task is assigned to server i */ hold (expntl(1.0/service_rate)); server[i].release(); task_done_event->set(); }