Exemple #1
0
 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)));
 }
Exemple #2
0
        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));
        }
Exemple #3
0
 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))));
 }
Exemple #4
0
 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();
 }
Exemple #5
0
 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));
 }