//Funkcja wywołująca się raz na kwant czasu, odpowiada za wykonywanie zadań public void WykonajKrok() { //Żadne z zadań nie otrzymało kwantu czasu w tym cyklu foreach (Podzadanie podzad in PrzypisaneZadania) { podzad.CzyOtrzymano = 0; } //Licznik zadań zakończonych w tym przebiegu. Wykorzystywany przy wyznaczaniu zadań które można obsługiwać. int licznikzadanzakonczonych = 0; //Zadanie któremu przyporządkujemy kwant czasu int j = 0; //Maksymalna pozycja zadania do którego możemy się odwołać int makszadid = Math.Min(PrzypisaneZadania.Count(), PotencjalRownobieznegoPrzetwarzania) - 1; for (int i = 0; i < MocObliczeniowa; i++) { //Makszadid może być mniejsze od 0 tylko jeśli ukończyliśmy już w danym przebiegu tyle zadań ile wynosi potencjał równobieżnego przetwarzania if (PrzypisaneZadania.Count() > 0 && makszadid >= 0) { Podzadanie zadanieWykonywane = PrzypisaneZadania.ElementAt(j); bool zakonczone = NadajKwant(zadanieWykonywane); if (zakonczone) { WykonaneKwantyCzasu += zadanieWykonywane.WymaganyCzasPrzetwarzania; licznikzadanzakonczonych++; //Wyrzucamy podzadanie z węzła PrzypisaneZadania.RemoveAt(j); ObliczWspolczynnikObciazenia(); //Jeśli usuwamy zadanie musimy zmniejszyć iterator o 1 aby niczego nie przeskoczyć. Możemy to zrobić nawet jeśli zadanie było zerowe - za chwilę i tak podniesiemy j o 1 j--; //Od potencjału równobieżnego przetwarzania odejmujemy ilość ukończonych zadań tak aby nagle nie pojawiło nam sięnowe. makszadid = Math.Min(PrzypisaneZadania.Count(), (PotencjalRownobieznegoPrzetwarzania - licznikzadanzakonczonych)) - 1; } if (j >= makszadid) { j = 0; } else { j++; } } } for (int i = 0; i < PrzypisaneZadania.Count(); i++) { Podzadanie zadanieWykonywane = PrzypisaneZadania.ElementAt(i); if (zadanieWykonywane.CzyOtrzymano == 0) { zadanieWykonywane.krok(false); } } }
public void ObliczWspolczynnikObciazenia() { WspolczynnikObciazenia = (System.Convert.ToDouble(PrzypisaneZadania.Count()) / System.Convert.ToDouble(MocObliczeniowa)); }