Problema dos Jantar dos Filósofos em Sistemas Distribuidos

esse projeto foi o segundo trabalho da disciplina de Sistemas Distribuidos UFMS-CPPP

funcionamento

Há dois tipos de nós da rede, o servidor (Mesa) e o cliente (Filósofo), o filósofo só pode em estar em dois estados, comendo ou pensando, o pensar pode ser o calculo de n digitos de pi, uma espera de n ms ou até o apertar do enter do usuário quando ele termina de pensar ele requisita a mesa uma matriz não-singular quadrada, e depois envia devolta sua matriz inversa, esse é o estado de comer, caso retorne uma matriz inválida ele é expulso da mesa.

Enquanto isso na mesa, ele organiza todos os filósofos numa pilha duplamente lincada circular, de forma que cada nó tenha dois ponteiros para um mutex, um esquerdo e um direito, assim cada filósofo adjacente tem um mutex (garfo) em comum, cada filósofo só pode comer quando fizer o lock nos dois mutexes, desta forma o algorítmo resolve o problema tratando de impasses e fome através de uma fila, quando um filósofo não consegue fazer o lock de ambos os garfos, ele se inclui numa fila, e depois essa fila será executada pelo nó que está ocupado esse garfo. em resumo o algorítmo pode ser expresso nisso toda vez que uma requisição de comer for feita:

1.checar se a fila tem os garfos desse nó atual 1.1se sim adicione-se na fila pare 1.2 se não continue 2.tenta fazer lock em dois garfos, se não conseguir um deles 2.1 faça unlock de um deles e adicione-se na fila pare 2.1 caso contrário mande matriz não singular quadrada para filósofo execute monitor

O monitor tem o propósito de atender o primeiro nó da fila e o remove da fila, desta forma ele garante o lock de ambos os garfos, e impasses são tratados pelo fato do nó soltar um garfo se não conseguir ambos, e resolve fome por executar sempre o primeiro da fila.

Pré-requerimentos

  • g++
  • make
  • OpenBlas
  • LAPPACK
  • Armadillo
  • POSIX sockets
  • Pthreads
  • GMP

Executar

para executar a mesa basta usar o comando

./table [caminho para arquivo mtx] [tempo máxio de pensamento de filósofo (ms)]

o arquivo mtx pode ser gerado pelo binário genmtx com

./genmtx [dimensão das matrizes] [número de matrizes] [saida.mtx]

ou por outra fonte, o formato mtx é muito simples sendo constituído de seus 4 primeiros bytes a dimensão da matriz e o resto a matriz em sí em ordem de coluna maior com cada elemento sendo 1 byte

para executar o filósofo basta usar o comando

./philosopher [ip para mesa] [modo] [parâmetros] ...

sendo os modos

pi [menor digito] [digito máximo] sleep [min(ms)] [max(ms)] manual

compilar

para compilar todos os binários basta executar make, caso queira algum binário específico execute make [binario específico]