Exemple #1
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();
 }