spz-lab3/src/process.c

71 lines
1.7 KiB
C

#include <stdlib.h>
#include <stdio.h>
#include "process.h"
#include "mmu.h"
#include "random.h"
#include "config.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);
}
if (!randint(WS_CHANGE_INVERSE_CHANCE))
PROCESS_change_working_set(p);
}
return p->pages_accessed >= p->max_accesses;
}
void
PROCESS_change_working_set(struct Process *p)
{
printf("[process %d] Changing working set after %d accesses\n", p->id, p->pages_accessed);
for (size_t i = 0; i < p->ws_size; i++)
p->ws[i] = randint(p->total_pages_owned);
}