Multiplicación de Matrices (procesos e hilos)

Entrega individual a:

Deadline: <color green>13 de Febrero de 2007 11:59 pm</color>

 To: entregas@cic.puj.edu.co
 Subject: [PC070] (multmat) nombre del estudiante - código del estudiante

Objetivos

Aprender como se definen y crean procesos e hilos para resolver problemas en dos sistemas operativos diferentes, además de trabajar con diferentes métodos de comunicación entre procesos

Descripción

Realizar una implementación de multiplicación de matrices (NxN) para cada una de las siguientes características en lenguaje C:

  • Hilos en GNU/Linux
  • Procesos en GNU/Linux
  • Hilos en Windows
  • Procesos en Windows

Una vez realizado las implementaciones tomar tiempos de ejecución (trabajar con promedio de ejecuciones de la misma entrada) compararlos y escribir las conclusiones de los resultados obtenidos. Realizar pruebas con n>20 para ver las diferencias.

La multiplicación de matrices consiste en:

<latex> C_{NxM} = A_{NxL}*B_{LxM}

c_{i,j} = \sum_{k=1}^L a_{i,k}*b_{k,j}
</latex>

Hints

Tengan en cuenta que al trabajar con hilos se puede utiliza memoria compartida para la comunicación entre hilos. Para comunicar los procesos pueden buscar pipe o mkfifo para crear un canal de comunicación entre el proceso hijo y el proceso papá

FAQ

:?:

estoy revisando los archivos que se adjuntaron para la tarea de hilos y procesos.
pero necesito el archivo windows.h para poder hacer las pruebas, no se si en linux también necesito el pthread.h, por favor me puedes enviar los archivos y decir como puedo probarlos.

El archivo window.h normalmente se encuentra al instalar alguna herramienta de desarrollo en C en Windows (Visual Studio, Dev-C++ con Ming, Borland, etc)

Para trabajar con pthreads en Linux requieres del paquete de Pthreads o Pth2 (GNU Portable Threads)

:?:

Como se compila el ejemplo de pthreads en GNU/Linux?

gcc -o hilos hilos.c -pthread

Código de ejemplo

Ejemplo de uso de fork() para GNU/Linux

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
 
int main(int argc, char *argv[]) {
  int i,n;
  pid_t pid;
 
  if (argc < 2) {
    fprintf(stderr,"fork1 <valor entero>\n");
    return -1;
  }
  n = atoi(argv[1]);
  for(i=0;i<n;i++) {
    pid = fork();
    if (pid == 0) {
      printf("Hijo con PID:%ld y papa:%ld\n",(long)getpid(),(long)getppid());
    }
    else {
      printf("Papa con PID:%ld con hijo %ld\n",(long)getpid(),pid);
      //waitpid(pid);
    }
  }
}

Ejemplo de uso de hilos (Pthreads) en GNU/Linux

#include <pthread.h>
#include <stdio.h>
 
int cont=0; /* Variable compartida */
 
void *incrementar(void *param) {
  int i,n = atoi(param);
  for(i=0;i<n;i++)
    cont++;
  pthread_exit(0);
}
 
void *decrementar(void *param) {
  int i,n = atoi(param);
  for(i=0;i<n;i++)
    cont--;
  pthread_exit(0);
}
 
int main(int argc, char* argv[]) {
  pthread_t tidi,tidd;
  pthread_attr_t attr;
 
  if (argc < 2) {
    fprintf(stderr,"pthread1 <valor entero>\n");
    return -1;
  }
 
  pthread_attr_init(&attr);
  pthread_create(&tidi,&attr,incrementar,argv[1]);
  pthread_create(&tidd,&attr,decrementar,argv[1]);
  printf("Contador = %d\n",cont);
  pthread_join(tidi,NULL);
  pthread_join(tidd,NULL);
  printf("Contador = %d\n",cont);
}

Ejemplo de procesos en Windows (Win32 API)

/* win32proc.c -> win32proc.exe */
#include <stdio.h>
#include <windows.h>
 
int main(int argc, char *argv[]) {
    int i, n;
    char cmd[30];
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
 
    if (argc < 2) {
       fprintf(stderr,"win32proc.exe <valor entero>\n");
       return -1;
    }
 
    n = atoi(argv[1]);
 
    for(i=0;i<n;i++) 
    {
       ZeroMemory(&si,sizeof(si));
       si.cb = sizeof(si);
       ZeroMemory(&pi,sizeof(pi));
       sprintf(cmd,"win32proc.exe %d",n-(i+1)); 
       CreateProcess(NULL,cmd,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
       printf("Soy papa (%d) con hijo %d\n",GetCurrentProcessId(),pi.dwProcessId);
       WaitForSingleObject(pi.hProcess, INFINITE);
       printf("Proceso %d terminado\n",GetCurrentProcessId());
       CloseHandle(pi.hProcess);
       CloseHandle(pi.hThread);    
    }         
}

Ejemplo de uso de hilos en Windows (Win32 API)

#include <windows.h>
#include <stdio.h>
 
DWORD Cont=0; /* Variable compartida */
 
DWORD  WINAPI incrementar(LPVOID param) {
  DWORD n = *(DWORD*)param;
  int i;
  for(i=0;i<n;i++)
    Cont=Cont+1;
  return 0;
}
 
DWORD  WINAPI decrementar(LPVOID param) {
  DWORD n = *(DWORD*)param;
  int i;
  for(i=0;i<n;i++)
    Cont=Cont-1;
  return 0;
}
 
int main(int argc, char *argv[]) {
    DWORD TIdi,TIdd;
    HANDLE THandlei,THandled;
    int param;
 
    if (argc < 2) {
       fprintf(stderr,"win32threads1 <valor entero>\n");
       return -1;
    }
    param = atoi(argv[1]);
 
    THandlei = CreateThread(NULL,0,incrementar,&param,0,&TIdi);
    THandled = CreateThread(NULL,0,decrementar,&param,0,&TIdd);
    printf("Contador = %d\n",Cont);
    WaitForSingleObject(THandlei,INFINITE);
    WaitForSingleObject(THandled,INFINITE);
    CloseHandle(THandlei);
    CloseHandle(THandled);
    printf("Contador = %d\n",Cont);
}
 
materias/sistemas_operativos/tareas/multmat.txt · Última modificación: 2011/01/24 15:30 (editor externo)
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki