Wstęp do MPI-2. Jacek Dziedzic FTiMS, Politechnika Gdańska Gdańsk, Algorytmy rozproszone 2017/2018. v1.14

Wielkość: px
Rozpocząć pokaz od strony:

Download "Wstęp do MPI-2. Jacek Dziedzic FTiMS, Politechnika Gdańska Gdańsk, Algorytmy rozproszone 2017/2018. v1.14"

Transkrypt

1 Wstęp do MPI-2 Jacek Dziedzic FTiMS, Politechnika Gdańska Gdańsk, Algorytmy rozproszone 2017/2018 v1.14

2 Pracujemy w systemie równoległym o architekturze MIMD, z pamięcią rozproszoną... N E T W O R K wiadomość #718 od: węzeł #1 do: węzeł #3 długość: 8192 B dane: serwer plików pamięć masowa Pamięć rozproszona każdy węzeł pracuje we własnej przestrzeni adresowej, nie może bezpośrednio "zajrzeć" do pamięci pozostałych węzłów. Komunikacja między węzłami odbywa się za pomocą przesyłania wiadomości po wydajnej sieci.

3 Pracujemy w systemie równoległym o architekturze MIMD, z pamięcią rozproszoną plik1... N E T W O R K user@node2:~> ls plik1 plik2 plik3 user@node2:~> user@node3:~> ls plik1 plik2 plik3 user@node3:~> serwer plików pamięć masowa plik2 plik3 Dostęp do pamięci masowej zapewnia na ogół serwer plików, w sposób przezroczysty dla użytkownika.

4 MPI-2 W 1995 przeprowadzono ankietę wśród użytkowników MPI, pytając co chcieliby widzieć w kolejnej wersji standardu. Najczęściej padały prośby o dodanie: dynamicznego zarządzania procesami (startowanie nowych procesów w trakcie działania programu, etc.), wsparcia dla C++ (już z niego korzystamy), komunikacji jednostronnej (wszystkie informacje potrzebne do przesłania wiadomości dostarcza jedna strona, drugiej nie zawraca się głowy). Operacje typu Put i Get, pozwalające pisać do i czytać ze zdalnego węzła bez jego bezpośredniego udziału. równoległego we/wy. W 1997 pojawiła się specyfikacja MPI-2, w której zawarto wszystkie powyższe udogodnienia i jeszcze trochę (np. możliwe jest już wysyłanie wiadomości w Fortranie i jej odbiór w C++). Nie wszystkie implementacje MPI dysponują rozszerzeniami zawartymi w MPI-2, ale większość tak. W 2017: praktycznie wszystkie.

5 Po co nam równoległe we/wy? Najczęściej mamy do czynienia z sytuacją, w której każdy węzeł pracuje na porcji danych (dekompozycja danych). W pamięci masowej chcielibyśmy jednak mieć wszystkie dane w (uporządkowanej) całości. MAMY: CHCEMY: pamięć masowa

6 Bez równoległego we/wy metoda 1 Każdy węzeł może zapisywać dane do oddzielnego pliku. Łatwe do zrobienia, ale ma szereg wad: Podczas obróbki danych (post-processing) niewygodnie jest pracować z wieloma plikami zamiast z jednym. Co zrobić, jeśli liczba węzłów zmieni się pomiędzy kolejnymi wywołaniami programu? Przykładowo program pracował na 4 węzłach, wyprodukował 4 pliki wyjściowe, a jutro chcemy by pracował na 5 węzłach. Potrzeba dodatkowych użytków, które sklejałyby pliki do jednego po tym, jak program zakończy się strata czasu i przestrzeni dyskowej (co jeśli pliki mają po 4 GB?). Zapis do wielu plików jest niewydajny (seek, fragmentacja). storage

7 Bez równoległego we/wy metoda 2 Można zebrać dane na jednym węźle korzystając z przesyłania wiadomości i zapisać je z tego węzła. Gather(...) pamięć masowa

8 Bez równoległego we/wy metoda 2 Wady tego rozwiązania: Nierówny podział pracy węzeł, na którym piszemy do pliku jest zajęty wykonując we/wy, podczas gdy pozostałe węzły nudzą się. Na węźle odpowiedzialnym za we/wy potrzebujemy mnóstwo dodatkowej pamięci, żeby pomieścić na raz dane ze wszystkich węzłów (jeśli korzystamy z Gather). Można przesyłać po kawałku i pisać po kawałku, ale wtedy pozostałe węzły są dłużej zajęte (czekają z przesłaniem reszty aż master zapisze poprzednią porcję). Obciążenie sieci teraz wszystkie dane muszą przejść przez węzeł master, a być może bezpośrednie połączenia węzeł-serwer plików są krótsze.

9 MPI-2 oferuje równoległe we/wy wszystkie węzły piszą jednocześnie do jednego pliku MPI::File::Write(...) Wygodne (dostajemy jeden plik). Dobry podział pracy (wszystkie węzły zajęte). Efektywne (MPI i SO mogą optymalizować zapisy i odczyty). Podobnie dla odczytu. pamięć masowa

10 Równoległe we/wy jak? Skoncentrujmy uwagę na najbardziej pospolitej czynności wczytaniu danych z jednego pliku na wiele węzłów tak, że każdy z nich dostaje fragment danych. plik... node #0 node #1 node #2 Trzy metody: przesuń wskaźnik pliku i czytaj, czytaj-od-miejsca (read_at), widoki plików. node #(N-1)

11 Równoległe we/wy otwarcie pliku Zaczynamy od równoległego otwarcia pliku: static MPI::File MPI::File::Open(const MPI::Intracomm& comm, const char *filename, int amode, const MPI::Info& info); To jest operacja zbiorowa wszystkie węzły wewnątrz komunikatora muszą ją wywołać. (Jeśli chcemy równolegle otworzyć plik na jednym procesorze, możemy skorzystać z komunikatora MPI::COMM_SELF). comm komunikator, filename nazwa otwieranego pliku. Może się tak zdarzyć, że różne węzły widzą ten sam plik pod różnymi nazwami, np. jeden węzeł może widzieć plik pod nazwą /local/home/janek/plik1 a inny jako /mnt/lab/home/ janek/plik1. Jeśli tak jest, każdy węzeł przekazuje swoją nazwę. info dodatkowe informacje, które moglibyśmy chcieć przekazać implementacji MPI. Jeśli nie chcemy, przekazujemy MPI::INFO_NULL). amode tryb dostępu (o tym za chwilę). Zwraca: uchwyt do pliku. Domyślnie błędy nie kończą się katastrofą (ważne na laborce).

12 Równoległe we/wy otwarcie pliku Tryb dostępu jest bitową kombinacją poniższych flag: MPI_MODE_RDONLY tylko do odczytu, MPI_MODE_WRONLY tylko do zapisu, MPI_MODE_RDWR do odczytu i zapisu, MPI_MODE_CREATE utwórz plik, jeśli nie istnieje, MPI_MODE_EXCL sygnalizuj błąd, jeśli nie istnieje, MPI_MODE_DELETE_ON_CLOSE usuń plik po zamknięciu (dla plików tymczasowych), MPI_MODE_UNIQUE_OPEN obietnica, że plik nie będzie jednocześnie otwarty gdzieś indziej (pozwala SO na lepszą optymalizację), MPI_MODE_SEQUENTIAL tylko dostęp sekwencyjny (taśmy, etc.), MPI_MODE_APPEND przewiń na koniec pliku po otwarciu. Zadana kombinacja musi mieć sens, np. MPI_MODE_RDONLY MPI_MODE_WRONLY nie ma sensu. W Fortranie flagi te dodaje się (bo nie ma operatora bitowego OR). Wszystkie węzły muszą przekazać ten sam tryb dostępu. Parametr info dodatkowe wskazówki, które chcemy przekazać MPI, np. atrybuty pliku, jeśli jest tworzony, sugerowany rozmiar bufora, wskazówki co do tego, czy plik będzie głównie czytany czy pisany, etc.. Informacje te pozwalają implementacji na lepszą optymalizację późniejszych operacji na pliku. Na ogół nie będziemy przekazywali żadnych dodatkowych informacji przekazujemy wówczas MPI::INFO_NULL.

