Lekcja 4. Wektory bram i wektory modułów

Podobne dokumenty
Lekcja 5. Funkcje handlemessage() i initialize(), konstruktor i destruktor

Lekcja 1. Środowisko OMNeT++

Lekcja 2. Tworzenie i uruchamianie prostej symulacji

Lekcja 3. Statystyki narzędzie Result Analysis

Działanie komputera i sieci komputerowej.

UNIFON podręcznik użytkownika

Kancelaria instalacja programu

Programowanie w języku Python. Grażyna Koba

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16

Poradnik korzystania z usługi FTP

Klient poczty elektronicznej - Thunderbird

Instrukcja dla instalatora systemu SMDP Enterprise/Professional

Krok 2: Pierwsze uruchomienie

Wykład Nr Sieci bezprzewodowe 2. Monitorowanie sieci - polecenia

Programowanie - wykład 4

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

2014 Electronics For Imaging. Informacje zawarte w niniejszej publikacji podlegają postanowieniom opisanym w dokumencie Uwagi prawne dotyczącym tego

System imed24 Instrukcja Moduł Analizy i raporty

KOMPUTEROWY SYSTEM WSPOMAGANIA OBSŁUGI JEDNOSTEK SŁUŻBY ZDROWIA KS-SOMED

Platforma e-learningowa

Symulacja Packet Tracer - Komunikacja z użyciem protokołów TCP i UDP

Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać

Instrukcja. importu dokumentów. z programu Fakt do programu Płatnik. oraz. przesyłania danych do ZUS. przy pomocy programu Płatnik

1 Moduł Inteligentnego Głośnika

Instalacja programu dreryk

Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR

Konfiguracja podglądu obrazu z kamery IP / rejestratora BCS przez sieć LAN.

Przekierowanie portów w routerze - podstawy

Instrukcja użytkownika. Aplikacja dla Comarch Optima

1 Moduł Inteligentnego Głośnika 3

Sieci Komputerowe 2 / Ćwiczenia 2

Podstawy Programowania C++

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

BACKUP BAZ DANYCH FIREBIRD

Instalacja sterownika portu USB

Praca z programami SAS poza lokalną siecią komputerową UZ. Zestawienie tunelu SSH oraz konfiguracja serwera proxy w przeglądarce WWW

Rysunek 1: Okno z lista

SERWER AKTUALIZACJI UpServ

Spis treści. 1 Moduł RFID (APA) 3

Jak przygotować zbiorczy plik JPK VAT i przesłać go do urzędu skarbowego?

Instrukcje sterujące. wer. 11 z drobnymi modyfikacjami! Wojciech Myszka :53:

PHP: bloki kodu, tablice, obiekty i formularze

SERWER AKTUALIZACJI UpServ

SERWER AKTUALIZACJI UpServ

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Aplikacja Sieciowa wątki po stronie klienta

Budowanie listy Odbiorców

StacjaSQL.2012 / PIERWSZE URUCHOMIENIE I PODSTAWOWE USTAWIENIA / / USUNIĘCIE "BAZY TESTOWEJ, PRZEJŚCIE NA WERSJĘ KOMERCYJNĄ / oraz. str.

4. Certyfikaty dla pracy w systemie WOW w miejscu z siecią Internet UWAGA

Instrukcja obsługi programu ODGiK-NET 1.5

Rejestratory DVS-NVR0401-4P i DVS-NVR0801-8P. Instrukcja aktywacji rejestratora i dodawania kamer IP

Jak zainstalować i skonfigurować komunikator MIRANDA, aby wyglądał i funkcjonował jak Gadu Gadu Tutorial by t800.

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Fiery Remote Scan. Uruchamianie programu Fiery Remote Scan. Skrzynki pocztowe

Instrukcja użytkownika ARsoft-CFG WZ1 4.0

Moduł Media backup oraz konfiguracja serwera zapasowego

Projekt procesora NIOSII w strukturze programowalnego układu logicznego CYCLONEII EP2C35F672C6 podłączenie i obsługa wyświetlacza LCD.

Pętla for. Wynik działania programu:

Replikacja kolejkowa (Q-replication) w IBM DB2

Mechanizmy pracy równoległej. Jarosław Kuchta

Urządzenia sieciowe. Tutorial 1 Topologie sieci. Definicja sieci i rodzaje topologii

Data wykonania Część praktyczna

KRYPTOGRAFIA I OCHRONA DANYCH PROJEKT

W dowolnym momencie można zmienić typ wskaźnika.

