コード例 #1
0
ファイル: Loader.cs プロジェクト: rmoser3/SimOS
        //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();
        }
コード例 #2
0
 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;
     }
 }
コード例 #3
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++;
     }
 }
コード例 #4
0
 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
 }
コード例 #5
0
 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());
         }
     }
 }