13 Równoległe we/wy zamykanie pliku Gdy skończymy pracę z plikiem, trzeba go zamknąć: void MPI::File::Close(); Zatem wołamy metodę Close() na rzecz obiektu klasy MPI::File, który reprezentuje nasz plik i który otrzymaliśmy jako wynik działania funkcji MPI::File::Open(). To też jest operacja zbiorowa wszystkie węzły komunikatora muszą jednocześnie zamykać plik. Musimy zamknąć wszystkie pliki zanim wywołamy MPI::Finalize(). W momencie zamknięcia pliku musimy zagwarantować, że wszystkie nieblokujące operacje we/wy zakończyły się (na tym wykładzie mówimy tylko o blokujących operacjach we/wy).

14 Równoległe we/wy czytamy z pliku Odczyt wygląda podobnie do odbierania wiadomości: void MPI::File::Read(void* buf, int count, const MPI::Datatype& datatype, MPI::Status& status); NIE jest operacją grupową (!) nie wszystkie węzły komunikatora muszą czytać. Jeśli chcemy czytać z pliku tylko na niektórych węzłach, wywołujemy MPI::File::Read() tylko na tych węzłach. Istnieje wersja grupowa: MPI::File::Read_all(), która służy do odczytu na wszystkich węzłach komunikatora jednocześnie. Jeśli czytamy na wszystkich węzłach, korzystniej jest zastosować wersję grupową z uwagi na możliwość optymalizacji odczytu przez MPI i SO. buf adres bufora do którego czytamy dane. count liczba elementów (nie bajtów!) do wczytania. datatype typ odczytywanych danych (MPI::DOUBLE, MPI::INT, etc.) status struktura statusu, która zawiera szczegóły odczytu, tak samo jak w przypadku Recv(), np. liczbę faktycznie odczytanych elementów.

15 Równoległe we/wy uwagi dot. odczytu Wskaźniki pozycji pliku są niezależne na wszystkich węzłach. Oznacza to, że odczyt na jednym węźle nie ma wpływu na stan pliku (w szczególności na wskaźnik pozycji pliku) na pozostałych węzłach: plik A B Po tym jak węzeł A dokonał odczytu jego wskaźnik pozycji pliku przesuwa się, ale wskaźnik pozycji na B pozostaje niezmieniony. plik A B

16 W równoległym we/wy w MPI-2 dane w pliku są określonego typu nie liczymy danych w bajtach, tylko w elementach: Odczyt w stylu C (POSIX) read(... ile bajtów...) Zapis w stylu C (POSIX) write(... ile bajtów...) Odczyt w stylu C++ std::read(... ile bajtów...) Zapis w stylu C++ std::write(... ile bajtów...) ale Równoległe we/wy uwagi dot. odczytu MPI-2 MPI::File::Read(... ile elementów, jakiego typu...) MPI-2 MPI::File::Write(... ile elementów, jakiego typu...) operujemy na elementach, nie bajtach. zwalnia nas to z konieczności pamiętania czy np. sizeof(int)==2, 4 czy 8 na danej platformie. jeśli w pliku są dane nie tylko jednego typu tworzymy typ danych użytkownika (np. rekord).

17 Równoległe we/wy uwagi dot. odczytu Istnieje przeciążona wersja operacji Read() pozbawiona ostatniego argumentu (status) korzystamy z niej jeśli status nas nie interesuje. Liczbę odczytanych elementów możemy wydobyć ze statusu za pomocą metody Get_count(). Kontrolą błędów musimy się zająć sami domyślnie operacje równoległego we/wy nie zgłaszają wyjątków ani nie kończą programu.

18 Równoległe we/wy zapis do pliku Analogicznie do odczytu (i podobnie do wysłania wiadomości): void MPI::File::Write(const void* buf, int count, const MPI::Datatype& datatype, MPI::Status& status); Podobnie jak poprzednio: NIE jest operacją zbiorową (!) nie wszystkie węzły komunikatora muszą pisać. Jeśli jednak piszemy na wszystkich węzłach, warto skorzystać ze zbiorowej operacji MPI::File::Write_all() pozwoli ona MPI optymalizować zapis. Argumenty jak dla MPI::File::Read(), tylko bufor jest const. Jak przy odczycie każdy węzeł ma swój, niezależny wskaźnik zapisu. Sygnalizacja problemu: co jeśli dwóch jednocześnie pisze w to samo miejsce? Omówione operacje odczytu i zapisu nie mają zastosowania do plików otwartych w trybie MPI_MODE_SEQUENTIAL, te trzeba czytać i pisać z użyciem współdzielonych wskaźników pozycji pliku (shared file pointers) nie będziemy się nimi zajmować.

19 Równoległe we/wy jak przemieszczać się w pliku? Chcemy pisać/czytać w różnych miejscach pliku na różnych węzłach, musimy więc mieć możliwość przesuwania wskaźnika pozycji pliku (przemieszczania się w pliku, seek): void MPI::File::Seek(MPI::Offset offset, int whence); Składnia podobnia do POSIX lseek() używanej do przemieszczania w pliku w szeregowym we/wy. offset liczba bajtów (wyjątkowo nie elementów) o którą przesuwamy wskaźnik względem whence. whence (ang. skąd) stała symboliczna określająca względem jakiego miejsca mierzymy przesunięcie. Do dyspozycji mamy MPI_SEEK_SET od początku pliku, MPI_SEEK_END od końca pliku, MPI_SEEK_CUR od bieżącej pozycji. Przykładowo: // ustaw wskaźnik po pierwszych 10 bajtach (0..9) mój_plik.seek(10, MPI_SEEK_SET); // cofnij się o 6 bajtów mój_plik.seek(-6, MPI_SEEK_CUR); // przesuń się na koniec pliku mój_plik.seek(0, MPI_SEEK_END);

20 Równoległe we/wy przykład input.dat #include <mpi.h> #include <iostream> using namespace std; int main(int argc, char** argv) { MPI::Init(argc,argv); węzeł #0 węzeł #1 węzeł #2 k*porcja węzeł węzeł #k #(N-1) int moj_numer = MPI::COMM_WORLD.Get_rank(); const int porcja=200; MPI::File plik; double bufor[porcja]; plik = MPI::File::Open(MPI::COMM_WORLD,"input.dat", MPI_MODE_RDONLY,MPI::INFO_NULL); plik.seek(moj_numer*porcja*sizeof(double),mpi_seek_set); plik.read(bufor,porcja,mpi::double); plik.close(); } MPI::Finalize();

21 Równoległe we/wy odczyt bez jawnego przemieszczania Druga metoda odczytu (lub zapisu) czytanie (lub zapis) od razu od konkretnego miejsca, bez jawnego przesuwania wskaźnika pliku: void MPI::File::Read_at(MPI::Offset offset, void* buf, int count, const MPI::Datatype& datatype, MPI::Status& status); Dodatkowy parametr (offset) mówi z którego miejsca pliku czytać/pisać. Parametr offset jest typu MPI::Offset chociaż zachowuje się jak liczba całkowita (na ogół jest synonimem int), to nie ma gwarancji że pozostanie tak w przyszłości. W związku z powyższym przesunięcia w pliku należy deklarować jako MPI::Offset, nie int. Znowu istnieją wersje zbiorowe: MPI::File::Read_at_all(), MPI::File::Write_at_all().

22 Metoda trzecia: widoki (file views) Najbardziej skomplikowana metoda, ale dająca największe możliwości. Koncepcja widoków zwalnia programistę od pamiętania, że każdy węzeł czyta z innej części pliku. Nałożenie widoku na plik działa jak zasłonięcie niektórych fragmentów pliku na każdym z węzłów. widok na węźle #0 plik widok na węźle #2 Każdy węzeł widzi tylko część pliku. Widoki można zmieniać zdejmować i nakładać nowe. widok na węźle #1 widok na węźle #3

23 Metoda trzecia: widoki (file views) Co więcej, fragmenty pliku widziane na każdym z węzłów nie muszą być ciągłe! Otwiera to systemowi operacyjnemu i implementacji MPI pole do wielu optymalizacji, zwłaszcza jeśli dane się przeplatają. widok na węźle #0 widok na węźle #1 plik widok na węźle #2 widok na węźle #3 W szeregowym we/wy każdy węzeł musiałby wczytać cały plik, po czym wyrzucić ¾ danych (albo wykonać mnóstwo operacji przemieszczenia). Gdy korzystamy z widoków MPI-2, implementacja wie, że plik trzeba odczytać tylko raz, po czym automagicznie rozparcelowuje dane pomiędzy węzły.

24 Metoda trzecia: widoki (file views) Możliwe jest również określenie, w których miejscach pliku znajdują się "dziury", jeśli mamy do czynienia z sytuacją, w której chcemy ukryć pewne dane przed wszystkimi węzłami. Implementacja będzie się starała zoptymalizować we/wy jeśli dziur takich będzie dużo. niedostępne na żadnym z węzłów plik nagłówek widok na węźle #0 widok na węźle #1 widok na węźle #2 widok na węźle #3 Każdy z węzłów widzi tylko to, co jest dla niego istotne, nie wie co dzieje się w pozostałych częściach pliku, nie musi jawnie przeskakiwać dziur widzi należną mu część jak mniejszy, ciągły plik. Bardzo wygodne, wydajne. Jedyna trudna część definiowanie (nakładanie) widoku.

25 Równoległe we/wy nakładanie widoku Widok nakładamy korzystając z metody void MPI::File::Set_view(MPI::Offset disp, const MPI::Datatype& etype, const MPI::Datatype& filetype, const char *datarep, const MPI::Info& info) Plik musi być uprzednio otwarty. disp przesunięcie w pliku, od którego zaczyna się widok dla tego procesu. Przesunięcie to jest (wyjątkowo) mierzone w bajtach, nie w elementach. Pozwala to na przeskoczenie nagłówka pliku, który dzięki temu może mieć dowolną długość. etype podstawowa jednostka danych w pliku, filetype opisuje, które części pliku są widoczne, datarep łańcuch określający wewnętrzny format pliku jeden z {"native", "internal", "external32"}. info dodatkowe informacje, które chcemy przekazać implementacji MPI, podobnie jak przy MPI::File::Open(). Na ogół będziemy przekazywać MPI::INFO_NULL, nie przejmując się tym.

26 Równoległe we/wy etype i filetype etype typ danych reprezentujący najmniejszą jednostkę informacji w pliku. Np. dla pliku zawierającego liczby całkowite, etype==mpi::int. Jeśli w pliku mamy bardziej skomplikowane struktury, korzystamy z typów danych definiowanych przez użytkownika (rekordów). filetype opisuje w jaki sposób w pliku rozłożone są interesujące dane i niepotrzebne "dziury" najczęściej jest to typ definiowany przez użytkownika. Jeśli w pliku nie ma dziur, filetype==etype. nagłówek plik - etype, np. MPI::DOUBLE - filetype

27 Widoki uwagi Po nałożeniu widoku wskaźnik pozycji w pliku dla każdego procesu ustawia się na początek widoku. Po nałożeniu widoku wszystkie odczyty, zapisy i pozycjonowania działają względem nałożonego widoku, np. mój_plik.seek(0, MPI_SEEK_SET) przesuwa wskaźnik na początek widoku, nie pliku. MPI::File::Set_view() jest operacją zbiorową wszyscy w obrębie komunikatora nakładają widok jednocześnie. Argument datarep i rozmiar typu etype muszą być takie same na każdym węźle. Przed nałożeniem widoku należy mieć pewność, że wszystkie operacje na pliku zakończyły się (dotyczy operacji nieblokujących). Argument datarep opisuje jak wygląda reprezentacja danych w pliku. Najprostszy wariant to taki, w którym dane w pliku są dokładną kopią danych w pamięci. Tryb ten wybieramy podając "native". Ma to tę zaletę, że działa szybko i zapisuje/czyta dane bez żadnych strat, bo nie ma konwersji. Wada jest taka, że nie da się tego stosować w środowiskach heterogenicznych na innej architekturze reprezentacja danych może być zupełnie inna. O pozostałych możliwościach ("internal", "external32") powiemy sobie przy temacie współoperatywności (jak zapewnić przenośność pliku między różnymi architekturami).

28 Załóżmy, że mamy do odczytania plik o następującym formacie: nagłówek: 16 bajtów, zawartość którego (dla uproszczenia) chcemy zignorować, 2000 liczb double przeznaczonych dla procesu 0, 2000 liczb double przeznaczonych dla procesu 1, 2000 liczb double przeznaczonych dla procesu *d *d przesunięcia (disp) (w bajtach). d=sizeof(double) // otwórz plik const int count = 2000; MPI::File plik; plik = MPI::File::Open(MPI::COMM_WORLD, "test.dat", MPI_MODE_RDONLY, MPI::INFO_NULL); // oblicz początek widoku zależnie od numeru procesora d=sizeof(double); MPI::Offset disp=15+mój_numer*count*d; // wszystko w bajtach // wybierz typ danych w pliku. Rezygnujemy z "dziur", wobec // czego filetype == etype MPI::Datatype etype = MPI::DOUBLE; MPI::Datatype filetype = MPI::DOUBLE; // ustaw widok plik.set_view(disp, etype, filetype, "native", MPI::INFO_NULL); // czytaj swoją porcję double bufor[count]; plik.read(bufor, count, etype); Widoki przykład widok w proc 0 widok w proc 1 widok w proc 2

29 MPI-2: mniej istotne operacje na plikach Sprawdzenie rozmiaru pliku: MPI::Offset MPI::File::Get_size(); Operacja punktowa. Rozmiar zwracany jest w bajtach (sic!). Pamiętamy, że rozmiar jest typu MPI::Offset. Zaalokowanie dodatkowej przestrzeni w pliku: void MPI::File::Preallocate(MPI::Offset size); size nowy rozmiar pliku. Służy do powiększania pliku podanie size mniejszego od bieżącego rozmiaru pliku nie skraca go. Wymuszenie powiększenia pliku (potencjalnie) zapobiega fragmentacji, która może nastąpić gdy plik powiększamy po kawałku. Operacja grupowa wszyscy muszą podać to samo size. Skutkuje powiększeniem pliku do zadanego rozmiaru. Dane, o które powiększył się plik są niezdefiniowane. Nie ma sensu przy MPI_MODE_SEQUENTIAL.

30 Równoległe we/wy kontrola błędów W MPI dla Fortranu i C funkcje we/wy zwracają wartość (w Fortranie dodatkowy parametr, w C wartość zwracana), którą można sprawdzić żeby upewnić się, czy operacja we/wy zakończyła się sukcesem: int error; error=mpi_file_open(...); if(error) // nie udalo sie error=mpi_file_seek(...); if(error) // nie udalo sie error=mpi_file_read(...); if(error) // nie udalo sie //... W C++ korzystamy z wyjątków, żeby móc rozdzielić gałęzie kodu obsługujące sytuację w której wszystko idzie pomyślnie od sytuacji wyjątkowej: try { MPI::File plik = MPI::File::Open(...); plik.seek(...); plik.read(...); //... } catch(mpi::exception &e) { // nie udalo sie }

31 Równoległe we/wy kontrola błędów Aby wykorzystać mechanizm wyjątków w MPI-2 musimy zrobić dwie rzeczy. 1) Upewnić się, że ich obsługa jest włączona często jest tak, że biblioteka MPI musi być skompilowana z odpowiednimi opcjami, żeby włączyć obsługę wyjątków. Na ogół domyślnie obsługa ta jest wyłączona (żeby niekorzystający z nich mogli uniknąć niepotrzebnych narzutów). Dla przykładu na dzień dzisiejszy na olimpie korzystamy z wersji bez wkompilowanej obsługi wyjątków: [jaca@olimp ~]$ ompi_info grep exceptions C++ exceptions: no 2) Wymusić, aby wystąpienie błędów we/wy kończyło się zgłoszeniem wyjątku. W MPI mamy do dyspozycji trzy sposoby reakcji na błędy: MPI::ERRORS_ARE_FATAL natychmiastowe zakończenie programu w razie błędu, domyślnie stosowane dla błędów w przesyłaniu wiadomości, MPI::ERRORS_RETURN w razie błędu funkcja zwraca kod błędu (przydatne w C, Fortranie) domyślnie stosowane dla błędów we/wy, MPI::ERRORS_THROW_EXCEPTIONS w razie błędu zgłaszany jest wyjątek ten sposób reakcji na błędy interesuje nas w C++. Musimy zatem wymusić trzeci typ reakcji dla operacji we/wy.

