Zakres laboratorium:
- programowanie współbieżne w systemie linux,
- wątki (KSS-wyklad-watki),
- wykorzystanie muteksów do wzajemnego wykluczania (KSS-wyklad-mutex),
- procesy systemu linux (KSS-wyklad-procesy).
Zadanie 1
Utworzyć program, który posłuży do zapoznania się z funkcjonowaniem wątków w systemie linux.
- utworzyć prosty program w języku C typu “Hello World\r\n”, napis powinien być wyświetlany na samym początku programu głównego
- dodać do programu 4 wątki – tworzenie wątków z wykorzystaniem funkcji “pthread_create“, do opóźnień wykorzystać funkcję “sleep”,
- wątki powinny wyświetlić na ekranie swój numer, każdy powinien wyświetlić numer 5 razy i zakończyć działanie,
- program główny oczekuje “pthread_join” na zakończenie pracy wszystkich wątków i wyświetla napis “koniec”, kończy działanie,
- jak działa program bez oczekiwania na zakończenie wątków? kiedy jest zakończony? Czy wątki dalej pracują?
przy kompilacji programu należy dodać flagę “-lpthread “
Zadanie 2
Zapoznanie się z działaniem mutexów
- czym jest mutex?
- utworzyć program z dwoma wątkami, opóźnienia w wątkach ustawić na 1 sekundę,
- utworzyć dwie zmienne globalne typu liczbowego- int a,b,
- wątek pierwszy:
- ustawia zmienne a i b na wartość 1, pomiędzy ustawieniem oczekuje 1 sekundę
- pobiera wartości zmiennych a,b do swoich lokalnych zmiennych x,y
- wyświetla napis “Watek 1: a=%d b=%d”, gdzie %d to wartości zmiennych
- czeka jedną sekundę
- wątek drugi wykonuje analogiczne operacje jak wątek pierwszy tylko ustawia zmienne na 2,
- zaobserwować działanie programu, czy zawsze wyświetlana zmienne a,b mają tą samą wartość? Dlaczego nie? jak rozwiązać problem?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#include <stdio.h> #include <pthread.h> #include <unistd.h> int a,b; void *watek1(void *arg) { int x,y; while(1) { a=1; sleep(1); b=1; x=a;y=b; printf("Watek 1: a=%d b=%d\r\n",x,y); sleep(1); } return 0; } void *watek2(void *arg) { int x,y; while(1) { a=2; sleep(1); b=2; x=a;y=b; printf("Watek 2: a=%d b=%d\r\n",x,y); sleep(1); } return 0; } |
Zadanie 3
Synchronizacja z wykorzystaniem mutexów – sekcja krytyczna:
- zmodyfikować program z zadania 2 tak aby zmienne a,b zawsze miały tą samą wartość, wykorzystać mutex,
- utworzyć mutex przy użyciu funkcji “pthread_mutex_init”,
- dodać blokowanie i odblokowywanie do funkcji wątków tak aby powodowały wykluczenie jednoczesnej zmiany zmiennych przez dwa wątki.
Zadanie 4
Obsługa procesów:
- utworzyć nowy program “Hello World 1\r\n”, który co 1 sekundę wyświetla na ekranie napis i będzie działał przez 60 sekund,
- uruchomić program, w drugim oknie terminala sprawdzić PID procesu przy wykorzystaniu polecenia “ps” z odpowiednimi parametrami, co to jest PID procesu, do czego może służyć?
Zadanie 5
- utworzyć drugi program “Hello World 2 – mój PID:%d\r\n”, działający tak jak pierwszy i wyświetla swój PID. Uruchomić dwa programy w jednym oknie terminala, programy pracują w tle, skorzystać z operatora “&”, jak wygląda okno terminala
- w drugim oknie sprawdzić PID procesów, czy pokrywa się z wyświetlanym przez program?
- wykorzystać polecenie “kill” i wyłączyć procesy przed ich zakończeniem, jak działa to polecenie, jakie argumenty może przyjąć?