Пример #1
0
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));
}
Пример #2
0
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);
}
Пример #3
0
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);
}