#include #include #include "process.h" #include "mmu.h" #include "random.h" struct Process * Process(size_t proc_id, size_t max_accesses, size_t total_pages_owned, size_t ws_size) { struct Process *p = malloc(sizeof(struct Process)); p->id = proc_id; p->max_accesses = max_accesses; p->pages_accessed = 0; p->total_pages_owned = total_pages_owned; p->pt = malloc(sizeof(struct PageTableEntry) * total_pages_owned); for (size_t i = 0; i < p->total_pages_owned; i++) p->pt[i].p = 0; p->ws_size = ws_size; p->ws = malloc(sizeof(size_t) * ws_size); for (size_t i = 0; i < ws_size; i++) p->ws[i] = randint(total_pages_owned); return p; } size_t PROCESS_run_for(struct Process *p, size_t time_bits) { if (!p) { printf("[process ?] p == NULL, something is very wrong\n"); return 0; } for (size_t i = 0; (i < time_bits) && (p->pages_accessed < p->max_accesses); i++, p->pages_accessed++) { int accessed_page_no = randint(10) == 0 ? randint(p->total_pages_owned) : p->ws[randint(p->ws_size)]; if (randint(10) > 7) { printf("[process %d] Writing to page #%d\n", p->id, accessed_page_no); MMU_write(p->pt, accessed_page_no); } else { printf("[process %d] Reading from page #%d\n", p->id, accessed_page_no); MMU_read(p->pt, accessed_page_no); } } return p->pages_accessed >= p->max_accesses; }