int *run(int npages, int nframes, page_fault_handler_t handler, void (*program)(char *, int)) { int i; page_algo_handler = handler; disk = disk_open("myvirtualdisk",npages); if(!disk) { fprintf(stderr,"couldn't create virtual disk: %s\n",strerror(errno)); exit(EXIT_FAILURE); } struct page_table *pt = page_table_create( npages, nframes, page_fault_handler ); if(!pt) { fprintf(stderr,"couldn't create page table: %s\n",strerror(errno)); exit(EXIT_FAILURE); } fi = 0; disk_reads = 0; disk_writes = 0; page_faults = 0; // Init frame table ft = malloc(nframes * sizeof(int)); for (i = 0; i < nframes; ++i) { ft[i] = -1; } char *virtmem = page_table_get_virtmem(pt); physmem = page_table_get_physmem(pt); program(virtmem,npages*PAGE_SIZE); printf("Disk writes: %d\n", disk_writes); printf("Disk reads: %d\n", disk_reads); printf("Page faults: %d\n", page_faults); free(ft); page_table_delete(pt); disk_close(disk); int *stats = malloc(sizeof(int) * 3); stats[0] = disk_reads; stats[1] = disk_writes; stats[2] = page_faults; return stats; }
int main( int argc, char *argv[] ) { // handle input if(argc!=5) { printf("use: virtmem <npages> <nframes> <rand|fifo|custom> <sort|scan|focus>\n"); return 1; } int npages = atoi(argv[1]); int nframes = atoi(argv[2]); char *page_replacement = argv[3]; const char *program = argv[4]; if (!strcmp(page_replacement,"rand")){ page_rep_choice = 0; } else if(!strcmp(page_replacement,"fifo")){ page_rep_choice = 1; } else if(!strcmp(page_replacement,"custom")){ page_rep_choice = 2; } else{ printf("Choose rand, fifo, or custum\n"); return 1; } // create new virtual disk with pointer to the disk object struct disk *disk = disk_open("myvirtualdisk",npages); if(!disk) { fprintf(stderr,"couldn't create virtual disk: %s\n",strerror(errno)); return 1; } // create page table with pointer to page table // includes virtual memory and physical memory struct page_table *pt = page_table_create( npages, nframes, page_fault_handler ); if(!pt) { fprintf(stderr,"couldn't create page table: %s\n",strerror(errno)); return 1; } // return pointer to start of virtual memory char *virtmem = page_table_get_virtmem(pt); // return pointer to start of physical memory char *physmem = page_table_get_physmem(pt); // calls page_fault_handler // call one of the algorithms if(!strcmp(program,"sort")) { sort_program(virtmem,npages*PAGE_SIZE); } else if(!strcmp(program,"scan")) { scan_program(virtmem,npages*PAGE_SIZE); } else if(!strcmp(program,"focus")) { focus_program(virtmem,npages*PAGE_SIZE); } else { fprintf(stderr,"unknown program: %s\n",argv[3]); } page_table_print(pt); // clean up page_table_delete(pt); disk_close(disk); return 0; }
int main( int argc, char *argv[] ) { if(argc!=5) { printf("use: virtmem <npages> <nframes> <rand|fifo|custom> <sort|scan|focus>\n"); return 1; } npages = atoi(argv[1]); nframes = atoi(argv[2]); const char *algorithm = argv[3]; const char *program = argv[4]; loaded_pages = malloc(sizeof(int) * nframes); int i; for(i = 0; i < nframes; i++) { /* indicate that there is no pages loaded yet */ loaded_pages[i] = -1; } disk = disk_open("myvirtualdisk",npages); if(!disk) { fprintf(stderr,"couldn't create virtual disk: %s\n",strerror(errno)); return 1; } struct page_table *pt = page_table_create( npages, nframes, page_fault_handler ); if(!pt) { fprintf(stderr,"couldn't create page table: %s\n",strerror(errno)); return 1; } char *virtmem = page_table_get_virtmem(pt); physmem = page_table_get_physmem(pt); if(!strcmp(algorithm, "rand")) { pageswap = 0; } else if(!strcmp(algorithm, "fifo")) { pageswap = 1; fifo_counter = 0; } else if(!strcmp(algorithm, "custom")) { pageswap = 2; fifo_counter = 0; clock = malloc(sizeof(int) * nframes); for(i = 0; i < nframes; i++) { clock[i] = 0; } } else if(!strcmp(algorithm, "custom2")) { pageswap = 3; clock = malloc(sizeof(int) * nframes); for(i = 0; i < nframes; i++) { clock[i] = 0; } } else { fprintf(stderr,"unknown algorithm: %s\n",argv[2]); } if(!strcmp(program,"sort")) { sort_program(virtmem,npages*PAGE_SIZE); } else if(!strcmp(program,"scan")) { scan_program(virtmem,npages*PAGE_SIZE); } else if(!strcmp(program,"focus")) { focus_program(virtmem,npages*PAGE_SIZE); } else { fprintf(stderr,"unknown program: %s\n",argv[3]); } printf("Faults: %d Reads: %d Writes: %d\n", fault_counter, read_count, write_count); page_table_delete(pt); disk_close(disk); return 0; }