Shared memory and messages. Functions. process 0. process 1. program 0. program 0. data 0. data 1. program 1. data 0. data 1.

Podobne dokumenty
KOLEJKI KOMUNIKATÓW IPC

Pamięć współdzielona

1. Utwórz blok pamięci współdzielonej korzystając z poniższego kodu:

IPC: Kolejki komunikatów

Semafory, pamięć dzielona i kolejki komunikatów

Programowanie Współbieżne. Komunikacja między procesowa IPC

Pamięć dzielona i kolejki komunikatów

Instytut Teleinformatyki

Temat zajęć: Mechanizmy IPC: kolejki komunikatów.

Mechanizmy z grupy IPC

Mechanizmy z grupy IPC

problemu producenta i konsumenta z ograniczonym buforem cyklicznym. Wszystkie funkcje dotyczace

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

Krótki kurs programowania współbieżnego (2)

Programowanie w ANSI C z wykorzystaniem funkcji jądra systemu UNIX/Linux

Funkcje jadra systemu operacyjnego UNIX

Programowanie Proceduralne

Funkcje jadra systemu operacyjnego UNIX

Gniazda BSD. komunikacja bezpołączeniowa

Sieciowa komunikacja procesów - XDR i RPC

Pobieranie argumentów wiersza polecenia

Informatyka. Wy-03 Dynamiczna alokacja pamięci, wyjątki. mgr inż. Krzysztof Kołodziejczyk

1: ////////// 2: // test.c. 3: ssize_t ret = read(fd, buf, nbytes);

J. Ułasiewicz Programowanie aplikacji współbieżnych 1

Problem producentakonsumenta

Uzupełnienie dot. przekazywania argumentów

# echo przykład przykład. echo przykład

dynamiczny przydział pamięci calloc() memset() memcpy( ) (wskaźniki!! )

Co nie powinno być umieszczane w plikach nagłówkowych:

1.1 Przykład znajdowanie liczb pierwszych leżących w zadanym zakresie, tryb bezpołączeniowy

Wskaźniki do funkcji. Wykład 11. Podstawy programowania ( język C ) Wskaźniki do funkcji (1) Wskaźniki do funkcji (2)

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

Wstęp do programowania 1

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

QNX Neutrino (v 6.3)

Krótkie wprowadzenie do korzystania z OpenSSL

Struktury czyli rekordy w C/C++

Kolejki komunikatów POSIX

Tablice w argumentach funkcji. Tablicy nie są przekazywane po wartości Tablicy są przekazywane przez referencje lub po wskaźniku

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

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

SUMA KONTROLNA (icmp_cksum) NUMER KOLEJNY (icmp_seq)

ISO/ANSI C dostęp do plików ISO/ANSI C. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,

Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Inżynierii Systemów Sterowania

Wykład X. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2016 Janusz Słupik

część 16 struktury rekurencyjne i ich zastosowania drzewa binarne, algorytmy rekurencyjne dla drzew binarnych

main( ) main( void ) main( int argc, char argv[ ] ) int MAX ( int liczba_1, liczba_2, liczba_3 ) źle!

Wykład VI. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Driver interfejsu szeregowego dla systemu QNX Neutrino

Wykład 5_2 Algorytm ograniczania liczby serii za pomocą kopcowego rozdzielania serii początkowych

2x test: 25% projekt: 40% inne (zadania domowe, aktywno± ): 10% 51-60% dst 61-70% dst % db 81-90% db % bdb. 1 Zasady zaliczenia:

KURS C/C++ WYKŁAD 8. Deklaracja funkcji informuje komplilator jaką wartość funkcja będzie zwracała i jakiego typu są jej argumenty.

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

ŁAŃCUCHY W JĘZYKU C/C++

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

Funkcje zawarte w bibliotece < io.h >

3. Identyfikacja. SKŁADNIA #include <sys/socket.h> int getpeername(int socket, struct sockaddr *addr, int *addrlen);

Struktury - wprowadzenie

Procesy, pliki, potoki, sygnały - uzupełnienie

Literatura uzupełniająca: W. Richard Stevens, Programowanie zastosowań sieciowych w systemie Unix WNT 1998

Laboratorium Podstawy Przetwarzania Rozproszonego SPRAWOZDANIE z zadania SERWIS KOMPUTEROWY

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

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Programowanie Proceduralne

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Łącza nienazwane(potoki) Łącza nienazwane mogą być używane tylko pomiędzy procesami ze sobą powiązanymi.

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

Funkcje zawarte w bibliotece < io.h >

Obsługa plików Procesy

DANE TEKSTOWE W JĘZYKU C/C++ - TABLICE ZNAKOWE

Zdalne wywołania procedur. Jarosław Kuchta Programowanie Współbieżne

Programowanie I C / C++ laboratorium 02 Składnia pętli, typy zmiennych, operatory

1. Ustanawianie ograniczeń na użycie zasobów

Temat zajęć: Mechanizmy IPC: semafory

Linux Kernel III. Character devices

Wskaźniki. Programowanie Proceduralne 1

Stałe i zmienne znakowe. Stała znakowa: znak

Struktury. Przykład W8_1

Język ANSI C. część 11. Jarosław Gramacki Instytut Informatyki i Elektroniki

np. dla p=1 mamy T1(N) N/2 średni czas chybionego wyszukiwania z prawdopodobieństwem q:

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Sieciowe Systemy Operacyjne

Sieciowe Systemy Operacyjne

Wykład 7 Abstrakcyjne typy danych słownik (lista symboli)

4.2 Sposób korzystania z l acza

Języki i metodyka programowania. Wskaźniki i tablice.

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

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Programowanie z użyciem RPC

Wyklad 7 Funkcje (c.d.). Tablice jednowymiarowe znaków

Wykład 3: Implementacja programów wbudowanych

Wprowadzenie. System rozproszony jest kolekcją niezależnych, autonomicznych komputerów, które dla użytkownika prezentują się jak jeden komputer.

odmierzanie czasu - przykład

Podstawy programowania w języku C++

Programowanie Procedurale

Transkrypt:

Shared memory and messages Shared memory vs message passing Shared memory - C functions Shared memory - example program Message queues - C functions Message queues - example program process 0 process 1 program 1 data 1 program 0 data 0 program 0 data 1 data 0 program 1 1% 3% Shared memory Message passing common memory common medium int shmget(key_t key, int size, int shmflg); Get shared memory segment. void *shmat(int shmid, void *shmaddr, int shmflg); Attach shared memory segment. int shmdt(void *shmaddr); Detach shared memory segment. 2% 4%

int shmctl(int shmid, int cmd, struct shmid_ds *buf); Shared memory control. IPC STAT getstatus IPC SET set owner, group and mode IPC RMID destroy memory segment SHM LOCK lock memory segment in RAM memory SHM UNLOCK unlock memory segment from RAM memory for (i=0; i<100000; i++) j=i+1; void fatal( char *msg ) perror( msg ); exit( 1 ); void mem_init( void ) 5% 7% #include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> int mid; typedef struct int ver; char buffer[200]; my_buff; void delay( void ) int i, j; mem = shmat( mid, NULL, 0 ); if (mem == (void *)-1) fatal( "Buffer not attached!\n" ); mem->ver=0; strcpy( mem->buffer, "" ); res=shmdt( mem ); fatal( "Can not detach memory\n" ); 6% 8%

void mem_create( void ) mid=shmget(333, sizeof(my_buff), IPC_CREAT 0666 ); if (mid == -1) fatal( "Error getting memory!\n" ); printf( "Memory ID=%d\n", mid ); void mem_destroy( void ) res=shmctl( mid, IPC_RMID, NULL ); fatal( "Can not destroy memory\n" ); my_buff *mem_attach( void ) mem = shmat( mid, NULL, 0 ); if (mem == (void *)-1) fatal( "Child Buffer not attached!\n" ); return mem; void mem_detach( my_buff *mem ) res=shmdt( mem ); 9% 11% fatal( "Can not detach memory\n" ); 10% 12%

void child( void ) int ver; mem = mem_attach(); while (mem->ver == 0) delay(); printf( "[%s]\n", mem->buffer ); mem->ver++; strcpy( mem->buffer, "OK" ); mem_detach( mem ); 13% 15% void parent( void ) int ver; mem = mem_attach(); strcpy( mem->buffer, "Hurrah!" ); mem->ver++; while (mem->ver == 1) delay(); printf( "[%s]\n", mem->buffer ); mem_detach( mem ); mem_destroy(); int main( int narg, char *argv[] ) int pid; mem_create(); mem_init(); pid=fork(); if (pid == 0) child(); else if (pid > 0) parent(); else printf( "Error\n" ); 14% 16%

Messages msgrcv( id, buf, size, 0, flag ); msgrcv( id, buf, size, 1, flag ); nr=1, t=3 nr=2, t=1 nr=3, t=5 nr=4, t=7 nr=5, t=1 nr=6, t=3 nr=7, t=1 nr=8, t=1 nr=9, t=3 nr=10, t=5 msgrcv( id, buf, size, 3, flag ); int msgctl(int msqid, int cmd, /* struct msqid_ds *buf */...); Controll message queue. IPC STAT get information about message queue IPC SET set owner, group, mode and size of the queue IPC RMID remove queue msgsnd(id,buf,size,flag); 17% 19% int msgget(key_t key, int msgflg); Get message queue. int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); Send a message. int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); Receive a message. #include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> int qid; typedef struct long mtype; char mtxt[200]; msg_buff; void fatal( char *msg ) perror( msg ); 18% 20%

exit( 1 ); fatal( "Error sending message" ); 21% 23% void msg_create( void ) qid=msgget( 123, IPC_CREAT 0666 ); if (qid == -1) fatal( "Can not open queue\n" ); void msg_send( char *txt, int mt ) msg_buff msg; msg.mtype = mt; strcpy( msg.mtxt, txt ); res=msgsnd( qid, msg, sizeof(msg), 0 ); void msg_destroy( void ) res=msgctl( qid, IPC_RMID ); fatal( "Can not destroy queue!\n" ); char *msg_receive( int mt ) static msg_buff msg; res=msgrcv( qid, msg, sizeof(msg), mt, 0 ); 22% 24%

int main( int narg, char *argv[] ) int pid; msg_create(); fatal( "Error sending message" ); return msg.mtxt; pid=fork(); if (pid == 0) child(); else if (pid > 0) parent(); else printf( "Error\n" ); 25% 27% void child( void ) msg_send( "Hello", 1 ); printf( "Child got: [%s]\n", msg_receive(2) ); msg_destroy(); void parent( void ) printf( "Parent got: [%s]\n", msg_receive(1) ); msg_send( "Hi", 2 ); 26%