• Nenhum resultado encontrado

O tratamento da competição entre processos

Uniformidade benéfica ou monopólio prejudicial?

3.4 O tratamento da competição entre processos

Uma importante tarefa de um sistema operacional é a alocação dos recursos da máquina aos processos no sistema. Aqui usamos o termo recurso em sentido amplo, incluindo os dispositivos periféri- cos da máquina, bem como elementos internos da própria máquina. O gerente de arquivos autoriza o acesso a arquivos existentes, aloca espaço em disco para a construção de arquivos novos; o gerente de memória aloca espaço de memória; o escalador, espaço na tabela de processos; e o despachante, fatias de tempo. Como acontece com muitos problemas em sistemas computacionais, esta tarefa de alocação pode

parecer simples à primeira vista. Por trás dela, entretanto, estão presentes vários problemas que, se não forem devidamente tratados, podem levar à ocorrência de falhas no sistema. É bom lembrar que uma máquina não pensa por si mesma, mas apenas segue diretrizes. Assim, para construir sistemas operacio- nais confiáveis, é necessário desenvolver algoritmos que levem em conta cada detalhe possível do siste- ma, independentemente insignificante ele possa parecer.

Semáforos

Consideremos uma máquina com uma única impressora, em que esteja sendo executado um sistema operacional de tempo partilhado. Se um processo precisar imprimir seus resultados, deverá solicitar ao sistema operacional acesso ao dirigente da impressora. Nesse caso, o sistema operacional deve decidir se o pedido deve ser atendido ou não, conforme a impressora esteja livre ou ocupada por algum processo. Se não estiver ocupada, o sistema operacional atenderá à solicitação e permitirá que o processo solicitante prossiga sua execução; caso contrário, o pedido será negado e o processo, mar- cado como à espera de que a impressora fique disponível. De fato, se for permitido que dois processos tenham acesso simultâneo à impressora, a listagem embaralhada assim obtida será inútil para ambos. A alocação de acesso exige que o sistema operacional mantenha atualizada a informação do estado de alocação da impressora. Uma solução possível consiste em empregar uma variável sinaliza- dora que, neste contexto, pode ser materializada na forma de um bit de memória, cujos estados fre- qüentemente denominamos ligado e desligado (set e clear), em vez de 1 e 0. Um sinalizador desligado indica que a impressora está disponível, enquanto um ligado indica que ela está alocada no momento. Aparentemente, essa solução parece não esconder qualquer problema imprevisto. No início da opera- ção, o sistema operacional simplesmente desliga o sinalizador, e a partir daí, toda vez que for recebido um pedido de acesso à impressora, verifica o valor assumido pelo sinalizador. Se este estiver desliga- do, o pedido será atendido e o sistema operacional deverá então ligar o sinalizador. Se este já estiver ligado, o sistema operacional colocará o processo requisitante em estado de espera. Cada vez que um processo terminar de utilizar a impressora, o sistema operacional a alocará a um processo em espera ou, se nenhum processo estiver nesse estado, simplesmente desligará o sinalizador.

Embora esta solução pareça boa à primeira vista, ela apresenta um problema. A tarefa de testar e ligar o sinalizador requer a execução de diversas instruções de máquina. Portanto, é possível que a tarefa seja interrompida logo após ser detectada a situação de sinalizador desligado, porém antes de haver tempo para que o mesmo seja religado. Por isso, pode ocorrer a situação descrita a seguir.

Suponha que, neste instante, a impressora esteja disponível e sendo solicitada por um processo. O seu sinalizador é verificado e, por se encontrar no estado desligado, indica que a impressora está dispo- nível. Suponha que, por coincidência, neste momento o processo seja interrompido e que outro processo inicie a utilização de sua fatia de tempo, e também solicite o uso da impressora. Novamente, o sinaliza- dor será verificado, mas o mesmo ainda se encontra desligado, já que o processo anterior fora interrom- pido antes que o sistema operacional pudesse ligá-lo. Como conseqüência, o sistema operacional permi- tirá que o segundo processo utilize a impressora. Mais tarde, o primeiro processo retomará a execução a partir do ponto em que havia sido interrompido, isto é, imediatamente depois da instrução que executava quando o sistema operacional detectou o desligamento do sinalizador. Desse modo, o sistema operacio- nal permitirá ao primeiro processo o acesso à impressora, e, portanto, os dois processos estarão agora utilizando a mesma impressora, ao mesmo tempo.

