Logo
IT Dienstleistungen

Sortrace V2

Sharedmemory Array wird von mehreren Kindern sortiert befüllt. Auftreten von Raceconditions.

/************************************************************
*  sortrace.c - Array mit Zufallszahlen sortiert befuellen  *
* (c) 2009 Manuel Krischer fuer das Betriebssystempraktikum *
************************************************************/
 
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>  
#include <sys/shm.h>  
#include <sys/wait.h> 
#include <time.h>     
 
/*Festlegungen*/      
#define ARRAYSIZE       1000
#define MAXWERT         5000
#define KINDER          5 /*muss durch Arraysize ohne rest teilbar sein*/
 
/*Zufallszahlen ziehen*/
int zufall(int max) {   
  return rand() % max;  
}                       
 
/*array befuellen*/
void insert_array(int wert, int *array, int max) {
  int i, j, k, insert, empty;                     
 
  /*Position fuer insert suchen*/
  for (i=0; i<ARRAYSIZE; i++) {  
      if (wert < array[i] || array[i] < 0) {
          insert = i;                       
          break;                            
      }                                     
  }                                         
  /*leeres feld suchen*/                    
  for (j=insert+1; j<ARRAYSIZE; j++) {      
      if (array[j] < 0) {                   
          empty = j;                        
          break;                            
      }                                     
  }                                         
  /*felder von insert bis leer um eins verschieben wenn zwischendrin eingefuegt wird*/
  if (insert < empty) {                                                               
      for (k=empty; k>insert; k--) {                                                  
        array[k] = array[k-1];                                                        
      }                                                                               
  }                                                                                   
  /*wert einfuegen*/                                                                  
  array[insert] = wert;                                                               
exit;                                                                                 
}                                                                                     
 
/*uebergebenes array auf falsche sortierung und leere felder untersuchen*/
void status(int  *array) {                                                
  printf("\n---------- Array mit %i Werten aus Random(%i) sortiert befuellt ----------\n", ARRAYSIZE, MAXWERT);
  int fehler=0, nullen=0, i;                                                                                   
 
    for (i=0; i<ARRAYSIZE; i++) {
    /*pruefen auf leeres feld*/  
      if (array[i] < 0 ) {       
        printf("Feld %i nicht genutzt.\n", i);
        nullen++; }                           
 
    /*pruefen auf falsche sortierung*/
        if (array[i] > array[i+1]) {  
          if ( i+1 >= ARRAYSIZE ) break;
          fehler++;                     
        printf("\nWert %i: %i ist groesser als \nWert %i: %i\n", i, array[i], i+1, array[i+1]);
        }                                                                                      
    }                                                                                          
  printf("Fehler: %i, Nullen: %i\n\n", fehler, nullen);                                        
/*aufraumen*/                                                                                  
exit;                                                                                          
}                                                                                              
 
/*Speicher wieder freigeben*/
void cleanup(int id, int *array) {
/*Shared Memory aus dem Adresseraum des aktuellen Prozesses ausklinken*/
    if (shmdt(array) != 0 ) {                                           
      printf("Entfernen des Shared-Memory fehlgeschlagen!\n");          
    }                                                                   
/*Shared-Memory Element mit IPC_RMID aus dem Speicher entfernen*/       
   if (shmctl(id, IPC_RMID, 0) != 0 ) {                                 
      printf("Loeschen des Shared-Memory nicht moeglich!\n");           
   }                                                                    
exit;                                                                   
}                                                                       
 
/***********************hauptprogramm*******************************/
int main(int argc,char *argv[]) {                                    
int k, j;                                                            
 
/*Sharedmemory mit Groesse eines Int[] holen*/
int id = shmget(IPC_PRIVATE, sizeof(int[ARRAYSIZE]), IPC_CREAT | 0777);
  if (id<0) {                                                          
    printf("Speicherreservierung Fehlgeschlagen!\n");                  
  }                                                                    
 
/*Array an Prozess anklinken*/
int *array = shmat(id, 0, 0); 
 
/*einmaliges initialisieren des randomizers*/
srand(time(NULL));                           
 
/*startaufstellung: array mit -1 befuellen*/
for (j=0; j<ARRAYSIZE; j++) {               
  array[j] = -1;                            
}                                           
 
/*array befuellen mit kindern*/
     if (fork() == 0) {        
           for (k=0; k<ARRAYSIZE/KINDER; k++) {
               insert_array(zufall(MAXWERT), array, ARRAYSIZE);
           }                                                   
     }                                                         
     else if (fork() == 0) {                                   
           for (k=0; k<ARRAYSIZE/KINDER; k++) {                
               insert_array(zufall(MAXWERT), array, ARRAYSIZE);
           }
     }
     else if (fork() == 0) {
           for (k=0; k<ARRAYSIZE/KINDER; k++) {
               insert_array(zufall(MAXWERT), array, ARRAYSIZE);
           }
     }
     else if (fork() == 0) {
           for (k=0; k<ARRAYSIZE/KINDER; k++) {
               insert_array(zufall(MAXWERT), array, ARRAYSIZE);
           }
     }
     else if (fork() == 0) {
           for (k=0; k<ARRAYSIZE/KINDER; k++) {
               insert_array(zufall(MAXWERT), array, ARRAYSIZE);
           }
     }
     else {
         wait(0);
         wait(0);
         wait(0);
         wait(0);
         wait(0);
         status(array);
         cleanup(id, array);
     }
return 0;
}

Seiten-Werkzeuge