INE 5645 - Programação Paralela e Distribuída


Tarefas Teóricas e de Programação

Material Didático
Unidade 1:   Introdução    Introdução 2010

Unidade 2-Parte 1:   Programação Concorrente    Programação Concorrente 2010

Unidade 2-Parte 2:  Concorrência em Java

Material de Apoio:  Cap. 23-Deitel-Java: Como Programar, Ed. 6

Tarefa Inicial de Programação - Estruturação de Threads. Analisar um exemplo, sobre a estruturação de threads, usando herança direta da classe Thread. Aula dia 10/08/2010.

Tarefa Inicial de Programação - Estruturação de Threads. Analisar um exemplo, sobre a estruturação de threads, usando a interface Runnable. Aula dia 16/08/2010.

Para estudar a interface Runnable, a interface Executor, a interface ExecutorService, a classe Executors (com s no final é uma classe), código como Thread.currentThread().getName(), ver o arquivo Java Threading

-------------------------------------------------------------------------------------------

Unidade 3:  Concorrência, Monitores, Semáforos e Locks

                    Inanição = Starvation

Tarefa Inicial de Programação 3.1 - Produtor-Consumidor com Monitor.

Livro "Java Como Programar", Edição 6, Deitel & Deitel - Cap. 23 - Multithreading
Download de códigos do livro Deitel, Java: Como Programar Ed. 6:  http://www.inf.ufsc.br/~bosco/Downloads/Livro-Java-Como-Programar-Deitel-Ed6/examples/ch23/   (Aula dia 17/08/2010)

Você deve procurar os arquivos das figuras 23.6 (Interface Buffer), 23.7 (class Producer) e 23.8 (class Consumer), do exemplo da seção 23.6.

Analise primeiro, o exemplo 23.9 que trata da implementação de um buffer não-sincronizado UnsynchronizedBuffer. Lembre-se que gostaríamos que a thread Producer executasse primeiro e que cada valor produzido pelo Producer fosse consumido exatmente uma vez pelo Consumer.

No código 23.10, a implementação SharedBufferTest, é de um aplicativo mostrando duas threads que manipulam um buffer não-sincronizado.

Veja o resultado de sua execução !!!

O que você nota ???
-------------------------------------------------------------------------------------------

Analise, agora,  o relacionamento entre produtor e consumidor com sincronização, veja agora a seção 23.12 sobre Monitores em Java. Novamente  você deve aproveitar os códigos 23.6 do Buffer e as classes Producer (em 23.7) e Consumer (em 23.8) do exemplo da seção 23.6.

O código que realiza a sincronização é colocado nos métodos set e get da classe SynchronizedBuffer (Fig. 23.19), que implementa a interface Buffer. A explicação do exemplo é importante para o aprendizado sobre monitores. O código 23.20 SharedBufferTest2  mostra um aplicativo produto-consumidor que utiliza um buffer sincronizado.

Veja o resultado de sua execução.

O que você nota, agora ???

Postar no Moodle, um arquivo de 1 página, sobre os resultados de suas análises sem sincronização e com sincronização.

Explicação do Problema dos Leitores e Escritores

Pseudo-Código:  Leitores e Escritores (para entendimento do problema)

Laboratório 1: Threads e Monitores  (Entrega 31/8/2010)

-------------------------------------------------------------------------------------------

Tarefa Inicial de Programação 3.2 - Produtor-Consumidor com Locks
. Utilizar o mesmo exemplo de código da tarefa anterior sobre monitor e realizar sincronização usando locks.

Relacionamento Produtor-Consumidor com sincronização usando Locks (Exemplo Deitel 6Ed. Cap. 23, Seção 23.7, pag. 800-805).

Sobre código reentrante:

Reentrância – É comum, em sistemas multiprogramáveis, vários usuários executarem os mesmos utilitários do SO simultaneamente, como, por exemplo, um editor de textos. Se cada usuário que utilizasse o editor trouxesse o código do utilitário para a memória, haveria diversas cópias de um mesmo programa na memória principal, o que ocasionaria um desperdício de espaço.

Reentrância é a capacidade de um código de programa (código reentrante) poder ser compartilhado por diversos usuários, exigindo que apenas uma cópia do programa esteja na memória. Uma característica da reentrância é que o código não pode ser modificado por nenhum usuário no momento em que está sendo executado.

A reentrância permite que cada usuário possa estar em um ponto diferente do código reentrante, manipulando dados próprios, exclusivos de cada usuário.

