Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 

Repository files navigation

Projeto de Programação Concorrente - Santa Claus Problem

Autores: Yuri Ulisses dos Santos Baza Professor: Rodrigo Campiolo Universidade Tecnológica Federal do Paraná - UTFPR

O que é o problema do Papai Noel?

O problema do Papai Noel é um problema clássico de sincronização de threads que foi proposto por John Trono em 1994. O problema é baseado na história do Papai Noel e seus ajudantes elfos e renas. O problema é composto por três tipos de threads: Papai Noel, Elfo e Rena. O Papai Noel dorme até que um dos seguintes eventos ocorra:

  • Quando 3 elfos estão na sala de espera esperando ajuda para montar os brinquedos.
  • Quando 9 renas estão na sala de espera esperando para puxar o trenó.

Objetivo

O objetivo deste projeto é implementar o problema do Papai Noel utilizando uma linguagem de programação. O projeto foi desenvolvido para a disciplina de Programação Concorrente do curso de Ciência de Computação da Universidade Tecnológica Federal do Paraná - UTFPR.

A escolha da linguagem

A linguagem escolhida para a implementação do projeto foi a linguagem de programação Elixir. A escolha da linguagem foi feita devido a sua facilidade de implementação de concorrência e paralelismo. Ainda, a linguagem foi desenvolvida por José Valim, um brasileiro que é conhecido por ser um dos principais contribuidores da linguagem Ruby.

Dependências do projeto

Para executar o projeto, recomenda-se que sejam seguidos os seguintes passos (os passos foram testados no sistema operacional MacOS Sonoma 14.7):

# Instalar as dependências do gerenciador asdf
brew install coreutils curl git

# Instalar o gerenciador de versões asdf
brew install asdf

Após a instalação do asdf, é necessário adicionar o seguinte trecho de código no arquivo ~/.zshrc ou ~/.bashrc:

# Adicionar o asdf no PATH
echo -e "\n. $(brew --prefix asdf)/asdf.sh" >> ${ZDOTDIR:-~}/.zshrc

Após o passo anterior, é necessário instalar o plugin do Erlang e Elixir no asdf:

# Instalar o plugin do Erlang
asdf plugin add erlang

# Instalar o erlang
asdf install erlang latest

# Instalar o plugin do Elixir
asdf plugin add elixir

# Instalar o elixir
asdf install elixir latest

# Definir a versão do Erlang e Elixir
asdf set erlang <version>
asdf set elixir <version>

Para saber os passos de instalação do asdf em outros sistemas operacionais, recomenda-se a leitura da documentação oficial do asdf: https://asdf-vm.com/pt-br/guide/getting-started.html

Execução do projeto

Para executar o projeto, recomenda-se que esteja com o código na sua máquina e seja seguido os seguintes passos:

iex santa_claus.ex

Explicações sobre o código

Foram implementadas 3 mdoulos principais no código:

  • PapaiNoel: Módulo responsável por controlar o comportamento do Papai Noel.
  • Elfo: Módulo responsável por controlar o comportamento dos elfos.
  • Rena: Módulo responsável por controlar o comportamento das renas.

Também foi implementada uma função para inicializar o comportamento do Papai Noel, Elfo e Rena. A função start.

Ainda, temos:

  • santa nº 1: Função responsável por controlar o comportamento do Papai Noel quando há 9 renas na sala de espera.
  • santa nº 2: Função responsável por controlar o comportamento do Papai Noel quando há 3 elfos na sala de espera.
  • santa nº 3: Função responsável por esperar e processar as mensagens enviadas pelos elfos e renas.
  • loop nº 1: Função responsável por controlar o comportamento dos elfos.
  • loop nº 2: Função responsável por controlar o comportamento das renas.

Para finalizar, há algumas funções importantes utilizadas para concorrência em Elixir:

  • spawn: Função responsável por incializar um processo concorrente.
  • send: Função responsável por enviar uma mensagem para um processo. Essa função é formada por dois argumentos: o primeiro é o processo que receberá a mensagem e o segundo é a mensagem que será enviada.
  • receive: Função responsável por receber uma mensagem enviada por um processo. Essa função é formada por um bloco de código que será executado quando uma mensagem for recebida.

O código foi desenvolvido de forma a ser o mais simples possível, para que seja possível entender o funcionamento do problema do Papai Noel. Ainda, o código foi inteiramente comentado para facilitar o entendimento.

Referências

About

🎅🏻 Problema de concorrência e sincronização envolvendo o papai noel, renas e elfos

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages