diff --git a/Assignment5/.idea/runConfigurations/Assignment5_Input_1.xml b/Assignment5/.idea/runConfigurations/Assignment5_Input_1.xml new file mode 100644 index 0000000..c22bc64 --- /dev/null +++ b/Assignment5/.idea/runConfigurations/Assignment5_Input_1.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/Assignment5/CMakeLists.txt b/Assignment5/CMakeLists.txt index f3d4026..5e4e7ce 100644 --- a/Assignment5/CMakeLists.txt +++ b/Assignment5/CMakeLists.txt @@ -4,4 +4,4 @@ project(Assignment5 C) set(CMAKE_C_STANDARD 99) include_directories(lib) -add_executable(Assignment5 round_robin.c lib/queue.c lib/process.c) +add_executable(Assignment5 hard_affinity.c lib/queue.c lib/process.c) diff --git a/Assignment5/documentation/a5_sample_input_1.txt b/Assignment5/documentation/a5_sample_input_1.txt index b408d2f..6c15b97 100644 --- a/Assignment5/documentation/a5_sample_input_1.txt +++ b/Assignment5/documentation/a5_sample_input_1.txt @@ -1,7 +1,7 @@ 1 3 User Process Arrival Duration -Jim A 2 5 -Mary B 2 2 -Sue C 5 5 -Mary D 6 2 +Jim A 2 5 +Mary B 2 2 +Sue C 5 5 +Mary D 6 2 \ No newline at end of file diff --git a/Assignment5/round_robin.c b/Assignment5/hard_affinity.c similarity index 69% rename from Assignment5/round_robin.c rename to Assignment5/hard_affinity.c index 6904737..5f817c0 100644 --- a/Assignment5/round_robin.c +++ b/Assignment5/hard_affinity.c @@ -1,35 +1,59 @@ #include +#include #include "lib/queue.h" #define MAX_USERNAME_LENGTH 100 int QUANTUM; +int CPUS; Queue *input_queue() { Queue *queue = createQueue(); char username[MAX_USERNAME_LENGTH]; // username buffer char job; - int arrival_time, duration; + int arrival_time, duration, affinity; scanf("%d", &QUANTUM); while (getchar() != '\n'); // clear the newline from the buffer - while (getchar() != '\n'); // ignore the rest of the line, this is the table line + scanf("%d", &CPUS); + while (getchar() != '\n'); // clear the newline from the buffer + + while (getchar() != '\n'); // ignore the rest of the line, this is the table line // Loop through the process table and enqueue each process - while (scanf("%99s %c %d %d", username, &job, &arrival_time, &duration) != EOF) { - Process *process = createProcess(username, job, arrival_time, duration); + while (scanf("%99s %c %d %d %d", username, &job, &arrival_time, &duration, &affinity) != EOF) { + Process *process = createProcess(username, job, arrival_time, duration, affinity); enqueue(queue, process); } return queue; } +void* print(void *print_queue_void) { + // Cast the input queue to a Queue pointer + Queue *print_queue = (Queue*) print_queue_void; -void simulation(Queue *in_queue) { - // Summary creation + // Print the Time label as well as the CPU labels + printf("Time"); + for (int i = 0; i < CPUS; i++) { + printf("\tCPU%d", i); + } + printf("\n"); + + + + +} + + +void* simulation(void *in_queue_void) { + // Cast the input queue to a Queue pointer + Queue *in_queue = (Queue*) in_queue_void; + + // Summary creation Process *process = in_queue->end; Queue *summary_queue = createQueue(); for (int i = 0; i < in_queue->size; ++i) { if (contains(summary_queue, process->username) == false) { - Process *copy = createProcess(process->username, process->job, process->arrival_time, process->duration); + Process *copy = createProcess(process->username, process->job, process->arrival_time, process->duration, process->affinity); enqueue(summary_queue, copy); } process = process->prev_elem; @@ -51,7 +75,7 @@ void simulation(Queue *in_queue) { for (int i = 0; i < in_queue->size; i++) { if (process->arrival_time == time) { // Create copy to keep the queues separate - Process *copy = createProcess(process->username, process->job, process->arrival_time, process->duration); + Process *copy = createProcess(process->username, process->job, process->arrival_time, process->duration, process->affinity); enqueue(sim_queue, copy); addedJobs++; } @@ -95,7 +119,24 @@ void simulation(Queue *in_queue) { int main() { Queue *in_queue = input_queue(); // Create the input queue - simulation(in_queue); // Run simulation on input queue + Queue *print_queue = createQueue(); // Create the print queue + + // Create the print thread + pthread_t print_thread; + pthread_create(&print_thread, NULL, &print, print_queue); + + // Create the simulation threads + pthread_t threads[CPUS]; + for (int i = 0; i < CPUS; i++) { + pthread_create(&threads[i], NULL, &simulation, in_queue); + } + + // This should make sure all threads are done simulating, as the print function exits after simulation is done + pthread_join(print_thread, NULL); + // Just to make sure all threads are done + for (int i = 0; i < CPUS; i++) { + pthread_join(threads[i], NULL); + } stop(in_queue); // Free memory for input queue return 0; } diff --git a/Assignment5/lib/process.c b/Assignment5/lib/process.c index 5e7215a..91ce241 100644 --- a/Assignment5/lib/process.c +++ b/Assignment5/lib/process.c @@ -5,7 +5,7 @@ //Assume that the string passed in is null terminated -Process *createProcess(char *username, char job, int arrival_time, int duration) { +Process *createProcess(char *username, char job, int arrival_time, int duration, int affinity) { // Allocate memory for the process, and check if it was successful Process *node = calloc(1, sizeof(Process)); if (node == NULL) { @@ -26,6 +26,9 @@ Process *createProcess(char *username, char job, int arrival_time, int duration) node->arrival_time = arrival_time; node->duration = duration; node->next_elem = NULL; + node->prev_elem = NULL; + node->finish_time = 0; + node->affinity = affinity; return node; } diff --git a/Assignment5/lib/process.h b/Assignment5/lib/process.h index 8823493..f102aa9 100644 --- a/Assignment5/lib/process.h +++ b/Assignment5/lib/process.h @@ -9,9 +9,10 @@ typedef struct Process { int arrival_time; int duration; int finish_time; + int affinity; } Process; -Process *createProcess(char *username, char job, int arrival_time, int duration); +Process *createProcess(char *username, char job, int arrival_time, int duration, int affinity); void destroyProcess(Process *node); diff --git a/Assignment5/lib/queue.c b/Assignment5/lib/queue.c index 1aeea01..71314c0 100644 --- a/Assignment5/lib/queue.c +++ b/Assignment5/lib/queue.c @@ -71,6 +71,7 @@ Process *dequeue(Queue *queue) { queue->size--; return temp; } + void printList(Queue *queue) { Process *current = queue->end; while (current != NULL) { diff --git a/Assignment5/main.c b/Assignment5/main.c deleted file mode 100644 index ef66efb..0000000 --- a/Assignment5/main.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -int main() { - printf("Hello, World!\n"); - return 0; -}