Os utilitários do sistema, como editores de texto, compiladores e linkers (linker editors), são exemplos de código reentrante, que proporcionam grande economia de espaço em memória e aumento na performance do sistema. Em alguns sistemas existe a possibilidade de utilizar o conceito de reentrância para aplicações de usuários.

(Reentrância)  Um link interessante:
http://www2.eletronica.org/artigos/eletronica-digital/reentrancia

Laboratório 2: Locks  (14/09/2010)

Unidade 3:  Controle de Concorrência com Locks  (slides com aplicação a transações)


Tarefa Prática (Opcional):  Implementar a concorrência, usando locks, entre as duas transações T e U exemplificadas no slide 83. Você pode considerar a implementação de uma Interface Coordinator de transações, como no slide 37, a Classe Lock e a Classe LockManager, como mostradas ao final dos slides.

-------------------------------------------------------------------------------------------

Tarefa Inicial de Programação 3.3 - Produtor-Consumidor com Semáforo.

Exemplos de Produtor-Consumidor com Semáforo:

Montar o segundo exemplo do problema do Produtor-Consumidor com Sincronização, buffer limitado, da seção 23.12. Mas, usando semáforos (pacote (java.util.concurrent. Semaphore) Você deve procurar, no link acima, os arquivos das figuras 23.6 (Interface Buffer), 23.7 (Classe Producer) e 23.8 (Classe Consumer), do exemplo da seção 23.6. O código que realiza a sincronização é colocado nos métodos set e get da classe SynchronizedBuffer (Fig. 23.19), que implementa a interface Buffer.

O trabalho poderá ser feito em dupla, mas a dupla deverá estar presente para mostrar o programa funcionando. Postar a tarefa no Moodle até a data programada, a aula de terça-feira (16/03). Para quem é iniciante, um exemplo de programa a ser modificado, está no Cap. 23 do livro referido acima, nas seções . A explicação do exemplo é importante para o aprendizado sobre semáforos.

Laboratório 3: Semáforos (28/09/2010)

-------------------------------------------------------------------------------------------

Material Semaphore-Monitor  (Para estudar para a primeira prova)

Prova 1: Dia 04/10/2010

-------------------------------------------------------------------------------------------

Unidade 4:  Sockets.  Ver slides do Prof. Lau 

Cap.4 (Coulouris) Communicação Inter-Processos

Comunicação por Sockets

Programação com Sockets.  Implementar uma aplicação distribuída usando sockets.

(1) Comunicação de Datagramas UDP
Exemplo 1:  UDPClient1 x UDPServer1
Exemplo 2:  UDPClient2 x UDPServer2
Exemplo 3:  UDPClient3 x UDPServer3

(2) Comunicação com TCP Streams
Exemplo 2:  TCPClient2 x TCPServer2

(3) Comunicação de grupo com IP Multicast.

API Abstration Multicast  (contém alguns slides sobre Multicast)

IP Multicast Java (contém explicação sobre Multicast em Java)

Livro de Sistemas Distribuidos (Coulouris)

Laboratório 4.1  (Tarefa proposta pelo Prof. Bosco): Tarefas com Sockets

Exemplos de Código para implementação e datagramas com sockets.
   Datagram Socket Client
   Datagram Socket Server

Exemplos e Código para implementação e sockets TCP
   TCP Stream Socket Client
   TCP Stream Socket Server

Exemplo de código para implementação de comunicação de grupo com multicast IP.
   Group Communication Socket com IP Multicast

Laboratório 4.2 (Tarefa proposta pelo Prof. Lau) : Comunicação de Processos

-------------------------------------------------------------------------------------------

Unidade 5:  Objetos Distribuídos e Invocação Remota de Métodos

Tarefa 5:   
Implementar usando sockets ou Java RMI, uma aplicação distribuída   
                    sobre o sistema de despertador automático de uma operadora de
                    telefonia.  Um design pattern (padrão de projeto) está descrito no
                    arquivo texto no link abaixo. Você deve utilizar este design pattern,
                    podendo se discordar do código usado, refazer conforme seu
                    entendimento.

Tarefa Teórica Individual   Objetos Distribuídos e Invocação Remota

Laboratório 5 (Bosco)   Implementando CallBack

Laboratório 5: Comunicação usando RMI (Invocação de Métodos Remotos)

Prova 2:  Dia 22/11/2010

Prova de Recuperação:   a ser marcada na ocasião

-------------------------------------------------------------------------------------------