ALua. asynchronous communication in Lua

Documentos relacionados
DALUA: BIBLIOTECA PARA APLICAÇÕES DISTRIBUÍDAS

Comunicação em Sistemas Distribuídos. Conceitos: Paradigma C/S. Conceitos: Paradigma C/S. Paradigma Cliente/Servidor

Sistemas Distribuídos e Redes de Sensores

Programação Concorrente

UNIVERSIDADE. Sistemas Distribuídos

Sincronização de Processos (5) Troca de Mensagens

Sistemas Distribuídos. Aleardo Manacero Jr.

Comunicação entre processos (grupos) COMUNICAÇÃO ENTRE PROCESSOS Comunicação de grupo. Comunicação entre processos (grupos)

Concorrência e Paralelismo


Paradigma Cliente/Servidor

Chamadas Remotas de Procedimentos (RPC) O Conceito de Procedimentos. RPC: Programa Distribuído. RPC: Modelo de Execução

Sincronização. Sincronização de Relógios. Relógios Físicos

Disciplina de Sistemas Distribuídos. Sincronização em SD. Prof. M.Sc. Alessandro Kraemer Kraemer

Processos e Threads (partes I e II)

Sistemas Distribuídos Capítulos 3 e 4 - Aula 4

Curso: Ciência da Computação Disciplina: Construção de Compiladores Período: Prof. Dr. Raimundo Moura

Tipos de Servidores. Servidores com estado

Sistemas Operacionais. Capítulo 7 Sincronização e Comunicação entre Processos

Tutorial de Integração PYTHON

PHP: Funções. Programação de Servidores Marx Gomes Van der Linden

Ciência de Computadores Sistemas Distribuídos e Móveis

Programação distribuída e paralela (C. Geyer) RPC 1

Grupo I [6v] Considere o seguinte extracto de um programa de definição de uma calculadora apenas com a função soma de dois valores reais

Comunicação entre processos (grupos) COMUNICAÇÃO ENTRE PROCESSOS Comunicação de grupo. Comunicação entre processos (grupos)

A ) O cliente terá que implementar uma interface remota. . Definir a interface remota com os métodos que poderão ser acedidos remotamente

Exclusão Mútua e Eleição

Sistemas Distribuídos. Coulouris Capítulo 4

Sistemas Distribuídos. Professora: Ana Paula Couto DCC 064

Sistemas Distribuídos

Sistemas Distribuídos

Exclusão Mútua Distribuída

Ajax Asynchronous JavaScript and Xml

Java Spaces Exemplos

JavaScript. JavaScript é uma linguagem de script usada em navegadores web. É uma linguagem dinâmica, estruturada e orientada em objetos.

Como foi exposto anteriormente, os processos podem ter mais de um fluxo de execução. Cada fluxo de execução é chamado de thread.

FUNCTION ) RETURNS INTEGER AS $$ DECLARE

1.6. Tratamento de Exceções

Sistemas Distribuídos 59. Sistemas Distribuídos 61. "Receive não-bloqueante:

Revisão Ultima aula [1/2]

MC714 - Sistemas Distribuídos. Leandro Villas

Distributed Systems Principles and Paradigms

Notas da Aula 6 - Fundamentos de Sistemas Operacionais

Comunicação. Parte II

Estrutura de Dados. Introdução a Ponteiros. Prof. Gerson Borges Estrutura de Dados I 1

Grupos de Processos (Comunicação Grupal)

Comunicação em Sistemas Distribuídos

Sistemas Distribuídos Grupos

Disciplina: Sistemas Operacionais - CAFW-UFSM Professor: Roberto Franciscatto

Sincronização. Cooperação entre Processos

SISTEMAS DISTRIBUÍDOS

Threads em Java. Sistemas Operacionais - Laboratório Professor Machado

ECD1200 Equipamento de Consulta de Dados KIT DE DESENVOLVIMENTO

Documentação SC501GER.DLL V2.2

Capítulo 2. Charm++ 16

Sistemas Distribuídos RPC x RMI. Edeyson Andrade Gomes

