From 7035f119a8984e758e0816a0638b6daa2a708b46 Mon Sep 17 00:00:00 2001 From: cdez Date: Wed, 13 Mar 2024 15:27:58 -0700 Subject: [PATCH] Starting work on Simulator 3, SJF works-ish... +- config0.cnf (SJF mode) +- simulator.c/h +- sim03 --- Sim03/config0.cnf | 2 +- Sim03/logfile_1.lgf | 3 +- Sim03/sim03 | Bin 0 -> 66616 bytes Sim03/simulator.c | 78 +++++++++++++++++++++++++++++++++++++++++--- Sim03/simulator.h | 12 +++++++ 5 files changed, 87 insertions(+), 8 deletions(-) create mode 100755 Sim03/sim03 diff --git a/Sim03/config0.cnf b/Sim03/config0.cnf index 08f2bfd..9404729 100644 --- a/Sim03/config0.cnf +++ b/Sim03/config0.cnf @@ -1,7 +1,7 @@ Start Simulator Configuration File: Version/Phase : 1.05 File Path : metadata5.mdf -CPU Scheduling Code : FCFS-N +CPU Scheduling Code : SJF-N Quantum Time (cycles) : 3 Memory Available (KB) : 11100 Memory Display (On/Off) : On diff --git a/Sim03/logfile_1.lgf b/Sim03/logfile_1.lgf index 52b0e91..91abba2 100644 --- a/Sim03/logfile_1.lgf +++ b/Sim03/logfile_1.lgf @@ -1,7 +1,6 @@ -0.000000, OS: Simulator start +0.000001, OS: Simulator start READY state from NEW state ate ate - diff --git a/Sim03/sim03 b/Sim03/sim03 new file mode 100755 index 0000000000000000000000000000000000000000..b640cd6f1fca192f8320369e9ebc17912395137f GIT binary patch literal 66616 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 WTe*hF;r1ZuniquePid == currentPid) { // needs to set from READY to RUNNING - pcbPtr->process_state = PROCESS_STATE_READY; + pcbPtr->process_state = PROCESS_STATE_RUNNING; sprintf(simulatorOutput, "%f, OS: Process %d set to RUNNING state from READY state\n\n", accessTimer(LAP_TIMER, timeStringy), pcbPtr->uniquePid); logOutput(configPtr, simulatorOutput, false); pthread_t runThread; @@ -497,7 +518,6 @@ int scheduleProcess(ProcessControlBlockLL *headPointer, ConfigDataType *configPt { case CPU_SCHED_FCFS_N_CODE: // First Come, First Served, Non-preemptive Scheduling - // only one implemented for now. returns first process without fail. // need to find whichever process is first, AND the state is NEW. // will set the state to READY, return the pid of the process which // was set to ready. @@ -506,7 +526,7 @@ int scheduleProcess(ProcessControlBlockLL *headPointer, ConfigDataType *configPt while(wkgPtr != NULL) { // - if(wkgPtr->process_state != PROCESS_STATE_READY && wkgPtr->process_state != PROCESS_STATE_TERMINATED) + if(wkgPtr->process_state == PROCESS_STATE_NEW) { // set the process within the PCB to the ready state, report in ready state. wkgPtr->process_state = PROCESS_STATE_READY; @@ -523,7 +543,7 @@ int scheduleProcess(ProcessControlBlockLL *headPointer, ConfigDataType *configPt while(wkgPtr != NULL && (returnPid == -1)) { // check if the process is NOT terminated - if (wkgPtr->process_state == PROCESS_STATE_READY) + if (wkgPtr->process_state != PROCESS_STATE_RUNNING && wkgPtr->process_state != PROCESS_STATE_TERMINATED) { //printf("Process %d Selected with %.0f ms remaining\n", wkgPtr->uniquePid, wkgPtr->timeLeft); sprintf(loggingStr, "%f, OS: Process %d selected with %.0f ms remaining\n", accessTimer(LAP_TIMER, timeStringy), wkgPtr->uniquePid, wkgPtr->timeLeft); @@ -541,7 +561,55 @@ int scheduleProcess(ProcessControlBlockLL *headPointer, ConfigDataType *configPt // TODO: Round Robin Scheduling break; case CPU_SCHED_SJF_N_CODE: - // TODO: Shortest Job First Scheduling + // Shortest Job First Scheduling + // need to find shortest job, maybe using a find min function? + // reuse the previous code to set each process to READY from NEW + // will select the process that is in the READY state, with the shortest time. + int shortestJob = 0; + int shortestJobProcNum = 0; + while (wkgPtr != NULL) + { + // + if (wkgPtr->process_state == PROCESS_STATE_NEW) + { + // set the process within the PCB to the ready state, report in ready state. + wkgPtr->process_state = PROCESS_STATE_READY; + // printf("Process %d set to READY from NEW\n", wkgPtr->uniquePid); + sprintf(loggingStr, "%f, OS: Process %d set to READY state from NEW state\n", accessTimer(LAP_TIMER, timeStringy), wkgPtr->uniquePid); + logOutput(configPtr, loggingStr, false); + } + // move to the next pointer + wkgPtr = wkgPtr->nextPtr; + } + + // reset the pointer to get ready for selection of process + wkgPtr = headPointer->headPtr; + // load in the first process time + shortestJob = wkgPtr->timeLeft; + // move to the next pointer. + wkgPtr = wkgPtr->nextPtr; + while (wkgPtr != NULL && (returnPid == -1)) + { + // check if the process is NOT terminated + // now, ALSO needs to check which process takes the least time. + if (wkgPtr->process_state != PROCESS_STATE_RUNNING && wkgPtr->process_state != PROCESS_STATE_TERMINATED) + { + // check to see if the working pointer job is shorter than the current shortest job + shortestJob = findMin(shortestJob, wkgPtr->timeLeft); + // check to see if the shortest job time changed, if it did, change the process number + if(shortestJob == wkgPtr->timeLeft) + { + // change process number, or leave it unchanged. + shortestJobProcNum = wkgPtr->uniquePid; + } + } + // move to next pointer + wkgPtr = wkgPtr->nextPtr; + } + // printf("Process %d Selected with %.0f ms remaining\n", wkgPtr->uniquePid, wkgPtr->timeLeft); + sprintf(loggingStr, "%f, OS: Process %d selected with %.0f ms remaining\n", accessTimer(LAP_TIMER, timeStringy), shortestJobProcNum, (double)shortestJob); + logOutput(configPtr, loggingStr, false); + returnPid = shortestJobProcNum; break; case CPU_SCHED_SRTF_P_CODE: // TODO: Shortest Run-time First Scheduling diff --git a/Sim03/simulator.h b/Sim03/simulator.h index 0a07783..4ccba46 100644 --- a/Sim03/simulator.h +++ b/Sim03/simulator.h @@ -131,6 +131,18 @@ Dependencies: ??? */ ProcessControlBlockLL *fillProcessList(ConfigDataType *configPtr, OpCodeType *metadataPtr, ProcessControlBlockLL *headPointer); +/* +Name: findMin +Process: compares two values, returns the smaller of the two. +Function Input/Parameters: two integer values (int) +Function Output/Parameters: none +Function Output/Returned: minimum of the two input integer values (int) +Device Input/Device: none +Device Output/Device: none +Dependencies: none +*/ +int findMin(int one, int another); + /* Name: logOutput Process: Takes in a string, and then outputs it to monitor AND/OR file