0

I was writing a First Come First Serve scheduling algorithm for OS161 on ubuntu 16

#FCFS code

#include <types.h>
#include <lib.h>
#include <machine/types.h>
#include <stdlib.h>
#include <FCFS.h> //custom header made by me

void enqueue(Queue *queue, int pid, int arrival_time, int burst_time) {
    Process *new_process = kmalloc(sizeof(Process));
    new_process->pid = pid;
    new_process->arrival_time = arrival_time;
    new_process->burst_time = burst_time;
    new_process->next = NULL;
    if (queue->head == NULL) {
        queue->head = new_process;
        queue->tail = new_process;
    } else {
        queue->tail->next = new_process;
        queue->tail = new_process;
    }
}

int dequeue(Queue *queue) {
    if (queue->head == NULL) {
        return -1;
    }
    int pid = queue->head->pid;
    Process *old_head = queue->head;
    queue->head = queue->head->next;
    if (queue->head == NULL) {
        queue->tail = NULL;
    }
    kfree(old_head);
    return pid;
}

void init_queue(Queue *queue) {
    queue->head = NULL;
    queue->tail = NULL;
}

double calculate_average_wait_time(Process *processes, int num_processes) {
    int current_time = 0;
    int total_wait_time = 0;
    Queue q;
    init_queue(&q);
    for (int i = 0; i < num_processes; i++) {
        int time_difference = processes[i].arrival_time - current_time;
        if (time_difference > 0) {
            current_time += time_difference;
        }
        enqueue(&q, processes[i].pid, processes[i].arrival_time, processes[i].burst_time);
        current_time += processes[i].burst_time;
        total_wait_time += current_time - processes[i].arrival_time - processes[i].burst_time;
    }
    return ((double) total_wait_time) / num_processes;
}

#FCFS.h

#ifndef FCFS_H
#define FCFS_H

typedef struct Process {
    int pid;
    int arrival_time;
    int burst_time;
    struct Process *next;
} Process;

typedef struct Queue {
    Process *head;
    Process *tail;
} Queue;

void enqueue(Queue *queue, int pid, int arrival_time, int burst_time);
int dequeue(Queue *queue);
void init_queue(Queue *queue);
double calculate_average_wait_time(Process *processes, int num_processes);

#endif

After adding the method to the main.c file under kmain

void
kmain(char *arguments)
{
    boot();
           Process process_list[5];
    int num_processes = 0;

    // Add code to populate the process_list and num_processes

    // Run your FCFS algorithm and store the result
    double average_wait_time = calculate_average_wait_time(process_list, num_processes);

    // Print the average wait time or perform any necessary actions
    kprintf("Average wait time: %f\n", average_wait_time);
    menu(arguments);

    /* Should not get here */
}

The error appeared full error

panic: Fatal exception 11 (Coprocessor unusable) in kernel mode

panic: EPC 0x8000d0cc, exception vaddr 0x0

panic: I can't handle this... I think I'll just die now...

sys161: trace: software-requested debugger stop

sys161: Waiting for debugger connection...

Nic3500
  • 8,144
  • 10
  • 29
  • 40
  • 1
    Does this answer your question? [Use of floating point in the Linux kernel](https://stackoverflow.com/questions/13886338/use-of-floating-point-in-the-linux-kernel) – Tsyvarev May 25 '23 at 20:31
  • You shouldn't use floating point operations in the kernel. – Tsyvarev May 25 '23 at 20:31

0 Answers0