You are on page 1of 5

Universidade Federal Do Pará

Instituto de Ciências Exatas e Naturais


Faculdade de Computação
Bacharelado em Ciência da Computação
Sistemas Operacionais

Lista 05 – Sincronização de Processos

1 - Cite diversas razões por que o estudo da concorrência é apropriado e


importante em Sistemas Operacionais.

O conceito de concorrência é muito importante em sistemas operacionais,


porque é o princípio básico para o projeto e a implementação dos sistemas operacionais
multiprogramáveis. Já que nos antigos sistemas monoprogramáveis, nos quais recursos
computacionais como processadores, memórias e dispositivos de entrada e saída eram
utilizados de maneira pouco eficiente, limitando o desempenho dessas arquiteturas. Nos
sistemas multiprogramáveis, vários programas podem estar na memória, concorrendo
pelo acesso ao processador. A utilização concorrente do processador deve ser
implementada de maneira que, quando um programa perde o uso do processador e
depois retorna para continuar sua execução, seu estado deverá ser idêntico ao do
momento em que foi interrompido. Em muitas aplicações concorrentes é necessário a
comunicação entre os processos e essa comunicação pode ser implementada através de
mecanismos como variáveis compartilhadas e troca de mensagens.

2 - A exclusão mútua pode ser implementada de forma a gerar a espera ocupada ou


de forma a gerar o bloqueio. Discuta a aplicabilidade e os méritos relativos de cada
abordagem.

A exclusão mutua é um mecanismo que tem a função de tentar solucionar os


problemas relacionados ao compartilhamento de recursos de processos concorrentes,
quando estes processos querem utilizar um determinado recurso simultaneamente. Na
primeira abordagem a exclusão mutua age da seguinte forma, enquanto um processo
estiver acessando determinado recurso em sua região crítica, todos os demais
processos que queiram acessá-lo deverão esperar pelo termino da utilização do
recurso, no caso de algum outro processo tentar acessá-lo ele usa a outra abordagem,
fazendo com que o processo fique bloqueado até que o processo termine de fazer uso
da região crítica sinalizando a ele que o acesso foi concluído através de protocolos de
entrada e saída que são a garantiada exclusão mutua na região crítica.

3 - Uma forma de programar a exclusão mútua é através de soluções aplicadas


ao próprio hardware, como por exemplo, a desabilitação das interrupções. Discuta
asvantagens e desvantagens desta solução.

Para garantir a implementação da exclusão mútua deve haver uma sincronização


entre os processos envolvidos, e para isso algumas soluções foram desenvolvidas para
tentar fazer essa sincronia entre os processos, que é o caso da desabilitação das
interrupções, que faz com que o processo desabilite todas as interrupções antes de fazer
a entrada na região crítica e as reabilite após deixar a região crítica, e como a mudança
de contexto de processos só ocorre devido as interrupções, o processo que a desabilitou
tem acesso exclusivo. Porém, tem uma desvantagem quando relacionada a
multiprogramação que fica seriamente comprometida, já que a concorrência entre
processos tem como base o uso das interrupções, uma situação mais grave poderia
ocorrer caso um processo desabilitasse as interrupções e não as reabilitasse. Neste caso,
o sistema provavelmente teria o seu funcionamento comprometido.

4 - Diferencie o problema do starvationdo busywait. Explique o que pode


ocasionar cada um dos referidos problemas e como podemos solucioná-los.

O primeiro problema é o da Espera Indefinida (Starvation) que acontece quando


um processo nunca consegue executar sua região crítica, no momento que o sistema
operacional aloca um recurso ele possui um critério para selecionar os processos que
serão escolhidos para ter acesso ao recurso e os que ficaram aguardando, em função
dessa escolha o processo de starvation pode ocorrer mesmo se houver prioridade ou se
for aleatória, o problema pode ocorrer. Uma solução para este problema é a criação de
filas de pedidos de alocação para cada recurso, utilizando o esquema de FIFO, assim
quando um processo solicitar um recurso, esse pedido será colocado no final da fila de
associação ao recurso.

Ao contrário da espera ocupada (busywait) que é o problema do looping de


