Trabalho - Banco de Dados Orientado a Objetos
Por: Rodrigo.Claudino • 9/11/2017 • 1.835 Palavras (8 Páginas) • 601 Visualizações
...
A instrução TSL
A instrução TSL (teste e atualize variável de trava), que funciona junto com a ajuda do hardware, lê o conteúdo na memória (variável lock) no registrador e armazena um valor diferente de zero nesta memória. Esses processos de leitura e armazenamento são indivisíveis, então a palavra na memória não pode ser acessada por nenhum outro processador sem a instrução TSL ter terminado, onde a CPU que está executando a instrução impede o acesso ao barramento de memória. Comparada com a alternativa de desabilitar interrupções, a instrução TSL é muito mais eficaz pois impedindo o barramento de memória, um processo dois não poderá acessar a palavra no processo de leitura e escrita do processo um, o que não acontece na desabilitação de interrupções. Ao entrar na região crítica, o processo verifica o conteúdo de lock retorna, e assim que termina de executar a região crítica, o processo volta a colocar o valor de lock em zero.
O problema produtor-consumidor
No problema produtor-consumidor dois processos compartilham de um mesmo buffer de tamanho fixo, onde o produtor coloca informação dentro do buffer e o consumidor a retira.O problema ocorre quando o produtor quer adicionar uma nova informação no buffer, mas este já está cheio. A solução é colocar o produtor para dormir e só despertá-lo depois de o consumidor ter retirado um ou mais informações do buffer. A mesma coisa para o consumidor que ao dormir só será despertado após conter alguma informação no buffer. Para ter controle sobre estes itens no buffer é usado a variável count. Se a capacidade do buffer for armazenar N informações, o código do produtor verifica se count é igual N. Caso for verdadeiro o produtor dormirá; do contrário, o produtor irá adicionar um item e irá incrementar a variável count. Isso se repete para o código consumidor, caso o valor de N for 0, ele remove um item e decresce a variável. Mas a condição de disputa ainda poderá ocorrer pelo fato de a variável count não ter acesso restrito, assim pode acontecer de o produtor e o consumidor dormirem para sempre. Uma solução para tal disputa seria adicionar um bit de espera pelo sinal de acordar, o qual é ligado quando um processo acordado recebe um sinal de acordar, e é desligado quando um processo tentar dormir e estiver com o bit ligado, mas o processo permanecerá acordado.
Semáforos
Um semáforo antes de usado deve ser iniciado, configurando assim um valor para a variável protegida (numero inteiro), que indicará que nenhum thread está executando em seção crítica, a partir daí é criada uma fila que armazena referências a threads que estão esperando para entrar em seção crítica. Esse algoritmo funciona da seguinte forma: o semáforo será acessado e alterado por apenas duas funções, P e V (P = Operação esperar [wait] e V = Sinalizar [sign]), sempre que um thread quiser entrar em seção crítica ele terá que optar pela opção P e para sair utilizará V.
Monitores
Coleção e rotinas, variáveis e estruturas de dados, tudo isso junto é um tipo especial de pacote, O processo pode chamar uma rotina no monitor quando quiser, porém não pode ter acesso a estrutura interna de dados ao monitor a partir de uma rotina declarada fora dele.
O monitor tem uma propriedade útil para realizar a exclusão mutua: somente um processo pode estar ativo no monitor em um certo momento. Quando o processo chama uma rotina do monitor, uma das primeiras instruções é verificar se qualquer outro processo está atualmente ativo no monitor, caso esteja, o processo que chamou será bloqueado até que o outro processo deixe o monitor, caso nenhum outro processo esteja usando o monitor o processo que chamou poderá entrar.
Sincronismo em Java
No sincronismo em Java, os monitores são associados a cada objeto criado em Java e também representam o mecanismo primário para fornecer exclusão mútua, por meio da palavra-chave synchronized. Os monitores sincronizados em Java são bem diferentes dos monitores clássicos, o primeiro não possui variáveis condicionais e sim dois métodos, o wait e o notify, que são equivalentes ao sleep e wakeup, onde o modo wait pode ser interrompido. Tornando automática a exclusão mútua das regiões críticas os monitores deixam a programação paralela muito menos sujeita a erros do que o uso de semáforos. A exclusão mútua é garantida, pois somente um processo pode estar ativo em um monitor em um dado momento. Mesmo assim estes podem apresentar erros, pois como nos semáforos, monitores são projetados para resolver o problema de exclusão mútua em uma ou mais CPU's, todas com acesso a uma memória comum. Colocando semáforos na memória comum e usando a instrução TSL, pode evitar disputas.
Deadlock
Ocorre quando dois ou mais processos quiserem escrever ao mesmo tempo em uma impressora (por exemplo), o que causaria uma bagunça. A tentativa de dois ou mais processos, utilizarem a mesma entrada de tabela do sistema de arquivos vai nos levar a um sistema de arquivos corrompidos e esses processos ficariam bloqueados eternamente, isso também pode ser chamado de impasse. E uma das condições para ocorrer deadlock é a exclusão mútua, onde um recurso só pode ser adquirido por um único processo por vez.
Conclusão
Vimos muitas formas de solucionar realização da exclusão mútua, muitas formas de fazer com que os processos ou threads tenham segurança na hora de executar em região crítica.
Muitos desses algoritmos resolvem parcialmente nossa grande questão, de como fazer um método seguro que não deixe um processo atrapalhar o outro quando ele está tratando de informações que não podem sofrer alterações mediante intromissões. A partir de pesquisas feitas com base em artigos científicos, chegamos a conclusão que,
...