1 Podstawy c++ w pigułce.

Jak przesłać mapę do urządzenia lub na kartę pamięci?

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Opcje Fiery1.3 pomoc (serwer)

ROZDZIAŁ 1. PRZEGLĄD BRAMOFONU SAFE...

PhysX Visual Debugger. Tomasz Gańko

1 Wielokrotne powtarzanie tych samych operacji

Instrukcja użytkownika. Aplikacja dla Comarch Optima

Laboratorium Ericsson HIS NAE SR-16

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Podstawy programowania skrót z wykładów:

Przewodnik... Budowanie listy Odbiorców

Instrukcja konfiguracji funkcji skanowania

Laboratorium - Przechwytywanie i badanie datagramów DNS w programie Wireshark

Specyfikacja instalacji usługi SMS Premium w Przelewy24.pl

E-DEKLARACJE Dokumentacja eksploatacyjna 2017

5. Model komunikujących się procesów, komunikaty

WebMobile7 and Sello Integrator wersja 1.1.2

1 Moduł Bramki xcomfort 3

1 Moduł Bramki xcomfort

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

KURIER XL BY CTI DLA SIÓDEMKA

IIIIIIIIIIIIIIIMMIMMIII

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

ŁĄCZENIE POZYCJI Z RECEPTY

Metody Metody, parametry, zwracanie wartości

Palety by CTI. Instrukcja

dr inż. Tomasz Krzeszowski

Jak nadać dokumentowi żądany numer?

Serwery Statefull i Stateless

Podstawy programowania Laboratorium. Ćwiczenie 2 Programowanie strukturalne podstawowe rodzaje instrukcji

Program dla praktyki lekarskiej

Instrukcja obsługi serwera FTP v

Zamawianie Taxi Aktywator Instrukcja użytkownika

Instrukcja użytkownika. Aplikacja dla Comarch ERP XL

Transkrypt:

Lekcja 4. Wektory bram i wektory modułów W lekcji 4 wyjaśnione zostają zagadnienia korzystania z wektorów modułów oraz wektorów bram ułatwiających budowę dużych symulacji. Bardzo często zdarza się, że w symulacji znajdują się moduły spełniające te same funkcje i podłączone do tych samych modułów. Wypadałoby wtedy deklarować dla każdego z nich osobny moduł i inicjować każdy. W przypadku małych symulacji nie byłby to problem, ale gdy należy podłączyć np. 20 klientów do sieci to staje się to kłopotliwe. W takich sytuacjach najlepiej jest wykorzystać wektor modułu. Zawierał on będzie jakąś liczbę (określaną przez nas) pojedynczych podmodułów. Ponadto skoro maja być wszystkie te submoduły podłączone do tego samego modułu to należałoby zdefiniować dla każdego z nich połączenie. Przydatny staje się wtedy wektor bram. Zasady wykorzystania i deklaracji wektorów modułu i wektorów bram przedstawione zostały na przykładzie sieci klient-serwer. Nie będzie to sieć odwzorowująca rzeczywiste sieci jedynie będzie je przypominała układem czynników biorących udział w połączeniach i będzie służyła jako model edukacyjny. Przykład Wykonany został model sieci komputerowej, w skład której wchodzą: serwer bazodanowy działający na takich samych zasadach jak w modelu z Lekcji 2( bez cache) cztery komputery klienckie (również działające tak jak w modelu z Lekcji 2) przełącznik switch pracujący z prędkością 10Mb/s na wejściach oraz 100Mb/s na wyjściach. Wewnętrzna przepustowość jest nieograniczona. Klienci mają wysyłać żądanie do serwera poprzez przełącznik i otrzymywać odpowiedź. Schemat sieci przedstawiony jest na poniższym rysunku. Dodatkowo zostaną wykorzystane (tak jak w poprzedniej lekcji) moduły sieciowe, które będą sprawdzały zajętość kanału transmisyjnego i pozwolą na bezkolizyjne wysyłanie komunikatów. 40

DYSK CPU SERWER 100Mb/s SWITCH 10Mb/s K1 K2 K3 K4 Rys. 1. Schemat sieci Źródło: wykonanie własne Z powyższego schematu łatwo można wywnioskować, że do budowy modelu będą potrzebne 3 moduły złożone: moduł Serwer w skład którego wchodzą podmoduł procesor i dysk, moduł Switch w którym zdefiniujemy podmoduł Porty zajmujący się sprawdzaniem skąd przybył komunikat i przesyłaniem go do odpowiedniej bramy oraz podmoduł Sterowanie zajmujący się ustawianiem odpowiednich rodzajów komunikatów co ułatwi rozpoznawanie dokąd Porty mają wysłać wiadomość, moduł Symulator zawierający wymienione wyżej moduły i moduł Klienta. Dla przejrzystości kodu oraz łatwiejszego odnajdywania ewentualnych błędów wszystkie moduły złożone można zapisać w osobnych plikach.ned i importować odpowiednie pliki (serwer.ned oraz switch.ned) do pliku, w którym zdefiniowany jest moduł nadrzędny (Symulator). Zaczniemy od modułu serwera, który różni się od modułu Serwer z zadania z Lekcji 2 jedynie tym, że jest nieco uproszczony - nie posiada podmodułu Cache. Zapisany zostanie on w pliku o nazwie serwer.ned. Następnie omówiony zostanie moduł Switch. Składa się on z submodułu odpowiadającego za przetrzymywanie informacji na temat przychodzących wiadomości, który został nazwany Magazyn oraz submodułu zajmującego się ustawianiem odpowiednich kind ów adresów docelowych dla zadań Sterowanie_switchem. 41

Do switcha mają być podłączeni klienci oraz serwer. Wiadomości od klientów trafiają najpierw do Magazynu, następnie do Sterowanie_switchem, gdzie jest ustawiany odpowiedni adres docelowy (destaddress) i są z powrotem przesyłane do Magazynu. Magazyn wysyła komunikaty do Serwera. Wynika stąd, że w Magazynie potrzebne są 4 połączenia odbierające wiadomości od klientów, 4 wysyłające do klientów, połączenie do i od sterowania oraz połączenie do i od serwera. Wiedząc, że każdy klient wykonuje te same czynności można wykorzystać wektor bram, który wyznaczany jest za pomocą pary pustych nawiasów []. Tworzymy pliki: Magazyn.ned i Sterowanie_switchem.ned //---------------- plik Magazyn.ned -------- simple Magazyn parameters: int czas_wyszukiwania_danych; gates: input od_klienta[];//wektor bram wejściowych od klientów output do_klienta[]; input od_sterowania[]; output do_sterowania[]; input od_cpu; output do_cpu; //---------------- plik Sterowanie_switchem.ned -------- simple Sterowanie_switchem gates: input od_portow; output do_portow; Wielkość wektora (czyli ilość bram w wektorze) określa się za pomocą gates (w poprzedniej wersji gatesizes) w module nadrzędnym w sekcji submodules. W tym przykładzie wykorzystana zostanie zmienna ilosc_klientow, która będzie przechowywała liczbę wszystkich klientów (jej wartość określona została w omnetpp.ini; elementy wektora numerowane są od 0). Jeśli pominięte zostanie nadanie rozmiaru wektora to zostanie on utworzony z wartością 0. Należy pamiętać również, że komunikaty trafiają najpierw do modułu złożonego skąd są kierowane na Magazyn, więc konieczne jest zdefiniowanie wektora bram również w module Switch. 42

module Switch parameters: int id_klienta; gates: input do_switcha[]; output od_switcha[]; input od_serwera; output do_serwera; submodules: porty: Magazyn @display( p=50,158 ); gates: od_klienta[id_klienta]; do_klienta[id_klienta]; od_sterowania; do_sterowania; od_cpu; do_cpu; sterowanie: Sterowanie_switchem @display( p=50,50 ); gates: input od_portow; output do_portow; connections: Do określenia odpowiednich połączeń pomiędzy wektorem bram Switcha a bramami klientów zastosowana jest pętla for... connections: for i=0..(id_klienta-1) do_switcha[i] --> porty.od_klienta[i]; od_switcha[i] <-- porty.do_klienta[i]; od_serwera --> porty.od_cpu; do_serwera <-- porty.do_cpu; porty.od_sterowania <-- sterowanie.do_portow; porty.do_sterowania --> sterowanie.od_portow; Następnie utworzony zostanie moduł złożony symulacji Lekcja4. W zadaniu potrzebnych jest czterech klientów, więc w sekcji submodule nadany jest wektor modułu Klient, a w sekcji conections za pomocą pętli for ustawione połączenia dla każdego modułu wektora. 43

