public static Queue<Request> SSTF(Queue<Request> requestQueue, Drive.Stats driveStatistics) { if (requestQueue.Count <= 1) return new Queue<Request>(requestQueue); return new Queue<Request>( requestQueue.OrderBy(request => Utilities.RequestDistance(request, driveStatistics))); }
public static Queue<Request> LOOK(Queue<Request> requestQueue, Drive.Stats driveStatistics) { if (requestQueue.Count <= 1) return new Queue<Request>(requestQueue); Func<int, int, bool> comparisonFunc = driveStatistics.HeadDirectionFlag ? (Func<int, int, bool>)((a,b) => a > b) : ((a, b) => a < b); var requestsInDirectPath = requestQueue.Where(request => comparisonFunc(request.Track, driveStatistics.TrackPosition)); var requestsInOppositePath = requestQueue.Except(requestsInDirectPath); requestsInDirectPath= requestsInDirectPath.OrderBy( request => Utilities.RequestDistance(request, driveStatistics)); requestsInOppositePath= requestsInOppositePath.OrderBy(request => Utilities.RequestDistance(request,(requestsInDirectPath.Count() == 0) ? new Request(0,(driveStatistics.HeadDirectionFlag) ? driveStatistics.TracksPerFace : 0, 0) : requestsInDirectPath.Last(), driveStatistics)); return new Queue<Request>(requestsInDirectPath.Concat(requestsInOppositePath)); }
public static Queue<Request> CLOOK(Queue<Request> requestQueue, Drive.Stats driveStatistics) { if (requestQueue.Count <= 1) return new Queue<Request>(requestQueue); var requestsAbove = requestQueue.Where( request => request.Track > driveStatistics.TrackPosition && request.Sector > driveStatistics.SectorPosition); var requestsBelow = requestQueue.Except(requestsAbove); return new Queue<Request>(requestsAbove.OrderBy(request => Utilities.RequestDistance(request, driveStatistics)) .Concat( requestsBelow.OrderBy( request => Utilities.RequestDistance(request.Track, 0, request.Sector, 0, driveStatistics)))); }
static double[] simulateDrive(Drive drive) { var outputMetricList = new List<double>(); drive.AlgorithmEnumerator.Reset(); for (double time = 0, requestsRemaining = requestCollection.Length; requestsRemaining > 0 || drive.ActiveRequest != null || drive.RequestsQueued > 0;) { if (drive.ActiveRequest != null) { var completionData = drive.CompleteJob(); time = completionData.Item1; outputMetricList.Add(time - completionData.Item2); if (requestsRemaining == 0) break; } requestCollection.Where( request => (requestCollection.ElementAt(requestCollection.Count() - Convert.ToInt32(requestsRemaining)) .ArrivalTime <= request.ArrivalTime) && request.ArrivalTime <= time).ForEach( request => { requestsRemaining--; drive.AddRequest(request); }); if (drive.IsQueueEmpty()) { time++; continue; } if (drive.AlgorithmEnumerator.Current != null || drive.AlgorithmEnumerator.MoveNext()) { Func<Queue<Request>, Drive.Stats, Queue<Request>> seekAlgorithm = null; switch (drive.AlgorithmEnumerator.Current) { case "FCFS": seekAlgorithm = RequestAlgorithms.FCFS; break; case "SSTF": seekAlgorithm = RequestAlgorithms.SSTF; break; case "LOOK": seekAlgorithm = RequestAlgorithms.LOOK; break; case "CLOOK": seekAlgorithm = RequestAlgorithms.CLOOK; break; } drive.ActivateNewJob(seekAlgorithm, time); } } return outputMetricList.ToArray(); }
public static Queue<Request> FCFS(Queue<Request> requestQueue, Drive.Stats driveStatistics) { if (requestQueue.Count <= 1) return new Queue<Request>(requestQueue); return new Queue<Request>(requestQueue.OrderBy(request => request.ArrivalTime)); }