/* * task-1-29994705.c * * FIT2100 Assignment 2 for S2/2020 * * Alexander Occhipinti * Student ID: 29994705 * Created: 14 Oct 2020 * Modified: 19 Oct 2020 * * This is the source file for Task 1 of Assignment 2. * This program simulates a FCFS (first-come-first-serve) scheduler with at most 10 simulated processes. * These processes are read from file, simulated, then results are exported to "process-data.txt". * These results include wait time, turnaround time and whether the deadline was met for each process. * The purpose of this is to compare various scheduling algorithms. * */ #include #include #include #include #include "task-1-29994705.h" // NOTE: the structs provided in the assignment document are in the header file /* * Compares two pcb_t structs to determine the order between the two in a FCFS system. * This function is designed to interface with C's qsort function. * * Args: * pcb_a: any given process' PCB as a pcb_t * pcb_b: any given process' PCB as a pcb_t * * Returns (int): * -1 if pcb_a comes before b * 0 if both equal * 1 if pcb_a comes after b * */ int fcfs_compare(const void *pcb_a, const void *pcb_b) { pcb_t *pcb_x = (pcb_t *) pcb_a; pcb_t *pcb_y = (pcb_t *) pcb_b; return pcb_x->entryTime - pcb_y->entryTime; } /* * Reads and interprets a file containing process PCBs to simulate in the given format: * [Process Name] [Arrival Time] [Service Time] [Deadline] * separated by spaces. * Writes these PCBs to a given array via a pointer to be simulated later. * * Args: * file_path: the path to the input file * pcb_array: an array to write PCBs into * array_size: the size of the given PCB array * * Returns (int): * The number of PCBs actually read from the file. (May be less than the maximum array size) * */ int pcbs_from_file(char* file_path, pcb_t *pcb_array, int array_size) { FILE *fp; fp = fopen(file_path, "r"); int i; /* Read PCBs in from file until array is full or the file ends */ for (i = 0; istate == RUNNING) { if (--next_process->remainingTime == 0) { // Is there no remaining time left? next_process->state = EXIT; next_process->timeFinished = time; printf("Time %d: Process %s has finished executing.\n", time, next_process->process_name); next_process = &pcb_array[++procs_done]; // Change the current process to the next process along } } /* Checks if the current process ready for execution and sets its status to RUNNING */ if (next_process->state == READY) { next_process->state = RUNNING; next_process->timeStarted = time; printf("Time %d: Process %s is now running.\n", time, next_process->process_name); } // Sleep and continue to the next unit of time sleep(WAIT_PER_CYCLE); time++; } export_results(pcb_array, num_pcbs); } /* * The Main function, called when the program is started * Reads PCBs from file, simulates the scheduler on them, then exports the results. * * Interprets the following program arguments: * 0 args: runs with the DEFAULT_INPUT_PATH as the input file * 1 arg: (a path to a text file): exports the results to the given path */ int main(int argc, char *argv[]) { char in_path[MAX_PATH_SIZE] = DEFAULT_INPUT_PATH; // Initialise the PCB input file path to the default one if (argc > 1) strncpy(in_path, argv[1], MAX_PATH_SIZE); // Set the input path to the first argument if it was provided pcb_t pcb_array[MAX_NUM_PROCS]; // Init the array that will hold the PCBs int num_pcbs = pcbs_from_file(in_path, pcb_array, MAX_NUM_PROCS); // Read the PCBs from the provided file path, into the PCB array perform_fcfs_scheduling(pcb_array, num_pcbs); // Run the simulation on the read-in PCB array return 0; }