Example #1
0
        public override void simulate(int snapshot, StreamWriter pa)
        {
            // TODO Auto-generated method stub
            pa.WriteLine ("**************************************RR STARTED**************************");
            quantum	= RRprocessList.getQuantum();

            //add all processes to queue
            foreach (Process process in RRprocessList.processes) {
                ReadyQueue.Enqueue(process);
                //pa.WriteLine (process.getCPU_burst1 ());
            }

            //initialize currents
            currentProcess = ReadyQueue.Dequeue ();
            currentIO = new Process(-1,-1,-1,-1,-1);

            //main RR while loop
            while (ReadyQueue.Count > 0) {

                //quantum for loop
                for (int i = 0; i < quantum; i++) {

                    //cpu processing
                    //pa.WriteLine (currentProcess.getPID ());

                    foreach (Process p in ReadyQueue) {
                        p.period++;
                    }

                    if (currentProcess.getCPU_burst1 () > 0) {
                        currentProcess.decrementCPUBurst1 ();
                    } else if (currentProcess.getCPU_burst1 () == 0 && currentProcess.getIO_burst () > 0) {
                        IOQueue.Enqueue (currentProcess);
                        break;
                    } else if (currentProcess.getCPU_burst1 () == 0 && currentProcess.getIO_burst () == 0 && currentProcess.getCPU_burst2 () > 0) {
                        currentProcess.decrementCPUBurst2 ();
                    } else {
                        break;
                    }
                    currentProcess.activePeriod++;

                    //io processing
                    if (currentIO.getIO_burst () > 0) {
                        currentIO.decrementIO_burst ();
                    } else if (currentIO.getIO_burst () == 0) {
                        ReadyQueue.Enqueue (currentIO);
                        if (IOQueue.Count > 0) {
                            currentIO = IOQueue.Dequeue ();
                        } else {
                            currentIO = new Process (-1, -1, -1, -1, -1);
                        }
                    } else {
                        if (IOQueue.Count > 0) {
                            currentIO = IOQueue.Dequeue ();
                        }
                    }
                    //increment time
                    time++;

                    //POKEMON SNAP
                    if (time % snapshot == 0) {
                        pa.WriteLine ("Taking Snap at time: " + time);
                        this.snapshot (pa);
                    }
                }

                if (currentProcess.getCPU_burst1 () > 0 || (currentProcess.getCPU_burst2 () > 0 && currentProcess.getIO_burst () == 0)) {
                    ReadyQueue.Enqueue (currentProcess);
                } else if (currentProcess.getCPU_burst1 () == 0 && currentProcess.getIO_burst () > 0 && !IOQueue.Contains(currentProcess)){
                    IOQueue.Enqueue (currentProcess);
                    //pa.WriteLine ("into IO2:"+ currentProcess.getPID ());
                } else if(currentProcess.getCPU_burst1 () == 0 && currentProcess.getCPU_burst2() == 0 && currentProcess.getIO_burst() == 0){

                    currentProcess.activePeriod--;
                    Final_List.Add (currentProcess);
                }
                if (ReadyQueue.Count>0) currentProcess = ReadyQueue.Dequeue ();

            }
            Final_List.Add(currentProcess); foreach (Process item in Final_List) item.period--;	time += 10;
            finalReport (pa);
            pa.WriteLine ("**************************************RR ENDED**************************");
        }