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); }
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); } } } }
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"); } } } }
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); } } } }
private void Scan(scanDirection direction) { if (direction == scanDirection.BACKWARD) { drive.MoveHeadBack(); } else { drive.MoveHeadForward(); } }
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++; } }
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); } }