コード例 #1
0
ファイル: Simulator.cs プロジェクト: lilifuna/HDDSimulator
        private bool CheckForFartherRequests(scanDirection direction)
        {
            if (direction == scanDirection.FORWARD)
            {
                foreach (Request req in allRequests)
                {
                    if (req.GetPosition() > drive.GetPosition())
                    {
                        return(true);
                    }
                }
            }

            if (direction == scanDirection.BACKWARD)
            {
                foreach (Request req in allRequests)
                {
                    if (req.GetPosition() < drive.GetPosition())
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
コード例 #2
0
ファイル: Simulator.cs プロジェクト: lilifuna/HDDSimulator
        private void DoCSCAN(ref scanDirection direction)
        {
            if (drive.GetPosition() == drive.GetSize())
            {
                direction = scanDirection.BACKWARD;
            }
            if (drive.GetPosition() <= 0)
            {
                direction = scanDirection.FORWARD;
            }

            Scan(direction);


            foreach (Request req in allRequests)
            {
                if (req.CheckRequestState() == Request.requestState.QUEUED)
                {
                    if (CheckIfHeadOverRequest(req))
                    {
                        FinishRequest(req);
                    }
                }
            }
        }
コード例 #3
0
ファイル: Simulator.cs プロジェクト: lilifuna/HDDSimulator
        private void DoSCAN(ref scanDirection direction)
        {
            Scan(direction);
            if (!CheckForFartherRequests(direction))
            {
                if (direction == scanDirection.FORWARD)
                {
                    direction = scanDirection.BACKWARD;
                }
                else
                {
                    direction = scanDirection.FORWARD;
                }
            }

            foreach (Request req in allRequests)
            {
                if (req.CheckRequestState() == Request.requestState.QUEUED)
                {
                    if (CheckIfHeadOverRequest(req))
                    {
                        FinishRequest(req);
                        //Console.WriteLine("Process " + allRequests.IndexOf(req) + "finished");
                    }
                }
            }
        }
コード例 #4
0
ファイル: Simulator.cs プロジェクト: lilifuna/HDDSimulator
        private void DoFDSCAN(ref scanDirection direction, ref Request movingTowards, List <RealTimeRequest> RealTimeRequests, int time)
        {
            List <RealTimeRequest> requestsPossible = FindRequestsThatCanBeServed(RealTimeRequests, time);

            if (CheckFDSCANDirection(requestsPossible, time, direction) && movingTowards == null)
            {
                if (direction == scanDirection.FORWARD)
                {
                    direction = scanDirection.BACKWARD;
                }
                else
                {
                    direction = scanDirection.FORWARD;
                }
                movingTowards = requestsPossible.First(); // So that it does not check for new Requests when the head is moving towards the chosen request
            }
            Scan(direction);
            foreach (Request req in allRequests)
            {
                if (req.CheckRequestState() == Request.requestState.QUEUED)
                {
                    if (req.GetPosition() == drive.GetPosition())
                    {
                        if (req.Equals(movingTowards))
                        {
                            movingTowards = null;
                        }
                        FinishRequest(req);
                    }
                }
            }
        }
コード例 #5
0
ファイル: Simulator.cs プロジェクト: lilifuna/HDDSimulator
 private void Scan(scanDirection direction)
 {
     if (direction == scanDirection.BACKWARD)
     {
         drive.MoveHeadBack();
     }
     else
     {
         drive.MoveHeadForward();
     }
 }
コード例 #6
0
ファイル: Simulator.cs プロジェクト: lilifuna/HDDSimulator
        public void Simulate()
        {
            int            time          = 0;
            scanDirection  direction     = scanDirection.FORWARD;
            Request        movingTowards = null;
            simulationMode previousMode  = currentMode;



            while (!CheckIfSimulationFinished())
            {
                UpdateQueue(time);
                List <RealTimeRequest> realTimeRequests = FindRealtimeRequests(time);

                if (realTimeRequests.Count > 0)
                {
                    switch (RTRmode)
                    {
                    case RTRServiceModes.FDSCAN:

                        currentMode = simulationMode.FDSCAN;
                        break;

                    case RTRServiceModes.EDF:
                        currentMode = simulationMode.EDF;
                        break;
                    }
                } // Change mode to EDF/FDSCAN if there are any RTR's in the queue.
                else
                {
                    currentMode = previousMode;  //Go back to previous mode after serving all RTR
                }
                switch (currentMode)
                {
                case simulationMode.FCFS:
                    DoFCFS();

                    break;

                case simulationMode.SSTF:
                    DoSSTF();
                    break;


                case simulationMode.CSCAN:

                    DoCSCAN(ref direction);
                    break;


                case simulationMode.SCAN:
                    DoSCAN(ref direction);

                    break;

                case simulationMode.EDF:
                    DoEDF(time, realTimeRequests);


                    break;



                case simulationMode.FDSCAN:

                    DoFDSCAN(ref direction, ref movingTowards, realTimeRequests, time);
                    break;
                }

                time++;
            }
        }
コード例 #7
0
ファイル: Simulator.cs プロジェクト: lilifuna/HDDSimulator
        private bool CheckFDSCANDirection(List <RealTimeRequest> realTimeRequests, int currentTime, scanDirection currentDirection)
        {
            List <RealTimeRequest> realTimeRequestsThatCanBeServed = FindRequestsThatCanBeServed(realTimeRequests, currentTime);

            try {
                RealTimeRequest requestToBeServed = realTimeRequestsThatCanBeServed.First();

                if (currentDirection == scanDirection.FORWARD)
                {
                    if (requestToBeServed.GetPosition() > drive.GetPosition())
                    {
                        return(false);
                    }
                    else
                    {
                        return(true);
                    }
                }
                else if (currentDirection == scanDirection.BACKWARD)
                {
                    if (requestToBeServed.GetPosition() > drive.GetPosition())
                    {
                        return(true);
                    }
                    return(false);
                }
                else
                {
                    return(false);
                }
            }
            catch (NullReferenceException exception)
            {
                return(false);
            }
        }