Coise
FCT/UNL - 2009/2010
Trabalho prático 3
Sincronização de processos – Semáforos
Introdução
Este trabalho pretende ilustrar aspectos apresentados nas aulas teóricas relacionados com a programação concorrente, concretamente o uso de semáforos para a sincronização de processos e a definição de zonas de memória partilhada entre processos.
Descrição
Este trabalho, foi constituído por duas fases: a primeira fase consistia simplesmente em que, um processo escrevia todas as suas mensagens, e só quando todas as mensagens do primeiro processo tivessem sido escritas, é que o programa passava para o processo seguinte, e escrivia as respectivas mensagens; a segunda fase consistia em que cada processo escrevia uma mensagem de índice i, só quando todos os processos tiverem escrito as respectivas mensagens do mesmo índice, o primeiro processo pode escrever a sua mensagem de índice i+1.
Para resolver o problema da primeira fase, fez-se um “include” de “sem.h” para se fazer a chamada dos métodos de semáforo, como por exemplo o “createSem”, para se fazer a implementação do semáforo, e assim resolver o problema. Implementou-se o semáforo junto à zona crítica, fazendo um decremento antes, e um incremento após. Na segunda fase, fez-se um “include” de “sem.h” e de “shm.h”, para fazer a chamada dos métodos dos semáforos e da memória partilhada, respectivamente. Criou-se um método barreira, que faz a sincronização para que cada processo só continue a sua execução quando todos tiverem chegado à barreira, assim, só quando todos os processos tiverem escrito a mensagem i, é que podem avançar para a mensagem i+1, e criou-se uma variável de memória partilhada dentro da barreira, na qual os processos verificam o seu estado, para saber o índice de mensagem que devem escrever.
Código
Ficheiro “nim.c” fase 1
#include
#include
#include
#include
#include "sem.h"
#define N_NIM 5
void nim( int i );
int main(int argc, char