Modelize um sistema distribuído que adicione todos os elementos duma matriz.Apresente o modelo operacional bem como o modelo de setup.
Desenvolva um módulo Erlang respeitante ao modelo anterior.
Os elementos de cada linha são adicionados por um processo distinto, que posteriormente envia a soma para um processo que adicionará as somas de todas as linhas.
(falta modelo)
A criação dos processos faz-se por ordem inversa da ordem de operação.
(falta modelo)
-module(exercicio5). -export([start/1,adicao/1,adicaofinal/2]).
start(Matriz) -> NLinhas=length(Matriz),
Pid_adicaofinal=spawn(exercicio5,adicaofinal,[self(),NLinhas]), Pids_adicoes=lanca_adicoes(Pid_adicaofinal,NLinhas),
envia_linhas(Pids_adicoes,Matriz), receive Result -> Result end.
lanca_adicoes(Pid_adicaofinal,NLinhas) -> lanca_adicoes(Pid_adicaofinal,NLinhas,[]). lanca_adicoes(_Pid_adicaofinal,0,Pids_adicoes) -> Pids_adicoes; lanca_adicoes(Pid_adicaofinal,NLinhas,Pids_adicoes) -> Pid_novo=spawn(exercicio5,adicao,[Pid_adicaofinal]), lanca_adicoes(Pid_adicaofinal,NLinhas-1,[Pid_novo|Pids_adicoes]).
envia_linhas([],[]) -> ok; envia_linhas([Pid|Pids_adicoes],[Linha|Matriz]) -> Pid ! Linha, envia_linhas(Pids_adicoes,Matriz).
adicao(Pid_adicaofinal) -> receive Linha when list(Linha) -> ok end, Soma_linha=somatorio(Linha), Pid_adicaofinal ! Soma_linha.
somatorio(Linha) -> somatorio(Linha,0). somatorio([],Soma_final) -> Soma_final; somatorio([Elemento|Linha],Acumulado) -> somatorio(Linha,Acumulado+Elemento).
adicaofinal(Pid_start,NLinhas) -> Somatorio=recebe_e_adiciona(NLinhas), Pid_start ! Somatorio.
recebe_e_adiciona(NLinhas) -> recebe_e_adiciona(NLinhas,0). recebe_e_adiciona(0,Somatorio) -> Somatorio; recebe_e_adiciona(NLinhas,Acumulado) -> receive Soma_linha -> ok end, recebe_e_adiciona(NLinhas-1,Acumulado+Soma_linha).
Última actualização: 02-05-2005