void allocate_page(void) { int req_pageno = vmem->adm.req_pageno; int frame = VOID_IDX; int page_removed_idx = VOID_IDX; if(vmem->pt.entries[req_pageno].flags & PTF_PRESENT) { // no page fault! return; } /* find free page */ frame = search_bitmap(); #ifdef DEBUG_MESSAGES printf("bitmap: frame %d\n", frame); #endif // DEBUG_MESSAGES if(frame != VOID_IDX) { fprintf(stderr, "Found free frame no %d, allocation page\n", frame); update_pt(frame); fetch_page(vmem->adm.req_pageno); } else { frame = find_remove_frame(); } /* TODO: impl stuff*/ page_removed_idx = vmem->pt.framepage[frame]; /* TODO: impl stuff*/ /* Store page to be removed and clear present-bit */ if(vmem->pt.entries[page_removed_idx].flags & PTF_DIRTY) { store_page(page_removed_idx); } vmem->pt.entries[page_removed_idx].flags &= ~PTF_PRESENT; /* Load new page */ update_pt(frame); fetch_page(vmem->adm.req_pageno); /* Update page fault counter */ vmem->adm.pf_count++; // log allocation struct logevent le; le.req_pageno = vmem->adm.req_pageno; le.replaced_page = page_removed_idx; le.alloc_frame = frame; le.pf_count = vmem->adm.pf_count; le.g_count = vmem->adm.g_count; logger(le); // unblock application sem_post(&(vmem->adm.sema)); }
void allocate_page(void) { int framenumb; vmem->adm.pf_count++; framenumb = find_free_frame(); // wenn alle Frames schon besetzt -> löschen ein frame if (framenumb == VOID_IDX) { framenumb = find_remove_frame(); } vmem->adm.next_alloc_idx = framenumb; update_pt(framenumb); // "Pagefault" note event.alloc_frame=vmem->adm.next_alloc_idx; event.g_count=vmem->adm.g_count; event.pf_count=vmem->adm.pf_count; event.req_pageno=vmem->adm.req_pageno; logger(event); }
void page_fault() { int page_unloaded = VOID_IDX; int new_frame = VOID_IDX; int req_page = vmem->adm.req_pageno; // Page fault aufgetreten DEBUG(fprintf(stderr, "Pagefault: Requested Page: %d\n", req_page)); vmem->adm.pf_count++; new_frame = find_remove_frame(); page_unloaded = vmem->pt.framepage[new_frame]; if( vmem_is_full() ) { store_page(page_unloaded); } update_pt(new_frame); fetch_page(req_page); // make Logs struct logevent le; le.req_pageno = vmem->adm.req_pageno; le.replaced_page = page_unloaded; le.alloc_frame = new_frame; le.pf_count = vmem->adm.pf_count; le.g_count = vmem->adm.pf_count; logger(le); DEBUG(fprintf(stderr, "Page loaded. pf_count=%d\n", vmem->adm.pf_count)); // Den aufrufenden Freigeben sem_post(&vmem->adm.sema); }