/* * CS560: Operating Systems * Jim Plank / Rich Wolski * printqsim.c -- Printer simulation driver program Modified for Kthreads */ #include #include "kt.h" #include "printqsim.h" void user_thread(void *v) { Spq *s; int i; int sleeptime; int jobsize; Job *j; s = (Spq *) v; for (i = 0; i < s->nevents; i++) { sleeptime = random()%(s->arrtime*2) + 1; printf("%4d: user %2d/%03d: Sleeping for %2d seconds\n", time(0)-s->starttime, s->id, i, sleeptime); fflush(stdout); kt_sleep(sleeptime); j = (Job *) malloc(sizeof(Job)); j->jobsize = (random()%s->maxpages) + 1; j->userid = s->id; j->jobid = i; printf("%4d: user %2d/%03d: Submitting a job with size %d\n", time(0)-s->starttime, s->id, i, j->jobsize); fflush(stdout); submit_job(s, j); } printf("%4d: user %2d/%03d: Done\n", time(0)-s->starttime, s->id, i); fflush(stdout); kt_exit(); } /* Assume 4 seconds a page */ void printer_thread(void *v) { Spq *s; int jobsize, userid, jobid; int i; Job *j; s = (Spq *) v; i = 0; while(1) { printf("%4d: prnt %2d/%03d: ready to print\n", time(0)-s->starttime, s->id, i); fflush(stdout); j = get_print_job(s); if (j == NULL) { printf("%4d: prnt %2d/%03d: Done\n", time(0)-s->starttime, s->id, i); fflush(stdout); kt_exit(); } printf("%4d: prnt %2d/%03d:", time(0)-s->starttime, s->id, i); printf(" Printing job %3d from user %2d size %3d\n", j->jobid, j->userid, j->jobsize); fflush(stdout); kt_sleep(4*j->jobsize); free(j); i++; } } main(int argc, char **argv) { Spq spq, *s; void **user_tids; void **printer_tids; int i; if (argc != 7) { fprintf(stderr, "usage: printqsim nusers nprinters arrtime maxpages bufsize nevents\n"); exit(1); } spq.nusers = atoi(argv[1]); spq.nprinters = atoi(argv[2]); spq.arrtime = atoi(argv[3]); spq.maxpages = atoi(argv[4]); spq.bufsize = atoi(argv[5]); spq.nevents = atoi(argv[6]); spq.starttime = time(0); srandom(spq.starttime); initialize_v(&spq); user_tids = (void **) malloc(sizeof(void *)*spq.nusers); printer_tids = (void **) malloc(sizeof(void *)*spq.nprinters); for (i = 0; i < spq.nusers; i++) { s = (Spq *) malloc(sizeof(Spq)); memcpy(s, &spq, sizeof(Spq)); s->id = i; user_tids[i] = kt_fork(user_thread, (void *) s); } for (i = 0; i < spq.nprinters; i++) { s = (Spq *) malloc(sizeof(Spq)); memcpy(s, &spq, sizeof(Spq)); s->id = i; printer_tids[i] = kt_fork(printer_thread, (void *) s); } kt_joinall(); exit(0); }