O problema, neste ponto, é que a tarefa de testar e, provavelmente, de ligar o sinalizador, uma vez iniciada, deve ser completamente executada, sem interrupções. Uma solução é utilizar as instruções de habilitação (enable) ou de desabilitação (disable) de interrupção, disponíveis na maioria das linguagens de máquina. Quando executada, uma instrução de desabilitação faz com que futuras interrupções sejam bloqueadas, enquanto uma instrução de habilitação faz com que a UCP volte a responder aos sinais de interrupção. Assim, se o sistema operacional iniciar a rotina de teste do sinalizador com uma instrução de desabilitação de interrupção e terminar com uma de habilitação, uma vez iniciada essa rotina, nenhuma outra atividade poderá interrompê-la.

Outra abordagem é usar a instrução de test-and-set, disponível em muitas linguagens de máquina. Esta instrução permite ao processador obter o valor do sinalizador, anotar o valor recebido e então ligar o sinalizador, tudo dentro de uma única instrução de máquina. A vantagem é que, como a UCP sempre completa uma instrução antes de reconhecer uma interrupção, a tarefa de testar e ligar o sinalizador não será interrompida quando for implementada como uma única instrução.

Um sinalizador adequadamente implementado, conforme descrito, é conhecido com o nome de semáforo, em referência aos sinais ferroviários utilizados para controlar o acesso aos trilhos. De fato, os semáforos são usados em sistemas de software do mesmo modo como em ferrovias. Em lugar dos segmen- tos de trilhos, que podem conter somente um trem por vez, está a seqüência de instruções que podem ser executadas apenas por um processo de cada vez. Tal seqüência é chamada de região crítica. A exigên- cia de que apenas um processo possa executar uma região crítica é conhecida como exclusão mútua. Em resumo, uma maneira comum de obter a exclusão mútua em uma região crítica é controlá-la por um semáforo. Para entrar na região crítica, um processo deve encontrar o semáforo desligado e então ligá-lo antes de entrar; depois, logo que sair, deve desligar o semáforo. Se o semáforo for encontrado ligado, o processo que tentou entrar na região crítica deverá esperar até que o semáforo seja desligado. Enlace mortal (deadlock)

Outro problema que pode surgir durante a alocação de recursos é o enlace mortal, situação na qual dois ou mais processos ficam impedidos de prosseguir suas execuções, devido ao fato de cada um estar aguardando acesso a recursos já alocados ao outro. Por exemplo, um processo tem acesso à impres- sora, mas está esperando pelo dispositivo de fita, enquanto outro processo tem acesso ao dispositivo de fita, mas está aguardando a impressora. Outro exemplo acontece quando processos criam novos proces- sos para executar subtarefas. Se o escalador não dispuser de espaço na tabela de processos e cada proces- so no sistema precisar criar um processo adicional antes de poder completar sua tarefa, nenhum processo poderá continuar. A ocorrência de tais situações, assim como a de diversas outras configurações (Figura 3.9), pode reduzir dramaticamente o desempenho de um sistema.

A análise do enlace mortal revelou que ele não ocorre, a menos que sejam satisfeitas simultanea- mente as três condições seguintes:

1. Há competição por recursos não-compartilháveis.

2. Os recursos são solicitados de forma parcial, ou seja, já de posse de alguns recursos, um processo volta a solicitar mais recursos

em instante posterior. 3. Uma vez alocado, um recurso

não pode ser retomado pelo sis- tema, a não ser que o processo o libere espontaneamente. Isoladas essas três condições, torna-se possível resolver o problema do enlace mortal pela simples elimina- ção de qualquer uma delas. Em geral, as técnicas que tratam a terceira con- dição pertencem à categoria conheci- da como esquemas de detecção e cor- reção de enlaces mortais. Nestes casos, a ocorrência do enlace é considerada tão remota que nenhum esforço é feito para evitá-la. Pelo contrário, a forma empregada é a de localizar a sua ocor-

rência e então corrigir a situação reto- Figura 3.9

Um enlace mortal resultante de competição por intersecções não-compartilháveis de transporte ferroviário.

mando compulsoriamente alguns dos recursos alocados. O nosso exemplo da tabela de processos com- pletamente lotada se encaixa nesta situação. Um administrador de sistema normalmente dimensiona uma tabela de processos suficientemente grande para cada instalação. Entretanto, se os enlaces mortais ocorrerem por causa de alguma tabela lotada, o administrador precisa apenas lançar mão de seu privilé- gio de superusuário para remover (o termo técnico é kill — matar) alguns dos processos que lotam esta tabela, garantindo assim que os demais possam continuar suas tarefas.

As técnicas de tratamento das duas primeiras condições são conhecidas como esquemas para evitar os enlaces mortais. Por exemplo, elimina-se a segunda condição exigindo que cada processo solici- te todos os recursos necessários de uma só vez. Outra técnica, talvez mais criativa, elimina a primeira condição, sem remover diretamente a competição, mas convertendo recursos não-compartilháveis em compartilháveis. Por exemplo, suponha que o recurso em questão seja uma impressora e vários processos solicitem o seu uso. Toda vez que um processo solicitar a impressora, o sistema operacional atenderá o pedido. Contudo, em lugar de conectar o processo ao dirigente da impressora, o sistema operacional o conecta a um dirigente de dispositivo que armazena a informação a ser impressa em um disco, em vez de enviá-la à impressora. Assim, sob esta configuração, tudo se passa como se cada processo tivesse acesso à impressora e, portanto, cada um continua normalmente a sua execução. Mais tarde, quando a impres- sora estiver disponível, o sistema operacional transferirá os dados do disco para ela. Desta maneira, o sistema operacional fez um recurso não-compartilhável comportar-se como se fosse compartilhável, cri- ando a ilusão de haver mais de uma impressora. Esta técnica de armazenar dados para uma saída poste- rior em uma ocasião mais oportuna é chamada de spooling, e é muito comum em sistemas de todos os tamanhos.

Naturalmente, outros problemas podem surgir quando existe competição dos processos pelos re- cursos de uma máquina. Por exemplo, um gerente de arquivos, em geral, concede a vários processos o acesso a um mesmo arquivo, desde que se trate de acessos apenas para a leitura do arquivo. Nesse caso, ocorrerão conflitos se mais de um processo tentar alterar um mesmo arquivo ao mesmo tempo. Assim, um gerente de arquivos permite acesso ao arquivo de acordo com as necessidades dos processos, permi- tindo que vários leiam os dados, mas que somente um grave informações em um determinado momento. Outros sistemas dividem o arquivo de forma que diferentes processos possam alterar diferentes partes do mesmo arquivo concomitantemente. Todavia, ainda há problemas que devem ser solucionados. Por exem- plo, de que maneira esses processos, que possuem autorização para ler dados de um arquivo, devem ser notificados quando um outro processo estiver alterando o conteúdo do arquivo?

Q

UESTÕES

/E

XERCÍCIOS

1. Suponha que os processos A e B compartilhem tempo na mesma máquina e que ambos necessitem de um mesmo recurso não-compartilhável por pequenos períodos (por exemplo, cada processo imprime uma série de pequenos relatórios independentes). Cada processo pode, repetidamente, acessar um recurso, liberá-lo e depois solicitá-lo novamente. Descubra uma situação adversa quando se resolve controlar os acessos aos recursos da seguinte maneira:

Comece atribuindo o valor 0 a um sinalizador. Se o processo A solicitar o recurso e o sinalizador contiver 0, atenda o pedido. Caso contrário, faça o processo A esperar. Se o processo B solicitar o recurso e o sinalizador for 1, atenda o pedido. Caso contrário, faça o processo B esperar. Todas as vezes que o processo A liberar o recurso, altere o sinalizador para 1. Todas as vezes que o processo B terminar de utilizar o recurso, altere o sinalizador para 0. 2. Suponha que uma estrada de dupla pista se reduza a uma pista única ao atravessar um túnel.

Para coordenar o uso do túnel, foi instalado o seguinte sistema de sinalização:

Ao entrar por qualquer extremidade do túnel, um carro faz com que seja ligado um sinal luminoso vermelho nas duas aberturas do túnel. No momento em que o carro sair, esse sinal

será desligado. Se, ao aproximar-se do túnel, outro carro encontrar ligado o sinal vermelho, deverá aguardar até que ele se apague antes de entrar no túnel. Qual é o defeito deste esquema?

3. Suponha que as soluções seguintes tenham sido propostas para remover o enlace mortal que ocorre em uma ponte de pista única quando dois carros se defrontam. Das condições de ocorrência de enlaces mortais descritas no texto, identifique qual delas é removida quando se emprega cada uma das soluções propostas a seguir:

a. Não deixar um carro subir na ponte enquanto esta não estiver vazia. b. Se dois carros se defrontarem, fazer um deles voltar atrás.

c. Acrescentar uma nova pista à ponte.

4. Suponha que, em um sistema de tempo partilhado, representemos cada processo por um ponto e que desenhemos uma seta de um ponto a outro se o processo representado pelo primeiro ponto estiver esperando por um recurso ocupado pelo segundo. O quadro resultante é chamado pelos matemáticos de grafo orientado. Qual propriedade do grafo orientado representa um enlace mortal no sistema?

3.5 Redes

As primeiras redes de computadores eram constituídas de máquinas independentes que, basica- mente, apenas efetuavam transferências de arquivos através de conexões telefônicas temporárias, usan- do os softwares utilitários dos sistemas operacionais. Atualmente, a interação de computadores por meio de redes tornou-se comum e multifacetada. Muitos sistemas de software modernos, tais como de recupe- ração de informação global, de contabilidade e estoque de grandes companhias e mesmo alguns jogos de computador, são projetados como sistemas distribuídos, o que significa que consistem em unidades em execução em diferentes computadores de uma rede. Já o software subjacente necessário para suportar tais aplicações cresceu desde um simples pacote utilitário até um sistema expansível de software de rede, que proporciona uma infra-estrutura em toda a rede. Em um certo sentido, então, os softwares de rede vêm evoluindo para um sistema operacional de redes. No restante deste capítulo, consideraremos alguns tópicos associados a um contexto expansível de software de sistema.

Fundamentos de redes

Cada rede de computadores pode ser classificada em uma das duas grandes categorias: redes locais (local area network — LANs) e redes de longa distância (wide area networks — WANs). Uma rede local em geral é formada por um conjunto de computadores, localizados em um único edifício ou em um complexo de edifícios. Por exemplo, os computadores existentes em um campus universitário ou em uma indústria podem ser interconectados por uma rede local. Uma rede de longa distância une máquinas que podem estar em pontos opostos de uma cidade, ou mesmo do mundo.

Outra dicotomia existente nas redes é baseada na propriedade do projeto, se de domínio público ou de uma única corporação. Uma rede do primeiro tipo é chamada rede aberta e uma do segundo, rede fechada ou rede proprietária. A Internet é um sistema aberto. De fato, a comunicação através da Internet é controlada por uma coleção aberta de padrões conhecida como TCP/IP, conjunto de proto- colos que discutiremos na próxima seção. A empresa Novell, por sua vez, é um grande fornecedor de

software de rede, desenvolvido por ela e de sua propriedade. Assim, os sistemas de rede instalados e

mantidos pela Novell são sistemas fechados.

Outro modo de classificar redes está baseado em sua topologia e refere-se ao padrão com que as máquinas são conectadas. A Figura 3.10 representa algumas topologias mais conhecidas: (a) em anel, na qual as máquinas são conectadas circularmente; (b) em via, em que são conectadas por uma linha co- mum de comunicação chamada via; (c) em estrela, na qual uma das máquinas serve como uma central,