Należy pamiętać również o określeniu odpowiedniej przepustowości na wejściu i wyjściu do switcha. Można to zrobić w dwa sposoby: na szybko i elegancko. Poniżej oba sposoby zostały przedstawione ( datarate = 10Mbps; oraz deklaracja typu kanal_100 ). network Lekcja4 parameters: int ilosc_klientow; @display( bgb=930,500 ); types: channel kanal_100 extends ned.dataratechannel datarate = 100Mbps; submodules: host[ilosc_klientow]: Klient parameters: @display( p=105,420,row,200 ); siec_od[ilosc_klientow]: Siec @display("p=65,320,row,200;i=block/ifcard"); siec_do[ilosc_klientow]: Siec @display("p=165,320,row,200;i=block/ifcard"); switch: Switch parameters: id_klienta = ilosc_klientow; @display( p=420,225;i=device/switch ); gates: od_switcha[ilosc_klientow]; do_switcha[ilosc_klientow]; od_serwera; do_serwera; komputer: Serwer @display( p=420,40;i=device/server ); gates: od_komputera; do_komputera; sieciowa1: Siec @display("p=350,120;i=block/ifcard"); sieciowa2: Siec 44

@display("p=475,120;i=block/ifcard"); connections: for i=0..ilosc_klientow-1 siec_do[i].wyjscie --> datarate = 10Mbps; --> switch.do_switcha[i]; siec_od[i].wyjscie --> datarate = 10Mbps; --> host[i].do_klienta; switch.od_switcha[i] --> siec_od[i].wejscie; siec_do[i].wejscie <-- host[i].od_klienta; sieciowa2.wyjscie --> kanal_100 --> serwer.do_komputera; //datarate = 100Mbps serwer.od_komputera --> sieciowa1.wejscie; switch.do_serwera --> sieciowa2.wejscie; sieciowa1.wyjscie --> kanal_100 --> switch.od_serwera; Ponieważ moduł Klient jest wektorem modułów to podczas uruchomienia modelu w GNED widoczny będzie on jako jeden moduł. Dopiero w trakcie działania symulacji w trybie graficznym Tkenv pokazane zostaną wszystkie moduły wchodzące w skład wektora. Należy jednak ustawić ich położenie za pomocą odpowiedniej etykiety w display: p=xpos,ypos,row,deltay, dzięki której moduły ułożą się w jednym wierszu w odstępach od siebie określonych jako deltay. Display posiada wiele różnych etykiet, które są przydatne przy ustawianiu modułów, m.in.: p=xpos,ypos,column,deltay ustawia w kolumnie p=xpos,ypos,ring,width,height ustawia w koło b=width,height,rect ustawia w prostokąt Przydatne jest również nadanie zmiennym wartości w pliku omnetpp.ini. Model sieci jest już gotowy. Można go obejrzeć pod zakładką Design. Teraz kolej jest na zaimplementowanie poszczególnych submodułów w C++. Definicje wszystkich klas klasy csimplemodule zostały zapisane w jednym pliku źródłowym *.h. Konstrukcja obiektów klasy csimplemodule została omówiona w lekcji 2. Dla przypomnienia poniżej znajduje się definicja klasy Klient. #ifndef KLIENT_H #define KLIENT_H 45

#include <omnetpp.h> #include "MyPacket_m.h" class Klient : public csimplemodule public: Klient() : csimplemodule(32768) cqueue kolejka; MyPacket *zadanie; virtual void activity(); ; #endif Podobnie jak w lekcjach wcześniejszych zastosowana została funkcja activity(). Kierunek wysyłania wiadomości najłatwiej jest kontrolować operując na adresie docelowym komunikatu. Jednakże należy ustalić na samym początku algorytm przydzielania adresów dla poszczególnych wysłań wiadomości. Poniższy rysunek przedstawia nadanie adresów w tym zadaniu. 46