Prof. Marcos Ribeiro Quinet de Andrade Universidade Federal Fluminense - UFF Pólo Universitário de Rio das Ostras - PURO

Redes de Computadores

Conteúdo. Especificação HTTP v1.1

Comunicação entre Processos

9 - Sincronização e Comunicação entre Processos

Estudo sobre a linguagem de programação Lua *

Sistemas Paralelos e Distribuídos /2004 Curso: Matemática /Informática Sistemas Distribuídos /2004 Curso: Ensino da Informática

Num sistema de objectos distribuídos, dois conceitos são fundamentais.

Sistemas distribuídos:comunicação

Aula 30 - Sockets em Java

Visão do Usuário da DSM

Capítulo 8 Arquitetura de Computadores Paralelos

Remote Procedure Call. Programação distribuída e paralela (C. Geyer) RPC 1

Chamada Remota de Procedimento (RPC)

Sistemas Operacionais Distribuídos e Multiprocessados

PROGRAMAÇÃO EM BANCO DADOS Stored Procedure e Trigger

Sistemas Distribuídos. Professora: Ana Paula Couto DCC 064

3. Comunicação em Sistemas Distribuídos

Lista de Erros Discador Dial-Up

Estrutura de Dados Pilha (Stack)

Capítulo 8. Sistemas com Múltiplos Processadores. 8.1 Multiprocessadores 8.2 Multicomputadores 8.3 Sistemas distribuídos

Memória Flash. PdP. Autor: Tiago Lone Nível: Básico Criação: 11/12/2005 Última versão: 18/12/2006. Pesquisa e Desenvolvimento de Produtos

Sistemas Distribuídos

INE Sistemas Distribuídos

Programação Web com PHP. Prof. Wylliams Barbosa Santos Optativa IV Projetos de Sistemas Web

Python: Funções. Claudio Esperança

MANUAL DE INSTALAÇÃO

FICHA DE ESPECIFICAÇÃO TÉCNICA. x PRODUTO PROCESSO DATA: 04/02/2013. PRODUTO: IcBox SUB-PRODUTO: DESCRIÇÃO: API DLL c++ (C++ builder e Delphi)

MINISTÉRIO DO DESENVOLVIMENTO SOCIAL E COMBATE À FOME Secretaria Nacional de Renda de Cidadania

MÓDULO 7 Modelo OSI. 7.1 Serviços Versus Protocolos

PROGRAMAÇÃO II 3. FILA DINÂMICA

PHP e MySQL Autenticação de Usuários

Pilhas. Profa Morganna Diniz

Prof. Luiz Fernando Bittencourt MC714. Sistemas Distribuídos 2 semestre, 2013

Transcrição:

ALua asynchronous communication in Lua

o que é modelo de programação troca de mensagens Lua assincronismo modelo de concorrência cada evento tratado até o final estrutura da rede daemons intermediando comunicação

ALua processo processo processo daemon processo processo daemon daemon processo processo processo daemon processo processo alua.s

exemplo de uso function s_callback(reply)... function spawn_callback(reply) for id, proc in pairs(reply.processes) do if proc.status == "ok" then alua.s(id, [[ print("hello World!") ]], s_callback) alua.open() alua.spawn(12, spawn_callback) alua.loop() funções da biblioteca sempre com callbacks

redes de daemons daemons criados com open ou create conexão entre eles com link

envio - exemplo 1 processo A executa: s (pid_b, [["print (".. minhavar.. ")"]]) em B: "print (".. minhavar.. ")" processando: print ( 3 )

envio - exemplo 2 processo A executa: s (pid_b, [[ s (pid_a, "print (".. minhavar.. ")")]]) em B: s (pid_a, " print (".. minhavar.. ")") s (pid_a, " print ( 3 ) ") em A: print ( 3 )