à qual todas as outras são conectadas; (d) irregular, na qual as máquinas são conectadas de uma maneira arbitrária. A topologia irregular é comum em redes de longa distância, enquanto as em anel e em via em geral são empregadas em ambientes locais, cujas redes têm um único responsável.

É importante lembrar que a conexão entre as máquinas de uma rede não necessita ser física. As redes sem fio estão se tornando a cada dia mais comuns. Por exemplo, a tecnologia tradicional de trans- missão de rádio, na qual o sinal se propaga em todas as direções, pode ser usada para implementar uma rede com topologia de via. Nesse caso, a via não é um cabo físico, mas um segmento de freqüências do espectro de transmissão.

Às vezes, torna-se necessário interligar duas redes existentes. Quando elas são compatíveis, isto pode ser feito meramente conectando as redes por meio de um dispositivo de acoplamento chamado ponte (bridge). Por exemplo, no caso de duas redes com topologia de via, é possível usar uma ponte para conectar as duas vias existentes de tal forma que os sinais de uma sejam retransmitidos na outra (Figura 3.11a). O importante é que quando duas redes estão conectadas por uma ponte, o resultado é simples- mente uma única rede maior.

Contudo, muitas vezes é necessário unir duas redes cujas características não são compatíveis. Por exemplo, as características de uma rede em estrela não são compatíveis com uma em via. Nesses Figura 3.10 Topologias de redes.

casos, as duas redes devem ser conectadas de uma maneira que construa uma rede de redes, que é conhecida como internet, ou seja, as redes originais mantêm a sua originalidade e continuam a funcionar como redes independentes. Elas são meramente ligadas de forma que as mensagens de uma sejam transferidas para a outra, permitindo assim que uma máquina de uma rede envie mensagem a uma máquina da outra.

A conexão entre duas redes para formar uma internet é feita por uma máquina chamada rotea- dor (router), que é um computador pertencente às duas redes, que propaga as mensagens de uma para a outra (Figura 3.11b). Note que a tarefa de um roteador é significativamente maior do que a de uma ponte. De fato, o roteador deve fazer as conversões de idiossincrasias das duas redes originais. A Internet

O exemplo mais notável de internet é a Internet (note que o I é maiúsculo), que se originou de uma pesquisa iniciada em 1973 pela Defense Advanced Research Project Agency (DARPA). A meta desse programa era desenvolver a capacidade de interconectar várias redes de computadores, de forma que eles funcionassem como uma única rede confiável. Hoje, a Internet é uma combinação de redes locais e redes de longa distância que envolve milhões de máquinas.

Topologia da Internet Conceitualmente, a Internet pode ser vista como um conjunto de domínios,

em que cada um é constituído de uma rede ou uma pequena internet, operada por uma única entidade, como uma universidade, uma empresa, ou uma instituição governamental. Cada domínio é um sistema autônomo, que pode ser configurado conforme determinado pelas autoridades locais, talvez até mesmo na forma de um conjunto de redes de longa distância, de âmbito mundial. Para estabelecer um domínio, a entidade deve registrá-lo no ICANN (Internet Corporation of Assigned Names and Numbers — pronun- cia-se Ai-can), uma corporação sem fins lucrativos para coordenar a identificação de domínios, como veremos a seguir.

Uma vez registrado, ele pode ser anexado à Internet por meio de um roteador que conecte uma das redes do domínio a uma rede da Internet. Esse roteador é considerado o portão (gateway) do domínio, já que representa a porta do domínio ao mundo exterior. O “mundo exterior” às vezes é chama- do nuvem (cloud), em referência ao fato de que a estrutura da Internet fora do portão do domínio está fora de seu controle e é irrelevante à sua operação. Qualquer mensagem transmitida a um destino dentro do domínio é tratada dentro dele; qualquer mensagem transmitida a um destino fora do domínio é direcionada para o portão, de onde é enviada para a nuvem.