WĄTKI W SYSTEMIE LINUX

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

Download "WĄTKI W SYSTEMIE LINUX"

Transkrypt

1 Mirosław Jedynak WĄTKI W SYSTEMIE LINUX Wstęp Wątki vs. Procesy Biblioteka: libpthread Tworzenie wątku Oczekiwanie na zakończenie innego wątku Uzyskanie własnego identyfikatora Ustawianie atrybutów przy tworzeniu wątków Zakończenie działania wątku Anulowanie wątku Dane własne wątku Mutex (MUTual Exclusion lock) Semafory dla wątków Zmienne warunków Obsługa sygnałów Debugging wątków Pytania Spis Treści Wstęp Wątki, podobnie jak procesy stanowią mechanizm pozwalający programowi na robienie naraz więcej niż jednej rzeczy. Podobnie jak procesy także wątki sprawiają wrażenie, że wykonują się jednocześnie; jądro systemu szereguje je asynchronicznie, przerywając wątki aby oddać czas innym. Idea wątków została użyta, aby przyśpieszyć pracę systemu wątki są często nazywane lekkimi procesami, ponieważ operacje potrzebne do przełączenia wątków zajmują znacznie mniej czasu i niż na przełączenie kontekstu procesów. Istnieje jednak ścisła zależność miedzy watkami a procesami wątki są jednostką podrzędna w stosunku do procesów żaden wątek nie może istnieć bez procesu nadrzędnego (ale jeden proces może mieć więcej niż jeden wątek podporządkowany) Wątki poziomu użytkownika Wątki poziomu użytkownika rezygnują z zarządzania wykonaniem przez jądro i robią to same. Często jest to nazywane "wielowątkowością spółdzielczą", gdyż proces definiuje zbiór wykonywalnych procedur, które są "wymieniane" poprzez operacje na wskaźniku stosu. Zwykle każdy wątek "rezygnuje" z procesora poprzez bezpośrednie wywołanie żądania wymiany (wysłanie sygnału i zainicjowanie mechanizmu zarządzającego) albo przez odebranie sygnału zegara systemowego. Obecnie wątki poziomu użytkownika mogą szybciej dokonać wymiany niż wątki poziomu jądra, ale ciągły rozwój tych drugich powoduje, że ta różnica jest bardzo mała. Implementacje wątków poziomu użytkownika napotykają na liczne problemy, które trudno obejść, np: problem "kradzenia" czasu wykonania innych wątków przez jeden wątek brak sposobu wykorzystania możliwości SMP oczekiwanie jednego z wątków na zakończenie blokującej operacji wejścia/wyjścia powoduje, że inne wątki tego procesu też tracą swój czas wykonania.

2 Różne rozwiązania tych problemów zależą najczęściej bezpośrednio od sprzętowej strony systemu: kontrola monopolizacji czasu poprzez monitor używający swojego własnego zegara, uruchamianie procesów na określonych procesorach i tam startowanie wątków, czy też nadpisywanie funkcji systemowych, żeby były wielowejściowe (nieblokujące operacje wejścia/wyjścia itp.). Wątki poziomu jądra Wątki poziomu jądra są często implementowane poprzez dołączenie do każdego procesu tabeli/listy jego wątków. W tym rozwiązaniu system zarządza każdym wątkiem wykorzystując kwant czasu przyznany dla jego procesu-rodzica. Zaletą takiej implementacji jest zniknięcie zjawiska "kradzenia" czasu wykonania innych wątków przez "zachłanny" wątek, bo zegar systemowy tyka niezależnie i system wydziedzicza "niesforny" wątek. Także blokowanie operacji wejścia/wyjścia nie jest już problemem. Ponadto przy poprawnym zakodowaniu programu, proces może automatycznie wyciągnąć korzyści z istnienia SMP przyśpieszając swoje wykonanie przy każdym dodatkowym procesorze. Kombinacje obu rozwiązań Niektóre implementacje używają obu rozwiązań: wątków poziomu użytkownika powiązanych z wątkami jądra. Takie połączenie przynosi korzyści wynikające z obu wersji wątków, choć rozwój wątków jądra spowoduje, że jedyną zaletą tego rozwiązania będzie możliwość współdziałania wielu wątków. W dalszej części prezentacja będzie poświęcona wątkom systemowym Wątki vs. Procesy Wątki współdzielą (w przeciwieństwie do procesów) Przestrzeń pamięci Deskryptory plików Inne zasoby systemowe (funkcja exec kończy wszystkie wątki, kolejki, ) Wątki nie współdzielą Stosu Własne dane wątku Biblioteka: libpthread #include <pthread.h> kompilując przy użyciu gcc programy korzystające z tej biblioteki, należy wymusić jej dołączenie, przez użycie opcji -lpthread. gcc -lpthread program.c

3 Tworzenie wątku Identyfikator wątku: pthread_t Kiedy wątek jest tworzony zaczyna wykonywać funkcję wątku. Po zakończeniu funkcji kończy istnienie także wątek. Argumentem funkcji tworzącej wątek oraz typem zwracanej wartości jest void*; jądro systemu nie ingeruje w treść tych danych (często jest to wskaźnik do struktury, z której wątek pobiera informacje na temat argumentów uwaga na zmienne lokalne i zwalnianie zasobów - free); Deklaracja #include <pthread.h> int pthread_create(pthread_t * thread, pthread_attr_t attr, void * (*start_routine)(void *), void * arg); Opis Funkcja pthread_create tworzy nowy watek, który wykonuje się współbieżnie z wątkiem wywołującym. Nowy watek zaczyna wykonywać podana funkcje start_routine podając jej arg jako pierwszy argument. Nowy watek kończy się explicite przez wywołanie procedury pthread_exit lub przez powrót z start_routine. Argument attr określa atrybuty nowego wątku, do których ustalenia służy funkcja pthread_attr_init. Jeśli jako attr przekażemy NULL, zostaną określone domyślne atrybuty wątku: możliwość dołączenia, domyślny sposób kolejkowania (nie czasu rzeczywistego). Po bezbłędnym wykonaniu pthread_create umieszcza identyfikator nowoutworzonego wątku w miejscu wskazywanym przez argument thread i zwraca 0. W razie błędu zwracane jest EAGAIN w przypadku, gdy brakuje zasobów systemowych żeby stworzyć proces dla nowego wątku lub, gdy więcej niż PTHREAD_THREADS_MAX wątków już działa w systemie #include <pthread.h> #include <stdio.h> /* Prints x s to stderr. The parameter is unused. Does not return. */ void* print_xs (void* unused) while (1) fputc ( x, stderr); return NULL; /* The main program. */ int main () pthread_t thread_id; /* Create a new thread. The new thread will run the print_xs function. */ pthread_create (&thread_id, NULL, &print_xs, NULL); /* Print o s continuously to stderr. */ while (1) fputc ( o, stderr); return 0;

4 Oczekiwanie na zakończenie innego wątku Deklaracja int pthread_join(pthread_t th, void **thread_return); Opis Funkcja pthread_join zawiesza działanie wołającego wątku aż do momentu, gdy watek identyfikowany przez th nie zakończy działania. Jeśli argument thread_return jest różny od NULL to kod zakończenia wątku th zostanie wstawiony w miejsce wskazywane przez thread_return. Kodem zakończenia może być wartość określoną przy wołaniu funkcji pthread_exit lub PTHREAD_CANCELLED jeśli watek był usunięty. Watek, do którego dołączamy musi być w stanie umożliwiającym dołączanie (nie może być odłączony przez wywołanie pthread_detach lub określenie atrybutu PTHREAD_CREATE_DETACHED przy jego tworzeniu przez pthread_create). W momencie, gdy watek w stanie umożliwiającym dołączenie kończy działanie jego zasoby (deskryptor wątku i stos) nie są zwalniane dopóki inny watek nie wykona na nim pthread_join. Dlatego pthread_join powinien być wykonany dla każdego nieodłączonego wątku. Co najwyżej jeden watek może czekać na zakończenie danego wątku. Wywołanie pthread_join w momencie, gdy jakiś inny watek już oczekuje na jego zakończenie spowoduje powrót z funkcji pthread_join z błędem. Oczekiwanie przez wywołanie funkcji pthread_join jest tzw. cancellation-point, co oznacza, ze jeśli watek zostanie odwołany (canceled) w czasie oczekiwania, to działanie wątku zostanie zakończone natychmiast bez czekania na synchronizacje z wątkiem th. W przypadku sukcesu funkcja pthread_join zwraca 0 i kod zakończenia wątku th jest umieszczany w miejscu wskazywanym przez thread_return. W przypadku błędu zwracana jest wartość EINVAL jeśli watek th już został odłączony (detached) lub inny watek już oczekuje na jego zakończenie albo wartość EDEADLK jeśli argument th odnosi się do wołającego wątku. int main () pthread_t thread1_id; pthread_t thread2_id; struct char_print_parms thread1_args; struct char_print_parms thread2_args; /* Create a new thread to print 30,000 x s. */ thread1_args.character = x ; thread1_args.count = 30000; pthread_create (&thread1_id, NULL, &char_print, &thread1_args); /* Create a new thread to print 20,000 o s. */ thread2_args.character = o ; thread2_args.count = 20000; pthread_create (&thread2_id, NULL, &char_print,

5 &thread2_args); /* Make sure the first thread has finished. */ pthread_join (thread1_id, NULL); /* Make sure the second thread has finished. */ pthread_join (thread2_id, NULL); /* Now we can safely return. */ return; Uzyskanie własnego identyfikatora Deklaracja pthread_t pthread_self(void); Opis pthread_self zwraca identyfikator wątku, który wywołał funkcje. Porównanie dwóch identyfikatorów wątków int pthread_equal(pthread_t thread1, pthread_t thread2); Funkcja pthread_equal określa, czy oba identyfikatory odnoszą się do tego samego wątku. Zwraca niezerowa wartość jeśli thread1 i thread2 odnoszą się do tego samego wątku. W przeciwnym przypadku 0 jest zwracane. Ustawianie atrybutów przy tworzeniu wątków Ustawić atrybutu wątku można w czasie tworzenia wątku drugi argument. 1. wywołać funkcje pthread_attr_init(pthread_attr_t tatr) 2. zmodywikowac (pthread_attr_t) attr 3. przekazac wskaźnik do pthread_create 4. wywołać funkcje pthread_attr_destroy zwolnienie zasobów związanych w funkcji pthread_attr_init 5. Obiekt atrybutów może być zmienna automatyczną i zostać użyty przy tworzeniu kilku wątków. Najczęściej używanym atrybutem jest stan odłączenia (detached state). Do ustalenia stanu odłączenia wątku służy funkcja pthread_attr_setddetachedstate żeby odłączyć należy jako drugi argument podać PTHREAD_CREATE_DETACHED.

6 Zakończenie działania wątku Deklaracja void pthread_exit(void *retval); Opis Funkcja pthread_exit kończy działanie wołającego wątku. Wywoływane są po kolei (LIFO) wszystkie funkcje czyszczące określone przez pthread_cleanup_push. Funkcje kończące dla wszystkich kluczy odnoszących się do konkretnego wątku i mających wartość inna niż NULL (patrz pthread_key_create) są wykonywane. Dopiero po tym wszystkim działanie wątku jest wstrzymywane. Argument retval określa kod zakończenia wątku, który może być odczytany przez inny watek za pomocą funkcji pthread_join. Anulowanie wątku Deklaracja int pthread_exit(pthread_t thread) Opis Normalnie można zakończyć wątek przez wywołanie pthread_exit albo poprzez dojście do końca funkcji wątku. Aby jeden wątek mógł przerwać inny należy użyć funkcji pthread_cancel. Anulowany wątek zwraca wartość (do pthread_join) PTHREAD_CANCELED Wątek może kontrolować kiedy i czy zostanie anulowany(zasoby zwalniane): asynchroniczne anulowanie w każdej chwili synchroniczne anulowanie żądanie anulowania są kolejkowane, aż do osiągnięcia punktu anulowanie bez możliwości anulowania Aby zmienić sposób anulowania wątku należy użyć pthread_setcanceltype z argumentami PTHREAD_CANCEL_ASYNCHRONOUS asynchroniczne. PTHRAD_CANCEL_DEFERED synchroniczne; drugim argumentem jest wskaźnik do obiektu gdzie ma zostać zachowany poprzedni stan wątku (może być NULL) Tworzenie punktów anulowania void pthread_cancel(void) Tworzenie sekcji krytycznych int pthread_setcancelstate(int state, int* oldstate) State - PTHREAD_CANCEL_DISABLE / PTHREAD_CANCEL_ENABLE,

7 #include <pthread.h> #include <stdio.h> #include <string.h> /* An array of balances in accounts, indexed by account number. */ float* account_balances; /* Transfer DOLLARS from account FROM_ACCT to account TO_ACCT. Return 0 if the transaction succeeded, or 1 if the balance FROM_ACCT is too small. */ int process_transaction (int from_acct, int to_acct, float dollars) int old_cancel_state; /* Check the balance in FROM_ACCT. */ if (account_balances[from_acct] < dollars) return 1; /* Begin critical section. */ pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &old_cancel_state); /* Move the money. */ account_balances[to_acct] += dollars; account_balances[from_acct] -= dollars; /* End critical section. */ pthread_setcancelstate (old_cancel_state, NULL); return 0; Dane własne wątku int ptread_key_create(pthred_key_t *key, void *destructor(void*)) Mutex (MUTual Exclusion lock) Operacje na mutexach pthread_mutex_init, pthread_mutex_lock, pthread_mutex_trylock, pthread_mutex_unlock, pthread_mutex_destroy Deklaracja pthread_mutex_t fastmutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t recmutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr); int pthread_mutex_lock(pthread_mutex_t *mutex)); int pthread_mutex_trylock(pthread_mutex_t *mutex); int pthread_mutex_unlock(pthread_mutex_t *mutex); int pthread_mutex_destroy(pthread_mutex_t *mutex);

8 Opis Mutex jest mechanizmem wzajemnego wykluczania (MUTual EXclusion) służącym do chronienia danych dzielonych miedzy watkami przed równoczesnymi modyfikacjami i używanym do implementacji sekcji krytycznych i monitorów. Mutex ma dwa możliwe stany: otwarty (nie zajęty przez żaden watek) lub zajęty (przez jeden watek). Mutex nie może być w posiadaniu więcej niż jednego wątku na raz. Watek próbujący zając mutex będący w osiadaniu innego wątku jest zawieszany aż do chwili zwolnienia mutexu przez watek, który go posiadał wcześniej. Inicjacja Funkcja pthread_mutex_init inicjalizuje obiekt mutex zgodnie z atrybutami przekazanymi przez mutexattr. Jeśli mutexattr jest NULL używane są wartości domyślne. Funkcja zawsze zwraca 0. Blokowanie/ odblowokanie Funkcja pthread_mutex_lock zajmuje dany mutex. Jeśli mutex jest wolny zostaje zajęty i przypisany wątkowi wołającemu i pthread_mutex_lock kończy działanie natychmiast. Jeśli mutex jest zajęty przez jakiś inny watek pthread_mutex_lock zawiesza działanie wątku aż do momentu, kiedy mutex zostanie zwolniony. Jeśli mutex jest już zajęty przez watek wołający to zachowanie funkcji zależy od rodzaju mutexu. Jeśli mutex dopuszcza rekurencje to funkcja kończy działanie poprawnie zapisując sobie ilość wywołań funkcji (głębokość rekurencji - potem trzeba wywołać tyle samo razy pthread_mutex_unlock żeby zwolnić mutex), jeśli zaś nie dopuszcza to doprowadza do blokady (deadlock) wątku. Funkcja zwraca błąd EINVAL jeśli mutex nie został wcześniej poprawnie zainicjalizowany. Funkcja pthread_mutex_trylock zachowuje się identyczne do pthread_mutex_lock, jednak nie jest blokującą (zwraca EBUSY w razie zajętości mutexu). Funkcja pthread_mutex_unlock zwalnia dany mutex. Mutex musi być wcześniej zajęty przez wołający proces. Jeśli mutex jest nierekurencyjny to zawsze wraca do stanu zwolnionego, jeśli jest rekurencyjny, to zmniejszana jest głębokość rekurencji w mutexie. Jedynie gdy głębokość jest zero mutex zostaje faktycznie zwolniony. Funkcja zwraca błąd EINVAL jeśli mutex nie został wcześniej poprawnie zainicjalizowany. Usuwanie Funkcja pthread_mutex_destroy niszczy obiekt mutexu i zwalnia zasoby z nim związane. Mutex musi być wolny wpp zwracana jest wartość EBUSY. Żadna z funkcji obsługujących mutexy nie jest cancellation point i żadna nie powinna być wykonywana z funkcji obsługi sygnału (nie jest async-signal safe). Przykład: Zmienna dzielona x może być w następujący sposób chroniona przez mutex: int x; pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; Wszystkie operacje na zmiennej x powinny być otoczone wywołaniami pthread_mutex_lock i pthread_mutex_unlock: pthread_mutex_lock(&mut); /* operacje na x */

