Curso de Especialização em Java – Sistemas Distribuídos ...tacla/EspSD/Aula2/0030... · Curso...

119
Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla Notas instrutor -1- Copyright Cesar Augusto Tacla 2003

Transcript of Curso de Especialização em Java – Sistemas Distribuídos ...tacla/EspSD/Aula2/0030... · Curso...

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 1 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 2 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 3 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 4 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

Vários processadores que se comunicam por meio de uma memória compartilhada.

Chips multiprocessados vão se tornar bastante comuns a medida que o número de transistores aumentam.

Com paralelismo também utilizado no desenvolvimento de aplicações, facilmente se supera o desempenho de sistemas sequenciais.

Sugestão de leitura e de como montar um artigo para os alunos de engenharia de computação

http://www.inf.ufrgs.br/procpar/disc/cmp134/trabs/

- 5 -

Copyright Cesar Augusto Tacla 2003

http://www.inf.ufrgs.br/procpar/disc/cmp134/trabs/T1/051/cschepke/itanium.pdf

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

Segundo (Garg, 2004), são sistemas compostos por múltiplos processadores conectados por uma rede de comunicação, sendo a rede de comunicação uma LAN (Ethernet) ou WAN (Internet).

Neste tipo de sistema os processadores se comunicam por troca de mensagens (não por memória compartilhada)

- 6 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 7 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

A pergunta é: por que não fazemos hardware puramente paralelo que tem melhor desempenho?

- 8 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 9 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

1. É mais rápido atualizar uma memória local do que enviar uma mensagem para outro processador, especialmente qdo o valor de uma variável deve ser comuicado para vários processadores

- 10 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

O modelo de programação reflete a estrutura do hardware. Num modelo de objetos distribuídos, temos vários processos peso-pesado que rodam de forma distribuída e que se comunicam por troca de mensagens. Cada processo pode ter várias threads.

- 11 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 12 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

Processo quando um programa é executado, são criados um ou mais processos

Processes

A process has a self-contained execution environment. A process generally has a complete, private set of basic run-time resources; in particular, each process has its own memory space. Processes are often seen as synonymous with programs or applications. However, what the user sees as a single application may in fact be a set of cooperating processes. To facilitate communication between processes, most operating systems support Inter Process Communication (IPC)

- 13 -

Copyright Cesar Augusto Tacla 2003

systems support Inter Process Communication (IPC) resources, such as pipes and sockets. IPC is used not just for communication between processes on the same system, but processes on different systems.

Most implementations of the Java virtual machine run as a single process. A Java application can create additional processes using a ProcessBuilder object. Multiprocess applications are beyond the scope of this lesson.

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

Threads

Threads are sometimes called lightweight processes. Both processes and threads provide an execution environment, but creating a new thread requires fewer resources than creating a new process. Threads exist within a process — every process has at least one. Threads share the process's resources, including memory and open files. This makes for efficient, but potentially problematic, communication.

Multithreaded execution is an essential feature of the Java platform. Every application has at least one thread — or several, if you count "system" threads that

- 14 -

Copyright Cesar Augusto Tacla 2003

thread — or several, if you count "system" threads that do things like memory management and signal handling. But from the application programmer's point of view, you start with just one thread, called the main thread. This thread has the ability to create additional threads, as we'll demonstrate in the next section.

Fonte http://java.sun.com/docs/books/tutorial/essential/concurrency/procthread.html

Thread parecem ser processos, mas compartilham o mesmo "espaço de endereçamento“. É muito rápidochavear a execução entre threads, mas não entre processos.

Uma thread recebe alguns recursos próprios durante a execução:

- uma pilha de execução para poder chamar métodos, passar parâmetros, alocar variáveis locais ;

- um "Program Counter" Chamamos isso o "contexto de execução do thread“.

Alguns autores chamam thread de "contexto de execução"

Um browser é um exemplo de uma aplicaçãomultithreaded

Várias coisas podem ocorrer ao mesmo tempo:

•scroll

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 15 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

http://javabeanz.wordpress.com/2007/07/09/understanding-jvm/

http://www.cs.nuim.ie/~ainem/Lectures/Section1.pdf

Java stack:hold the state of each method (java method, not a native method) invocations for the thread such as the local variables, method arguments, return values, intermediate results. Each entry in the Java stack is called “stack frames“. Whenever a method is invoked a new stack frame is added to the stack and

- 16 -

