Filosofos
From Mo806
Dario Fernandes e Vitor Afonso
Contents |
Atividade
Análise do caso de baixo paralelismo da implementação assimétrica. Encontrar padrões que levam ao baixo paralelismo para alguns valores de N e fazer uma implementação com sleeps que ilustra estes padrões.
Introdução
Na implementação assimétrica os filósofos de índice ímpar pegam primeiro o garfo da direita e depois o garfo da esquerda, enquanto os de índice par pegam primeiro o da esquerda, como demonstrado no código abaixo.
for (i = 0; i < N_CICLOS; i++) {
fica_com_fome(phil_id);
if (phil_id % 2) {
pega_garfo_dir(phil_id);
pega_garfo_esq(phil_id);
} else {
pega_garfo_esq(phil_id);
pega_garfo_dir(phil_id);
}
come(phil_id);
solta_garfos_pensa(phil_id);
}
Testes
Foram realizados testes com diversas implementações para encontrar os casos que apresentavam menos paralelismo.
Material
Os slides da apresentação estão aqui: slides-multithread
Os códigos fonte com as diferentes implementações de baixo paralelismo estão em: códigos-filósofos.
Nesse pacote estão os seguintes arquivos:
- assimetrica.c - Implementação assimétrica sem modificações. - delay_crescente_2_grupos.c - Implementação utilizando dois grupos e com sleep crescente. - delay_fixo.c - Implementação utilizando um tempo fixo de sleep. - delay_grupos_2.c - Implementação utilizando 2 grupos e tempo de sleep crescente dentro de cada grupo. - delay_grupos_3.c - Implementação utilizando 3 grupos e tempo de sleep crescente dentro de cada grupo. - delay_grupos_4.c - Implementação utilizando 4 grupos e tempo de sleep crescente dentro de cada grupo. - delay_grupos_5.c - Implementação utilizando 5 grupos e tempo de sleep crescente dentro de cada grupo. - delay_grupos_6.c - Implementação utilizando 6 grupos e tempo de sleep crescente dentro de cada grupo. - delay_grupos_7.c - Implementação utilizando 7 grupos e tempo de sleep crescente dentro de cada grupo. - delay_grupos_8.c - Implementação utilizando 8 grupos e tempo de sleep crescente dentro de cada grupo. - delay_grupos_9.c - Implementação utilizando 9 grupos e tempo de sleep crescente dentro de cada grupo. - delay_grupos_10.c - Implementação utilizando 10 grupos e tempo de sleep crescente dentro de cada grupo. - delay_random.c - Implementação com tempo de sleep aleatório. - delay_soltando_segundo_garfo.c - Implementação com sleep antes de soltar o segundo grafo e após soltar o primeiro.
Conclusão
Dos casos testados o que apresentou menos paralelismo foi o caso em que os filósofos eram divididos em dois grupos e o tempo de sleep era crescente dentro de cada grupo.