public static void terminateJobs() { for (int i = 0; i < Driver.CPUs.Length; i++) { int currentJobNumber = Driver.CPUs[i].currentJobNumber(); try { if (Driver.CPUs[i].isIdle() && Driver.CPUs[i].shouldTerminate()) { Console.WriteLine(String.Format("TERMINATING" + currentJobNumber + ":is idle:{0} shouldTerminate:{1} cpu loaded:{2} shouldUnload:{3}", Driver.CPUs[i].isIdle(), Driver.CPUs[i].shouldTerminate(), Driver.CPUs[i].isJobLoaded(), Driver.CPUs[i].shouldUnload())); Console.WriteLine("Terminating Job" + currentJobNumber + "ON CPU:" + i); Driver.commands[currentJobNumber] += "TERMINATING JOB" + currentJobNumber + "ON CPU: " + i; Driver.CPUs[i].unload(PCBManager.getPCB(currentJobNumber)); MMU.synchronizeCache(PCBManager.getPCB(currentJobNumber)); RAM.deallocatePcb(PCBManager.getPCB(currentJobNumber)); Console.WriteLine(string.Format("TERMINATED" + currentJobNumber + ":is idle:%s shouldTerminate:%s cpu loaded:%s shouldUnload:%s", Driver.CPUs[i].isIdle(), Driver.CPUs[i].shouldTerminate(), Driver.CPUs[i].isJobLoaded(), Driver.CPUs[i].shouldUnload())); if (PCBManager.getPCB(currentJobNumber).getProcessStatus() == PCB.PROCESS_STATUS.TERMINATE) { Driver.completedJobs++; } Driver.updateOsMetric(); } } catch (IndexOutOfRangeException ex) { throw new IndexOutOfRangeException("Exception Terminating Job" + currentJobNumber + "On CPU:" + i + " " + ex.ToString()); } } }
private String read(int address) { return(MMU.read(VMA[address / RAM.getPageSize()] * RAM.getPageSize() + (address % RAM.getPageSize()))); }