2016-12-18 4 views
0

Я сделал в C программу в Linux умножения матриц порядка 1000 A и B. А теперь мне нужно добавить процессы!Умножение квадратной матрицы с fork(); in C

А теперь я должен добавить 4 процессов в умножении, что приведет к массиву С.

1 Процесс расчета от 0 до 249;

2 процесс для расчета от 250 до 499;

3 процесс расчета от 500 до 749;

4 процесс для расчета от 750 до 999;

Умножение работает правильно;

Я не понимаю много процессов, и проблема заключается в тех частях процессов, я не могу делать то, что мне нужно;

Следуйте код ниже:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <time.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <sys/shm.h> 

int id; 

int main(){ 

    int i; 
    int j; 
    int row; 
    int col; 
    int order; 

    long T1; 
    long T2; 
    float delta; 

    int process_1; 
    int process_2; 
    int process_3; 
    int process_4; 

    printf("Enter the order of the square matrices A and B: "); 
    scanf("%d", &order); 

    T1 = clock(); 

    printf("\nThe square matrices A and B, are order matrices %d",order); 

    order = order - 1; 

    row = order; 
    col = order; 

    float A[row+1][col+1]; 
    float B[row+1][col+1]; 

    for(i = 0; i <= row; i++){ 

     for(j = 0; j <= col; j++){ 

      printf("\n\nEnter the value of the array A[%d][%d]: ",i+1,j+1); 
      scanf("%f", &A[i][j]); 

      printf("\nEnter the value of the array B[%d][%d]: ",i+1,j+1); 
      scanf("%f", &B[i][j]); 
     } 
    } 

    printf("\nThe multiplication of matrices A and B:\n\n"); 

    id = shmget(IPC_PRIVATE, 100, 0600); 

    process_1 = fork(); 
    process_2 = fork(); 
    process_3 = fork(); 
    process_4 = fork(); 

    int *a; 
    a = shmat(id,0,0); 

    printf("\n\nprocess 1:\n\n"); 

    if(process_1 == 0){ 
     int P1 = 0; 

     if(P1 <= 249){ 

      for(i = 0; i <= row; i++) { 

        for(j = 0; j <= col; j++) { 

         float C[row+1][col+1]; 

          for(int AUX = 0; AUX <= order; AUX++) { 

            C[i][j] += A[i][AUX] * B[AUX][j]; 

           } 
           printf("%.2f ",C[i][j]); 
        } 
        printf("\n"); 
      } 
     } 
     exit(0); 
    } 

    printf("\n\nprocess 2:\n\n"); 

    if(process_2 == 0){ 
     int P2 = 250; 

     if(P2 >=250 && P2 <= 499){ 

      for(i = 0; i <= row; i++) { 

        for(j = 0; j <= col; j++) { 

         float C[row+1][col+1]; 

          for(int AUX = 0; AUX <= order; AUX++) { 

            C[i][j] += A[i][AUX] * B[AUX][j]; 

           } 
           printf("%.2f ",C[i][j]); 
        } 
        printf("\n"); 
      } 
     } 
     exit(0); 
    } 

    printf("\n\nprocess 3:\n\n"); 

    if(process_3 == 0){ 
     int P3 = 0; 

     if(P3 >=500 && P3 <= 749){ 

      for(i = 0; i <= row; i++) { 

        for(j = 0; j <= col; j++) { 

         float C[row+1][col+1]; 

          for(int AUX = 0; AUX <= order; AUX++) { 

            C[i][j] += A[i][AUX] * B[AUX][j]; 

           } 
           printf("%.2f ",C[i][j]); 
        } 
        printf("\n"); 
      } 
     } 
     exit(0); 
    } 

    printf("\n\nprocess 4:\n\n"); 

    if(process_4 == 0){ 
     int P4 = 0; 

     if(P4 >=750 && P4 <= 999){ 

      for(i = 0; i <= row; i++) { 

        for(j = 0; j <= col; j++) { 

         float C[row+1][col+1]; 

          for(int AUX = 0; AUX <= order; AUX++) { 

            C[i][j] += A[i][AUX] * B[AUX][j]; 

           } 
           printf("%.2f ",C[i][j]); 
        } 
        printf("\n"); 
      } 
     } 
     exit(0); 
    } 

    waitpid(process_1, NULL, 0); 
    waitpid(process_2, NULL, 0); 
    waitpid(process_3, NULL, 0); 
    waitpid(process_4, NULL, 0); 

    T2 = clock(); 
     delta = (float)(T2-T1)/CLOCKS_PER_SEC; 

     printf("\n\Time %.5f seconds\n\n",delta); 

    return 0; 
} 

Как я могу это исправить?

ответ

1

Я хотел бы начать с изменения типа Int в pid_t для идентификаторов процесса, например:

pid_t process_1; 

, а затем изменится:

process_1 = fork(); 
process_2 = fork(); 
process_3 = fork(); 
process_4 = fork(); 

в

pid_t pid = fork(); 
if (pid) { 
    process_1 = pid; 
    pid = fork(); 
} 
if (pid) { 
    process_2 = pid; 
    pid = fork(); 
} 
if (pid) { 
    process_3 = pid; 
    pid = fork(); 
} 
if (pid) 
    process_4 = pid; 

идея заключается в том, что мы делаем fork() только в родительском процессе и пропускаем разветвление в дочернем процессе. В противном случае ваш код обрабатывает процессы как дерево, каждый дочерний и родительский процессы вызывают следующую fork() после предыдущего, тогда их дети делают то же самое и так далее четыре раза. Вышеприведенный код не проверяет, возвращает ли fork() код ошибки (-1). В идеальном мире настоятельно рекомендуется.

От развилки (2) человек страница:

Возвращаемое значение

В случае успеха, PID дочернего процесса возвращается в родителе, и 0 возвращается в дочернем. При ошибке -1 возвращается в родительском , никакого дочернего процесса не создается, а errno устанавливается соответствующим образом.