spz-lab3/src/process.c

71 lines
1.7 KiB
C
Raw Normal View History

2025-03-06 21:50:29 +02:00
#include <stdlib.h>
#include <stdio.h>
#include "process.h"
#include "mmu.h"
#include "random.h"
#include "config.h"
2025-03-06 21:50:29 +02:00
struct Process *
2025-03-07 22:52:43 +02:00
Process(size_t proc_id, size_t max_accesses, size_t total_pages_owned, size_t ws_size)
2025-03-06 21:50:29 +02:00
{
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;
2025-03-07 22:52:43 +02:00
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);
2025-03-06 21:50:29 +02:00
return p;
}
size_t
PROCESS_run_for(struct Process *p, size_t time_bits)
2025-03-06 21:50:29 +02:00
{
if (!p) {
printf("[process ?] p == NULL, something is very wrong\n");
return 0;
}
2025-03-06 21:50:29 +02:00
for (size_t i = 0;
(i < time_bits) && (p->pages_accessed < p->max_accesses);
i++, p->pages_accessed++)
{
2025-03-07 22:52:43 +02:00
int accessed_page_no = randint(10) == 0
? randint(p->total_pages_owned)
: p->ws[randint(p->ws_size)];
2025-03-06 21:50:29 +02:00
if (randint(10) > 7) {
2025-03-06 23:05:21 +02:00
printf("[process %d] Writing to page #%d\n", p->id, accessed_page_no);
2025-03-06 21:50:29 +02:00
MMU_write(p->pt, accessed_page_no);
} else {
2025-03-06 23:05:21 +02:00
printf("[process %d] Reading from page #%d\n", p->id, accessed_page_no);
2025-03-06 21:50:29 +02:00
MMU_read(p->pt, accessed_page_no);
}
if (!randint(WS_CHANGE_INVERSE_CHANCE))
PROCESS_change_working_set(p);
2025-03-06 21:50:29 +02:00
}
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);
}