Wstęp. Procesy i wątki.
Transkrypt
Wstęp. Procesy i wątki.
Wstęp. Procesy i wątki. Krzysztof Banaś Przetwarzanie współbieżne, równoległe i rozproszone 1 Cel zajęć Zapoznanie z technikami i narzędziami programistycznymi służącymi do tworzenia programów równoległych Przedstawienie sprzętu wykorzystywanego do obliczeń równoległych Nauczenie sposobów tworzenia i implementacji algorytmów równoległych Zapoznanie z technikami analizy programów równoległych oraz rozwiązywania pojawiających się w nich problemów programistycznych Przedstawienie wybranych dziedzin zastosowań przetwarzania równoległego oraz występujących tam algorytmów Krzysztof Banaś Przetwarzanie współbieżne, równoległe i rozproszone 2 Historia i pojęcia wstępne Przetwarzanie współbieżne realizacja wielu programów (procesów) w taki sposób, że ich trwanie od momentu rozpoczęcia do momentu zakończenia może się na siebie nakładać współbieżność pojawiła się wraz z wielozadaniowymi systemami operacyjnymi (lata 60te, Multics – 1965) i nie wymusza równoległości współbieżność związana jest z szeregiem problemów teoretycznych wynikłych z prób realizacji wielozadaniowych systemów operacyjnych istnieje wiele mechanizmów niskiego poziomu (systemowych) do rozwiązywania problemów współbieżności Krzysztof Banaś Przetwarzanie współbieżne, równoległe i rozproszone 3 Procesy Proces: ciąg rozkazów (wątek główny) i ewentualnie inne wątki stos (wątku głównego) przestrzeń adresowa dodatkowe elementy tworzące m.in. kontekst procesu Tworzenie procesu: pid_t fork( void ) int execv(const char *filename, char *const argv []) pid_t wait(pid_t pid, int *status) Krzysztof Banaś Przetwarzanie współbieżne, równoległe i rozproszone 4 Tworzenie procesów main(){ pid = fork(); if(pid==0){ wyn = execl(.....); // np. execl(„/usr/bin/ls”, (char *) 0); if(wyn==....) ....; } else { wyn = wait(&stan); (if stan==....)....; } } uwaga: zachowanie zmiennych (w tym globalnych) Krzysztof Banaś Przetwarzanie współbieżne, równoległe i rozproszone 5 Wątki Wątek Tworzenie wątku (Linux): ciąg rozkazów stos niektóre z elementów tworzących kontekst procesu int clone(int (*fn)(void *), void *child_stack, int flags, void *arg) Przyczyna wprowadzenia wątków: łatwość komunikacji przy użyciu pamięci wspólnej i wydajność przełączania kontekstu Krzysztof Banaś Przetwarzanie współbieżne, równoległe i rozproszone 6 Wątki pthreads Specyfikacja POSIX (IEEE 1003.1, 1995, 2001) Operacje na wątkach: określanie atrybutów („odłączalność”, adres i rozmiar stosu, itp.) tworzenie i uruchamianie (pthread_create) porównywanie identyfikatorów (pthread_equal, pthread_self) zabijanie i przesyłanie sygnałów (pthread_cancel, pthread_kill) odłączanie (pthread_detach) oczekiwanie na zakończenie (pthread_join) int pthread_create(pthread_t *thread, pthread_attr_t *attr, void * (*start_routine)(void *), void * arg) int pthread_join(pthread_t th, void **thread_return) Krzysztof Banaś Przetwarzanie współbieżne, równoległe i rozproszone 7 Tworzenie wątków main(){ int arg_1, arg_2; wyn_1 = pthread_create(& tid_1, NULL, wątek, &arg_1); wyn_2 = pthread_create(& tid_2, NULL, wątek, &arg_2); wyn_1 = pthread_join( tid_1, NULL); wyn_2 = pthread_join( tid_2, NULL); } void * wątek (void * arg_wsk){ int moj_arg; moj_arg = *( (int *) arg_wsk ); } Krzysztof Banaś Przetwarzanie współbieżne, równoległe i rozproszone 8 Przesyłanie argumentów do wątków typedef struct { int a; double b;} struktura; main(){ struktura s; s.a = 1; s.b = 3.14; pthread_create(& tid, NULL, funkcja_w, (void *) &s); ........ } void * funkcja_w (void * arg_wsk){ struktura s_lok = *((struktura *)wsk); // struktura lokalna! // dostęp do zmiennych lokalnych: printf("watek: s_lok.a = %d, s_lok.b = %lf\n", s_lok.a, s_lok.b); // dostęp do zmiennych nielokalnych kopiowanie wskaźnika z rzutowaniem typu struktura * s_wsk = (struktura *) arg_wsk; printf("zewn.: "s_zewn.a = %d, s_zewn.b = %lf\n”, s_wsk>a, s_wsk>b); ........ } Krzysztof Banaś Przetwarzanie współbieżne, równoległe i rozproszone 9