diff --git a/Assignment4/.idea/.gitignore b/Assignment4/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/Assignment4/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/Assignment4/.idea/Assignment4.iml b/Assignment4/.idea/Assignment4.iml new file mode 100644 index 0000000..f08604b --- /dev/null +++ b/Assignment4/.idea/Assignment4.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Assignment4/.idea/codeStyles/codeStyleConfig.xml b/Assignment4/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..a55e7a1 --- /dev/null +++ b/Assignment4/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/Assignment4/.idea/misc.xml b/Assignment4/.idea/misc.xml new file mode 100644 index 0000000..79b3c94 --- /dev/null +++ b/Assignment4/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Assignment4/.idea/modules.xml b/Assignment4/.idea/modules.xml new file mode 100644 index 0000000..112b71c --- /dev/null +++ b/Assignment4/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/Assignment4/.idea/vcs.xml b/Assignment4/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/Assignment4/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Assignment4/CMakeLists.txt b/Assignment4/CMakeLists.txt new file mode 100644 index 0000000..204584b --- /dev/null +++ b/Assignment4/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.22) +project(Assignment4 C) + +set(CMAKE_C_STANDARD 99) + +add_executable(Assignment4 + round_robin.c + lib/queue.h + lib/queue.c + lib/process.h + lib/process.c +) diff --git a/Assignment4/documentation/Assignment 4-v2.pdf b/Assignment4/documentation/Assignment 4-v2.pdf new file mode 100644 index 0000000..9560c23 Binary files /dev/null and b/Assignment4/documentation/Assignment 4-v2.pdf differ diff --git a/Assignment4/documentation/a4_sample_input_1.txt b/Assignment4/documentation/a4_sample_input_1.txt new file mode 100644 index 0000000..249e5e4 --- /dev/null +++ b/Assignment4/documentation/a4_sample_input_1.txt @@ -0,0 +1,6 @@ +3 +User Process Arrival Duration +Jim A 2 5 +Mary B 2 2 +Sue C 5 5 +Mary D 6 2 diff --git a/Assignment4/documentation/a4_sample_input_2.txt b/Assignment4/documentation/a4_sample_input_2.txt new file mode 100644 index 0000000..8d886da --- /dev/null +++ b/Assignment4/documentation/a4_sample_input_2.txt @@ -0,0 +1,7 @@ +3 +User Process Arrival Duration +Jim A 2 5 +Mary B 2 2 +Mary D 6 2 +Sue C 7 5 +Hassan E 22 3 diff --git a/Assignment4/documentation/a4_sample_output_1.txt b/Assignment4/documentation/a4_sample_output_1.txt new file mode 100644 index 0000000..ac3d5d0 --- /dev/null +++ b/Assignment4/documentation/a4_sample_output_1.txt @@ -0,0 +1,22 @@ +Time Job +1 - +2 A +3 A +4 A +5 B +6 B +7 A +8 A +9 C +10 C +11 C +12 D +13 D +14 C +15 C +16 - + +Summary +Jim 8 +Mary 13 +Sue 15 diff --git a/Assignment4/documentation/a4_sample_output_2.txt b/Assignment4/documentation/a4_sample_output_2.txt new file mode 100644 index 0000000..892ad91 --- /dev/null +++ b/Assignment4/documentation/a4_sample_output_2.txt @@ -0,0 +1,32 @@ +Time Job +1 - +2 A +3 A +4 A +5 B +6 B +7 A +8 A +9 D +10 D +11 C +12 C +13 C +14 C +15 C +16 - +17 - +18 - +19 - +20 - +21 - +22 E +23 E +24 E +25 - + +Summary +Jim 8 +Mary 10 +Sue 15 +Hassan 24 diff --git a/Assignment4/lib/process.c b/Assignment4/lib/process.c new file mode 100644 index 0000000..5e7215a --- /dev/null +++ b/Assignment4/lib/process.c @@ -0,0 +1,36 @@ +#include +#include +#include +#include "process.h" + +//Assume that the string passed in is null terminated + +Process *createProcess(char *username, char job, int arrival_time, int duration) { + // Allocate memory for the process, and check if it was successful + Process *node = calloc(1, sizeof(Process)); + if (node == NULL) { + printf("Error allocating memory for process\n"); + exit(EXIT_FAILURE); + } + // Free the data first, then allocate memory for the new data + node->username = calloc(strlen(username) + 1, sizeof(char)); + if (node->username == NULL) { + printf("Error allocating memory for username data\n"); + exit(EXIT_FAILURE); + } + // Copy data from the string passed in to the process's data + // Makes sure if the string passed in is changed, the process's data is not changed + // Also makes sure that if the data is on the stack, it is not freed at some other point + strcpy(node->username, username); + node->job = job; + node->arrival_time = arrival_time; + node->duration = duration; + node->next_elem = NULL; + return node; +} + +void destroyProcess(Process *node) { + // Free the data first, then free the process + free(node->username); + free(node); +} diff --git a/Assignment4/lib/process.h b/Assignment4/lib/process.h new file mode 100644 index 0000000..e4bba60 --- /dev/null +++ b/Assignment4/lib/process.h @@ -0,0 +1,17 @@ +#ifndef NODE_H +#define NODE_H + +typedef struct Process { + struct process *prev_elem; + struct process *next_elem; + char *username; + char job; + int arrival_time; + int duration; +} Process; + +Process *createProcess(char *username, char job, int arrival_time, int duration); + +void destroyProcess(Process *node); + +#endif //NODE_H diff --git a/Assignment4/lib/queue.c b/Assignment4/lib/queue.c new file mode 100644 index 0000000..a11a0d9 --- /dev/null +++ b/Assignment4/lib/queue.c @@ -0,0 +1,109 @@ +#include +#include +#include +#include +#include +#include "process.h" +#include "queue.h" + +/* + * Queue implementation + * 5 4 3 2 1 + * START END + * + * If you were to visualize the queue as a line, the end is the first person in line and the start is the last person in line + * So when you enqueue, you are adding to the start of the line + * And when you dequeue, you are exiting from the end of the line + */ + +//TODO: Refactor +int contains(Queue *queue, char *job) { + Process *current = queue->start; + while (current != NULL) { + if (strcmp(current->username, job) == 0) { + return true; + } + current = current->next_elem; + } + return false; +} + +//TODO: Refactor +Process *search(Queue *queue, char *job) { + Process *current = queue->start; + + while (current != NULL) { + if (strcmp(current->username, job) == 0) { + return current; + } + current = current->next_elem; + } + return NULL; +} + + +void enqueue(Queue *queue, Process *process) { + if (queue->end == NULL) { // If the queue is empty, set the start and end to the new process + queue->end = process; + queue->start = queue->end; + } else { + process->next_elem = queue->start; // Set the next element of the new process to the start of the queue + queue->start->prev_elem = process; // Set the previous element of the start of the queue to the new process + queue->start = process; // Set the start of the queue to the new process + } + queue->size++; +} + + +// WARNING: Returns a pointer to a process that is not in the queue, it is your responsibility to free it +Process *dequeue(Queue *queue) { + if (queue->end == NULL) { // If the queue is empty, return NULL + return NULL; + } + Process *temp = queue->end; // Store the end of the queue for returning later + + queue->end = queue->end->prev_elem; // Set the end to the previous element + queue->end->next_elem = NULL; // Set the next element of the new end to NULL + + if (queue->end == NULL) { // If the queue is empty, set the start to NULL + queue->start = NULL; + } + + temp->prev_elem = NULL; // The dequeued element should not point to anything + queue->size--; + return temp; +} + +//TODO: Refactor +void printList(Queue *queue) { + Process *current = queue->start; + while (current != NULL) { + // printf("%s %d\n", current->username, current->duration); + current = current->next_elem; + } +} + +//TODO: Refactor +int stop(Queue *queue) { + Process *current = queue->end; + while (current != NULL) { + Process *next = current->prev_elem; + destroyProcess(current); + current = next; + } + free(queue); + return true; +} + +Queue *createQueue() { + Queue *queue = calloc(1, sizeof(Queue)); + if (queue == NULL) { + printf("Error allocating memory for queue\n"); + exit(EXIT_FAILURE); + } + queue->start = NULL; + queue->end = NULL; + queue->size = 0; + return queue; +} + diff --git a/Assignment4/lib/queue.h b/Assignment4/lib/queue.h new file mode 100644 index 0000000..37dca9d --- /dev/null +++ b/Assignment4/lib/queue.h @@ -0,0 +1,27 @@ +#ifndef QUEUE_H +#define QUEUE_H + +#include +#include "process.h" + +typedef struct Queue { + Process *start; + Process *end; + int size; +} Queue; + +int contains(Queue *queue, char *job); + +Process *search(Queue *queue, char *job); + +void enqueue(Queue *queue, Process *process); + +Process *dequeue(Queue *queue); + +void printList(Queue *queue); + +int stop(Queue *queue); + +Queue* createQueue(); + +#endif //QUEUE_H diff --git a/Assignment4/round_robin.c b/Assignment4/round_robin.c new file mode 100644 index 0000000..064f450 --- /dev/null +++ b/Assignment4/round_robin.c @@ -0,0 +1,53 @@ +#include +#include "lib/queue.h" + +#define MAX_USERNAME_LENGTH 100 +int QUANTUM; + +typedef struct Summary { + char username[MAX_USERNAME_LENGTH]; + int last_time; +} Summary; + +Queue* input_queue() { + Queue* queue = createQueue(); + + scanf("%d", &QUANTUM); + char username[MAX_USERNAME_LENGTH]; + char job; + int arrival_time, duration; + while(scanf("%s100 %c %d %d", username, &job, &arrival_time, &duration) != EOF) { + Process *process = createProcess(username, job, arrival_time, duration); + enqueue(queue, process); + } + return queue; +} + + +void simulation(Queue* queue) { + printf("Time\tJob\n"); + int time = 0; + Queue *sim_queue = createQueue(); + + //Take note of all usernames at the start, and then create an array of summary + //When a job finishes, take note of its username, and then go through the array of summary and find the username + //Once you find the username, assign the last_time to the current time. + //TODO: May need to change as the summary should be sorted by username arrival time + + //Go through list and check for arrival times at current time + //If arrival time is at current time, add to sim_queue + //If there is nothing in sim_queue, print - + //If there is something in sim queue, store the process in a variable, so we can check the quantum + //If the quantum is 0, then we need to dequeue the process and enqueue it again + //If the quantum is not 0, then we need to print the process and decrement the quantum + //If the process is done, then we need to print the process and dequeue it + //If the process is not done, then we need to print it and leave the queue alone + //Once we reach the point where time is greater than the last arrival time, we need to check if sim_queue is empty + //Once sim_queue is empty, we need to break out of the loop + + +} + +int main() { + Queue* input = input_queue(); +}