9 pthread_mutex_unlock(&mut); Rodzaje muteksów szybkie muteksy może dojść do zakleszczenia jeśli np z jednego wątku będziemy chcieli wywołać zagnieżdżone funkcje tworzenia mutexu (domyślny rodzaj w linuxie) rekurencyjne muteksy system wyłapuje rekurencyjne blokowania i pozwala się wątkowi wykonywać dalej (jest wbudowany licznik wywołań, żeby zwolnić mutex pracy na danym mutex'ie na najwyższym poziomie) sprawdzające błędy drugie wywołanie zwróci kod EDEADLK Drugi i trzeci rodzaj muteksow dostępny jest tylko na linuxie i zaleca się używanie ich tylko przy testowaniu i debuggowaniu. Przykład Aby utworzyć takie muteksy należy użyć poniższych funkcji pthread_mutex_attr_ tatr; pthread_mutex_t muter; pthread_mutex_attr_int(&attr); pthread_mutexattr_setkind_np (&attr, PTHREAD_MUTEX_ERRORCHECK_NP / PTHREAD_MUTEX_RECURSIVE_NP); pthread_mutex_init(&mutex,&attr); pthread_mutex_attr_destroy(&attr); #include <malloc.h> #include <pthread.h> struct job /* Link field for linked list. */ struct job* next; /* Other fields describing work to be done... */ ; /* A linked list of pending jobs. */ struct job* job_queue; /* A mutex protecting job_queue. */ pthread_mutex_t job_queue_mutex = /* Process queued jobs until the queue is empty. */ void* thread_function (void* arg) while (1) struct job* next_job; /* Lock the mutex on the job queue. */ pthread_mutex_lock (&job_queue_mutex); /* Now it s safe to check if the queue is empty. */ if (job_queue == NULL) next_job = NULL; else /* Get the next available job. */ next_job = job_queue; /* Remove this job from the list. */ job_queue = job_queue->next; /* Unlock the mutex on the job queue because we re done with the queue for now. */

10 pthread_mutex_unlock (&job_queue_mutex); /* Was the queue empty? If so, end the thread. */ if (next_job == NULL) break; /* Carry out the work. */ process_job (next_job); /* Clean up. */ free (next_job); return NULL; Semafory dla wątków Tworzenie semafora int sem_init (sem_t *sem, int pshare, unsigned, int value); Argumenty: pshare NULL ( linux nie obsługuje współdzielenia między procesami) value wartość początkowa Jeśli zmienna sem nie jest już potrzebna to można od razu użyć funkcji destroy_sem; Licznik semafora Każdy semafor posiada wartość licznika umożliwiająca wykonanie dwóch operacji: wait (sem_wait) zmniejsza wartość semafora o 1. Jeżeli wartość była 0 to wartość jest zmniejszana o 1, a wątki są blokowane do czasu aż licznik będzie równy 0 post (sem_post) zwiększa wartość semafora o 1. Istnieje jeszcze nie blokująca wersja funkcji (analogiczna do wait) sem_trywait podobna do pthread_mutex_trylock. Jeżeli semafor jest zablokowany to zwraca EAGAIN. Można pobrać (w linux ie) wartość licznika semafora za pomocą funkcji sem_getvalue #include <malloc.h> #include <pthread.h> #include <semaphore.h> struct job /* Link field for linked list. */ struct job* next; /* Other fields describing work to be done... */ ; /* A linked list of pending jobs. */ struct job* job_queue; /* A mutex protecting job_queue. */

11 pthread_mutex_t job_queue_mutex = PTHREAD_MUTEX_INITIALIZER; /* A semaphore counting the number of jobs in the queue. */ sem_t job_queue_count; /* Perform one-time initialization of the job queue. */ void initialize_job_queue () /* The queue is initially empty. */ job_queue = NULL; /* Initialize the semaphore which counts jobs in the queue. Its initial value should be zero. */ sem_init (&job_queue_count, 0, 0); /* Process queued jobs until the queue is empty. */ void* thread_function (void* arg) while (1) struct job* next_job; /* Wait on the job queue semaphore. If its value is positive, indicating that the queue is not empty, decrement the count by 1. If the queue is empty, block until a new job is enqueued. */ sem_wait (&job_queue_count); /* Lock the mutex on the job queue. */ pthread_mutex_lock (&job_queue_mutex); /* Because of the semaphore, we know the queue is not empty. Get the next available job. */ next_job = job_queue; /* Remove this job from the list. */ job_queue = job_queue->next; /* Unlock the mutex on the job queue because we re done with the queue for now. */ pthread_mutex_unlock (&job_queue_mutex); /* Carry out the work. */ process_job (next_job); /* Clean up. */ free (next_job); return NULL; /* Add a new job to the front of the job queue. */ void enqueue_job (/* Pass job-specific data here... */) struct job* new_job; /* Allocate a new job object. */ new_job = (struct job*) malloc (sizeof (struct job)); /* Set the other fields of the job struct here... */ /* Lock the mutex on the job queue before accessing it. */ pthread_mutex_lock (&job_queue_mutex); /* Place the new job at the head of the queue. */ new_job->next = job_queue; job_queue = new_job; /* Post to the semaphore to indicate that another job is available. If threads are blocked, waiting on the semaphore, one will become unblocked so it can process the job. */ sem_post (&job_queue_count); /* Unlock the job queue mutex. */ pthread_mutex_unlock (&job_queue_mutex);

12 Zmienne warunków Opis Zmienna warunku umożliwia zaimplementowanie warunku pod którym zmienna się wykonuje i przeciwnie warunku pod którym wątek jest zablokowany. Linux gwarantuje odblokowanie czekających wątków gdy nastąpi zmiana zmiennej warunku. Idea jest podobna do semaforów. Jeżeli watek A czeka znamienna warunku to jest zablokowany dopóki wątek B nie zasygnalizuje tej zmiennej. W przeciwieństwie do semafora zmienna warunku nie ma pamięci- jeśli wątek b zasygnalizuje zmienna B, ale w tym czasie wątek A nie będzie czekał na warunku to sygnał zostanie utracony. Sprawdzanie zmiennej warunku 1. Blokowanie muteksu i pobranie wartości flagi(zmiennej warunku) 2. Jeżeli flaga ustawiona to zwolnij muteks i kontynuuj działanie 3. Jeżeli flaga nie jest ustawiona to atomowo zwalnia muteks i czeka na zmianę warunku Ustawianie zmiennej warunku 1. Blokowanie muteksu (tego samego co przy sprawdzaniu) 2. Działania zmieniające zmienną warunku (np. flagę) 3. Sygnalizacja lub rozesłanie zmiennej warunku 4. Odblokowanie muteksu Funkcje operujące na zmiennych warunku (pthread_cond_t) int pthread_cond_int (pthread_cond_t *cond,const pthread_condattr_t *attr) inicjuje zmienna warunku (drugi argument ignorowany) int pthread_con_signal(pthread_cond_t *cond) sygnalizuje zmienna warunkuzostaje odblokowany jeden wątek int pthread_con_broadcast(pthread_cond_t *cond) rozgłasza zmienna warunkuzostają odblokowane wszystkie wątki int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *muter) blokuje wywołujący ją wątek do czasu zasygnalizowanie zmiennej warunku. #include <pthread.h> int thread_flag; pthread_mutex_t thread_flag_mutex; void initialize_flag () pthread_mutex_init (&thread_flag_mutex, NULL); thread_flag = 0; /* Calls do_work repeatedly while the thread flag is set; otherwise spins. */ void* thread_function (void* thread_arg) while (1)

