44 lines
1.0 KiB
C
44 lines
1.0 KiB
C
|
#include <stdlib.h>
|
||
|
#include <stdio.h>
|
||
|
|
||
|
#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)
|
||
|
{
|
||
|
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;
|
||
|
|
||
|
return p;
|
||
|
}
|
||
|
|
||
|
size_t PROCESS_run_for(struct Process *p, size_t time_bits)
|
||
|
{
|
||
|
for (size_t i = 0;
|
||
|
(i < time_bits) && (p->pages_accessed < p->max_accesses);
|
||
|
i++, p->pages_accessed++)
|
||
|
{
|
||
|
// no working set yet
|
||
|
int accessed_page_no = randint(p->total_pages_owned);
|
||
|
|
||
|
if (randint(10) > 7) {
|
||
|
printf("[process] Writing to page #%d\n", accessed_page_no);
|
||
|
MMU_write(p->pt, accessed_page_no);
|
||
|
} else {
|
||
|
printf("[process] Reading from page #%d\n", accessed_page_no);
|
||
|
MMU_read(p->pt, accessed_page_no);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return p->pages_accessed >= p->max_accesses;
|
||
|
}
|