32 Równoległe we/wy kontrola błędów Do zmiany reakcji na błędy operacji we/wy korzystamy z metody void MPI::File::Set_errhandler(const MPI::Errhandler& errhandler) const, której jako argument przekazujemy jedną z wartości MPI::ERRORS_ARE_FATAL, MPI::ERRORS_RETURN, MPI::ERRORS_THROW_EXCEPTIONS (bądź funkcję obsługi błędów stworzoną przez użytkownika), a wywołujemy ją na rzecz pliku, dla którego chcemy zmienić sposób reakcji na błędy. Jeśli obsługa wyjątków nie została włączona przy kompilacji biblioteki MPI, zachowanie programu po napotkaniu błędu będzie zależało od konkretnej implementacji MPI (np. wersja na olimpie wypisuje komunikat o błędzie i próbuje kontynuować pracę). Przy korzystaniu z wyjątków musimy mieć pewność, że zarówno bibliotekę MPI, jak i program z niej korzystający skompilowano tym samym kompilatorem oraz że kod napisany w innych językach (C, Fortran) będzie poprawnie propagował wyjątki do momentu wyłapania ich w kodzie w C++.

33 MPI-2: współoperatywność Zagadnienie współoperatywności (interoperability) operacji we/wy jak będą wyglądały operacje we/wy w systemach heterogenicznych? Dwa aspekty: 1. Fizyczny układ danych w pliku różne architektury zapisują dane na różne sposoby. Np. liczba 0x304AB7F2 na procesorach Intel x86 będzie zapisana jako cztery bajty: 0xF2 0xB7 0x4A 0x30 (tzw. konwencja little-endian), a na procesorach Motorola jako cztery bajty: 0x30 0x4A 0xB7 0xF2 (tzw. konwencja big-endian). MPI, ponieważ gwarantuje współoperatywność, musi dać do dyspozycji możliwość poprawnego odczytania na Motoroli pliku zapisanego kiedyś na Intelu (gorzej, w środowisku heterogenicznym ten sam plik może być jednocześnie pisany w jednym fragmencie przez Motorolę, a w innym przez Intela x86). 2. Ewentualne konwersje na jednej architekturze MPI::DOUBLE może mieć osiem a na innej sześć bajtów. Co więcej, jednocześnie z tego samego pliku mogą korzystać oba procesory. Należy zapewnić ew. przycinanie wartości przy przesyłaniu w jedną stronę i ew. poszerzanie jej przy przesyłaniu w drugą. Z drugiej strony niektóre programy są pisane z myślą tylko o środowiskach homogenicznych i nie obchodzą je zagadnienia współoperatywności dobrze, gdyby dało się z tego zrezygnować (i można).

34 MPI-2: współoperatywność Drugi aspekt współoperatywności mamy zagwarantowany automatycznie MPI samo dokonuje potrzebnych konwersji zarówno przy operacjach na plikach jak i przy przesyłaniu wiadomości. Pierwszy aspekt współoperatywności w operacjach we/wy osiągamy za pomocą widoków. void MPI::File::Set_view(, const char *datarep, ); datarep łańcuch określający wewnętrzny format pliku jeden z {"native", "internal", "external32"}. Tryb "native" oznacza rezygnację ze współoperatywności. Wszystkie dane w pliku są dokładną kopią danych w pamięci. Pliki tak zapisane nie działają w systemach heterogenicznych. Nie dają się czytać (bez jakiegoś ręcznego przekonwertowania) na maszynach, gdzie obowiązują inne konwencje. Zaletą jest prostota i szybkość (brak jakichkolwiek narzutów związanych z konwersją). Tryb "internal" wymusza zapis w pewnym (nieokreślonym dokładnie) formacie wspólnym dla wszystkich maszyn wykonujących program. Włączone są konwersje, zatem osiągamy aspekt drugi współoperatywności. Nie ma jednak gwarancji, że plik da się czytać w innych środowiskach (nie osiągamy aspektu pierwszego). Tryb "external32" wymusza zapis w dobrze określonym formacie, o którym mamy gwarancję że będzie taki sam we wszystkich środowiskach. Włączone są konwersje. Osiągamy oba aspekty współoperatywności kosztem największych narzutów czasowych.

35 Równoległe we/wy synchronizacja i spójność Dwa podstawowe problemy, typowe dla środowisk w których mamy do czynienia ze współbieżnością. 1.Procesor A wykonuje zapis do pliku F na pozycji k, po czym procesor B odczytuje z pliku F na pozycji k. Czy procesor B odczyta już nowozapisane dane? Problem w tym, że zakończenie się operacji zapisu na procesorze A nie oznacza, że dane faktycznie są w pliku (na skutek buforowania). A rozpoczyna zapis A koniec zapisu na A A wysyła wiadomość do B, że dane są gotowe A B odbiera wiadomość i zaczyna odczyt B czas bufory systemowe... ale w tym momencie danych nie ma jeszcze fizycznie na dysku dysk

36 2. Procesor A wykonuje zapis do pliku F na pozycji k, w tym samym czasie procesor B wykonuje zapis do tego samego pliku na tej samej pozycji. Co znajdzie się w pliku? Sposób traktowania powyższych przypadków semantyka spójności. Równoległe we/wy synchronizacja i spójność Np. w standardzie POSIX ( zakłada się tzw. semantykę silnej spójności oznacza to ad 1: gdy zakończy się zapis, mamy gwarancję że nowe dane widziane są we wszystkich procesach (co niekoniecznie oznacza, że są już fizycznie na dysku, tylko że system dba o spójność buforowanych danych), ad 2: w sytuacji dwóch jednoczesnych zapisów mamy gwarancję, że dane będą pochodziły od jednego lub drugiego procesu (nie wiadomo którego), ale wiadomo, że nie będą zbitką danych z obydwu.

Wstęp do MPI-2. Jacek Dziedzic FTiMS, Politechnika Gdańska Gdańsk, Algorytmy rozproszone 2014/2015. v1.13

Wstęp do MPI-2. Jacek Dziedzic FTiMS, Politechnika Gdańska Gdańsk, Algorytmy rozproszone 2014/2015. v1.13 Wstęp do MPI-2 Jacek Dziedzic FTiMS, Politechnika Gdańska Gdańsk, 2006-2015 Algorytmy rozproszone 2014/2015 v1.13 Pracujemy w systemie równoległym o architekturze MIMD, z pamięcią rozproszoną... N E T

Bardziej szczegółowo

Programowanie w modelu przesyłania komunikatów specyfikacja MPI, cd. Krzysztof Banaś Obliczenia równoległe 1

Programowanie w modelu przesyłania komunikatów specyfikacja MPI, cd. Krzysztof Banaś Obliczenia równoległe 1 Programowanie w modelu przesyłania komunikatów specyfikacja MPI, cd. Krzysztof Banaś Obliczenia równoległe 1 MPI dynamiczne zarządzanie procesami MPI 2 umożliwia dynamiczne zarządzanie procesami, choć

Bardziej szczegółowo

Rozszerzenia MPI-2 1

Rozszerzenia MPI-2 1 Rozszerzenia MPI-2 1 2 Dynamiczne tworzenie procesów Aplikacja MPI 1 jest statyczna z natury Liczba procesów określana jest przy starcie aplikacji i się nie zmienia. Gwarantuje to szybką komunikację procesów.

Bardziej szczegółowo

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

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1 Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja

Bardziej szczegółowo

Komunikacja za pomocą potoków. Tomasz Borzyszkowski

Komunikacja za pomocą potoków. Tomasz Borzyszkowski Komunikacja za pomocą potoków Tomasz Borzyszkowski Wstęp Sygnały, omówione wcześniej, są użyteczne w sytuacjach błędnych lub innych wyjątkowych stanach programu, jednak nie nadają się do przekazywania

Bardziej szczegółowo

Laboratorium Systemów Operacyjnych. Ćwiczenie 4. Operacje na plikach

Laboratorium Systemów Operacyjnych. Ćwiczenie 4. Operacje na plikach Laboratorium Systemów Operacyjnych Ćwiczenie 4. Operacje na plikach Wykonanie operacji wymaga wskazania pliku, na którym operacja ma zostać wykonana. Plik w systemie LINUX identyfikowany jest przez nazwę,

Bardziej szczegółowo

Programowanie w modelu przesyłania komunikatów specyfikacja MPI. Krzysztof Banaś Obliczenia równoległe 1

Programowanie w modelu przesyłania komunikatów specyfikacja MPI. Krzysztof Banaś Obliczenia równoległe 1 Programowanie w modelu przesyłania komunikatów specyfikacja MPI Krzysztof Banaś Obliczenia równoległe 1 Model przesyłania komunikatów Paradygmat send receive wysyłanie komunikatu: send( cel, identyfikator_komunikatu,

Bardziej szczegółowo

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

5. Model komunikujących się procesów, komunikaty Jędrzej Ułasiewicz str. 1 5. Model komunikujących się procesów, komunikaty Obecnie stosuje się następujące modele przetwarzania: Model procesów i komunikatów Model procesów komunikujących się poprzez pamięć

Bardziej szczegółowo

Programowanie Równoległe Wykład 5. MPI - Message Passing Interface. Maciej Matyka Instytut Fizyki Teoretycznej

Programowanie Równoległe Wykład 5. MPI - Message Passing Interface. Maciej Matyka Instytut Fizyki Teoretycznej Programowanie Równoległe Wykład 5 MPI - Message Passing Interface Maciej Matyka Instytut Fizyki Teoretycznej Dorobiliśmy się strony WWW www.ift.uni.wroc.pl/~koma/pr/index.html MPI, wykład 2. Plan: - komunikacja

Bardziej szczegółowo

Programowanie Równoległe Wykład 4. MPI - Message Passing Interface. Maciej Matyka Instytut Fizyki Teoretycznej

Programowanie Równoległe Wykład 4. MPI - Message Passing Interface. Maciej Matyka Instytut Fizyki Teoretycznej Programowanie Równoległe Wykład 4 MPI - Message Passing Interface Maciej Matyka Instytut Fizyki Teoretycznej Jak używać w MPI? Donald Knuth: We should forget about small efficiencies, say about 97% of

Bardziej szczegółowo

Wykład 4. Tablice. Pliki

Wykład 4. Tablice. Pliki Informatyka I Wykład 4. Tablice. Pliki Dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2017 Tablice Tablica uporządkowany zbiór elementów określonego typu Każdy element tablicy posiada

Bardziej szczegółowo

Pliki. Operacje na plikach w Pascalu

Pliki. Operacje na plikach w Pascalu Pliki. Operacje na plikach w Pascalu ścieżka zapisu, pliki elementowe, tekstowe, operacja plikowa, etapy, assign, zmienna plikowa, skojarzenie, tryby otwarcia, reset, rewrite, append, read, write, buforowanie

Bardziej szczegółowo

ang. file) Pojęcie pliku (ang( Typy plików Atrybuty pliku Fragmentacja wewnętrzna w systemie plików Struktura pliku

ang. file) Pojęcie pliku (ang( Typy plików Atrybuty pliku Fragmentacja wewnętrzna w systemie plików Struktura pliku System plików 1. Pojęcie pliku 2. Typy i struktury plików 3. etody dostępu do plików 4. Katalogi 5. Budowa systemu plików Pojęcie pliku (ang( ang. file)! Plik jest abstrakcyjnym obrazem informacji gromadzonej

Bardziej szczegółowo

Wykład PASCAL - Pliki tekstowe

Wykład PASCAL - Pliki tekstowe Podstawy programowania Wykład PASCAL - Pliki tekstowe 1 dr Artur Bartoszewski - Podstawy prograowania, sem. 1- WYKŁAD Rodzaje plików Dane przechowywane w pliku mogą mieć reprezentację binarną (taką samą,

Bardziej szczegółowo

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6 JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM Wykład 6 1 SPECYFIKATOR static Specyfikator static: Specyfikator ten powoduje, że zmienna lokalna definiowana w obrębie danej funkcji nie jest niszczona

Bardziej szczegółowo

Pliki. Funkcje tworzące pliki i operujące na nich opisane są w części 2 pomocy systemowej. Tworzenie i otwieranie plików:

Pliki. Funkcje tworzące pliki i operujące na nich opisane są w części 2 pomocy systemowej. Tworzenie i otwieranie plików: Pliki W celu wykonania jakiejkolwiek operacji na istniejącym pliku, plik ten musi zostać otwarty, natomiast jeśli plik jeszcze nie istnieje, to musi zostać utworzony. Plik może zostać otwarty w trybie:

Bardziej szczegółowo

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie. Część XXII C++ w Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie. Ćwiczenie 1 1. Utwórz nowy projekt w Dev C++ i zapisz go na

Bardziej szczegółowo

System plików warstwa logiczna

System plików warstwa logiczna Dariusz Wawrzyniak Pojęcie u Plik jest abstrakcyjnym obrazem informacji gromadzonej i udostępnianej przez system komputerowy. Plik jest podstawową jednostką logiczną magazynowania informacji w systemie

Bardziej szczegółowo

Biblioteka standardowa - operacje wejścia/wyjścia

Biblioteka standardowa - operacje wejścia/wyjścia Biblioteka standardowa - operacje wejścia/wyjścia Przemysław Gawroński D-10, p. 234 Wykład 6 15 stycznia 2019 (Wykład 6) Biblioteka standardowa - operacje wejścia/wyjścia 15 stycznia 2019 1 / 14 Outline

Bardziej szczegółowo

Obsługa plików. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 25 września 2011

Obsługa plików. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 25 września 2011 Obsługa plików Systemy Operacyjne 2 laboratorium Mateusz Hołenko 25 września 2011 Plan zajęć 1 Pliki w systemie Linux i-węzły deskryptory plików 2 Operacje na plikach otwieranie i zamykanie zapis i odczyt

Bardziej szczegółowo

Operacje grupowego przesyłania komunikatów. Krzysztof Banaś Obliczenia równoległe 1

Operacje grupowego przesyłania komunikatów. Krzysztof Banaś Obliczenia równoległe 1 Operacje grupowego przesyłania komunikatów Krzysztof Banaś Obliczenia równoległe 1 Operacje grupowego przesyłania komunikatów Operacje, w ramach których ten sam komunikat lub zbiór komunikatów przesyłany

Bardziej szczegółowo

Programowanie aplikacji równoległych i rozproszonych. Wykład 8

Programowanie aplikacji równoległych i rozproszonych. Wykład 8 Wykład 8 p. 1/?? Programowanie aplikacji równoległych i rozproszonych Wykład 8 Dr inż. Tomasz Olas olas@icis.pcz.pl Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska Plan wykładu

Bardziej szczegółowo

Argumenty wywołania programu, operacje na plikach

Argumenty wywołania programu, operacje na plikach Temat zajęć: Argumenty wywołania programu, operacje na plikach Autor: mgr inż. Sławomir Samolej Zagadnienie 1. (Zmienne statyczne) W języku C można decydować o sposobie przechowywania zmiennych. Decydują

Bardziej szczegółowo

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p. Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni Wykład 6 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Wskaźnik do pliku Dostęp do pliku: zapis, odczyt,

Bardziej szczegółowo

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw Mirosław Głowacki 1 1 Akademia Górniczo-Hutnicza im. Stanisława Staszica w Ktrakowie Wydział Inżynierii Metali i Informatyki Stosowanej

Bardziej szczegółowo

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main. Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo

Bardziej szczegółowo

Logiczny model komputera i działanie procesora. Część 1.

Logiczny model komputera i działanie procesora. Część 1. Logiczny model komputera i działanie procesora. Część 1. Klasyczny komputer o architekturze podanej przez von Neumana składa się z trzech podstawowych bloków: procesora pamięci operacyjnej urządzeń wejścia/wyjścia.

Bardziej szczegółowo

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p. Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy Wykład 12 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji (1) Obsługa łańcuchów znakowych getchar(), putchar()

Bardziej szczegółowo

Lab 9 Podstawy Programowania

Lab 9 Podstawy Programowania Lab 9 Podstawy Programowania (Kaja.Gutowska@cs.put.poznan.pl) Wszystkie kody/fragmenty kodów dostępne w osobnym pliku.txt. Materiały pomocnicze: Wskaźnik to specjalny rodzaj zmiennej, w której zapisany

Bardziej szczegółowo

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

Podstawy programowania skrót z wykładów: Podstawy programowania skrót z wykładów: // komentarz jednowierszowy. /* */ komentarz wielowierszowy. # include dyrektywa preprocesora, załączająca biblioteki (pliki nagłówkowe). using namespace

Bardziej szczegółowo

Zdalne wywoływanie procedur RPC. Dariusz Wawrzyniak 1

Zdalne wywoływanie procedur RPC. Dariusz Wawrzyniak 1 Zdalne wywoływanie procedur Zagadnienia projektowe Zagadnienia realizacyjne main(int argc, char* argv[]){ int id, status; id = atoi(argv[1]); status = zabij_proc(id); exit(status)... int zabij_proces (int

Bardziej szczegółowo

Obsługa wyjątków. Język C++ WW12

Obsługa wyjątków. Język C++ WW12 Obsługa wyjątków Pozwala zarządzać błędami wykonania w uporządkowany sposób. Umożliwia automatyczne wywołanie części kodu, funkcji, metod klas, który trzeba wykonać przy powstaniu błędów. try //blok try

Bardziej szczegółowo

Programowanie w modelu przesyłania komunikatów specyfikacja MPI, cd. Krzysztof Banaś Obliczenia równoległe 1

Programowanie w modelu przesyłania komunikatów specyfikacja MPI, cd. Krzysztof Banaś Obliczenia równoległe 1 Programowanie w modelu przesyłania komunikatów specyfikacja MPI, cd. Krzysztof Banaś Obliczenia równoległe 1 Środowisko przesyłania komunikatów MPI Rodzaje procedur: blokujące nieblokujące Tryby przesyłania

Bardziej szczegółowo

Zdalne wywoływanie procedur RPC

Zdalne wywoływanie procedur RPC Zdalne wywoływanie procedur Zagadnienia projektowe Zagadnienia realizacyjne main(int argc, char* argv[]){ int id, status; id = atoi(argv[1]); status = zabij_proc(id); exit(status) }... int zabij_proces

Bardziej szczegółowo

Zdalne wywoływanie procedur RPC

Zdalne wywoływanie procedur RPC Zdalne wywoływanie procedur Zagadnienia projektowe Zagadnienia realizacyjne main(int argc, char* argv[]){ int id, status; id = atoi(argv[1]); status = zabij_proc(id); exit(status)... int zabij_proces (int

Bardziej szczegółowo

Tryby komunikacji między procesami w standardzie Message Passing Interface. Piotr Stasiak Krzysztof Materla

Tryby komunikacji między procesami w standardzie Message Passing Interface. Piotr Stasiak Krzysztof Materla Tryby komunikacji między procesami w standardzie Message Passing Interface Piotr Stasiak 171011 Krzysztof Materla 171065 Wstęp MPI to standard przesyłania wiadomości (komunikatów) pomiędzy procesami programów

Bardziej szczegółowo

Instrukcja do laboratorium Systemów Operacyjnych (semestr drugi)

Instrukcja do laboratorium Systemów Operacyjnych (semestr drugi) Instrukcja do laboratorium Systemów Operacyjnych (semestr drugi) wiczenie trzecie Temat: Potoki i ł cza nazwane w Linuksie. Opracowanie: mgr in ż. Arkadiusz Chrobot Wprowadzenie 1. Komunikacja z wykorzystaniem

Bardziej szczegółowo

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI Dr inż. Grażyna KRUPIŃSKA Grazyna.Krupinska@fis.agh.edu.pl D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI Wyrażenia 2 Wyrażenia w języku C są bardziej elastyczne niż wyrażenia w jakimkolwiek innym języku

Bardziej szczegółowo

Jak wiemy, wszystkich danych nie zmieścimy w pamięci. A nawet jeśli zmieścimy, to pozostaną tam tylko do najbliższego wyłączenia zasilania.

Jak wiemy, wszystkich danych nie zmieścimy w pamięci. A nawet jeśli zmieścimy, to pozostaną tam tylko do najbliższego wyłączenia zasilania. Jak wiemy, wszystkich danych nie zmieścimy w pamięci. A nawet jeśli zmieścimy, to pozostaną tam tylko do najbliższego wyłączenia zasilania. Dlatego trzeba je zapisywać do pliku, a potem umieć je z tego

Bardziej szczegółowo

Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki Konwersje napis liczba Struktury, unie Scanf / printf Wskaźniki Konwersje liczba napis Ćwiczenia 1. Napisz aplikację, która na wejściu dostaje napis postaci W Roku Pańskim 1345, władca Henryk 12,

Bardziej szczegółowo

Wyjątki (exceptions)

Wyjątki (exceptions) Instrukcja laboratoryjna nr 6 Programowanie w języku C 2 (C++ poziom zaawansowany) Wyjątki (exceptions) dr inż. Jacek Wilk-Jakubowski mgr inż. Maciej Lasota dr inż. Tomasz Kaczmarek Wstęp Wyjątki (ang.

Bardziej szczegółowo

Wskaźniki. Informatyka

Wskaźniki. Informatyka Materiały Wskaźniki Informatyka Wskaźnik z punktu widzenia programisty jest grupą komórek pamięci (rozmiar wskaźnika zależy od architektury procesora, najczęściej są to dwa lub cztery bajty ), które mogą

Bardziej szczegółowo

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

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany KLASA UCZEN Napisz deklarację klasy Uczen, w której przechowujemy następujące informacje o uczniu: imię, nazwisko, średnia (pola prywatne), poza tym klasa zawiera metody: konstruktor bezparametrowy (nie

Bardziej szczegółowo

Pliki. Informacje ogólne. Obsługa plików w języku C

Pliki. Informacje ogólne. Obsługa plików w języku C Pliki Informacje ogólne Plik jest pewnym zbiorem danych, zapisanym w systemie plików na nośniku danych (np. dysku twardym, pendrive, płycie DVD itp.). Może posiadać określone atrybuty, a odwołanie do niego

Bardziej szczegółowo

Operacje grupowego przesyłania komunikatów

Operacje grupowego przesyłania komunikatów Operacje grupowego przesyłania komunikatów 1 Operacje grupowego przesyłania komunikatów Operacje, w ramach których ten sam komunikat lub zbiór komunikatów przesyłany jest pomiędzy więcej niż dwoma procesami

Bardziej szczegółowo

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy : Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy : class nazwa_klasy prywatne dane i funkcje public: publiczne dane i funkcje lista_obiektów;

Bardziej szczegółowo

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec PROE wykład 3 klasa string, przeciążanie funkcji, operatory dr inż. Jacek Naruniec Przypomnienie z ostatnich wykładów Konstruktory/destruktory i kolejność ich wywołania w złożonej klasie. Referencja Obiekty

Bardziej szczegółowo

51. Metody komunikacji nieblokującej.

51. Metody komunikacji nieblokującej. 51. Metody komunikacji nieblokującej. Funkcje nieblokujace różnia sie od wersji blokujacych przedrostkiem I (immediate) w nazwie oraz jednym dodatkowym argumentem: request, który jest używany do sprawdzenia,

Bardziej szczegółowo

Przekazywanie argumentów wskaźniki

Przekazywanie argumentów wskaźniki Przekazywanie argumentów wskaźniki klasyczne wywołanie wyliczenie i zwrotne przekazanie tylko jednej wielkości moŝliwość uŝycia zmiennych globalnych niebezpieczeństwa z tym związane wyjście wywołanie funkcji

Bardziej szczegółowo

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1 Tworzenie programów równoległych Krzysztof Banaś Obliczenia równoległe 1 Tworzenie programów równoległych W procesie tworzenia programów równoległych istnieją dwa kroki o zasadniczym znaczeniu: wykrycie

Bardziej szczegółowo

System plików warstwa fizyczna

System plików warstwa fizyczna System plików warstwa fizyczna Dariusz Wawrzyniak Przydział miejsca na dysku Przydział ciągły (ang. contiguous allocation) cały plik zajmuje ciąg kolejnych bloków Przydział listowy (łańcuchowy, ang. linked

Bardziej szczegółowo

System plików warstwa fizyczna

System plików warstwa fizyczna System plików warstwa fizyczna Dariusz Wawrzyniak Plan wykładu Przydział miejsca na dysku Zarządzanie wolną przestrzenią Implementacja katalogu Przechowywanie podręczne Integralność systemu plików Semantyka

Bardziej szczegółowo

System plików warstwa fizyczna

System plików warstwa fizyczna System plików warstwa fizyczna Dariusz Wawrzyniak Przydział miejsca na dysku Zarządzanie wolną przestrzenią Implementacja katalogu Przechowywanie podręczne Integralność systemu plików Semantyka spójności

Bardziej szczegółowo

Zajęcia nr 5 Algorytmy i wskaźniki. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Zajęcia nr 5 Algorytmy i wskaźniki. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej Zajęcia nr 5 Algorytmy i wskaźniki dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej Plan Zapis i odczyt z plików tekstowych O tablicach ciąg dalszy Referencje

Bardziej szczegółowo

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów Operatory są elementami języka C++. Istnieje zasada, że z elementami języka, takimi jak np. słowa kluczowe, nie można dokonywać żadnych zmian, przeciążeń, itp. PRZECIĄŻANIE OPERATORÓW Ale dla operatorów

Bardziej szczegółowo

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4 Dr inż. Dariusz JĘDRZEJCZYK Wskaźniki Dynamiczna alokacja pamięci Przykłady 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 2 Wskaźnik to

Bardziej szczegółowo

76.Struktura oprogramowania rozproszonego.

76.Struktura oprogramowania rozproszonego. 76.Struktura oprogramowania rozproszonego. NajwaŜniejsze aspekty obiektowego programowania rozproszonego to: Współdziałanie (interoperability) modułów programowych na róŝnych maszynach. Wielokrotne wykorzystanie

Bardziej szczegółowo

Wstęp do Programowania, laboratorium 02

Wstęp do Programowania, laboratorium 02 Wstęp do Programowania, laboratorium 02 Zadanie 1. Napisać program pobierający dwie liczby całkowite i wypisujący na ekran największą z nich. Zadanie 2. Napisać program pobierający trzy liczby całkowite

Bardziej szczegółowo

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Laboratorium Podstaw Informatyki Strona 1 Laboratorium Podstaw Informatyki Kierunek Elektrotechnika Ćwiczenie 4 Obsługa plików Kraków 2010 Laboratorium Podstaw Informatyki Strona 2 Obsługa plików Zanim

Bardziej szczegółowo

dr inż. Jarosław Forenc

dr inż. Jarosław Forenc Informatyka 2 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr III, studia stacjonarne I stopnia Rok akademicki 2010/2011 Wykład nr 7 (24.01.2011) dr inż. Jarosław Forenc Rok akademicki

Bardziej szczegółowo

Tworzenie programów równoległych cd. Krzysztof Banaś Obliczenia równoległe 1

Tworzenie programów równoległych cd. Krzysztof Banaś Obliczenia równoległe 1 Tworzenie programów równoległych cd. Krzysztof Banaś Obliczenia równoległe 1 Metodologia programowania równoległego Przykłady podziałów zadania na podzadania: Podział ze względu na funkcje (functional

Bardziej szczegółowo

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33 Programowanie w C++ Wykład 8 Katarzyna Grzelak 15 kwietnia 2019 K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33 Klasy - powtórzenie Klasy typy definiowane przez użytkownika Klasy zawieraja dane składowe

Bardziej szczegółowo

1 Wskaźniki. 1.1 Główne zastosowania wskaźników

1 Wskaźniki. 1.1 Główne zastosowania wskaźników 1 Wskaźniki Wskaźnik (ang. pointer) jest obiektem (zmienną) przechowującym adres pamięci. Definiowanie wskaźników: typ *nazwa wskaznika; np.: int *wsk na x;, double *xxx;, char *znak;. Aby można było pracować

Bardziej szczegółowo

Zdalne wywoływanie procedur RPC 27. października Dariusz Wawrzyniak (IIPP) 1

Zdalne wywoływanie procedur RPC 27. października Dariusz Wawrzyniak (IIPP) 1 Zagadnienia projektowe Zagadnienia realizacyjne main(int argc, char* argv[]){ int id, status; id = atoi(argv[1]); status = zabij_proc(id); exit(status)... int zabij proces (int pid){ int stat; stat = kill(pid,

Bardziej szczegółowo

61 Topologie wirtualne

61 Topologie wirtualne 61 Topologie wirtualne pozwalają opisać dystrybucję procesów w przestrzeni z uwzględnieniem struktury komunikowania się procesów aplikacji między sobą, umożliwiają łatwą odpowiedź na pytanie: kto jest

Bardziej szczegółowo

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami: Wskaźniki są nieodłącznym elementem języka C. W języku C++ także są przydatne i korzystanie z nich ułatwia pracę, jednak w odróżnieniu do C wiele rzeczy da się osiągnąć bez ich użycia. Poprawne operowanie

Bardziej szczegółowo

dr inż. Jarosław Forenc

dr inż. Jarosław Forenc Informatyka 2 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr III, studia stacjonarne I stopnia Rok akademicki 2016/2017 Wykład nr 7 (11.01.2017) Rok akademicki 2016/2017, Wykład

Bardziej szczegółowo

wykład Organizacja plików Opracował: dr inż. Janusz DUDCZYK

wykład Organizacja plików Opracował: dr inż. Janusz DUDCZYK wykład Organizacja plików Opracował: dr inż. Janusz DUDCZYK 1 2 3 Pamięć zewnętrzna Pamięć zewnętrzna organizacja plikowa. Pamięć operacyjna organizacja blokowa. 4 Bufory bazy danych. STRUKTURA PROSTA

Bardziej szczegółowo

Klient-Serwer Komunikacja przy pomocy gniazd

Klient-Serwer Komunikacja przy pomocy gniazd II Klient-Serwer Komunikacja przy pomocy gniazd Gniazda pozwalają na efektywną wymianę danych pomiędzy procesami w systemie rozproszonym. Proces klienta Proces serwera gniazdko gniazdko protokół transportu

Bardziej szczegółowo

4. Procesy pojęcia podstawowe

4. Procesy pojęcia podstawowe 4. Procesy pojęcia podstawowe 4.1 Czym jest proces? Proces jest czymś innym niż program. Program jest zapisem algorytmu wraz ze strukturami danych na których algorytm ten operuje. Algorytm zapisany bywa

Bardziej szczegółowo

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej Wykład II - semestr II Kierunek Informatyka Wydział Matematyki Stosowanej Politechniki Śląskiej Gliwice, 2015 c Copyright 2015 Janusz Słupik Operacje dyskowe - zapis do pliku #include #include

Bardziej szczegółowo

Kolejki FIFO (łącza nazwane)

Kolejki FIFO (łącza nazwane) Kolejki FIFO (łącza nazwane) Systemy Operacyjne 2 laboratorium Mateusz Hołenko 6 listopada 2011 Plan zajęć 1 Łącza w systemie Linux kolejki FIFO vs. potoki specyfika łączy nazwanych schemat komunikacji

Bardziej szczegółowo

Funkcje zawarte w bibliotece < io.h >

Funkcje zawarte w bibliotece < io.h > PLIKOWE OPERACJE WEJŚCIA - WYJŚCIA Język C/C++ nie ma wbudowanych żadnych instrukcji umożliwiających wykonywanie operacji wejścia-wyjścia! Służą do tego funkcje biblioteczne. Funkcje zawarte w bibliotece

Bardziej szczegółowo

Programowanie w językach

Programowanie w językach Programowanie w językach wysokiego poziomu Obsługa plików za pomocą strumieni Elektronika i Telekomunikacja, semestr III rok akademicki 2013/2014 dr inż. Paweł Myszkowski Plan zajęć a) otwieranie i zamykanie

Bardziej szczegółowo

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013 Laboratorium Podstaw Informatyki Strona 1 Laboratorium Podstaw Informatyki Kierunek Elektrotechnika Obsługa plików Kraków 2013 Laboratorium Podstaw Informatyki Strona 2 Obsługa plików Zanim będziemy mogli

Bardziej szczegółowo

Pamięć wirtualna. Przygotował: Ryszard Kijaka. Wykład 4

Pamięć wirtualna. Przygotował: Ryszard Kijaka. Wykład 4 Pamięć wirtualna Przygotował: Ryszard Kijaka Wykład 4 Wstęp główny podział to: PM- do pamięci masowych należą wszelkiego rodzaju pamięci na nośnikach magnetycznych, takie jak dyski twarde i elastyczne,

Bardziej szczegółowo

Funkcje zawarte w bibliotece < io.h >

Funkcje zawarte w bibliotece < io.h > PLIKOWE OPERACJE WEJŚCIA - WYJŚCIA Język C/C++ nie ma wbudowanych żadnych instrukcji umożliwiających wykonywanie operacji wejścia-wyjścia! Służą do tego funkcje biblioteczne. Funkcje zawarte w bibliotece

Bardziej szczegółowo

Typy wyliczeniowe Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Typy wyliczeniowe Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki Typy wyliczeniowe Konwersje napis liczba Struktury, unie Scanf / printf Wskaźniki Typy wyliczeniowe Służą do łatwiejszej kontroli nad stałymi Ustawianie parametrów o ściśle określonym zbiorze wartości

Bardziej szczegółowo

System plików. Warstwowy model systemu plików

System plików. Warstwowy model systemu plików System plików System plików struktura danych organizująca i porządkująca zasoby pamięci masowych w SO. Struktura ta ma charakter hierarchiczny: urządzenia fizyczne strefy (partycje) woluminy (w UNIXie:

Bardziej szczegółowo

Część 4 życie programu

Część 4 życie programu 1. Struktura programu c++ Ogólna struktura programu w C++ składa się z kilku części: część 1 część 2 część 3 część 4 #include int main(int argc, char *argv[]) /* instrukcje funkcji main */ Część

Bardziej szczegółowo

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1 Tworzenie programów równoległych Krzysztof Banaś Obliczenia równoległe 1 Tworzenie programów równoległych W procesie tworzenia programów równoległych istnieją dwa kroki o zasadniczym znaczeniu: wykrycie

Bardziej szczegółowo

Szablony funkcji i szablony klas

Szablony funkcji i szablony klas Bogdan Kreczmer bogdan.kreczmer@pwr.wroc.pl Zakład Podstaw Cybernetyki i Robotyki Instytut Informatyki, Automatyki i Robotyki Politechnika Wrocławska Kurs: Copyright c 2011 Bogdan Kreczmer Niniejszy dokument

Bardziej szczegółowo

Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30

Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30 Programowanie w C++ Wykład 9 Katarzyna Grzelak 14 maja 2018 K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30 Klasy - powtórzenie Klasy typy definiowane przez użytkownika Klasy zawieraja dane składowe plus

Bardziej szczegółowo

4. Procesy pojęcia podstawowe

4. Procesy pojęcia podstawowe 4. Procesy pojęcia podstawowe 4.1 Czym jest proces? Proces jest czymś innym niż program. Program jest zapisem algorytmu wraz ze strukturami danych na których algorytm ten operuje. Algorytm zapisany bywa

Bardziej szczegółowo

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Tablice (jedno i wielowymiarowe), łańcuchy znaków Tablice (jedno i wielowymiarowe), łańcuchy znaków wer. 8 z drobnymi modyfikacjami! Wojciech Myszka Katedra Mechaniki i Inżynierii Materiałowej 2017-04-07 09:35:32 +0200 Zmienne Przypomnienie/podsumowanie

Bardziej szczegółowo

Zadanie 2: Arytmetyka symboli

Zadanie 2: Arytmetyka symboli 1 Cel ćwiczenia Zadanie 2: Arytmetyka symboli Wykształcenie umiejętności abstrahowania operacji arytmetycznych. Zapoznanie się i przećwiczenie mechanizmu tworzenia przeciążeń funkcji operatorowych. Utrwalenie

Bardziej szczegółowo

Aplikacja Sieciowa wątki po stronie klienta

Aplikacja Sieciowa wątki po stronie klienta Aplikacja Sieciowa wątki po stronie klienta Na ostatnich zajęciach zajmowaliśmy się komunikacją pomiędzy klientem a serwerem. Wynikiem naszej pracy był program klienta, który za pomocą serwera mógł się

Bardziej szczegółowo

Podstawy i języki programowania

Podstawy i języki programowania Podstawy i języki programowania Laboratorium 8 - wprowadzenie do obsługi plików tekstowych i wyjątków mgr inż. Krzysztof Szwarc krzysztof@szwarc.net.pl Sosnowiec, 11 grudnia 2017 1 / 34 mgr inż. Krzysztof

Bardziej szczegółowo

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1 Podstawy programowania. Wykład 6 Wskaźniki Krzysztof Banaś Podstawy programowania 1 Adresy zmiennych Język C pozwala na operowanie adresami w pamięci stąd, między innymi, kwalifikowanie C jako języka relatywnie

Bardziej szczegółowo

Programowanie obiektowe i C++ dla matematyków

Programowanie obiektowe i C++ dla matematyków Programowanie obiektowe i C++ dla matematyków Bartosz Szreder szreder (at) mimuw... 22 XI 2011 Uwaga! Ponieważ już sobie powiedzieliśmy np. o wskaźnikach i referencjach, przez które nie chcemy przegrzebywać

Bardziej szczegółowo

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory Poniżej pozwoliłem sobie za cytować za wikipedią definicję zmiennej w informatyce.

Bardziej szczegółowo

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu. Część XIX C++ w Każda poznana do tej pory zmienna może przechowywać jedną liczbę. Jeśli zaczniemy pisać bardziej rozbudowane programy, okaże się to niewystarczające. Warto więc poznać zmienne, które mogą

Bardziej szczegółowo

Przykład MPI: zbiór Mandelbrota

Przykład MPI: zbiór Mandelbrota Przykład MPI: zbiór Mandelbrota 1 Zbiór Mandelbrota Zbiór punktów na płaszczyźnie zespolonej, które są quasi-stabilne, kiedy są iterowane funkcją: z k 1 = z k 2 c gdzie z k+1 wartość zespolona w k+1 iteracji,

Bardziej szczegółowo

Zdalne wywołanie procedur. Krzysztof Banaś Systemy rozproszone 1

Zdalne wywołanie procedur. Krzysztof Banaś Systemy rozproszone 1 Zdalne wywołanie procedur Krzysztof Banaś Systemy rozproszone 1 RPC Komunikacja za pomocą gniazd jest wydajna, gdyż korzystamy z funkcji systemowych niewygodna, gdyż musimy wyrażać ją za pomocą jawnego

Bardziej szczegółowo

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1 Tworzenie programów równoległych Krzysztof Banaś Obliczenia równoległe 1 Tworzenie programów równoległych W procesie tworzenia programów równoległych istnieją dwa kroki o zasadniczym znaczeniu: wykrycie

Bardziej szczegółowo

Operacje na plikach. Informatyka. Standardowe strumienie wejścia i wyjścia

Operacje na plikach. Informatyka. Standardowe strumienie wejścia i wyjścia Materiały Operacje na plikach Informatyka Operacje wejścia-wyjścia w C/C++: Podejście proceduralne Podejście obiektowe Standardowe strumienie wejścia i wyjścia stdin - strumień wejściowy (klawiatura) cin

Bardziej szczegółowo

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki Dariusz Brzeziński Politechnika Poznańska, Instytut Informatyki W językach niskopoziomowych błędy zgłaszane były przez zwracanie odpowiedniego statusu (liczby) W C main() zwraca int żeby można było określić

Bardziej szczegółowo

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy, Lista 3 Zestaw I Zadanie 1. Zaprojektować i zaimplementować funkcje: utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy, zapisz

Bardziej szczegółowo