Rys. 2. Nadawanie wiadomościom adresu docelowego (destaddress) Źródło: wykonanie własne Funkcja activity() modułu Klient ma na celu wysyłanie komunikatów do Switch a. Ponieważ do poprawnego działania symulacji potrzebna jest informacja o tym, z którego modułu wektora została wysłana wiadomość aby wróciła do niego odpowiedź, należy z poszczególnych modułów wysyłać wiadomość zawsze o tym samym adresie źródłowym (srcaddress). Brama wyjściowa w każdym module wektora ma tą samą nazwę, więc nie ma możliwości sugerowania się nią, ale każda brama wyjściowa modułu wektora jest połączona do innej bramy z wektora bram modułu sąsiedniego, czyli Magazyn. Można to sprawdzić za pomocą gate( nazwa_bramy_wyjsciowej )->togate(). Funkcja togate() w Omnet 4.2 nazywa się getnextgate().jest to dopiero nazwa tej bramy, a do zadania potrzebna jest jej wartość. Można ją uzyskać poprzez getindex(). Niestety sposób ten nie zadziała w przypadku dołączenia do modelu - pomiędzy moduły Klient i Switch - modułów Siec. Wtedy najlepiej skorzystać z : gate( nazwa_bramy_wyjsciowej )->getownermodule()->getindex(). #include Klient.h #include "MyPacket_m.h" Define_Module(Klient); void Klient::activity() kolejka.setname( kolejka ); for (;;) char nazwa[20]; int wielkosc_danych = par ( wielkosc_danych );; strcpy(nazwa, oddo_klienta ); MyPacket *zadanie = new MyPacket (nazwa); int id_klienta = gate("od_klienta")->getownermodule() -> getindex()+1; zadanie->setkind(id_klienta); zadanie->setsrcaddress(id_klienta); zadanie->setdestadress(1); zadanie->setbytelength(wielkosc_danych); ev << Klient do switcha zadanie z kind= << 47

zadanie->getkind() <<,Wielkosc danych= << wielkosc_danych << endl; send(zadanie, "od_klienta"); double czas_namyslu=par ( czas_namyslu ); waitandenqueue((double) czas_namyslu, &kolejka); //tworzy kolejke komunikatow do tej kolejki kolejka.clear (); Wiadomość o odpowiednim adresie wysłana przez moduł Klient trafia do modułu Siec, a następnie do modułu Magazyn. Sprawdzana jest kolejka i w przypadku, gdy jest pusta za zadanie podstawiona jest przybyła wiadomość, a w przeciwnym wypadku wiadomość z końca kolejki. Następnie sprawdzony jest adres docelowy tej wiadomości i na jego podstawie wybrana jest odpowiednia funkcja. #include Magazyn.h Define_Module(Magazyn); void Magazyn::activity() MyPacket *zadanie; kolejka.setname( kolejka ); for (;;) if (kolejka.empty()) zadanie = (MyPacket *) receive(); else // w przeciwnym wypadku pobiera zadanie z konca kolejki zadanie = (MyPacket *)kolejka.pop(); int dest = zadanie->getdestaddress(); zadanie->setdestaddress(dest+1); double czas_wyszukiwania_danych = (double)par("czas_wyszukiwania_danych"); //spr czy przyszlo od klienta if (dest == 1) waitandenqueue(czas_wyszukiwania_danych, &kolejka); ev << Magazyn dostal od klienta zadanie z kind= 48

<< zadanie->getkind() << endl; wyslij_na_sterowanie(zadanie); //spr czy przyszlo od sterowania i ma isc do serwer else if (dest == 3) waitandenqueue(czas_wyszukiwania_danych, &kolejka); ev << Magazyn dostal od sterowania zadanie z kind= << zadanie->getkind() << endl; wyslij_do_serwera(zadanie); //spr czy przyszlo od serwera else if (dest == 7) waitandenqueue(czas_wyszukiwania_danych, &kolejka); ev << Magazyn dostal od serwera zadanie z kind= << zadanie->getkind() << endl; wyslij_na_sterowanie(zadanie); //spr czy ma isc do klienta else if (dest == 9) waitandenqueue(czas_wyszukiwania_danych, &kolejka); ev << Magazyn dostal od sterowania zadanie z kind= << zadanie->getkind() << endl; wyslij_do_klientow(zadanie); Jeśli wiadomość przyszła od Klienta lub od Serwera to wiadomość wysłana jest do Sterowania_switchem. void Magazyn::wyslij_na_sterowanie( MyPacket *zadanie) send(zadanie, "do_sterowania"); ev << Magazyn do sterowania zadanie z kind= << zadanie- >getkind() << endl; Tak samo należy postąpić w przypadku zadań, które mają być wysłane do serwera. void Magazyn::wyslij_do_serwera(MyPacket *zadanie) send (zadanie, "do_cpu"); ev << Magazyn do serwera zadanie z kind= << zadanie- 49

>getkind() << endl; Jeśli do Magazynu przybędzie wiadomość o adresie docelowym 9 to wiadomo że zadnie było już na serwerze i jest to odpowiedź do klienta. W metodzie send() należy zaznaczyć przez którą bramę wektora ma być wysłana wiadomość. void Magazyn::wyslij_do_klientow( cmessage *zadanie) int brama = zadanie->getsrcaddress(); send (zadanie, oddo_klienta$o,brama-1); ev << Magazyn do Klient zadanie z kind= << zadanie- >getkind() << endl; Moduł Sterowanie_switchem ma bardzo proste działanie zwiększa adres docelowy o 1 i wysyła z powrotem do Magazynu. #include Sterowanie_switchem.h Define_Module(Sterowanie_switchem); void Sterowanie_switchem::activity() for (;;) zadanie = (MyPacket *) receive(); ev << Sterowanie dostalo od Magazynu zadanie z kind= <<zadanie->getkind() << endl; wyslij_na_porty(zadanie); void Sterowanie_switchem::wyslij_na_porty(MyPacket *zadanie) int dest = zadanie->getdestaddress(); zadanie->setdestaddress(dest+1); send (zadanie, "do_portow"); ev << Sterowanie do Magazyn zadanie z kind= << zadanie- >getkind() << endl; W module Procesor należy sprawdzić czy zadanie przyszło od Switch a czy wróciło od dysku wykonać odpowiednią funkcję wysyłającą. #include Procesor.h Define_Module(Procesor); 50

void Procesor::activity() kolejka.setname( kolejka ); for (;;) int dest; // jesli kolejka jest pusta to odbiera zadanie //za pomoca funkcji receive if (kolejka.empty()) zadanie = (MyPacket *) receive(); else // w przeciwnym wypadku pobiera zadanie z konca kolejki zadanie = (MyPacket *)kolejka.pop(); dest = zadanie->getdestaddress(); zadanie->setdestaddress(dest+1); //spr czy przyszlo od switcha if (dest == 4) ev << Procesor dostal od switcha zadanie z kind= << zadanie->getkind() << endl; wysylamy_na_dysk(zadanie); //spr czy wrocilo z dysku else ev << Procesor dostal od dysku zadanie z kind= << zadanie->getkind() << endl; wysyla_do_switcha_od_serwera(zadanie); void Procesor::wysylamy_na_dysk(MyPacket *zadanie) double czas_wyszukiwania_danych = (double) par( czas_wyszukiwania_danych ) ; waitandenqueue(czas_wyszukiwania_danych, &kolejka); ev << Procesor do dysku zadanie z kind= << zadanie- >getkind() << endl; send (zadanie, "do_dysku"); void Procesor::wysyla_do_switcha_od_serwera(MyPacket *zadanie) double czas_transmisji_do_switcha; czas_transmisji_do_switcha= (double) par ( czas_transmisji_do_klienta ); 51

czas_transmisji_do_switcha*= (double) (zadanie-> getkind()*2); if (czas_transmisji_do_switcha>0 ) waitandenqueue(czas_transmisji_do_switcha, &kolejka); ev << Procesor do switcha zadanie z kind= << zadanie- >getkind() << endl; send (zadanie, "do_klienta"); Jeśli zadanie przyszło od switcha należy zwiększyć adres docelowy i wysyłać wiadomość do modułu Dysk_twardy. Natomiast w przypadku wiadomości, która wróciła od dysku należy również zmienić adres docelowy i wysłać do switcha. Wykonane jest to na tej samej zasadzie jak w przypadków wcześniej już omawianych modułów. Funkcje modułu Dysk_twardy nie wymagają sprawdzenia rodzaju wiadomości ponieważ dysk jest połączony jedynie z procesorem. Zadanie jest obsłużone na dysku, zostaje ustalony odpowiedni adres docelowy i zadanie wysłane jest do Procesora. Zadanie jest już gotowe do uruchomienia i przeprowadzenia symulacji. Rys. 3. Okno modułu Symulator Źródło: wykonanie własne 52

Po uruchomieniu wyświetlone zostało okno modułu głównego. Klienci ustawieni są w szeregu w odstępach od siebie nadanych wcześniej w modelu modułu i podpisani są odpowiednia wartością wektora. Po dwukrotnym kliknięciu na moduł switch oraz serwer otworzą się okna tych modułów. Rys. 4. Okno modułu switch Źródło: wykonanie własne Rys. 5. Okno modułu serwer Źródło: wykonanie własne Zadanie do samodzielnego przygotowania: Wykonaj model sieci komputerowej, w skład której wchodzą: określona liczba (podana przy rozpoczęciu symulacji) serwerów bazodanowych (z zadania drugiego), pewna liczba klientów (podana przy rozpoczęciu symulacji), przełącznik sieciowy (switch), sieć pracującej z prędkością 10 Mb/s. Wewnętrzna przepustowość przełącznika wynosi 100 Mb/s. Klient powinien wysyłać żądanie do wylosowanego wcześniej serwera. 53