Systemy operacyjne (wiosna 2014)

Slides:



Advertisements
Podobne prezentacje
Wirtualizacja zasobów w systemach operacyjnych
Advertisements

Wstęp do strumieni danych
Mechanizmy pracy równoległej
Programowanie obiektowe
Programowanie obiektowe
Wzorce.
SYSTEMY OPERACYJNE WSTĘP
Systemy rozproszone W. Bartkiewicz
Języki programowania C++
Semafory Autorzy : Michał Winciorek Łukasz Jackowicz.
PROGRAMOWANIE STRUKTURALNE
argumenty wiersza poleceń: getopt
używanie komend UNIXa z wnętrza programu napisanego w C
formatowanie kodu źródłowego
Semafory Semafor w programowaniu jest abstrakcją o zastosowaniu zaczerpniętym z działalności kolei. Gdy zasobów jest na tyle mało, że trzeba ich użyciem.
Zaawansowana obsługa sygnałów
ODE Informacje wstępne. Pojęcia podstawowe n Obiektowa baza danych u język komunikacji u ziarnistość obiektów u identyfikacja obiektów n Transakcja -
Systemy plików UNIX Krzysztof Ratkowski Mateusz Wosiński.
Systemy operacyjne Wykład nr 5: Wątki Piotr Bilski.
Systemy operacyjne Wykład nr 4: Procesy Piotr Bilski.
1 Dygresja: cztery płyty główne…. 2 Dygresja: osobliwości C /* cos o nieistniejacym typie Boolean */ /* oraz o operatorze przecinkowym */ #include int.
Programowanie w C Wykład 3
Język ANSI C Operacje we/wy
Java – programowanie obiektowe
Zachodniopomorskie Centrum Edukacyjne Zadanie domowe.
ZARZĄDZANIE PROCESAMI
12. GNIAZDA BSD Biblioteka funkcji związanych z gniazdami jest interfejsem programisty do obsługi protokołów komunikacyjnych. Została utworzona dla Unixa.
11. PAKIET IPC Narzędzia z pakietu IPC (InterProcess Communication) służą do koordynacji procesów wykonywa- nych na jednym komputerze (nie są przeznaczone.
Semafory według normy POSIX
10. PROSTE MECHANIZMY KOORDYNACJI DOSTĘPNE W JĘZYKU C W systemie Unix użytkownikowi (nie będącemu administratorem) nie wolno wykonywać bezpośrednio żadnych.
9. KOORDYNACJA PROCESÓW WSPÓŁBIEŻNYCH PRZY UŻYCIU INTERPRETATORA
Wieloprocesowy system operacyjny dla komputerów ATARI XL/XE
ipcrm [ shm | msq | sem ] id
Procesy odrębne –Unikatowy PID ( ) –Zmienne –Zbiory deskryptorów plików –Przestrzeń stosu (lokalne zmienne, wywołania funkcji) –Środowisko –Licznik.
Wątki.
Pamięć wspólna Przegląd stosowanych rozwiązań Marcin Kamiński, Michał Kotra Wydział EAIiE Katedra Automatyki Kraków, 2008.
Podstawy programowania
Podstawy programowania II
Podstawy programowania II Wykład 2: Biblioteka stdio.h Zachodniopomorska Szkoła Biznesu.
Pliki tekstowe. Operacje na plikach. mgr inż. Agata Pacek.
Linux - polecenia.
Pliki Pojęcie i rodzaje plików Definicja typu plikowego Operacje wykonywane na plikach elementowych.
Pliki tekstowe – A. Jędryczkowski © 2007 Turbo Pascal umożliwia wykorzystanie w programach plików tekstowych. Pliki takie zawierają informację niezakodowaną
Automatyka i Robotyka Systemy czasu rzeczywistego Wykład 4.
Programowanie strukturalne i obiektowe
JAVA c.d.. Instrukcji wyboru SWITCH używamy, jeśli chcemy w zależności od wartości pewnego wyrażenia wykonać jeden z kilku fragmentów kodu. Jest to w.
Systemy wejścia i wyjścia Michał Wrona. Co to jest system wejścia i wyjścia? Pobierania informacji ze źródeł danych, zdolnych przesyłać sekwencje bajtów,
Wykład 4 Programowanie systemowe w Linux: System plików i procesy
Programowanie systemowe w Linux:
Podstawy informatyki 2013/2014
Programowanie obiektowe 2013/2014
Wykład 6b Wątki, mechanizmy IPC
1 Strumienie Hierarchie klas strumieniowych, strumienie bajtowe - klasy InputStream i OutputStream i ich metody, klasa File, strumienie plikowe, strumienie.
Wykład 7 Synchronizacja procesów i wątków
Systemy operacyjne Wykład 6a Procesy dr inż. Wojciech Bieniecki
PL/SQL – dalsza wędrówka
Bariery synchronizacyjne Bariery są obiektami synchronizacyjnymi pakietu pthread służącymi do wyrównywania czasów pracy wątków wykonujących wspólne zadanie.
Systemy rozproszone  Rozdzielenie obliczeń między wiele fizycznych procesorów.  Systemy luźno powiązane – każdy procesor ma lokalną pamięć; procesory.
Podstawy programowania II Wykład 3: Obsługa plików w stdio.h.
System plików.
Systemy Operacyjne Seminarium Dyplomowe Wydział Informatyki, Elektroniki i Telekomunikacji Katedra Telekomunikacji Kraków, 9 listopada 2012 Adam Halwa.
Procesy, wątki Program a proces Proces: Przestrzeń adresowa, kod, dane, stos (część pamięci do przechowania zmiennych lokalnych i niektórych adresów) Otwarte.
Seminarium Dyplomowe: Metodyka i Techniki Programowania Autor: Bartłomiej Fornal.
1 Architektury Komputerów i Systemy Operacyjne Prowadzący przedmiot: dr inż. Rafał Stankiewicz Data:
Jeszcze dygresja o macierzach... #include /* przyklad pokazuje, jak dla macierzy wielowymiarowych dziala operator dereferencji * ; otoz jesli macierz jest.
Podstawy informatyki Mechanizm obsługi sytuacji wyjątkowych Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu.
Strumienie w języku Java Bartosz Walter InMoST Wielkopolska sieć współpracy w zakresie innowacyjnych metod wytwarzania oprogramowania Termin realizacji:
Systemy operacyjne Wykład 6 Procesy dr inż. Wojciech Bieniecki Instytut Nauk Ekonomicznych i Informatyki 1.
Piotr Kawałek , Mateusz Śliwowski
Strumienie, Wczytywanie, Zapisywanie, Operacje na plikach
Zapis prezentacji:

Systemy operacyjne (wiosna 2014) Laboratorium 11 – tutorial Komunikacja procesów dr inż. Wojciech Bieniecki Instytut Nauk Ekonomicznych i Informatyki http://wbieniec.kis.p.lodz.pl/pwsz

Metody komunikacji międzyprocesowej Komunikacja międzyprocesowa (ang. Inter-Process Communication — IPC) – sposoby komunikacji pomiędzy procesami systemu operacyjnego. Pojęcie IPC może odnosić się do wymiany informacji w systemach rozproszonych (klastrów, systemów odległych połączonych siecią). Mechanizmy IPC opierają się na budowaniu w pamięci lub na dysku dynamicznych struktur, używanych do transmisji komunikatów pomiędzy procesami Lista metod IPC ta obejmuje: pliki i blokady – najprostsza i najstarsza forma IPC sygnały (ang. signals) – czasami znane jako przerwania programowe semafory (ang. semaphores) łącza nienazwane (ang. pipes) – znane też jako łącza komunikacyjne łącza nazwane (ang. named pipes) – znane też jako nazwane łącza komunikacyjne kolejki komunikatów (ang. message queues) pamięć dzielona (ang. shared memory) gniazda Uniksa (ang. Unix domain sockets) gniazda (ang. sockets) RPC (ang. Remote Procedure Call) – zdalne wywoływanie procedur.

Łącza komunikacyjne Łącza w UNIX są plikami specjalnymi. Są podobne do plików zwykłych – posiadają swój i-węzeł, posiadają bloki z danymi, na otwartych łączach można wykonywać operacje zapisu i odczytu. Czym różnią się od plików zwykłych • ograniczona liczba bloków – łącza mają rozmiar 4KB – 8KB w zależności od konkretnego systemu, • dostęp sekwencyjny – na łączach można wykonywać tylko operacje zapisu i odczytu, ale nie można wykonywać funkcji lseek) • sposób wykonywania operacji zapisu i odczytu – dane odczytywane z łącza są zarazem usuwane (nie można ich odczytać ponownie) • proces jest blokowany w funkcji read na pustym łączu i w funkcji write, jeśli w łączu nie ma wystarczającej ilości wolnego miejsca, żeby zmieścić zapisywany blok

Łącza komunikacyjne – cechy wspólne i różnice Łącze nazwane (tzw kolejki FIFO). Łącze nienazwane (tzw. potok) Posiada dowiązanie w systemie plików (istnieje jako plik w jakimś katalogu) nie ma dowiązania w systemie plików – istnieje tylko tak długo, jak jest otwarte Może być identyfikowane przez nazwę Jest identyfikowane tylko przez deskryptory Po zamknięciu pozostaje przydzielony i-węzeł, ale wszystkie jego bloki na dysku są zwalniane. Po zamknięciu wszystkich jego deskryptorów przestaje istnieć (zwalniany jest jego i-węzeł i wszystkie bloki) Procesy, które chcą komunikować się za pomocą łącza nienazwanego, muszą znać jego deskryptor. Sposobem przekazania deskryptora łącza innemu procesowi jest utworzenie go jako proces potomny – tablica otwartych plików jest dziedziczona. Można w procesie macierzystym otworzyć łącze a następnie utworzyć dwa procesy potomne, które będą komunikować się ze sobą.

Operacje na łączach w UNIX Łącza nazwane mkfifo - funkcja systemowa tworząca łącze nazwane (działa podobnie jak creat dla plików zwykłych, ale w przeciwieństwie do creat nie otwiera łącza) int mkfifo (char* path, mode_t mode) Argumenty funkcji: path - nazwa ścieżkowa pliku specjalnego będącego kolejką FIFO mode - prawa dostępu do łącza Wartości zwracane: poprawne wykonanie funkcji: 0 zakończenie błędne: -1 W przypadku błędnego zakończenie funkcji, kod błędu możemy odczytać w errno.

Operacje na łączach w UNIX Łącza nazwane open – otwiera łącze podobnie jak plik. Uwaga – aby łącze działało musi być otwarte do odczytu i zapisu (np. jeden proces pisze drugi czyta) int open (char* path, int flags) Wartości zwracane: poprawne wykonanie funkcji: deskryptor kolejki FIFO zakończenie błędne: -1 Argumenty funkcji: path - nazwa ścieżkowa pliku specjalnego będącego kolejką fifo mode - prawa dostępu do łącza flags - określenie trybu w jakim jest otwierana kolejka: O_RDONLY - tryb tylko do odczytu O_WRONLY- tryb tylko do zapis

Przykład użycia łącza nazwanego Utworzone metodą mkfifo łącze musi zostać otwarte przez użycie funkcji open. Funkcja ta musi zostać wywołana przynajmniej przez dwa procesy w sposób komplementarny, tzn. jeden z nich musi otworzyć łącze do zapisu, a drugi do odczytu. Odczyt i zapis danych z łącza nazwanego odbywa się za pomocą funkcji read i write mkfifo("kolejka",0666); desc = open("kolejka" , O_RDONLY); desc = open("kolejka" , O_WRONLY); read(desc); write(desc); close(desc); close(desc); unlink("kolejka");

Przykład użycia łącza nazwanego #include <fcntl.h> main(){ int fd; if (mkfifo("/tmp/fifo", 0600) == -1) exit(1); //Błąd tworzenia kolejki switch(fork()){ case -1: // blad w tworzeniu procesu exit(1); case 0: //dotyczy procesu potomnego fd = open("/tmp/fifo", O_WRONLY); if (fd == -1) exit(1); //Błąd otwarcia kolejki do zapisu if (write(fd, "Witaj!", 7) == -1) exit(1); //Błąd zapisu do kolejki exit(0); //normalne zakończenie procesu potomnego default: // dotyczy procesu macierzystego char buf[10]; fd = open("/tmp/fifo", O_RDONLY); if (read(fd, buf, 10) == -1) printf("Odczytano z potoku: %s\n", buf); }