processo, que acontece quando um processo não consegue entrar em sua região crítica,
por já existir outro processo tendo acesso o recurso, testando uma condição, até que o
acesso seja permitido fazendo com que o o processo que está em looping consuma um
tempo desnecessário do processador, podendo levar a problemas de desempenho do
sistema. Uma técnica de solução deste problema é a introdução de mecanismos de
sincronização que permitam que um processo, quando não possa entrar em sua região
crítica, fosse colocado no estado de espera. Esses mecanismos são conhecidos como
semáforos e monitores.

5 - Explique o que é a sincronização condicional e dê um exemplo da sua


utilização.

A sincronização condicional é uma situação onde o acesso ao recurso


compartilhado exige a sincronização de processos vinculada a uma condição de acesso,
ou seja, um recurso não pode se encontrar pronto sem uma condição especifica, nesse
caso o processo que quer acessá-lo permanece bloqueado até que o recurso fique
disponível. Um exemplo bem simples é a comunicação entre dois processos
concorrentes através de operações de gravação e leitura em um buffer, onde um
processo pode gerar informações (processos produtores) que serão utilizados por outro
processo (processos consumidores). Nessa comunicação enquanto um processo grava
dados no buffer, o outro lê os dados, concorrentemente. Os processos envolvidos devem
estar sincronizados, de forma que um processo não tente gravar dados em um buffer
cheio, e nem um processo tente ler dados em um buffer vazio.

6 - Explique o que são semáforos e dê dois exemplos de sua utilização: um para a


solução da exclusão mútua e outro para a sincronização condicional.

Os semáforos são uma solução para o problema da espera ocupada, introduzindo


mecanismos de sincronização para que um processo não que não possa acessar a região
crítica seja colocado no estado de espera. Um semáforo é uma variável inteira, não
negativa, que só pode ser manipulada por duas instruções: DOWN e UP indivisíveis que
não podem ser interrompidas, a instrução UP incrementa uma unidade ao semáforo e a
instrução DOWN decrementa uma unidade ao semáforo, e por definição, elas não
podem receber valores negativos e quando a instrução DOWN executa um estado com
valor 0, o processo entra em um estado de espera. Eles se dividem em binários, ou
mutexes, que assumem apenas valores 0 e 1, ou contadores que podem assumir qualquer
valor inteiro positivo, além do 0.

Para a exclusão mutua, os semáforos agem da seguinte forma, utiliza-se um


semáforo binário associado ao recurso compartilhado, as instruções DOWN e UP
funcionam como os protocolos de entrada e saída, respectivamente, para um processo
poder entrar e sair da região crítica. O valor do semáforo igual a 1 indica que nenhum
processo está utilizando o recurso, enquanto que o valor 0 indica que o recurso está em
uso. Acabando assim com o problema da espera ocupada.

Os semáforos também podem ser utilizados quando a sincronização condicional


é exigida, um exemplo é a quando um processo solicita uma operação de E/S. Esse
pedido faz com que o processo execute a instrução DOWN no semáforo associado ao
evento e faz com que ele fique no estado de espera, até que a operação seja completada.
Quando for finalizada, a rotina de tratamento da interrupção executa um UP no
semáforo, liberando o acesso ao processo que está em espera, também acabando com o
problema da espera ocupada.

7 - Explique o que são monitores e dê dois exemplos de sua utilização: um para a


solução da exclusão mútua e outro para a sincronização condicional.

Os monitores também são uma solução para o problema da espera ocupada, ele é
um mecanismo de sincronização de mais alto nível e estruturados que torna mais
simples o desenvolvimento das aplicações concorrentes, e as chances de erro são bem
menores. Eles são formados e definidos especificando-se um nome, procedimentos, um
código de inicialização e variáveis encapsuladas dentro de um modulo.

Um exemplo e característica principal é a implementação automática da


exclusão mútua entre os procedimentos declarados, ou seja, apenas um dos processos
pode utilizar o os procedimentos do monitor em um determinado instante. Toda vez que
algum processo faz uma chamada a um desses procedimentos, o monitor verifica se já
existe outro processo executando algum procedimento do monitor. Caso exista, o
processo ficará aguardando sua vez em uma fila de entrada. Essas variáveis globais do
monitor só são visíveis para os procedimentos dentro da estrutura, sendo inacessíveis
fora do monitor. As regiões críticas devem ser definidas como esses procedimentos do
monitor, e o compilador se encarregará de garantir a exclusão mútua entre os mesmos.

Os monitores também podem ser utilizados na implementação da sincronização


condicional, através de variáveis especiais de condição, é possível associar a execução
de um procedimento que faz parte do monitor a uma determinada condição, garantindo
essa sincronização condicional. Essas variáveis são manipuladas por meio de duas
instruções, que são WAIT e SIGNAL. A instrução WAIT faz com que o processo seja
colocado em espera, até que outro processo sinalize com a instrução SIGNAL que a
condição foi satisfeita. Caso o SIGNAL seja executado e não haja nenhum processo na
fila nenhum efeito irá surgir.
8 - Levando em conta as suas respostas das questões 06 e 07, explique quais as
semelhanças e diferenças entre a utilização de monitores e de semáforos?

Bom, os métodos satisfazem o mesmo problema, que é o caso da espera ocupada


(busywait), só que com uma margem de erros diferenciada, levando em consideração o
uso de semáforos que exigia do programador bastante cuidado, pois qualquer engano
poderia levar a problemas de sincronização, devido à má estruturação, que ao contrário
dos semáforos os monitores além de possuir mecanismos de alto nível possuem uma
estrutura bem mais versátil para ser implementado pelo compilador, assim o
desenvolvimento de programas concorrentes fica mais fácil e com menos chance de
erros. E em relação à exclusão mútua eles se divergem no fato de que nos semáforos a
implementação era realizada diretamente pelo programador, no caso dos monitores
essas regiões são definidas como procedimentos do monitor, e o compilador é quem se
encarrega de garantir a exclusão mútua entre os procedimentos.

9 - Considere a seguinte frase: “Um thread pode estar em apenas uma fila de
espera de um semáforo por vez”. Essa frase é (verdadeira) ou (falsa)? Justifique a
suaresposta.

Falsa, na maioria das vezes as threads utilizam mais de um único recurso, mais
de uma thread por processo podem ficar mais de uma fila para acessar os recursos
necessários para finalizar o processo completo.

10 - Por que um thread deveria evitar requisitar bloqueio de E/S em uma seção
crítica de um sistema uniprocessador enquanto as interrupções estivessem
desabilitadas?

Porque mesmo quando a thread faz esse bloqueio, a CPU, no sistema com as
interrupções desabilitadas, seria ocupado exclusivamente por essa thread até que fosse
concluída a execução, então logo, não haveria necessidade de bloquear o mecanismo de
E/S.

11 - Explique por que uma thread deve esperar por um recurso fora do monitor?

As variáveis globais do monitor são executadas uma vez, na ativação do


programa onde está declarando o monitor, e a implementação da exclusão mútua que é
utilizada por eles não é realizada diretamente pelo programador, e sim definidas
previamente como procedimentos do monitor, e quem carregará será o compilador.
Quando todos os procedimentos estão ocupados o monitor faz com que a thread ficam
em uma fila esperando o procedimento solicitado ser liberado, toda a espera ocorre fora
do monitor

12 - Cite uma vantagem e uma desvantagem na comunicação indireta.

A comunicação indireta entre processos utiliza uma área compartilhada, onde as


mensagens podem ser colocadas pelo transmissor e retiradas pelo receptor. Essa área é
chamada de mailbox ou port, é um tipo de buffer, e tem como características a sua
identificação e capacidade de armazenamento de mensagens, que são definidas no
momento de sua criação. Existem três diferentes esquemas de implementar a
sincronização entre processos que trocam mensagens, o primeiro esquema de
comunicação implementa uma forma síncrona de comunicação entre os processos que é
conhecida como rendezvous. A desvantagem dessa implementação é que a execução
dos processos fica limitada ao tempo de processamento no tratamento das mensagens.

O segundo esquema é uma variação mais eficiente do rendezvous, que é permitir


que o processo transmissor não fique bloqueado aguardando a leitura da mensagem.
Neste caso, é possível enviar mensagens para diversos destinatários.

O terceiro esquema implementa uma forma assíncrona de comunicação, onde


tanto o processo transmissor, quanto o processo receptor não permanecem aguardando o
envio e o recebimento de mensagens. Nesse caso, além da necessidade de buffers para
armazenar as mensagens, deve haver outros mecanismos de sincronização que permitam
ao processo identificar se uma mensagem foi recebida ou enviada. A grande vantagem
deste mecanismo é aumentar a eficiência de aplicações concorrentes.

You might also like