13 int flag_is_set; /* Protect the flag with a mutex lock. */ pthread_mutex_lock (&thread_flag_mutex); flag_is_set = thread_flag; pthread_mutex_unlock (&thread_flag_mutex); if (flag_is_set) do_work (); /* Else don t do anything. Just loop again. */ return NULL; /* Sets the value of the thread flag to FLAG_VALUE. */ void set_thread_flag (int flag_value) /* Protect the flag with a mutex lock. */ pthread_mutex_lock (&thread_flag_mutex); thread_flag = flag_value; pthread_mutex_unlock (&thread_flag_mutex); Obsługa sygnałów System linux implementuje wątki jako osobne procesy (ale na zasadach wątku), ale w normie POSIX u nie jest założone który wątek otrzymuje sygnał. Linux zakłada jednak że zawsze otrzymuje sygnał najstarszy proces. Nie należy jednak zakładać takiego zachowania dla przenoszonych na inne platformy programów. Do wysyłania sygnałów pomiędzy wątkami należy używać funkcji pthread_kill Debugging wątków Z powodu istnienia nierównoważnych implementacji wątków, nie powstał dotąd żaden program umożliwiający bezpośrednie obserwowanie działania poszczególnych wątków. Programiści, aby zbadać działanie swojego programu, zmuszeni są więc do stosowania różnych sztuczek: metoda printf(): najstarszy chyba znany sposób sprawdzania poprawności działania programu :-) metoda attach z gdb: wykorzystując fakt, że wątki nie dzielą jeszcze PID z rodzicem, można "podłączyć" debugger gdb do wątku i obserwować działanie tego wątku obróbka zrzutu pamięci (plik core): ponieważ jądro nie tworzy zrzutu dla procesu, który współdzielił swoje części, jedyne co możemy odczytać z pliku core, to obraz ostatniego wątku - najczęściej jednak nie tego, który spowodował zakończenie programu Pytania 1) Chcac uzywac watkow w programie musisz dolaczyc plik naglowkowy biblioteke a) pthread (*) b) unixthread

14 c) threads d) nie ma mozliwosci uzywaniea watkow w unixie bo nie definuje ich norma POSIX 2) Watki jednego procesu NIE dziela a) sekcji danych (zmienne gloobalne itd) b) sekcji kodu programu- kod jest kopiowany dla kazdego watku osobno c) stosu - gdyby dzielily nie moglyby wywolywac roznych funkcji w roznych watkach (*) d) watki nic nie dziela miedzy soba 3) MUTEX to a) zwykla zmienna tylko nazwana inaczej ze wzgledu na zastosowanie b) rodzaj wzajaemnego wykluczania (MUTual EXclusion) uzywany do synchronizacji watkow (*) c) rodzaj sygnalu systemowego uzywanego do synchronizacji miedzy watkami (MUlti Thread EXamination) d) mechanizm systemowy uzywany w programach korzystajacych z watkow i wypisujacych na ekran (MultiUser TEXting) 4) Mechanizmy ktore NIE mechanizmem synchronizacji watkow to: a) semafory b) zmienne warunku c) MUREX d) pliki tymczasowe (*) 5) identyfikator watku jest typu a) zawsze typu int b) pthread_t (*) c) thread d) pid_t - taki sam typ jak dla procesu ale inna wartosc Spis Treści Wstęp... 1 Wątki poziomu użytkownika... 1

15 Wątki poziomu jądra... 2 Kombinacje obu rozwiązań... 2 Wątki vs. Procesy... 2 Wątki współdzielą (w przeciwieństwie do procesów)... 2 Wątki nie współdzielą... 2 Biblioteka: libpthread... 2 Tworzenie wątku... 3 Deklaracja... 3 Opis... 3 Oczekiwanie na zakończenie innego wątku... 4 Deklaracja... 4 Opis... 4 Uzyskanie własnego identyfikatora... 5 Deklaracja... 5 Opis... 5 Porównanie dwóch identyfikatorów wątków... 5 Ustawianie atrybutów przy tworzeniu wątków... 5 Zakończenie działania wątku... 6 Deklaracja... 6 Opis... 6 Anulowanie wątku... 6 Deklaracja... 6 Opis... 6 Tworzenie punktów anulowania... 6 Tworzenie sekcji krytycznych... 6 Dane własne wątku... 7 Mutex (MUTual Exclusion lock)... 7 Deklaracja... 7 Opis... 8 Inicjacja... 8 Blokowanie/ odblowokanie... 8 Usuwanie... 8 Przykład:... 8 Rodzaje muteksów... 9 Przykład... 9 Semafory dla wątków Tworzenie semafora... 10

16 Licznik semafora Zmienne warunków Opis Sprawdzanie zmiennej warunku Ustawianie zmiennej warunku Funkcje operujące na zmiennych warunku (pthread_cond_t) Obsługa sygnałów Debugging wątków Pytania Spis Treści... 14

w odróżnieniu od procesów współdzielą przestrzeń adresową mogą komunikować się za pomocą zmiennych globalnych

w odróżnieniu od procesów współdzielą przestrzeń adresową mogą komunikować się za pomocą zmiennych globalnych mechanizmy posix Wątki w odróżnieniu od procesów współdzielą przestrzeń adresową należą do tego samego użytkownika są tańsze od procesów: wystarczy pamiętać tylko wartości rejestrów, nie trzeba czyścić

Bardziej szczegółowo

Temat zajęć: Tworzenie i obsługa wątków.

Temat zajęć: Tworzenie i obsługa wątków. Temat zajęć: Tworzenie i obsługa wątków. Czas realizacji zajęć: 180 min. Zakres materiału, jaki zostanie zrealizowany podczas zajęć: Tworzenie wątków, przekazywanie parametrów do funkcji wątków i pobieranie

Bardziej szczegółowo

1. Uruchom poniższy program tworzący pojedynczy wątek:

1. Uruchom poniższy program tworzący pojedynczy wątek: 9 Wątki 1. Uruchom poniższy program tworzący pojedynczy wątek: #include #include #include void* worker(void* info) int i; for(i=0; i

Bardziej szczegółowo

Programowanie Współbieżne

Programowanie Współbieżne Programowanie Współbieżne Pthread http://www.unix.org/version2/whatsnew/threadsref.html Oraz strony podręcznika systemowego man 1 Wątki W tradycyjnym modelu w systemie Unix, jeżeli proces wymaga, by część

Bardziej szczegółowo

Plan wykładu. Obliczenia równoległe w zagadnieniach inżynierskich. Wykład 1 p. Wzajemne wykluczanie. Procesy współbieżne

Plan wykładu. Obliczenia równoległe w zagadnieniach inżynierskich. Wykład 1 p. Wzajemne wykluczanie. Procesy współbieżne Plan wykładu Obliczenia równoległe w zagadnieniach inżynierskich Wykład 1 Podstawowe pojęcia i model programowania Sposoby realizacji watków w systemach operacyjnych Tworzenie watów i zarzadzanie nimi

Bardziej szczegółowo

Tworzenie wątków. #include <pthread.h> pthread_t thread;

Tworzenie wątków. #include <pthread.h> pthread_t thread; Wątki Wątek (ang, thread) jest to niezależna sekwencja zdarzeń w obrębie procesu. Podczas wykonywania procesu równolegle i niezależnie od siebie może być wykonywanych wiele wątków. Każdy wątek jest wykonywany

Bardziej szczegółowo

Mariusz Rudnicki PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO CZ.4

Mariusz Rudnicki PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO CZ.4 Mariusz Rudnicki mariusz.rudnicki@eti.pg.gda.pl PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO CZ.4 Synchronizacja wątków Omawiane zagadnienia Czym jest synchronizacja wątków? W jakim celu stosuje się mechanizmy

Bardziej szczegółowo

Plan wykładu. Programowanie aplikacji równoległych i rozproszonych. Wykład 1 p. Wzajemne wykluczanie. Procesy współbieżne

Plan wykładu. Programowanie aplikacji równoległych i rozproszonych. Wykład 1 p. Wzajemne wykluczanie. Procesy współbieżne Plan wykładu Programowanie aplikacji równoległych i rozproszonych Wykład 1 Podstawowe pojęcia i model programowania Sposoby realizacji watków w systemach operacyjnych Tworzenie watów i zarzadzanie nimi

Bardziej szczegółowo

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

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

Bardziej szczegółowo

Programowanie równoległe i rozproszone. W1. Wielowątkowość. Krzysztof Banaś Programowanie równoległe i rozproszone 1

