Exemplo n.º 1
0
        //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);
                }
            }
        }
Exemplo n.º 2
0
 //Funkcja przypisuje kwant czasu procesora danemu zadaniu, po czym zwraca 'true' jeżeli zadanie zostało zakończone, 'false' w przeciwnym razie
 public bool NadajKwant(Podzadanie zadanieDocelowe)
 {
     zadanieDocelowe.krok(true);
     zadanieDocelowe.CzyOtrzymano = 1;
     if (zadanieDocelowe.Zakonczone == true)
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }