LINGUAGENS LÓGICAS E PROGRAMAÇÃO CONCORRENTE Adriana Nery
Programação lógica Paradigma Predicados Dedutiva) baseado no Cálculo de (Lógica Matemática Exemplo: Zé Carioca é um papagaio. Todo papagaio é uma ave. Logo, Zé Carioca é uma ave.
Programação lógica Programas são declarativos: especificam resultados desejados vez de procedimentos para produzi-los em Semelhança com paradigma funcional
Programação lógica Separação de lógica e controle: Lógica: definição do que deve ser solucionado Controle: como a solução pode ser obtida Programador escreve definições que permitam a dedução da solução
Elementos de um programa Proposições lógicas que formam fatos conhecidos uma base de Regras que definem como deduzir novas proposições a partir da base Consultas à base (execução do programa)
Elementos de um programa: exemplo Proposição (fato) Zé Carioca é um papagaio. Regra de inferência Todo papagaio é uma ave. Consulta Zé Carioca é uma ave? Solução/resposta/resultado Sim
Elementos de um programa: exemplo Proposições (fatos) João é pai de José. João é pai de Maria. Consulta João é pai de quem? Solução/resposta/resultado José Maria
Elementos de um programa: exemplo Proposição (fato) O fatorial de 0 é 1. Regra O fatorial de um número N*fatorial(N-1). N (N > 0) é igual a Consultas/Respostas: O fatorial de 2 é 200? Resposta: Não Consulta: Quanto é o fatorial de 3? Resposta: 6
Bases da programação lógica Lógica matemática Álgebra de Boole Descrição de proposições e verificação quanto à validade das mesmas Cálculo de predicados Lógica simbólica Proposições envolvem operadores lógicos símbolos e Cláusulas de Horn: proposições Significado Representação com forma restrita, p e q p q 2 partes p ou q p q p implica q p q p equivale a q p q
Origens da programação lógica Lógica matemática, lógica de predicados simbólica e cálculo Linguagem Prolog Início da década de 70: colaboração entre universidades Colmerauer e Roussel (Marseille): processamento de linguagem natural Kowalski (Edinburgh): prova automatizada de teoremas Desenvolvimento independente a partir de meados de 70
Algumas aplicações Sistemas especialistas: emulação da habilidade humana em algum domínio do conhecimento (ex. medicina) Sub-sistemas inteligentes, por exemplo: jogos: capacidade de derivar novos cenários, comportamentos, etc. bancos de dados: capacidade de deduzir informações a partir dos dados no banco Processamento de linguagem natural: chatbots Educação: ensino de lógica, contribuindo para pensamento e expressão mais claros
Vantagens e desvantagens Vantagens Separação entre lógica de programa e controle Programas fáceis de entender e manter Desvantagens Eficiência Baixa expressividade para certas aplicações
PROGRAMAÇÃO CONCORRENTE [ O QUE É ] Um programa concorrente é um conjunto de programas seqüenciais comuns que são executados em um paralelismo abstrato (M.Bem-Ari)
PROGRAMAÇÃO CONCORRENTE [ O QUE É ] Um programa concorrente especifica 2 ou mais processos que cooperam para realizar uma tarefa. Processos cooperam através de comunicação; utilizam variáveis compartilhadas ou troca de mensagens (G. R. Andrews)
PROGRAMAÇÃO CONCORRENTE [ MOTIVAÇÃO ] Aproveitar hardware com múltiplos processadores Atender a vários usuários simultaneamente Melhorar o desempenho das aplicações Aumentar a disponibilidade para o usuário Objetos ativos e controle de atividades Programas paralelos
PROGRAMAÇÃO CONCORRENTE [ CONCEITOS ] Paralelismo Processamento simultâneo físico Concorrência Processamento simultâneo lógico (aparente) Requer entrelaçamento (interleaving) de ações Processo Execução de um programa Programa Concorrente Vários processos que cooperam para a realização de uma tarefa
PROGRAMAÇÃO CONCORRENTE [ CONCEITOS ] Comunicação Variáveis compartilhadas Passagem de mensagens Sincronização Exclusão mútua de seções críticas Sincronização por condição Estado de um programa concorrente Consiste dos valores das variáveis (explícitas e implícitas) A execução de um comando muda o estado Ações atômicas Transformação indivisível de estado
PROGRAMAÇÃO CONCORRENTE [ PROCESSOS ] Um processo é um programa que está em algum estado de execução Tem espaço de endereçamento próprio, que é mapeado pelo S.O. para memória física Possui um fluxo de controle ou thread único Mantém um contador de programa (PC) que indica o endereço da próxima instrução A MMU (Memory Management Unit) traduz os endereços lógicos em endereços físicos, que normalmente não são contíguos (Memória Virtual)
PROGRAMAÇÃO CONCORRENTE [ PROCESSOS ] Espaço de Endereçamento Lógico Pilha Espaço de Endereçamento Lógico de um Processo Heap Dados Globais Instruções
PROGRAMAÇÃO CONCORRENTE [ PROCESSOS ] Tabela de Processos Estado do processo Valores dos registradores Arquivos abertos Alocação de memória PID (Process ID) UID (User ID) GID (Owner s Group ID)
PROGRAMAÇÃO CONCORRENTE [ PROCESSOS ] Estados de um processo Executando (Running): Utilizando a CPU Executável ou Pronto (Runnable ou Ready): Esperando para ser escalonado para usar a CPU Suspenso (Suspended): Recebeu um sinal para ser suspenso Bloqueado (Blocked): Esperando pela conclusão de algum serviço solicitado ao S.O.
PROGRAMAÇÃO CONCORRENTE [ PROCESSOS ] Bloqueado Ativo Iniciado Executável Executando Suspenso Encerrado
PROGRAMAÇÃO CONCORRENTE [ THREADS ] Um processo pode ter mais de uma Thread (Linha) Cada Thread possui contador de programa e pilha próprios Quando um processo é escalonado para ser executado, uma das Threads entra em execução As Threads compartilham as variáveis globais do processo
PROGRAMAÇÃO CONCORRENTE [ THREADS ] Espaço de Endereçamento de um Processo Thread 1 Pilha Contador de Programa Pilha Thread 2 Pilha Contador de Programa Thread n Pilha Contador de Programa Heap Variáveis Globais Instruções
PROGRAMAÇÃO CONCORRENTE [ THREADS ] Vantagens sobre processos compartilhando memória São muito mais leves de serem criadas A troca de contexto é mais suave pois compartilha instruções, heap e variáveis globais Facilitam o compartilhamento de memória
THREADS [ CICLO DE VIDA ] Intervalo de tempo expirou Dormindo sleep Criada escalonada Término Encerrada start Pronta Executando interrompida Operação de E/S concluída notify notityall Esperando wait Operação de E/S iniciada Bloqueada
THREADS [ SINCRONIZAÇÃO ] Sincronizando Threads Programação com múltiplas Threads requer bastante cuidado: Acesso / Atualização de variáveis compartilhadas Starvation Deadlock Acesso a estados inválidos de outros objetos
THREADS [ SINCRONIZAÇÃO ] Problema de acesso a variáveis compartilhadas Várias Threads (representando os depósitos dos clientes) querendo atualizar (depositar um valor) uma mesma conta Quando uma está lendo o saldo atual, uma outra Thread pode já ter lido esse valor e calculado o novo saldo, mas ainda não ter gravado o novo valor Se nesse momento a primeira Thread gravar o valor, o saldo final será igual ao calculado pela Thread que gravar o novo valor por último (desconsiderando assim o depósito da Thread que encerrou primeiro). O ideal é impedir que uma operação de depósito seja iniciada antes da outra encerrar
THREADS [ SINCRONIZAÇÃO ] A sincronização baseia-se na idéia de que para acessar um método sincronizado ou um entrar em um bloco sincronizado, é preciso obter (ou já ter) o lock desse objeto. A Thread que conseguir esse lock é a única autorizada a acessar os recursos protegidos através de sincronização.
PROGRAMAÇÃO CONCORRENTE [ PROPRIEDADES ] Safety: O programa nunca entra em um estado inconsistente) Liveness: Em algum momento o programa entra em um estado consistente Correção Parcial: Se o programa terminar, o resultado está correto. Caso contrário, nunca pode dar o resultado correto Término: O programa termina eventualmente Ausência de Deadlock: Nunca todos os processos estarão bloqueados Correção Total: O programa sempre termina e produz o resultado correto
OBRIGADA