Użycie łączy nienazwanych

Funkcja pipe int pipe(int fd[2]) Funkcja tworzy parę sprzężonych deskryptorów pliku, wskazujących na inode potoku i umieszcza je w tablicy fd. fd[0] – deskryptor potoku do odczytu fd[1] – deskryptor potoku do zapisu Proces, który utworzył potok może się przez niego komunikować tylko ze swoimi potomkami lub przekazać im deskryptory, umożliwiając w ten sposób wzajemną komunikację. Wartości zwracane: poprawne wykonanie funkcji: 0 zakończenie błędne: -1

Przykład komunikacji przodek-potomek main() { int fd[2]; if (pipe(fd) == -1) exit(1); // błąd tworzenia potoku switch(fork()){ // rozwidlamy procesy case -1: // blad w tworzeniu procesu exit(1); case 0: // proces potomny if (write(fd[1], "Witaj!", 7) == -1) exit(1); // błąd zapisu do potoku exit(0); // kończymy proces potomny default: // proces macierzysty char buf[10]; if (read(fd[0], buf, 10) == -1) exit(1); // błąd odczytu z potoku printf("Odczytano z potoku: %s\n", buf); }

Przykład użycia potoku Działanie funkcji read w przypadku pustego potoku main() { int fd[2]; pipe(fd); if (fork() == 0){ // proces potomny write(fd[1], "witaj!", 7); exit(0); } else { // proces macierzysty char buf[10]; read(fd[0], buf, 10); read(fd[0], buf, 10); //Uwaga tutaj!!! printf("Odczytano z potoku: %s\n", buf); Drugi odczyt spowoduje zawieszenie procesu, gdyż potok jest pusty, a proces potomny ma otwarty deskryptor do zapisu.

Przykład użycia potoku Niskopoziomowa realizacja ls|tr a-z A-Z z użyciem łączy nienazwanych #define MAX 512 //będziemy przetwarzać po 512 znaków main(int argc, char* argv[]) { int fd[2]; pipe(fd) == -1); //Tworzenie potoku if(fork() == 0) {// proces potomny dup2(fd[1], 1); // tworzymy drugie dowiązanie do stdout execvp("ls", argv); // Uruchomienie programu ls } else { // proces macierzysty char buf[MAX]; int lb, i; close(fd[1]); // zamykamy możliwość zapisu do łącza while ((lb=read(fd[0], buf, MAX)) > 0){ //czytamy for(i=0; i<lb; i++) buf[i] = toupper(buf[i]); //konwertujemy znaki w pętli write(1, buf,lb); // zapisujemy znaki na wyjście

Przykład użycia potoku wysokopoziomowa realizacja ls|tr a-z A-Z z użyciem łączy nienazwanych main(int argc, char* argv[]) { int fd[2]; pipe(fd); if(fork() == 0) {// proces potomny dup2(fd[1], 1); execvp("ls", argv); } else { // proces macierzysty close(fd[1]); dup2(fd[0], 0); execlp("tr", "tr", "a-z", "A-Z", 0); //Uruchomienie tr W przykładzie tym i poprzednim pominięto obsługę błędów.

Zadanie producenta-konsumenta Jeden proces-producent generuje produkuje dane (zapisuje do łącza) a drugi proces-konsument pobiera je (czyta z potoku). Potok jest wspólną zmienną która jest ograniczonym buforem. Może pojawić się problem przepełnienia łącza lub gdy łącze jest puste.