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 60­te, 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 nie­lokalnych ­ 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