Programowanie równoległe i rozproszone. W1. Wielowątkowość. Krzysztof Banaś Programowanie równoległe i rozproszone 1 Programowanie równoległe i rozproszone W1. Wielowątkowość Krzysztof Banaś Programowanie równoległe i rozproszone 1 Problemy współbieżności wyścig (race condition) synchronizacja realizowana sprzętowo (np.

Bardziej szczegółowo

Programowanie równoległe i rozproszone. Monitory i zmienne warunku. Krzysztof Banaś Programowanie równoległe i rozproszone 1

Programowanie równoległe i rozproszone. Monitory i zmienne warunku. Krzysztof Banaś Programowanie równoległe i rozproszone 1 Programowanie równoległe i rozproszone Monitory i zmienne warunku Krzysztof Banaś Programowanie równoległe i rozproszone 1 Problemy współbieżności Problem producentów i konsumentów: jedna grupa procesów

Bardziej szczegółowo

Mariusz Rudnicki PROGRAMOWANIE WSPÓŁBIEŻNE I SYSTEMY CZASU RZECZYWISTEGO CZ.4

Mariusz Rudnicki PROGRAMOWANIE WSPÓŁBIEŻNE I SYSTEMY CZASU RZECZYWISTEGO CZ.4 Mariusz Rudnicki mariusz.rudnicki@eti.pg.gda.pl PROGRAMOWANIE WSPÓŁBIEŻNE I SYSTEMY CZASU RZECZYWISTEGO CZ.4 Synchronizacja wątków Omawiane zagadnienia Czym jest synchronizacja wątków? W jakim celu stosuje

Bardziej szczegółowo

Systemy Operacyjne 2: Wątki pthreads. dr inż. Arkadiusz Chrobot

Systemy Operacyjne 2: Wątki pthreads. dr inż. Arkadiusz Chrobot Systemy Operacyjne 2: Wątki pthreads dr inż. Arkadiusz Chrobot 18 kwietnia 2013 1. Wprowadzenie Wątki podobnie jak procesy umożliwiają współbieżną realizację czynności w wykonywanym programie. Domyślnie

Bardziej szczegółowo

procesy odrębne dzielone

procesy odrębne dzielone procesy odrębne Unikatowy PID (2-32000) Zmienne Zbiory deskryptorów plików Przestrzeń stosu (lokalne zmienne, wywołania funkcji) Środowisko Licznik rozkazów dzielone Kod programu brak możliwości zapisu

Bardziej szczegółowo

Procesy i wątki. Krzysztof Banaś Obliczenia równoległe 1

Procesy i wątki. Krzysztof Banaś Obliczenia równoległe 1 Procesy i wątki Krzysztof Banaś Obliczenia równoległe 1 Procesy i wątki 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

Bardziej szczegółowo

Wątki. S. Samolej: Wątki 1

Wątki. S. Samolej: Wątki 1 Wątki dr inż. Sławomir Samolej Katedra Informatyki i Automatyki Politechnika Rzeszowska Program przedmiotu oparto w części na materiałach opublikowanych na: http://wazniak.mimuw.edu.pl/ oraz na materiałach

Bardziej szczegółowo

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO LABORATORIUM Temat: THREADS Mariusz Rudnicki 2016 1. Przygotowanie platformy i środowiska IDE. Przed uruchomieniem własnego kodu zwiększ priorytet procesu qconn

Bardziej szczegółowo

Wykład 3. Procesy i wątki. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

Wykład 3. Procesy i wątki. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB Wykład 3 Procesy i wątki Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB Pojęcie procesu Program = plik wykonywalny na dysku Proces = uruchomiony i wykonywany program w pamięci

Bardziej szczegółowo

Przetwarzanie wielowątkowe przetwarzanie współbieżne. Krzysztof Banaś Obliczenia równoległe 1

Przetwarzanie wielowątkowe przetwarzanie współbieżne. Krzysztof Banaś Obliczenia równoległe 1 Przetwarzanie wielowątkowe przetwarzanie współbieżne Krzysztof Banaś Obliczenia równoległe 1 Problemy współbieżności wyścig (race condition) synchronizacja realizowana sprzętowo (np. komputery macierzowe)

Bardziej szczegółowo

Dzisiejszy wykład. Klasa string. wersja prosta wersja ze zliczaniem odwołań. Wyjątki Specyfikator volatile Semafory

Dzisiejszy wykład. Klasa string. wersja prosta wersja ze zliczaniem odwołań. Wyjątki Specyfikator volatile Semafory Dzisiejszy wykład Klasa string wersja prosta wersja ze zliczaniem odwołań Wyjątki Specyfikator volatile Semafory 1 Klasa string Przetwarzanie tekstów jest powszechną dziedziną zastosowań komputerów W języku

Bardziej szczegółowo

Implementacje zgodne z tym standardem są nazywane wątkami POSIX lub Pthreads.

Implementacje zgodne z tym standardem są nazywane wątkami POSIX lub Pthreads. pthreads (POSIX) implementacji równoległości poprzez wątki w architekturach wieloprocesorowych z pamięcią współdzieloną przenośność problem programistyczny, gdy dostawcy sprzętu wdrażali własne wersje

Bardziej szczegółowo

Problemy współbieżności

Problemy współbieżności Problemy współbieżności wyścig (race condition) synchronizacja realizowana sprzętowo (np. komputery macierzowe) realizowana programowo (bariera, sekcja krytyczna, operacje atomowe) wzajemne wykluczanie

Bardziej szczegółowo

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO LABORATORIUM Temat: QNX Neutrino Interrupts Mariusz Rudnicki 2016 Wstęp W QNX Neutrino wszystkie przerwania sprzętowe przechwytywane są przez jądro systemu. Obsługę

Bardziej szczegółowo

Programowanie współbieżne Wykład 9 Synchronizacja dostępu do współdzielonych zasobów. Iwona Kochańska

Programowanie współbieżne Wykład 9 Synchronizacja dostępu do współdzielonych zasobów. Iwona Kochańska Programowanie współbieżne Wykład 9 Synchronizacja dostępu do współdzielonych zasobów Iwona Kochańska Sekcja krytyczna Instrukcje wykonywane na zmiennych współdzielonych tworzą sekcję krytyczną. Instrukcje

Bardziej szczegółowo

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO LABORATORIUM Temat: THREADS SYNCHRONIZATION METHODS Mariusz Rudnicki 2016 1. Wstęp W systemach wielowątkowych wspólne zasoby procesu takie, jak: pamięć: kod programu;

Bardziej szczegółowo

Współbieżność w środowisku Java

Współbieżność w środowisku Java Współbieżność w środowisku Java Wątki i ich synchronizacja Zagadnienia Tworzenie wątków Stany wątków i ich zmiana Demony Synchronizacja wątków wzajemne wykluczanie oczekiwanie na zmiennych warunkowych

Bardziej szczegółowo

Wielowątkowy serwer TCP

Wielowątkowy serwer TCP Wielowątkowy serwer TCP Wątek współbieżne działanie współdzielenie danych wykonywanie tego samego programu tańsze tworzenie w porównaniu do fork() join(), a detach() pthread - interesujące fragmenty pthread_create(),

Bardziej szczegółowo

Podstawy programowania współbieżnego. 1. Wprowadzenie. 2. Podstawowe pojęcia

Podstawy programowania współbieżnego. 1. Wprowadzenie. 2. Podstawowe pojęcia Podstawy programowania współbieżnego Opracowanie: Sławomir Samolej, Tomasz Krzeszowski Politechnika Rzeszowska, Katedra Informatyki i Automatyki, Rzeszów, 2010 1. Wprowadzenie Programowanie współbieżne

Bardziej szczegółowo

Poniższe funkcje opisane są w 2 i 3 części pomocy systemowej.

Poniższe funkcje opisane są w 2 i 3 części pomocy systemowej. Procesy Proces (zwany też zadaniem) jest jednostką aktywną, kontrolowaną przez system operacyjny i związaną z wykonywanym programem. Proces ma przydzielone zasoby typu pamięć (segment kodu, segment danych,

Bardziej szczegółowo

SYSTEMY CZASU RZECZYWISTEGO - VxWorks

SYSTEMY CZASU RZECZYWISTEGO - VxWorks WZAJEMNE WYKLUCZANIE Wiele metod. Np. wyłączanie przerwań: funkcja() //... Int blokada = intlock(); // Obszar krytyczny, któremu nie możemy przerwać intunlock(blokada); wyłączanie wywłaszczania: funkcja()

Bardziej szczegółowo

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1 Wątki 1. Wątki - wprowadzenie Wątkiem nazywamy sekwencyjny przepływ sterowania w procesie, który wykonuje dany program np. odczytywanie i zapisywanie plików Program Javy jest wykonywany w obrębie jednego

Bardziej szczegółowo

Problemy czytelników i pisarzy oraz 5 ucztujących filozofów

Problemy czytelników i pisarzy oraz 5 ucztujących filozofów Problemy czytelników i pisarzy oraz 5 dr inż. Sławomir Samolej Katedra Informatyki i Automatyki Politechnika Rzeszowska Program przedmiotu oparto w części na materiałach opublikowanych na: http://wazniak.mimuw.edu.pl/

Bardziej szczegółowo

Programowanie w Sieci Internet. Python: Wątki. Kraków, 12 grudnia 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

Programowanie w Sieci Internet. Python: Wątki. Kraków, 12 grudnia 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki Programowanie w Sieci Internet Python: Wątki Kraków, 12 grudnia 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki Wątki akt pierwszy, kilka przydatnych funkcji Lib/threading.py modół pozwalający

Bardziej szczegółowo

Programowanie współbieżne Wykład 10 Synchronizacja dostępu do współdzielonych zasobów. Iwona Kochańska

Programowanie współbieżne Wykład 10 Synchronizacja dostępu do współdzielonych zasobów. Iwona Kochańska Programowanie współbieżne Wykład 10 Synchronizacja dostępu do współdzielonych zasobów Iwona Kochańska Mechanizm synchronizacji wątków/procesów Wykorzystanie semaforów zapobiega niedozwolonemu wykonaniu

Bardziej szczegółowo

UŻYCIE I ZARZĄDZANIE WĄTKAMI

UŻYCIE I ZARZĄDZANIE WĄTKAMI Proces jako pewna instancja programu, w trakcie wykonania, ze swej natury w każdym systemie operacyjnym wyróżniają: prawa własności zasobu a jednym z fundamentalnych zadań systemu jest ochrona przed jednoczesnym

Bardziej szczegółowo

Wielozadaniowość w systemie Microsoft Windows

Wielozadaniowość w systemie Microsoft Windows Wielozadaniowość w systemie Microsoft Windows mgr inż. Tomasz Jaworski tjaworski@kis.p.lodz.pl http://tjaworski.kis.p.lodz.pl/ Idea wielozadaniowości Proces główny Wątki Algorytm szeregowania ustala kolejność

Bardziej szczegółowo

Pobieranie argumentów wiersza polecenia

Pobieranie argumentów wiersza polecenia Pobieranie argumentów wiersza polecenia 2. Argumenty wiersza polecenia Lista argumentów Lista argumentów zawiera cały wiersz poleceń, łącznie z nazwą programu i wszystkimi dostarczonymi argumentami. Przykłady:

Bardziej szczegółowo

Stworzenie klasy nie jest równoznaczne z wykorzystaniem wielowątkowości. Uzyskuje się ją dopiero poprzez inicjalizację wątku.

Stworzenie klasy nie jest równoznaczne z wykorzystaniem wielowątkowości. Uzyskuje się ją dopiero poprzez inicjalizację wątku. Laboratorium 7 Wstęp Jednym z podstawowych własności Javy jest wielowątkowość. Wiąże się to z możliwością współbieżnego wykonywania różnych operacji w ramach pojedynczej wirtualnej maszyny Javy (JVM).

Bardziej szczegółowo

UŻYCIE I ZARZĄDZANIE WĄTKAMI

UŻYCIE I ZARZĄDZANIE WĄTKAMI Proces jako pewna instancja programu, w trakcie wykonania, ze swej natury w każdym systemie operacyjnym wyróżniają: prawa własności zasobu a jednym z fundamentalnych zadań systemu jest ochrona przed jednoczesnym

Bardziej szczegółowo

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1 Współbieżność i równoległość w środowiskach obiektowych Krzysztof Banaś Obliczenia równoległe 1 Java Model współbieżności Javy opiera się na realizacji szeregu omawianych dotychczas elementów: zarządzanie

Bardziej szczegółowo

z powielaniem wielu struktur danych oraz komunikacja

z powielaniem wielu struktur danych oraz komunikacja c Wies law P laczek 28 8 Watki 8.1 Wprowadzenie Wiele rozwiazywanych problemów można podzielić na zadania czastkowe, które daja sie wykonać niemal niezależnie. Każde z takich zadań można by powierzyć oddzielnemu

Bardziej szczegółowo

9. Problem wzajemnego wykluczania i sekcji krytycznej

9. Problem wzajemnego wykluczania i sekcji krytycznej J. Ułasiewicz Programowanie aplikacji współbieżnych 1 9. Problem wzajemnego wykluczania i sekcji krytycznej 9.1 Przeplot i współużywalność zasobów Wyróżniamy dwa rodzaje zasobów: 1. Zasoby współużywalne

Bardziej szczegółowo

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

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02 METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE Wykład 02 NAJPROSTSZY PROGRAM /* (Prawie) najprostszy przykład programu w C */ /*==================*/ /* Między tymi znaczkami można pisać, co się

Bardziej szczegółowo

Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 1. Wątki

Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 1. Wątki Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 1 1 Informacje wstępne...2 2 Rodzaje wątków...7 poziomu jądra...7 poziomu użytkownika...8 Rozwiązania mieszane...8 3 Biblioteka pthreads...12

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

Procesy, wątki i zasoby

Procesy, wątki i zasoby Procesy, wątki i zasoby Koncepcja procesu i zasobu, Obsługa procesów i zasobów, Cykl zmian stanów procesu i kolejkowanie, Klasyfikacja zasobów, Wątki, Procesy i wątki we współczesnych systemach operacyjnych.

Bardziej szczegółowo

Zaawansowane programowanie w C++ (PCP)

Zaawansowane programowanie w C++ (PCP) Wykład 10 - boost Thread. 8 czerwca 2007 Równoległość bardzo wolna reakcja człowieka wolne urządzenia wejścia - wyjścia (np. drukarki) bardzo szybkie procesory można przeprowadzać obliczenia podczas obsługi

Bardziej szczegółowo

ZAJECIA Z SYSTEMÓW OPERACYJNYCH 2 (Programowanie): funkcje POSIX

ZAJECIA Z SYSTEMÓW OPERACYJNYCH 2 (Programowanie): funkcje POSIX ZAJECIA Z SYSTEMÓW OPERACYJNYCH 2 (Programowanie): funkcje POSIX Author: Arkadiusz D. Danilecki Version: 1.1 Date: 14.12.2013 Wstęp Niniejsze opracowanie zawiera jedynie podstawowe informacje o funkcjach

Bardziej szczegółowo

Architektury systemów równoległych

Architektury systemów równoległych Architektury systemów równoległych 1 Architektury systemów z pamięcią wspólną Architektury procesorów Procesory wielordzeniowe Procesory graficzne Akceleratory Procesory hybrydowe Architektury systemów

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

Signals + Threads: Qt vs. Boost

Signals + Threads: Qt vs. Boost Signals + Threads: Qt vs. Boost Adam Bujalski 2014-04-01 Adam Bujalski Signals + Threads: Qt vs. Boost 2014-04-01 1 / 22 Spis Treści 1 2 Wątki 3 Qt::QueuedConnection w boost Adam Bujalski Signals + Threads:

Bardziej szczegółowo

Wykład 5. Synchronizacja (część II) Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

Wykład 5. Synchronizacja (część II) Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB Wykład 5 Synchronizacja (część II) Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB Wady semaforów Jeden z pierwszych mechanizmów synchronizacji Generalnie jest to mechanizm bardzo

Bardziej szczegółowo

Kurs programowania. Wykład 8. Wojciech Macyna

Kurs programowania. Wykład 8. Wojciech Macyna Wykład 8 Program bez watków, jeden procesor, trzy zadania Program z watkami, jeden procesor, trzy zadania Procesory wielordzeniowe, każde zadanie na osobnym procesorze Trzy zadania uruchomione w watkach

Bardziej szczegółowo

Obliczenia równoległe i rozproszone w JAVIE. Michał Kozłowski 30 listopada 2003

Obliczenia równoległe i rozproszone w JAVIE. Michał Kozłowski 30 listopada 2003 Obliczenia równoległe i rozproszone w JAVIE Michał Kozłowski 30 listopada 2003 Wątki w JAVIE Reprezentacja wątków jako obiektów Uruchamianie i zatrzymywanie wątków Realizacja wątków Ograniczenia Mechanizmy

Bardziej szczegółowo

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego Wątki Wątek - definicja Ciąg instrukcji (podprogram) który może być wykonywane współbieżnie (równolegle) z innymi programami, Wątki działają w ramach tego samego procesu Współdzielą dane (mogą operować

Bardziej szczegółowo

Wykład 4. Synchronizacja procesów (i wątków) cześć I. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

Wykład 4. Synchronizacja procesów (i wątków) cześć I. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB Wykład 4 Synchronizacja procesów (i wątków) cześć I Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB Potrzeba synchronizacji Procesy wykonują się współbieżnie. Jeżeli w 100% są

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

Wielowątkowość mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

Wielowątkowość mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011 Wielowątkowość mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011 Uruchomienie programu powoduje stworzenie nowego procesu przez system operacyjny. Proces wykonywany program wraz

Bardziej szczegółowo

Systemy operacyjne III

Systemy operacyjne III Systemy operacyjne III WYKŁAD 2 Jan Kazimirski 1 Procesy w systemie operacyjnym 2 Proces Współczesne SO w większości są systemami wielozadaniowymi. W tym samym czasie SO obsługuje pewną liczbę zadań procesów

Bardziej szczegółowo

Synchronizacja procesów i wątków

Synchronizacja procesów i wątków SOE Systemy Operacyjne Wykład 12 Synchronizacja procesów i wątków dr inŝ. Andrzej Wielgus Instytut Mikroelektroniki i Optoelektroniki WEiTI PW Problem sekcji krytycznej Podstawowy problem synchronizacji

Bardziej szczegółowo

Przeplot. Synchronizacja procesów. Cel i metody synchronizacji procesów. Wątki współbieżne

Przeplot. Synchronizacja procesów. Cel i metody synchronizacji procesów. Wątki współbieżne Synchronizacja procesów Przeplot Przeplot wątków współbieżnych Cel i metody synchronizacji procesów Problem sekcji krytycznej Semafory Blokady 3.1 3.3 Wątki współbieżne Cel i metody synchronizacji procesów

Bardziej szczegółowo

Procesy. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 9 października 2011

Procesy. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 9 października 2011 Procesy Systemy Operacyjne 2 laboratorium Mateusz Hołenko 9 października 2011 Plan zajęć 1 Procesy w systemie Linux proces procesy macierzyste i potomne procesy zombie i sieroty 2 Funkcje systemowe pobieranie

Bardziej szczegółowo

Problemy czytelników i pisarzy oraz 5 ucztujących filozofów

Problemy czytelników i pisarzy oraz 5 ucztujących filozofów Problemy czytelników i pisarzy oraz 5 dr inż. Sławomir Samolej Katedra Informatyki i Automatyki Politechnika Rzeszowska Program przedmiotu oparto w części na materiałach opublikowanych na: http://wazniak.mimuw.edu.pl/

Bardziej szczegółowo

Sygnały. 7. Sygnały (2005/2006)

Sygnały. 7. Sygnały (2005/2006) Sygnały Sygnał jest to informacja dla procesu, że wystąpiło jakieś zdarzenie. Sygnały mogą być wysyłane: z procesu do innego procesu (grupy procesów) z procesu do siebie samego z jądra do procesu Sygnały

Bardziej szczegółowo

Program współbieżny jest zbiorem sekwencyjnych PROGRAMOWANIE C++

Program współbieżny jest zbiorem sekwencyjnych PROGRAMOWANIE C++ PROGRAMOWANIE C++ Współdzielenie obiektów w aplikacjach współbieżnych Używanie tych samych obiektów przez różne wątki może prowadzić do niezdefiniowanego zachowania się aplikacji. Obiekty synchronizacyjne

Bardziej szczegółowo

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak Java język programowania obiektowego Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak 1 Język Java Język Java powstał w roku 1995 w firmie SUN Microsystems Java jest językiem: wysokiego

Bardziej szczegółowo

7. Szeregowanie procesów w systemie QNX6 Neutrino

7. Szeregowanie procesów w systemie QNX6 Neutrino J. Ułasiewicz Programowanie aplikacji współbieżnych 1 7. Szeregowanie procesów w systemie QNX6 Neutrino 7.1 PRIORYTETY Każdy z procesów wykonywanych w systemie RTS ma przyporządkowany priorytet. W systemie

Bardziej szczegółowo

Systemy operacyjne III

Systemy operacyjne III Systemy operacyjne III WYKŁAD 3 Jan Kazimirski 1 Współbieżność 2 Współbieżność Wielozadaniowość - zarządzanie wieloma procesami w ramach jednego CPU Wieloprocesorowość - zarządzanie wieloma zadaniami w

Bardziej szczegółowo

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ Procesy i wątki Proces posiada samodzielne środowisko wykonawcze. Proces posiada własny zestaw podstawowych zasobów w czasie wykonywania; W szczególności, każdy proces ma własną przestrzeń pamięci. W uproszczeniu

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 drugie (jedne zajęcia) Temat: Procesy i sygnały w Linuksie. Opracowanie: mgr in ż. Arkadiusz Chrobot Wprowadzenie 1. Budowa procesu

Bardziej szczegółowo

Mariusz Rudnicki PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO CZ.2

Mariusz Rudnicki PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO CZ.2 Mariusz Rudnicki mariusz.rudnicki@eti.pg.gda.pl PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO CZ.2 Architektura - Procesy Proces program załadowany do pamięci; identyfikowany przez id procesu, zwykle nazywany

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

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018 Informatyka I Klasy i obiekty. Podstawy programowania obiektowego dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2018 Plan wykładu Pojęcie klasy Deklaracja klasy Pola i metody klasy

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

Systemy operacyjne. Zajęcia 11. Monitory

Systemy operacyjne. Zajęcia 11. Monitory Systemy operacyjne. Zajęcia 11. Monitory 1. Monitor to mechanizm zamykający całą pamięć wspólną i synchronizację w pojedynczym module. 2. Monitor posiada całą pamięć wspólną jako część 'prywatną': dostępu

Bardziej szczegółowo

synchronizacji procesów

synchronizacji procesów Dariusz Wawrzyniak Definicja semafora Klasyfikacja semaforów Implementacja semaforów Zamki Zmienne warunkowe Klasyczne problemy synchronizacji Plan wykładu (2) Semafory Rodzaje semaforów (1) Semafor jest

Bardziej szczegółowo

Prezentacja systemu RTLinux

Prezentacja systemu RTLinux Prezentacja systemu RTLinux Podstawowe założenia RTLinux jest system o twardych ograniczeniach czasowych (hard real-time). Inspiracją dla twórców RTLinux a była architektura systemu MERT. W zamierzeniach

Bardziej szczegółowo

Futex (Fast Userspace Mutex) Łukasz Białek

Futex (Fast Userspace Mutex) Łukasz Białek Futex (Fast Userspace Mutex) Łukasz Białek Futex informacje podstawowe Stworzony w 2002 roku przez Hubertusa Franke, Matthew Kirkwooda, Ingo Molnára i Rustiego Russella. Jest mechanizmem w Linuxie, który

Bardziej szczegółowo

Problem producentakonsumenta

Problem producentakonsumenta Problem producentakonsumenta dr inż. Sławomir Samolej Katedra Informatyki i Automatyki Politechnika Rzeszowska Program przedmiotu oparto w części na materiałach opublikowanych na: http://wazniak.mimuw.edu.pl/

Bardziej szczegółowo

Mechanizmy pracy równoległej. Jarosław Kuchta

Mechanizmy pracy równoległej. Jarosław Kuchta Mechanizmy pracy równoległej Jarosław Kuchta Zagadnienia Algorytmy wzajemnego wykluczania algorytm Dekkera Mechanizmy niskopoziomowe przerwania mechanizmy ochrony pamięci instrukcje specjalne Mechanizmy

Bardziej szczegółowo

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run(). Wątki Streszczenie Celem wykładu jest wprowadzenie do obsługi wątków w Javie. Czas wykładu 45 minut. Definiowanie wątków jako klas potomnych Thread Nadpisanie metody run(). class Watek extends Thread public

Bardziej szczegółowo

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje. Podstawowe elementy proceduralne w C++ Program i wyjście Zmienne i arytmetyka Wskaźniki i tablice Testy i pętle Funkcje Pierwszy program // Niezbędne zaklęcia przygotowawcze ;-) #include using

Bardziej szczegółowo

Programowanie wielowątkowe. Jarosław Kuchta

Programowanie wielowątkowe. Jarosław Kuchta Programowanie wielowątkowe Jarosław Kuchta Procesy i wątki w systemie Windows Windows jest systemem wielowątkowym. Każdy proces ma przynajmniej jeden wątek, chociaż może mieć wiele wątków. Start programu,

Bardziej szczegółowo

synchronizacji procesów

synchronizacji procesów Wykład prowadzą: Jerzy Brzeziński Dariusz Wawrzyniak Plan wykładu Definicja semafora Klasyfikacja semaforów Implementacja semaforów Zamki Zmienne warunkowe Klasyczne problemy synchronizacji (2) Semafory

Bardziej szczegółowo

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

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych. Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych. 1. Rodzaje pamięci używanej w programach Pamięć komputera, dostępna dla programu,

Bardziej szczegółowo

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania Celem ćwiczenia jest zapoznanie studentów z najprostszą dynamiczną strukturą

Bardziej szczegółowo

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

dynamiczny przydział pamięci calloc() memset() memcpy( ) (wskaźniki!! ) dynamiczny przydział pamięci malloc() free() realloc() calloc() memset() memcpy( ) mempcpy( ) memmove() (wskaźniki!! ) 1 dynamiczny przydział pamięci void * memccpy (void * to, void * from, int c, int

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

Język Java wątki (streszczenie)

Język Java wątki (streszczenie) Programowanie współbieżna Język Java wątki (streszczenie) Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski @ pwr.wroc.pl Języka Java wątki Autor:

Bardziej szczegółowo

Kurs programowania. Wykład 8. Wojciech Macyna. 10 maj 2017

Kurs programowania. Wykład 8. Wojciech Macyna. 10 maj 2017 Wykład 8 10 maj 2017 Współbieżność Watki w JAVA-ie Współbieżność może być realizowana na poziomie systemu operacyjnego (procesy) lub na poziomie aplikacji (watki). W JAVA-ie powszechnie stosuje się watki.

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 współbieżne Wykład 7. Iwona Kochaoska

Programowanie współbieżne Wykład 7. Iwona Kochaoska Programowanie współbieżne Wykład 7 Iwona Kochaoska Poprawnośd programów współbieżnych Właściwości związane z poprawnością programu współbieżnego: Właściwośd żywotności - program współbieżny jest żywotny,

Bardziej szczegółowo

Procesy, zasoby i wątki

Procesy, zasoby i wątki Dariusz Wawrzyniak Koncepcja procesu i zasobu Obsługa procesów i zasobów Cykl zmian stanów procesu i kolejkowanie Klasyfikacja zasobów Wątki Procesy i wątki we współczesnych systemach operacyjnych Plan

Bardziej szczegółowo

Procesy, zasoby i wątki

Procesy, zasoby i wątki Procesy, zasoby i wątki Wykład prowadzą: Jerzy Brzeziński Dariusz Wawrzyniak Plan wykładu Koncepcja procesu i zasobu Obsługa procesów i zasobów Cykl zmian stanów procesu i kolejkowanie Klasyfikacja zasobów

Bardziej szczegółowo

Procesy, zasoby i wątki

Procesy, zasoby i wątki Wykład prowadzą: Jerzy Brzeziński Dariusz Wawrzyniak Plan wykładu Koncepcja procesu i zasobu Obsługa procesów i zasobów Cykl zmian stanów procesu i kolejkowanie Klasyfikacja zasobów Wątki Procesy i wątki

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

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

Gdy kilka procesów czyta a przynajmniej jeden dokonuje zapisu wynik odczytu zależeć może od sposobu realizacji przeplotu.

Gdy kilka procesów czyta a przynajmniej jeden dokonuje zapisu wynik odczytu zależeć może od sposobu realizacji przeplotu. Komputery i Systemy Równoległe Jędrzej Ułasiewicz 1 9. Wzajemne wykluczanie 9.1 Przeplot i współużywalność zasobów Wyróżniamy dwa rodzaje zasobów: 1. Zasoby współużywalne - mogą być wykorzystane przez

Bardziej szczegółowo

Od uczestników szkolenia wymagana jest umiejętność programowania w języku C oraz podstawowa znajomość obsługi systemu Linux.

Od uczestników szkolenia wymagana jest umiejętność programowania w języku C oraz podstawowa znajomość obsługi systemu Linux. Kod szkolenia: Tytuł szkolenia: PS/LINUX Programowanie systemowe w Linux Dni: 5 Opis: Adresaci szkolenia Szkolenie adresowane jest do programistów tworzących aplikacje w systemie Linux, którzy chcą poznać

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