Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Piotr Trojanek BDSISK1 Sekcja 2
- /*
- n - liczba elementow ciogu
- k - ilosc procesow
- n jest podzielne przez k bez reszty
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- //obliczanie wartosci i-tego elementu ciagu
- double licz (int i,int n){
- return ((i*i-12)*(i*i-12)*(i*i-12))/(n*n*n*i*i*i)
- }
- //obliczanie sumy n_per_proc elementow ciagu zaczynajac od p-tego
- double func (int p,int n,int n_per_proc){
- //wartosc przechowywuje sume
- double sum;
- sum = 0;
- int i = p;
- //wartosc koncz¹ca np 4 liczby na element zaczynajac od 1 -> jesli mniejsze niz 5 licz (1,2,3,4)
- int ilosc = p+n_per_proc;
- //petla liczaca sume czesciowa
- for(i;i<ilosc;i++)
- {
- sum += licz(i,n);
- }
- return sum;
- }
- int main(int argc, char* argv[])
- {
- //zmienna do ktorej zczytujemy dane ze strumieni
- double a;
- //ilosc elementow sumy
- int n;
- //ilosc procesow potomnych
- int k;
- //zmienna sumujaca kolejne sumy czesciowe dajaca ostateczna sume
- double suma = 0;
- //element poczatkowy sumy tymczasowej
- int start;
- //ilosc elementow sumy obliczana przez jeden proces
- int n_per_proc;
- //ptablice reprezentujace potoki
- int stream1[2];
- int stream2[2];
- //zmienna okreslajaca czy dany proces jest dzieckiem czy nie
- int child = 0;
- //wprowadzona za mala ilosc argumentow
- if(argc < 3)
- printf("Za malo argumentow");
- //pobranie argumentow
- n = atoi(argv[1]);
- k = atoi(argv[2]);
- //obliczenie ilosci elementow sumy przypadajacej na proces
- n_per_proc = n / k;
- //tworzenie potokow
- pipe(stream1);
- pipe(stream2);
- int i = 0;
- //przypisanie wartosci okreslajacej dziecko badz rodzica
- for(i; i < k; i++)
- {
- if(fork() == 0)
- {
- child = 1;
- break;
- }
- }
- //dzialanie dla rodzica
- if(child == 0)
- {
- //przeslij wartosci poczatkowe sum czesciowych do procesow potomnych (np. n=12,k=3 -> wyslij 1,4,7,10)
- for(i=1;i<n;i+=n_per_proc)
- {
- write(stream1[1], &i, sizeof(int));
- }
- //wyslij polecenie zamkniecia procesu do kazdego procesu
- int e = -1;
- for(i=0; i < k; i++)
- {
- write(stream1[1], &e, sizeof(int));
- }
- //odczytaj sumy czesciowe od kazdego procesu i zsumuj je
- for(i=0; i < k; i++)
- {
- read(stream2[0], &a, sizeof(double));
- suma = suma + a;
- }
- //wypisanie wyniku
- printf("SUMA = %f\n", suma);
- }
- //dzialanie dla dziecka
- if(child == 1)
- {
- while(1)
- {
- //odczytuj dane wyslane przez rodzica
- read(stream1[0], &start, sizeof(int));
- //jesli polecenie zamkniecia procesu zakoncz proces
- if(start == -1)
- {
- exit(0);
- }
- //jesli nie licz sume czesciowa
- else
- {
- //pobranie numeru elementu poczatkowego
- double s = func(start,n,n_per_proc);
- //wyslanie sumy czesciowej
- write(stream2[1], &s, sizeof(double));
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement