Witam
Na zadanie z programowania systemowego mam zrobić dwa programy. Jeden sortujący bąbelkowo tablicę 100000 elementową i liczący czas tej operacji. Drugi program ma wygenerować tablicę 100000elementową podzielić ją na pół i połowę przekazać do procesu potomnego a połowę pozostawić w procesie macierzystym a następnie równolegle posortować babelkową obie połówki po skończeniu proces potomny ma przesłać do macierzystego swoją połówkę i w procesie macierzystym powinno dojść do scalenia i podania czasu całej operacji. Tu jest problem otóż wg. mojego kodu sortowanie na dwóch procesach jest 4 krotnie szybsze, a z tego co mówił profesor powinno być 2 krotnie szybsze. Oto kody obu programów:
Sortowanie_jednoprocesowe:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char *argv[])
{
srand(time(NULL));
int rozmiar = atoi( (argv[1]) );
int tablica[rozmiar], i;
for(i=0;i<rozmiar;i++)
{
tablica[i]=rand();
// printf("Element numer %d = %d\n",i,tablica[i]);
}
void bubblesort(int table[], int size)
{
int i, j, temp;
for (i = 0; i<size; i++)
for (j=0; j<size-1; j++)
{
if (table[j] > table[j+1])
{
temp = table[j+1];
table[j+1] = table[j];
table[j] = temp;
}
}
}
struct timeval tim;
gettimeofday(&tim, NULL);
double t1=tim.tv_sec+(tim.tv_usec/1000000.0);
bubblesort(tablica,rozmiar);
gettimeofday(&tim, NULL);
double t2=tim.tv_sec+(tim.tv_usec/1000000.0);
printf("Uplynelo: %.6lf sekund\n", t2-t1);
}
Sortowanie_dwuprocesowe:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char *argv[])
{
int rozmiar = atoi( (argv[1]) );
int tablica[rozmiar],tablica_a[rozmiar/2],tablica_b[rozmiar/2],tablica_c[rozmiar/2];
int deskr1[2],deskr2[2], pid, status,i,j;
srand(time(NULL));
for(i=0;i<rozmiar;i++)
{
tablica[i]=rand();
//printf("Element numer %d = %d\n",i,tablica[i]);
}
for(i=0;i<rozmiar/2;i++) tablica_a[i]=tablica[i];
for(i=0;i<rozmiar/2;i++) tablica_b[i]=tablica[i+rozmiar/2];
void bubblesort(int table[], int size)
{
int i, j, temp;
for (i = 0; i<size; i++)
for (j=0; j<size-1; j++)
{
if (table[j] > table[j+1])
{
temp = table[j+1];
table[j+1] = table[j];
table[j] = temp;
}
}
}
void merge(int m, int n, int A[], int B[], int C[]) {
int i, j, k, p;
i = 0;
j = 0;
k = 0;
while (i < m && j < n) {
if (A[i] <= B[j]) {
C[k] = A[i];
i++;
} else {
C[k] = B[j];
j++;
}
k++;
}
if (i < m) {
for (p = i; p < m; p++) {
C[k] = A[p];
k++;
}
} else {
for (p = j; p < n; p++) {
C[k] = B[p];
k++;
}
}
}
struct timeval tim;
gettimeofday(&tim, NULL);
double t1=tim.tv_sec+(tim.tv_usec/1000000.0);
if((pipe(deskr1))==-1)
{
printf("Error pipe 1\n");
exit(-1);
}
if((pipe(deskr2))==-1)
{
printf("Error pipe 2\n");
exit(-2);
}
if((pid=fork())==-1)
{
printf("Error fork\n");
exit(-3);
}
if(pid==0)
{
close(deskr2[1]);
close(deskr1[0]);
for(i=0;i<rozmiar/2;i++)
{
read(deskr2[0],&tablica_c[i],sizeof(int));
}
bubblesort(tablica_c,rozmiar/2);
for(i=0;i<rozmiar/2;i++)
{
write(deskr1[1],&tablica_c[i],sizeof(int));
}
close(deskr2[0]);
close(deskr1[1]);
}
else
{
close(deskr2[0]);
close(deskr1[1]);
for(j=0;j<rozmiar/2;j++)
{
write(deskr2[1],&tablica_b[j],sizeof(int));
}
bubblesort(tablica_a,rozmiar/2);
for(j=0;j<rozmiar/2;j++)
{
read(deskr1[0],&tablica_b[j],sizeof(int));
}
merge(rozmiar/2,rozmiar/2,tablica_a,tablica_b,tablica);
close(deskr1[0]);
close(deskr2[1]);
gettimeofday(&tim, NULL);
double t2=tim.tv_sec+(tim.tv_usec/1000000.0);
printf("Uplynelo: %.6lf sekund\n", t2-t1);
wait(&status);
}
}