//Function loads data into disk public void Load() { string[] lines = System.IO.File.ReadAllLines(filename); int counter = 0; pcbQueue = new pcbQueue(30); while (counter < lines.Length) { if (lines[counter].Contains("//") == false) { disk.enterData(lines[counter]); } else { if (lines[counter].Contains("JOB") == true) { //Get job number, priority number, number of words and disk pointer for store them in PCB's in queue pcbQueue.setJobInfo(lines[counter].Substring(7, lines[counter].Length - 7), disk.pointer * 32); } else if (lines[counter].Contains("Data") == true) { //Get input, output and temporary buffers, store them in PCB's in queue pcbQueue.setDataInfo(lines[counter].Substring(8, lines[counter].Length - 8)); } } counter++; } pcbQueue.ramIterator = 0; pcbQueue.sortQueue(); }
public void load(Disk disk, RAM ram, pcbQueue pcbQueue) //Loads the next batch of jobs into RAM { while (pcbQueue.jobsComplete() == false && pcbQueue.ramIterator < 30) { int index = pcbQueue.ramIterator; //Starting load index is where the ramIterator currently points while (spaceAvailable(iterator, pcbQueue.queue[index].spaceReq, ram) == false) { //do nothing Thread.Yield(); } while (spaceAvailable(iterator, pcbQueue.queue[index].spaceReq, ram) == true) //It will stop loading when space is no longer available for next process { if (pcbQueue.ramIterator >= pcbQueue.queue.Length) { break; } loadRAM(disk, ram, pcbQueue, pcbQueue.ramIterator); } ram.calculateUsed(); if (debugMode) { Console.WriteLine("Percentage of RAM used: " + ram.percentageUsed + "%"); } iterator = 0; } }
public void pageLoad(Disk disk, RAM ram, pcbQueue pcbQueue) { //for each pcb load the first 4 pages in RAM while (pcbQueue.ramIterator < 30) { for (int i = 0; i < 4; i++) { pageLoadRam(disk, pcbQueue.queue[pcbQueue.ramIterator].pageTable[i], ram); } pcbQueue.ramIterator++; } }
public void loadRAM(Disk disk, RAM ram, pcbQueue pcbQueue, int i) { //Load an individual job from disk to RAM, starting at process disk address and ending at disk address + spaceReq pcbQueue.queue[i].ramBaseAddress = iterator; pcbQueue.queue[i].programCounter = iterator; pcbQueue.queue[i].ramLoadTime = DateTime.Now.TimeOfDay; pcbQueue.queue[i].inputBufferAddress = pcbQueue.queue[i].ramBaseAddress + pcbQueue.queue[i].wordCount * 32 + 1; pcbQueue.queue[i].outputBufferAddress = pcbQueue.queue[i].inputBufferAddress + pcbQueue.queue[i].inputBuffer * 32 + 1; pcbQueue.queue[i].tempBufferAddress = pcbQueue.queue[i].outputBufferAddress + pcbQueue.queue[i].outputBuffer * 32 + 1; for (int j = pcbQueue.queue[i].diskAddress; j <= pcbQueue.queue[i].diskAddress + pcbQueue.queue[i].spaceReq; j++) { ram.data[iterator] = disk.data[j]; iterator++; } pcbQueue.ramIterator++; //By the end of this function, the queue's iterator will points to next process to be loaded }
public void execute(RAM ram, pcbQueue pcbQueue, Scheduler schedule, cpuQueue que) { while (pcbQueue.jobsComplete() == false) { while (this != que.head || pcbQueue.cpuIterator >= pcbQueue.ramIterator) { //do nothing if (pcbQueue.jobsComplete() == true) { return; } Thread.Yield(); } PCB temp = pcbQueue.queue[pcbQueue.cpuIterator]; if (debugMode) { Console.WriteLine("CPU " + this.id + " executing job " + temp.processID); } pcbQueue.cpuIterator++; que.deQueue(); temp.startTime = DateTime.Now.TimeOfDay; temp.waitTime = temp.startTime - temp.ramLoadTime; PopulateInstructionList(ram, temp); this.StartWork(temp); temp.timeCompleted = DateTime.Now.TimeOfDay; if (debugMode) { temp.core = pcbQueue.getCoreDump(temp, ram); } temp.executionTime = temp.timeCompleted - temp.startTime; temp.complete = true; this.signal(ram, schedule, temp); if (debugMode) { Console.WriteLine("Process " + temp.processID + " complete!"); } que.enQueue(this); if (debugMode) { Console.WriteLine("Jobs complete? " + pcbQueue.jobsComplete()); } } }