71 lines
1.7 KiB
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);
|
|
}
|