Example #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);
                }
            }
        }
Example #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);
     }
 }
Example #3
0
        public void Init()
        {
            string stmp;
            int    itmp, itmp2;
            int    iloscuslug = 0;

            ZadaniaDoWykonania  = new List <Podzadanie>();
            ZadaniaPrzetwarzane = new List <Zadanie>();
            ZadaniaZakonczone   = new List <Zadanie>();
            Wezly = new List <Wezel>();

            try
            { using (StreamReader sr = new StreamReader("Zadania_gen.txt"))
              {
                  Zegar = 0;


                  //Wczytanie zadań
                  String line = sr.ReadLine();
                  //Pobieramy ilość grup
                  Int32.TryParse(line.Split(',')[1], out itmp);
                  //Pobieramy ilość usług w każdej grupie
                  Int32.TryParse(line.Split(',')[2], out itmp2);
                  iloscuslug = itmp * itmp2;
                  IloscUslug = iloscuslug;

                  //Stworzenie tablicy list potrzebnej do obliczenia globalnego paramteru
                  ZadaniaDoUslugi = new List <double> [IloscUslug];
                  for (int i = 0; i < IloscUslug; i++)
                  {
                      ZadaniaDoUslugi[i] = new List <double>();
                  }

                  Console.WriteLine(line);
                  while ((line = sr.ReadLine()) != null)
                  {
                      //Console.WriteLine(line);
                      Podzadanie nowezadanie = new Podzadanie();

                      int tmp;
                      Int32.TryParse(line.Split(',')[0], out tmp);
                      nowezadanie.IDZadania = tmp;
                      Int32.TryParse(line.Split(',')[1], out tmp);
                      nowezadanie.ChwilaNadejscia = tmp;
                      Int32.TryParse(line.Split(',')[2], out tmp);
                      nowezadanie.WymaganyCzasPrzetwarzania = tmp;
                      Int32.TryParse(line.Split(',')[3], out tmp);
                      nowezadanie.IDuslugi = tmp;

                      ZadaniaDoUslugi[nowezadanie.IDuslugi].Add(Convert.ToDouble(nowezadanie.WymaganyCzasPrzetwarzania));

                      ZadaniaDoWykonania.Add(nowezadanie);
                  }
              } }
            catch (Exception e)
            {
                Console.WriteLine("Coś poszło nie tak.");
                Console.WriteLine(e.Message);
            }

            Console.WriteLine("Wczytywanie zadań zakończyło się sukcesem. Rozpoczynanie wczytywania listy węzłów...");

            try
            {
                using (StreamReader sr = new StreamReader("Wezel_gen.txt"))
                {
                    //Kworum
                    Console.WriteLine("Podaj liczność kworum");
                    stmp = Console.ReadLine();

                    Int32.TryParse(stmp, out itmp);

                    LicznoscKworum = itmp;


                    String line;

                    //Sanity check
                    if (iloscuslug == 0)
                    {
                        Console.WriteLine("Coś nie zadziałało z ilością usług...");
                        Console.ReadKey();
                    }

                    //Tworzymy listę na której zaznaczać będziemy ilości wystąpień poszczególnych usług
                    int[] wystapienia = new int[iloscuslug];
                    for (int i = 0; i < iloscuslug; i++)
                    {
                        wystapienia[i] = 0;
                    }


                    while ((line = sr.ReadLine()) != null)
                    {
                        //Console.WriteLine(line);
                        Wezel nowywezel = new Wezel();
                        nowywezel.CzasNieaktywnosci          = 0;
                        nowywezel.PrzypisaneZadania          = new List <Podzadanie>();
                        nowywezel.HistoriaZadania            = new List <Podzadanie>();
                        nowywezel.ObslugiwaneUslugi          = new List <int>();
                        nowywezel.DlugosciPrzypisanychZadan  = new List <double>();
                        nowywezel.FragmentyPrzypisanychZadan = new List <int>();
                        nowywezel.WspolczynnikObciazenia     = 0;

                        int tmp;
                        int ilosczadan;


                        //Wczytuję podstawowe informacje dotyczące węzła
                        Int32.TryParse(line.Split(' ')[0], out tmp);
                        nowywezel.IDWezla = tmp;
                        Int32.TryParse(line.Split(' ')[1], out tmp);
                        nowywezel.MocObliczeniowa = tmp;
                        Int32.TryParse(line.Split(' ')[2], out tmp);
                        nowywezel.PotencjalRownobieznegoPrzetwarzania = tmp;
                        Int32.TryParse(line.Split(' ')[3], out tmp);
                        ilosczadan = tmp;



                        //Wczytuję listę usług istniejących na danym węźle
                        for (int i = 4; i < ilosczadan + 4; i++)
                        {
                            Int32.TryParse(line.Split(' ')[i], out tmp);
                            wystapienia[tmp]++;
                            nowywezel.ObslugiwaneUslugi.Add(tmp);
                        }

                        Wezly.Add(nowywezel);
                    }

                    int min = wystapienia.Min();
                    if (min < LicznoscKworum)
                    {
                        Console.Write("Liczność kworum jest wyższa od minimalnej ilości wystąpień jednej z usług. Być może konieczna jest ponowna generacja węzłów/ zmniejszenie liczności kworum");
                        stmp = Console.ReadLine();
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Coś poszło nie tak.");
                Console.WriteLine(e.Message);
            }
        }
Example #4
0
        public void Simulate()
        {
            Console.WriteLine("Trwa sortowanie zadań po chwili nadejścia.");
            ZadaniaDoWykonania = ZadaniaDoWykonania.OrderBy(e => e.ChwilaNadejscia).ToList();

            //DEBUG - wypisuje zadania do wykonania

            /*foreach (Podzadanie zad in ZadaniaDoWykonania)
             * { Console.WriteLine(zad.IDZadania + "," + zad.ChwilaNadejscia + "," + zad.CzasPrzetwarzania + "," + zad.IDuslugi); }
             */

            //DEBUG - wypisuje węzły

            /*foreach (Wezel aktwez in Wezly)
             * {
             *  Console.Write(aktwez.IDWezla.ToString() + ", moc obliczeniowa: " + aktwez.MocObliczeniowa.ToString() + ", równobieżność: " + aktwez.PotencjalRownobieznegoPrzetwarzania.ToString() + ", usługi: ");
             *
             *  foreach (int usluga in aktwez.ObslugiwaneUslugi)
             *  { Console.Write(usluga.ToString() + " "); }
             *
             *  Console.WriteLine();
             * }*/

            Console.WriteLine("Aby rozpocząć przetwarzanie wciśnij klawisz Enter.");
            Console.ReadLine();

            Console.WriteLine("Trwa przetwarzanie.");

            while (ZadaniaDoWykonania.Count > 0 || ZadaniaPrzetwarzane.Count > 0)
            {
                //Nadeszło zadanie. Dodajemy je do odpowiedniej listy i rozmieszczamy na węzłach.
                while (ZadaniaDoWykonania.Count > 0 && ZadaniaDoWykonania[0].ChwilaNadejscia == Zegar)
                {
                    //Pobieram zadanie które nadeszło i usuwam je z listy zadań.
                    Podzadanie nadeszlo = ZadaniaDoWykonania[0];
                    ZadaniaDoWykonania.RemoveAt(0);
                    Zadanie nadchodzace = new Zadanie();
                    nadchodzace.IDZadania  = nadeszlo.IDZadania;
                    nadchodzace.Zakonczone = false;
                    nadchodzace.Podzadania = new List <Podzadanie>();

                    List <int> wykorzystanewezly = new List <int>();
                    for (int i = 0; i < LicznoscKworum; i++)
                    {
                        //Generuję nowe podzadanie
                        Podzadanie exec = new Podzadanie();
                        exec.ChwilaNadejscia           = (int)Zegar;
                        exec.CzasOczekiwania           = 0;
                        exec.CzasPrzetwarzania         = 0;
                        exec.IDuslugi                  = nadeszlo.IDuslugi;
                        exec.IDZadania                 = nadeszlo.IDZadania;
                        exec.WymaganyCzasPrzetwarzania = nadeszlo.WymaganyCzasPrzetwarzania;
                        exec.Zakonczone                = false;

                        Podzadanie exec2 = new Podzadanie();
                        exec2.ChwilaNadejscia           = (int)Zegar;
                        exec2.CzasOczekiwania           = 0;
                        exec2.CzasPrzetwarzania         = 0;
                        exec2.IDuslugi                  = nadeszlo.IDuslugi;
                        exec2.IDZadania                 = nadeszlo.IDZadania;
                        exec2.WymaganyCzasPrzetwarzania = nadeszlo.WymaganyCzasPrzetwarzania;
                        exec2.Zakonczone                = false;

                        nadchodzace.Podzadania.Add(exec);

                        int idwezla = ZnajdzWezel(exec.IDuslugi, wykorzystanewezly);
                        wykorzystanewezly.Add(idwezla);

                        Wezel WybranyWezel = Wezly.Where(e => e.IDWezla == idwezla).FirstOrDefault();
                        WybranyWezel.PrzypisaneZadania.Add(exec);
                        WybranyWezel.HistoriaZadania.Add(exec2);
                        WybranyWezel.SumaCzasowPrzypisanychZadan = WybranyWezel.SumaCzasowPrzypisanychZadan + exec.WymaganyCzasPrzetwarzania;
                        WybranyWezel.DlugosciPrzypisanychZadan.Add(Convert.ToDouble(exec.WymaganyCzasPrzetwarzania));
                        WybranyWezel.FragmentyPrzypisanychZadan.Add(exec.IDuslugi);
                        WybranyWezel.ObliczWspolczynnikObciazenia();
                    }

                    ZadaniaPrzetwarzane.Add(nadchodzace);
                }

                //Każdy węzeł wykonuje swoje przetwarzanie
                foreach (Wezel wezelek in Wezly)
                {
                    if (wezelek.PrzypisaneZadania.Count() == 0)
                    {
                        wezelek.CzasNieaktywnosci++;
                    }
                    else
                    {
                        wezelek.WykonajKrok();
                    }
                }

                //Sprawdzamy czy zakończyliśmy któreś zadanie
                foreach (Zadanie zadanko in ZadaniaPrzetwarzane.Reverse <Zadanie>())
                {
                    if (zadanko.czyukonczone())
                    {
                        ZadaniaPrzetwarzane.Remove(zadanko);
                        ZadaniaZakonczone.Add(zadanko);
                    }
                }


                Zegar++;
            }

            //DEBUG - komunikat o zakończeniu przetwarzania
            Console.WriteLine("Zadanie zakończono.");
            Console.WriteLine("Wykonano " + ZadaniaZakonczone.Count().ToString() + " zadań, czyli " + (ZadaniaZakonczone.Count() * LicznoscKworum).ToString() + " podzadań.");
            Console.WriteLine("Podczas zakończenia zegar logiczny miał wartość " + Zegar.ToString());

            //DEBUG - wypisuje statystyki poszczególnych zadań

            /*foreach (Zadanie ukonczone in ZadaniaZakonczone)
             * {
             *  Console.WriteLine("Zadanie " + ukonczone.IDZadania.ToString());
             *
             *  foreach (Podzadanie pukonczone in ukonczone.Podzadania)
             *  {
             *      Console.WriteLine(pukonczone.ChwilaNadejscia.ToString() + " " + pukonczone.CzasOczekiwania.ToString());
             *  }
             *
             * }*/

            //Obliczenie parametru globalnego
            double        odchsum = 0, sumaodchylen = 0;
            List <double> SumyUslug = new List <double>();

            for (int i = 0; i < IloscUslug; i++)
            {
                SumyUslug.Add(ZadaniaDoUslugi[i].Sum());
                sumaodchylen += getStandardDeviation(ZadaniaDoUslugi[i]);
            }
            odchsum = getStandardDeviation(SumyUslug);

            //DEBUG - oblicza i wyświetla drugi z parametrów dla każdego węzła
            using (var writer = new StreamWriter("paramOutput.csv"))
            {
                writer.WriteLine("global;" + odchsum / sumaodchylen);
                writer.WriteLine("node;local;");
                foreach (Wezel w in Wezly)
                {
                    double wartosc = 0;
                    wartosc = getStandardDeviation(w.DlugosciPrzypisanychZadan);
                    List <double>[] LocalZadaniaDoUslugi;
                    LocalZadaniaDoUslugi = new List <double> [IloscUslug];
                    for (int i = 0; i < IloscUslug; i++)
                    {
                        LocalZadaniaDoUslugi[i] = new List <double>();
                    }

                    foreach (Podzadanie zadanko in w.HistoriaZadania)
                    {
                        LocalZadaniaDoUslugi[zadanko.IDuslugi].Add(Convert.ToDouble(zadanko.WymaganyCzasPrzetwarzania));
                    }

                    double localsuma = 0;
                    for (int i = 0; i < IloscUslug; i++)
                    {
                        if (LocalZadaniaDoUslugi[i].Count() != 0)
                        {
                            localsuma += getStandardDeviation(LocalZadaniaDoUslugi[i]);
                        }
                    }

                    Console.WriteLine("Dla wezla " + w.IDWezla + " wartość lokalnego parametru wynosi: " + wartosc / localsuma);
                    writer.WriteLine(w.IDWezla + ";" + wartosc / localsuma);
                }
            }


            int    max, min, sum, n;
            string ocz;

            using (var writer = new StreamWriter("tasksOutput.csv"))
            {
                writer.WriteLine("task;max;min;avg;kworum;");
                foreach (Zadanie ukonczone in ZadaniaZakonczone)
                {
                    max = -1;
                    min = -1;
                    sum = 0;
                    n   = 0;
                    ocz = "";

                    foreach (Podzadanie pukonczone in ukonczone.Podzadania)
                    {
                        if (max < pukonczone.CzasOczekiwania)
                        {
                            max = pukonczone.CzasOczekiwania;
                        }
                        if (min == -1)
                        {
                            min = pukonczone.CzasOczekiwania;
                        }
                        else if (min > pukonczone.CzasOczekiwania)
                        {
                            min = pukonczone.CzasOczekiwania;
                        }
                        sum += pukonczone.CzasOczekiwania;
                        n++;
                        ocz += pukonczone.CzasOczekiwania + ";";
                    }

                    writer.WriteLine(ukonczone.IDZadania.ToString() + "; " + max + "; " + min + "; " + sum / n + "; " + ocz);
                }
            }
            string uslugi;

            using (var writer = new StreamWriter("nodesOutput.csv"))
            {
                writer.WriteLine("logicClock;" + Zegar);
                writer.WriteLine("node;noActive;workLoad;services");

                foreach (Wezel wez in Wezly)
                {
                    uslugi = "";
                    foreach (int usg in wez.ObslugiwaneUslugi)
                    {
                        uslugi += usg + ",";
                    }

                    writer.WriteLine(wez.IDWezla + ";" + wez.CzasNieaktywnosci + ";" + wez.WykonaneKwantyCzasu + ";" + uslugi + ";");
                }
            }

            using (var writer = new StreamWriter("serviceOutput.csv"))
            {
                int[,] serviceTable = new int[IloscUslug, 2];
                Array.Clear(serviceTable, 0, serviceTable.Length);
                writer.WriteLine("service;workToDo;count;");
                foreach (Zadanie ukonczone in ZadaniaZakonczone)
                {
                    foreach (Podzadanie pukonczone in ukonczone.Podzadania)
                    {
                        serviceTable[pukonczone.IDuslugi, 0] += pukonczone.WymaganyCzasPrzetwarzania;
                        serviceTable[pukonczone.IDuslugi, 1]++;
                    }
                }
                for (int i = 0; i < IloscUslug; i++)
                {
                    writer.WriteLine(i + ";" + serviceTable[i, 0] + ";" + serviceTable[i, 1] + ";");
                }
            }
        }