ClubEnsayos.com - Ensayos de Calidad, Tareas y Monografias
Buscar

Laboratorio 5 Comunicación y Sincronización Hilos/Procesos


Enviado por   •  19 de Febrero de 2017  •  Tutoriales  •  3.533 Palabras (15 Páginas)  •  189 Visitas

Página 1 de 15

Universidad de Antioquia udealogo

Facultad de Ingeniería

Sistemas Operativos y Laboratorio

Laboratorio 5

Comunicación y Sincronización Hilos/Procesos

Objetivos

* Identificar una condición de carrera y los mecanismos existentes para evitarla.

* Uso de mutex y semáforos.

* Explorar el uso de la técnica de memoria compartida para comunicación entre procesos e hilos.

1. Comunicación entre Procesos/Hilos a través de memoria compartida.

En el desarrollo de aplicaciones cooperativas usando técnicas de multiprogramación y multihilo, se hace necesario poseer herramientas con las cuales se facilite una comunicación efectiva entre los diferentes entes de procesamiento existentes en una máquina (hilos o procesos). El sistema operativo posee un diverso conjunto de opciones de comunicación que incluye las tuberías, los sockets, el paso de mensajes y la memoria compartida. Ésta última técnica de comunicación a través de memoria compartida es una de las más usadas actualmente debido a su facilidad en la implementación y la simpleza en su funcionamiento. Cuando estamos hablando estrictamente de hilos, ellos por definición comparten una serie de recursos del proceso, entre los que se encuentran los espacios de memoria Heap y Global que actúan como una región de memoria compartida que permite la comunicación entre hilos.

Para los procesos la situación cambia, ya que éstos no poseen a priori, ningún espacio de memoria compartido, por lo que se hace necesaria la intervención del sistema operativo para asignar un espacio de memoria que sea visible por los procesos que se desean comunicar.

En ambos casos tras la definición de un espacio de memoria se hace necesario sincronizar el acceso a la misma, pues se puede presentar una condición de carrera que altera el buen funcionamiento de la aplicación (para profundizar en este concepto remítase al material de clase o al capítulo 2 del libro de Tanenbaum [[1]]).

1.1 Comunicación entre Hilos

En la clase de sistemas operativos se abordó el uso de semáforos como mecanismo de sincronización entre procesos e hilos. Debido a que el concepto de semáforo se aplica muy similar en procesos e hilos, se ha decidido mostrar el funcionamiento solo para estos últimos y se deja al estudiante la tarea de verificar el funcionamiento en procesos. A continuación realizaremos algunos ejemplos acerca del uso de esta técnica tan popular.

1.1.1 Condición de carrera

En el siguiente ejemplo se tiene dos hilos que acceden a posiciones de memoria compartida. Se espera entonces que se configure una condición de carrera. Este es el código:

#include <stdio.h>

#include <pthread.h>

#define NUMTHREADS 200

#define MAXCNT 1000

/* Global variables - shared between threads */

double counter = 0;

/* Declaring functions*/

void* counting(void *);

int main(void) {

pthread_t tid[NUMTHREADS];

int i=0;

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

pthread_create (&tid[i], NULL, &counting, NULL);

}

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

pthread_join(tid[i], NULL);

}

printf("\nCounter must be in: %d\n", MAXCNT*NUMTHREADS);

printf("\nCounter value is: %.0f\n\n", counter);

return 0;

}

/* Function Thread*/

void* counting(void * unused) {

int i=0;

for(i=0; i<MAXCNT; i++)

counter++;

return NULL;

}

* Ejecute este código en varias oportunidades, verifique que se presente una condición de carrera. ¿Cómo se presenta en pantalla esta condición de carrera? ¿Cuál es el motivo del problema?

* ¿Cuál es la región crítica para este programa? ¿Cuáles son las posiciones de memoria compartida que generan el problema?

1.1.2 Mutex

La solución para asegurar el buen funcionamiento del ejercicio anterior es permitir que solo uno de los hilos se encuentre en la región crítica al mismo tiempo. En la librería pthread el mecanismo se conoce como un mutex.

Para crear un mutex, se debe crear la variable pthread_mutex_t y luego llamar la función pthread_mutex_init para inicializarlo. A continuación se presenta un ejemplo del uso de un mutex para la sincronización del hilo anterior.

#include <stdio.h>

#include <pthread.h>

#define NUMTHREADS 200

#define MAXCNT 1000

/* Global variables - shared between threads */

double counter = 0;

pthread_mutex_t lock;

/* Declaring functions*/

void* counting(void *);

int main(void)

...

Descargar como (para miembros actualizados)  txt (23.5 Kb)   pdf (92.6 Kb)   docx (31.7 Kb)  
Leer 14 páginas más »
Disponible sólo en Clubensayos.com