modelo de máquina de estados function envia (... )... alua.s (lista_procs, [[... alua.s (pid_a, "recebida(m,".. meuid.. ")")]]) pentes = -- tamanho da lista function recebida (msg, quem) print (quem.. " recebeu msg ".. msg) pentes = pentes - 1 if pentes == 0 then print ("todos receberam!)

uso de redefinição de fçs function envia (... )... alua.s (lista_procs, [[alua.s (pid_a, "recebida(m,".. meuid.. ")")]]) pentes = -- tamanho da lista function recebida (msg, quem) -- trata msg pentes = pentes - 1 if pentes <= MINIMO then recebida = function ()

modelo de concorrência código de mensagem não pode conter chamadas bloqueantes problemas com comunicação bloqueante

canais comunicação direta processo processo daemon processo processo processo daemon daemon processo processo processo processo callbacks para leitura e escrita definidas pelo programador

ainda modelo de programação programação com strings complexidade e propensão a bugs flexibilidade X falta de estrutura abstrações sobre o Alua luats: espaço de tuplas luarpc: chamada remota de procedimentos dalua: algoritmos distribuídos...

dalua facilidades para criação e coordenação de grupos de processos

Módulo dalua Envio de mensagens dalua.s(dest_procs, nome_func, arg1, arg2,...) Cada mensagem é uma chamada de função remota dest_procs pode ser um ou mais identificadores de processo Argumentos podem ser number, string, boolean ou table dalua.self() Obtém o identificador do processo corrente Exemplo require( dalua ) dalua.init( 127.0.0.1, 4321) dalua.s(dalua.self(), print, hello world! ) dalua.loop()

Módulo events Modelo de eventos x Modelo de callbacks Quando uma ação é finalizada, um evento correspondente é disparado Os processos podem se registrar para receber os eventos desejados e tratá-los se necessário dalua.events.monitor(nome_evento, tratador_do_evento) dalua.events.ignore(nome_evento, tratador_do_evento) nome_evento é uma string tratador_evento é uma função É possível disparar seus próprios eventos dalua.events.raise(nome_evento, procs, arg1, arg2...)

Exemplo Módulo events require( dalua ) local contador = 5 function envia() dalua.s(dalua.self(), print, hello world! ) contador = contador 1 if contador == 0 then dalua.events.ignore( dalua_s, envia) dalua.events.monitor( dalua_init, envia)

Módulo mutex Suporte a exclusão mútua distribuída dalua.mutex.create(nome_mutex, procs) Cria um Mutex com nome nome_mutex dentre os processos especificados na tabela procs dalua.mutex.enter(nome_mutex, mutex_cs, arg1, arg2...) Efetua um pedido para entrar na região crítica Ao conseguir, chama a função mutex_cs e seus argumentos dalua.mutex.leave(nome_mutex) Libera o acesso à região crítica a outros processos dalua.mutex.add(nome_mutex, proc) dalua.mutex.remove(nome_mutex, proc) Adiciona ou remove processos no Mutex existente

Módulo app Aplicação: um grupo de processos Processos podem criar, entrar e sair de aplicações dalua.app.init() dalua.app.create(nome_app) dalua.app.join(nome_app) dalua.app.leave(nome_app) dalua.app.destroy(nome_app) dalua.app.link(ip, porta) Cada processo da aplicação conhece a lista de processos participantes dalua.app.processes(nome_app) dalua.app.applications()

Exemplo -- PROCESSO 1 -- Módulo app function inicio() dalua.app.init() function appinit() dalua.app.create( Grupo ) function joined(event, status, app, proc) print( Processo..proc.. entrou em..app) dalua.s(dalua.app.processes( Grupo ), print, Olá membros do Grupo! ) dalua.events.monitor( dalua_init, inicio) dalua.events.monitor( dalua_app_init, appinit) dalua.events.monitor( dalua_app_join, joined) -- PROCESSO 2 -- function appinit() dalua.app.join( Grupo )

Módulo timer Permite executar tarefas periodicamente dalua.timer.add(proc, periodo, nvezes, func, arg1, arg2...) Cria um timer que executa a função func e seus argumentos no processo proc por nvezes a cada periodo segundos. func e os argumentos têm o mesmo formato do dalua.s Se nvezes for igual a zero, executa indefinidamente Retorna um identificador de timer dalua.timer.remove(timerid) Pára e remove o timer especificado (se ainda existir) Exemplo dalua.timer.add(dalua.self(), 1, 10, print, 1 segundo se passou... )

Módulos causal e total Oferecem serviço de ordenação de mensagens enviadas por multicast Ordem Causal Garante que uma mensagem M2 que foi enviada em resposta a M1 será entregue depois de M1 em todos os processos Ordem Total Garante que a ordem em que as mensagens são entregues seja a mesma em todos os processos Mesma maneira de usar que o dalua.s após inicialização do módulo

chamada remota chamada remota assíncrona como base criação dinâmica de função que realiza a chamada

chamada assíncrona valor retornado pode ser manipulado como qualquer função local e funções podem ser passadas como argumentos function register (val) currentval = val local get = rpc.async(servers, "getvalue", register) -- Invoke the remote function get()

chamada assíncrona - implementação function async(proc, func, cb) local f = function (...) -- put the arguments into a Lua table local args = {...} local idx = set_ping(cb) -- register the callback marshal(args) -- process the arguments local chunk = string.format("rpc.request(%q, %s, %q, %q)", func, alua.tostring(args), alua.id, idx) alua.s(proc, chunk) return f -- s the request

chamadas assíncronas e callbacks function avrg(val) acc = acc + val uso de globais - perda da pilha! count = count + 1 if count == expected then print("average: ", acc/count); -- Request the remote values. for i = 1, expected do -- create function values local get = rpc.async(servers[i], "getvalue", avrg) -- Invoke the remote function get()

em Lua: escopo léxico function getavrg (servers) local acc = 0, local count = 0 local expected = #servers function avrg(val) acc = acc + val count = count + 1 if count == expected then print("average: ", acc/count); -- Request the remote values. for i = 1, expected do -- create function values local get = rpc.async(servers[i], "getvalue", avrg) -- Invoke the remote function get()

chamada síncrona casamento de visão síncrona com modelo assíncrono queremos escrever res = chamadaremota(arg1,..., argn)! usa res! mas sem que o processo fique completamente bloqueado... e sem as confusões de multithreading!

rpc e co-rotinas podemos executar cada função como uma co-rotina diferente loop de eventos fica na co-rotina principal escalonamento: quando uma das co-rotinas faz uma chamada remota síncrona, queremos que isso implique em um yield volta ao loop de eventos disponível para receber novas chamadas ou respostas de chamadas anteriores

rpc e co-rotinas co-rotinas loop principal chamada de função chamada síncrona resposta chamada de função chamada de função

construtor síncrono function getavrg (servers) local acc = 0, local expected = #servers for i = 1, expected do -- create function values local get = rpc.sync(servers[i], "getvalue", avrg) -- Invoke the remote function acc = acc + get() return acc/expected

chamada síncrona - implementação function sync(proc, func) local f = function (...) -- Reference to the current coroutine local co = coroutine.running() -- Callback that will resume the execution local callback = function (...) coroutine.resume(co,...) -- S the remote invocation async(proc, func, callback)(...) -- Susp the execution before to return return coroutine.yield() return f

sincronização como adicionar facilidades de sincronização distribuída? monitores guardas

Monitores local function _put(item) -- place item in buffer local function _get() -- return first item in buffer -- Creates a lock local bufmon = monitor.create() put = monitor.dowhenfree(bufmon, _put) get = monitor.dowhenfree(bufmon, _get)

Sincronizadores local on = false local function check_on(request) return not on local function trigger_on(request) on = true local function trigger_off(request) on = false...

Sincronizadores (cont) local on = false local function check_on(request)... local function trigger_on(request)... local function trigger_off(request)... synchronizer.set_trigger("sharedresource", "turn_on", trigger_on) synchronizer.set_trigger("sharedresource", "turn_off", trigger_off) synchronizer.add_constraint("sharedresource", "turn_on", check_on)

trabalho 3 uso do ALua: http://www.inf.puc-rio.br/~fpina/alua/ construção de biblioteca alua para criação de grupos multicast causal multicast total exclusão mútua construção de testes que realmente exerçam essas funcionalidades discussão sobre falhas e como poderiam ser tratadas