Copyright Cesar Augusto Tacla 2003

a new stack frame is added to the stack and corresponding frame is removed when its execution is completed.

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 17 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 18 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

Uma cópia do processo pai é feita (cópia do espaço de endereçamento). A única diferença entre pai e filho é que no código do filho o retorno do fork é igual a zero e, no pai, é igual ao pid do filho

- 19 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 20 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 21 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 22 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

Fonte C:\Documents and Settings\tacla\My Documents\JAVARepositorio\JThreads\JThreadContadoras

- 23 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 24 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

O chaveamento de contexto é feito pela máquina virtual JAVA – é possível que a implementação da máquina virtual Java tire proveite dos vários cores existentes em uma CPU e crie processos nativos por meio de chamadas ao SO.

- 25 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

Observar que não é necessário mudar as linhas abaixo

* Thread t1 = new Thread(new MinhaThread(), "thread 1");

* Thread t2 = new Thread(new MinhaThread(), "\t\tthread 2");pois a class Thread implements Runnable e pode portanto ser considerada como sendo Runnable.

public class Thread extends Object implements Runnable

Assim, o método Thread(Runnable target,

- 26 -

Copyright Cesar Augusto Tacla 2003

Assim, o método Thread(Runnable target, String name) casa com as linhas de instanciação.

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 27 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

As flechas pontilhadas indicam swap e o label das mesmas o motivo do swap. Quando estiver escrito swap, o motivo é o próprio escalonador do SO; caso tenha yield(), a chamada ao método causou a mudança.

- 28 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 29 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

Mostra o resultado do programa Tecno-OO\RepositorioJAVA\JThreads\JThread após habilitar oyield.

- 30 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 31 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 32 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

O objetivo é mostrar que o sleep fará sinaleiros não sincronizados. Este problema é somente para turmas de programação; para as outras, fazer o pedido no slide seguinte.

- 33 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 34 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 35 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 36 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 37 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 38 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

Fonte das informações sobre Linux e Windows XP: http://www.inf.pucrs.br/~celso/SchedulerLinuxWindows.pdf

Interativos são aqueles que ficam bloqueados por longos períodos, esperando por I/O, executam rapidamente e ficam novamente esperando por I/O. Também são chamados de I/O bound.

- 39 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

Fonte das informações sobre Linux e Windows XP: http://www.inf.pucrs.br/~celso/SchedulerLinuxWindows.pdf

Interativos são aqueles que ficam bloqueados por longos períodos, esperando por I/O, executam rapidamente e ficam novamente esperando por I/O. Também são chamados de I/O bound.

- 40 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 41 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 42 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 43 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

JAVARepositorio\JThreads\JThreadContadoras

- 44 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

Observar que mesmo dando maior prioridade à thread de Barrichello ele pode chegar após Schumacher, pois o tempo de cada uma das voltas é atribuído aleatoriamente. Logo o tempo total da corrida do Barrichelo pode ser maior ao do Schumi mesmo que a thread do Barrichelo tenha acabado antes.

- 45 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

Observar que mesmo dando maior prioridade à thread de Barrichello ele pode chegar após Schumacher, pois o tempo de cada uma das voltas é atribuído aleatoriamente. Logo o tempo total da corrida do Barrichelo pode ser maior ao do Schumi mesmo que a thread do Barrichelo tenha acabado antes.

- 46 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 47 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

MPI=Message Passaging Interface

MPI vs OPEN MP

OpenMP works on SMP systems, whereas MPI works on both SMP and Distributed memory systems (ie, clusters). The codes we use in our office typically use MPI between cluster nodes and OpenMP on individual nodes assuming a dual CPU node), and often both at once (launch on 32 nodes with 2 CPUs per node; OpenMP spawns appropriate portions of the code over both CPUs). From my experience, OpenMP has better performance on SMP systems, ignoring MPI

- 48 -

Copyright Cesar Augusto Tacla 2003

performance on SMP systems, ignoring MPI implementations that short circuit the TCP/IP stack (eg, SGI's MPI on Origin 3000s). If you will be launching different runs on each node, then OpenMP will likely offer better performance than MPI.However, if you are going to launch a single job across multiple nodes, MPI is the de facto standard for parallelizing on clusters.

Other difference between OpenMP and MPI is that OpenMP is a fine grain parallelism and MPI is a course grain parallelism. For example, in OpenMP you most often parallelize over a loop using compile directives, so the code runs in serial until the loop, runs the loop in parallel, then reverts back to serial. Conversely, with MPI the entire code is launched on each node and you control what each code executes based its node number in the MPI universe along with an algorithm that distributes work, eg, a master/slave model. [http://lists.apple.com/archives/mt-smp/2004/Mar/msg00000.html]

SMP (symmetric multiprocessing) is the processing of programs by multiple processors that share a common operating system and memory. In symmetric (or "tightly coupled") multiprocessing, the processors share memory and the I/O bus or data path. A single copy of the operating system is in charge of all the processors. SMP, also known as a "shared everything" system, does not usually exceed 16 processors. SMP systems are considered better than MPP systems for online transaction processing (OTP) in which many users access the same database in a relatively simple set of transactions. An advantage of SMP for this purpose is

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

Este programa ilustra duas threads (alem da Main) que compartilham uma mesma area de memoria representada pelo atributo estatico compartilhado da classe AreaMemoria. As duas threads conseguem escrever/ler neste atributo. Observar qe a string “compartilhada” é inicializada quando as classes são carregadas, portanto no início de main ela contém o valor “thread-Main”

- 49 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

O programa, se executado repetidamente, tende a imprimir Thread-0. Algumas vezes imprimirá Thread-1 e, raramente, main.

Explicação no diagrama de sequência do slide seguinte.

- 50 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

O print c pode ocorrer onde mostrado, depois da execução de E0.run() ou depois de E1.run(). Além disso, E0 e E1 podem executar em qualquer ordem!

- 51 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

Este programa lança duas threads, cada uma delas sorteia um novo valor para a variável comp desde que o valor atual de comp esteja dentro da faixa [ini, fim].

Observar que se uma thread executar o while e a condição der falso, a thread termina. Veja a thread 1 na execução:

Thread-0 !!! wait

Thread-0 antes 0

Thread-1 !!! wait

Thread-1 !!! fim

- 52 -

Copyright Cesar Augusto Tacla 2003

Thread-1 !!! fim

Thread-0 depois 7

Thread-0 !!! fim

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 53 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

A última ativação da thread-1 nunca poderia ocorrer: a thread-0 é interrompida logo após c:=2 e o controle passa a Thread-1 que realiza o teste do while sem ser interrompida ( a próxima instrução é portanto o “}” do fim do while ou simplesmente o método run encerrou-se).Por consequencia,se thread-1 terminou não poderia receber o controle novamente ou se executou o teste condicional do while sem ser interrompida, não poderia realizá-lo novamente e atribuir c:=6 e assim por diante. Erro � Apõs primeiro swap thread-1 deveria encerrar.

- 54 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

OP1 pode retornar 0 ou 2

OP2 pode retornar 0 ou 3

- 55 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

Conta é um objeto compartilhado pelas threads instâncias de Retirada e Deposito. Embora o saldo dê na maioria das vezes zero, é possível que um valor diferente seja produzido devido a problemas de concorrência.

- 56 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 57 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 58 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

Observar que uma thread que está em wait() para prosseguir deve receber um notify (ser escolhida!) E conseguir o lock do objeto. É como se ela estivesse WAITING E BLOCKED ao mesmo tempo.

Difference between BLOCKED state and WAITING / TIMED_WAITING states?

When a thread calls Object.wait method, it releases all the acquired monitors and is put into WAITING (or TIMED_WAITING if we call the timeout versions of the wait method) state. Now when the thread is notified

- 59 -

Copyright Cesar Augusto Tacla 2003

wait method) state. Now when the thread is notified either by notify() or by notifyAll() call on the same object then the waiting state of the thread ends and the thread starts attempting to regain all the monitors which it had acquired at the time of wait call. At one time there may be several threads trying to regain (or maybe gain for the first time) their monitors. If more than one threads attempt to acquire the monitor of a particular object then only one thread (selected by the JVM scheduler) is granted the monitor and all other threads are put into BLOCKED state. Got the difference?

http://geekexplains.blogspot.com/2008/07/threadstate-in-java-blocked-vs-waiting.html

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 60 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 61 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 62 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 63 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 64 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

http://www.dsc.ufcg.edu.br/~jacques/cursos/map/html/threads/sincronizacao.html

- 65 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 66 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 67 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 68 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

A roleta 1 conta 1 bilhão de pessoas em 1 bilhão de iterações.

A roleta 2 conta 3 bilhões de pessoas em 1 bilhão de iterações (incremento de 3 a cada loop)

O contador central deve apontar ao final das duas threads 4 bilhões de entradas – ver o que ocorre!!!

- 69 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 70 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

(e.g. conflito no acesso ao meio físico da rede é livelock ou starvation?

- 71 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

Filosófos pensam, ficam com fome e comem. Para comer, precisam de dois pauzinhos. Eles têm um acordo: um filósofo só pode usar os pauzinhos que estão à sua direita ou esquerda.

- 72 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

Os filósofos decidem coordenar suas ações. O mais velho tem prioridade quando os dois solicitam o chopstick ao mesmo tempo. Um deles podem morrer de fome se sempre solicitarem os chopsticks ao mesmo tempo.

- 73 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

O filósofo reclama que não consegue comer, então decidem pegar os dois chopsticks ao mesmo tempo. Quando um filósofo vê que o outro tenta pegar os chopsticks, recolhe os braços e espera um tempo aleatório para tentar pegar novamente os chopsticks.

- 74 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

O sistema pode funcionar por longo tempo, mas a qualquer momento pode entrar em deadlock.

No início os dois pauzinhos estão livres (p1 e p2) o que significa que os filósofos pensam.

Em seguida duas coisas podem acontecer:

a) Um dos filósofos decide comer e o outro continua a pensar (não há conflito)

b) Os dois decidem comer concorrentemente

a) Um deles consegue pegar os dois pauzinhos antes do outro (não há conflito)

- 75 -

Copyright Cesar Augusto Tacla 2003

antes do outro (não há conflito)

b) Cada um pega um pauzinho => DEADLOCK

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 76 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

Na solução, um filósofo só pega o segundo pauzinho depois de conseguir o primeiro.

- 77 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 78 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 79 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 80 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

Semáforos

um processo servidor notifica um cliente que está aguardando o acesso a um objeto

Synchronized (Java)

- 81 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

Pode passar como exercício em aula ou dar as respostas:

Respostas (pg 27 Vijay Garg)

•Desabilitar interrupções: antes de entrar na SC, o processo desabilita as interrupções. Significa que não haverá troca de contexto, ou seja, o processo não deixará a CPU (troca de contexto ocorre quando a thread corrente recebe uma interrupção do clock sinalizado que o time-slice está terminado). Este método pode funcionar em máquinas monoprocessadas, mas apresenta incovenientes:

•máquinas multiprocessadores: interrupções

- 82 -

Copyright Cesar Augusto Tacla 2003

•máquinas multiprocessadores: interrupções podem ser desabilitadas numa das CPUs enquanto as outras continuam com interrupções habilitadas. Desabilitar interrupção em todas as CPUs acaba por custar caro (mata o paralelismo).

•outras funcionalidades do harware dependem de interrupções, ex. Registradores de clock são atualizados por interrupções, se interrupões são desabilitadas podem mostar valores incorretos

•e se o programa tiver um loop infinito, nunca mais vai deixar a CPU!

•E possível que instruções atòmicas mais abstratas que read e write sejam fornecidas pelo hardware

•testAndSet

•swap

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 83 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 84 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 85 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 86 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

Valor inicial = 2

- 87 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- Introduzir o problema do produtor-consumidor e a solução utilizando semáforos

- 88 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

Buffer circular de floats compartilhado por um processo produtor e outro consumidor com um ponteiro para a posição que deve receber o próximo float e outro (saída), para indicar da onde retirar o float.

- 89 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 90 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 91 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 92 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 93 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 94 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 95 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 96 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 97 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 98 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

The synchronized keyword can be used to mark a statement or block of code so that only one thread may execute an instance of the code at a time. Entry to the code is protected by a monitor lock around it. This process is implemented by a system of locks. You may also see the words monitor, or mutex (mutually exclusive lock) used. A lock is assigned to the object and ensures only one thread at a time can access the code. Thus when a thread starts to execute a synchronized block it grabs the lock on it. Any other thread will not be able to execute the code until the first thread has finished and released the lock. Note that the lock is based on the object and not on the

- 99 -

Copyright Cesar Augusto Tacla 2003

that the lock is based on the object and not on the method.

When a synchronized block is executed, its object is locked and it cannot be called by any other code until the lock is freed.

Fonte http://www.jchq.net/certkey/0703certkey.htm

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 100 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 101 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

Um dos problemas clássicos é o produtor-consumidor. Enquanto uma thread produz elementos e os coloca num buffer de capacidade limitada, outra thread consome estes elementos.

São duas threads que acessam a mesma área de memória. O produtor só pode produzir sob a condição de haver espaço no buffer. O consumidor só pode consumir sob a condição de haver ao menos um elemento no buffer

- 102 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

C:\Documents and Settings\tacla\My Documents\JAVARepositorio\JThreads\JExemploWaitNotifyPedestal\

- 103 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

Quando se faz um notify, libera-se o lock? Não.

- 104 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

Deve funcionar!!!

- 105 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

wait and notify should be placed within synchronized code to ensure that the current code owns the monitor

A call to wait from within synchronized code causes the thread to give up its lock and go to sleep.

This normally happens to allow another thread to obtain the lock and continue some processing.

If you call wait( ) or notify( ) within a method that’s not synchronized, the program will compile, but when you run it you’ll get an IllegalMonitorStateExceptionwith the somewhat non-intuitive message “current thread not owner.”

- 106 -

Copyright Cesar Augusto Tacla 2003

thread not owner.”

http://codeguru.earthweb.com/java/tij/tij0157.shtml#Heading499

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 107 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

*originalmente havia true no lugar de <condição>, mas não estava claro como não entrava em loop*

A call to wait from within synchronized code causes the thread to give up its lock and go to sleep. This normally happens to allow another thread to obtain the lock and continue some processing. The waitmethod is meaningless without the use of notify or notifyAll which allows code that is waiting to be notified that it can wake up and continue executing. A typical example of using the wait/notify protocol to allow communication between Threads appears to

- 108 -

Copyright Cesar Augusto Tacla 2003

allow communication between Threads appears to involve apparently endless loops such as <ver slide>

As true is notorious for staying true this, code looks at first glance like it will just loop forever. The wait method however effectively means give up the lock on the object and wait until the notify or notifyAllmethod tells you to wake up.

Thread scheduling is implementation dependent and cannot be relied on to act the same way on every JVM

Unlike most aspects of Java, Threading does not act the same on different platforms. Two areas of difference are Thread scheduling and Thread priorities. The two approaches to scheduling are

•Preemptive

•Time slicing

In a pre-emptive system one program can "pre-empt" another to get its share of CPU time. In a time sliced system each thread gets a "slice" of the CPU time and then gets moved to the ready state. This ensures against a single thread getting all of the CPU time. The downside is that you cannot be certain how long a Thread might execute or even when it will be running. Although Java defines priorities for threads from the lowest at 1 to the highest at 10, some platforms will accurately recognise these priorities whereas others will not.

The notify method will wake up one thread waiting to reacquire the monitor for the object. You cannot be

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

Observar que embora wait e notify tratem de thread, são métodos da classe Object pois todo objeto em Java tem lock.

One fairly unique aspect of wait( ) and notify( ) is that both methods are part of the base class Object and not part of Thread as are sleep( ), suspend( ), and resume( ). Although this seems a bit strange at first –to have something that’s exclusively for threading as part of the universal base class – it’s essential because they manipulate the lock that’s also part of every object. As a result, you can put a wait( ) inside any

- 109 -

Copyright Cesar Augusto Tacla 2003

object. As a result, you can put a wait( ) inside any synchronized method, regardless of whether there’s any threading going on inside that particular class. In fact, the only place you can call wait( ) is within a synchronized method or block. If you call wait( ) or notify( ) within a method that’s not synchronized, the program will compile, but when you run it you’ll get an IllegalMonitorStateException with the somewhat non-intuitive message “current thread not owner.” Note that sleep( ), suspend( ), and resume( ) can all be called within non- synchronized methods since they don’t manipulate the lock.

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 110 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 111 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 112 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

An assertion is a statement in the JavaTM programming language that enables you to test your assumptions about your program. For example, if you write a method that calculates the speed of a particle, you might assert that the calculated speed is less than the speed of light.

http://java.sun.com/j2se/1.4.2/docs/guide/lang/assert.html#intro

- 113 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

O processo que notifica continua a executar.

- 114 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 115 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 116 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 117 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 118 -

Copyright Cesar Augusto Tacla 2003

Curso de Especialização em Java – Sistemas Distribuídos – Prof. Tacla

Notas instrutor

- 119 -

Copyright Cesar Augusto Tacla 2003