c - Error running OPTIMAL algorithm -
****c:>pager_optimal test 100 file used fifo-test, resident set size 200
error restoring reference stream position error was:: invalid argument****/
pt_entry pte[max_page]; /* page table */ int mem_size; /* physical memory size in page frames */ list free_list_head; /* free list */ list res_set_head; /* resident set */ int total_fault = 0; /* total number of page faults */ int total_ref = 0; /* total number of memory references */ file *stream; int main(int argc, char *argv[]) { /* file *stream;*/ if (argc != 3) { printf("the format is: pager file_name memory_size.\n"); exit(1); } printf("file used %s, resident set size %d\n", argv[1], atoi(argv[2])); if ((stream = fopen(argv[1], "r")) == null) { perror("file open failed"); exit(1); } if( max_page >= (mem_size = atoi(argv[2])) ) { /* fine can go ahead */ start_simulation(); } else { printf ("\n\n\a\a\a******************************\n"); printf("***************************************************\n"); printf("** **\n"); printf("** error: **\n"); printf("** **\n"); printf("** attempting use resident set size **\n"); printf("** larger address space! **\n"); printf("** **\n"); printf("** maximum address space size is: %-4d **\n",max_page); printf("** **\n"); printf("***************************************************\n"); printf("***************************************************\n\n\n"); } fclose(stream); return 0; } void start_simulation(/*file * stream*/void) { /*char *addr_buf;not used removed --ec*/ int address; int i, n; list new_entry, current; /* initialise page table */ for(i=0; i<max_page;i++) { pte[i].frame = -1; pte[i].valid = 0; pte[i].dirty = 0; pte[i].in_mem = 0; pte[i].next_ref=-1; } /* initialise resident set - empty*/ res_set_head = (list)malloc(sizeof(struct list_item)); res_set_head->next = res_set_head; res_set_head->prev = res_set_head; /* initialise free list - physical pages*/ free_list_head = (list)malloc(sizeof(struct list_item)); free_list_head->next = free_list_head; free_list_head->prev = free_list_head; current = free_list_head; for(i=0; i<mem_size;i++) { new_entry = (list)malloc(sizeof(struct list_item)); current->next = new_entry; new_entry->prev = current; new_entry->next = free_list_head; new_entry->frame = i; current = new_entry; free_list_head->prev = current; } /* main simulation loop */ while( (n = fscanf(stream, "%x", &address)) != -1) { #ifdef debug2 printf("reference %i -------------\n",total_ref); #endif resolve(address); total_ref++; } free_mem(free_list_head); free_mem(res_set_head); display_stats(); return; } void resolve(int address) { unsigned short frame_alloc; int virt_page,i; /*static int disp_counter = 0;not used removed -ec*/ virt_page = address >> 8; if (pte[virt_page].valid == 1) { pte[virt_page].next_ref=distance_to_next_ref(virt_page); #ifdef debug2 printf("page %i valid, next reference is: %i\n",virt_page,pte [virt_page].next_ref); #endif } else { frame_alloc = find_frame(); pte[virt_page].valid = 1; pte[virt_page].frame = frame_alloc; total_fault++; pte[virt_page].next_ref=distance_to_next_ref(virt_page); #ifdef debug2 printf("page %i being loaded, next reference is: %i\n",virt_page,pte [virt_page].next_ref); #endif } for(i=0;i<max_page;i++) { if (pte[i].valid) pte[i].next_ref--; //if(pte[i].next_ref<=0) pte[i].next_ref=distance_to_next_ref(i); /* if page valid update next ref time */ } } unsigned short find_frame() { unsigned short frame; list current, new_tail; if (free_list_head == free_list_head->prev) /* free list empty */ { #ifdef debug printf("free list empty finding frame\n"); #endif frame = find_victim(); } else { #ifdef debug printf("free list not empty grabbing frame\n"); #endif new_tail = free_list_head->prev->prev; new_tail->next = free_list_head; current = free_list_head->prev; free_list_head->prev = new_tail; to_resident_set(current); frame = current->frame; } return frame; } void to_resident_set(list current) { list tail; tail = res_set_head->prev; tail->next = current; current->next = res_set_head; current->prev = tail; res_set_head->prev = current; } unsigned short find_victim() { int candidate,frame=-1,most_far=0,page; for(candidate=0;candidate<max_page;candidate++) { if(pte[candidate].valid==1) { #ifdef debug printf("\tvalid page %i being examined, next reference is: %i\n",candidate,pte [candidate].next_ref); printf("pt entry:\n\t\tframe: %d\n\t\tvalid: %d\n\t\tin_mem %d\n\t\tdirty: % d\n\t\tnext ref %d\n",pte[candidate].frame,pte[candidate].valid,pte [candidate].in_mem,pte[candidate].dirty,pte[candidate].next_ref); #endif if( (pte[candidate].next_ref) < 0 ) { #ifdef debug printf("\t\t< 0 page %i being examined, next reference is: %i\n",candidate,pte [candidate].next_ref); #endif pte[candidate].valid=0; frame = pte[candidate].frame; pte[candidate].frame=-1; return frame; } #ifdef debug printf("middle page %i\n",candidate); #endif if(most_far < (pte[candidate].next_ref) ) { #ifdef debug printf("\t\t> mf page %i being examined, next reference is: %i\n",candidate,pte [candidate].next_ref); #endif frame=pte[candidate].frame; most_far=pte[candidate].next_ref; } #ifdef debug printf("ending page %i\n",candidate); #endif } } invalidate(frame); return frame; } void invalidate(unsigned short frame) { int i; for(i=0;i<max_page;i++) { if (pte[i].frame == frame && pte[i].valid == 1) { pte[i].valid = 0; pte[i].frame = -1; #ifdef debug printf("page %i being evicted next ref is: %i\n",i,pte [i].next_ref); #endif break; } } } void display_stats() { printf("\nprocess issued %d memory references\n", total_ref); printf("process triggered %d page faults\n", total_fault); printf("page fault rate %d percent\n",((total_fault*100)/total_ref)); } void free_mem(list head) { list current,tail; tail = head->prev; current = head; while (current->prev != tail) { current = current->next; free(current->prev); } } /* finds distance next ref, returns -1 if never referenced again */ int distance_to_next_ref(int frame) { long pos; int n,count; int address,page; if((pos=ftell(stream))==-1) { printf("error saving reference stream position\n"); perror("error was"); fclose(stream); exit(1); } count=0; while( (n = fscanf(stream, "%x", &address)) != -1) { count++; page=address>>8; if(page==frame) { if((fseek(stream,pos,seek_set))==-1) { printf("error restoring reference stream position\n"); perror("error was:"); fclose(stream); } return count; } } if((fseek(stream,pos,seek_set))==-1) { printf("error restoring reference stream position\n"); perror("error was:"); fclose(stream); } return -1; }
replace two printfs with
printf("error restoring reference stream position @ line %d\n", __line__);
i suspect error not come thing comes from.
Comments
Post a Comment