Академический Документы
Профессиональный Документы
Культура Документы
O nível mais baixo contém dispositivos físicos: chips de circuitos integrados, fios,
fontes de alimentação, tubos de raios catódicos e dispositivos semelhantes.
A maioria delas serve para mover os dados por meio da máquina, fazer operações
aritméticas e comparar valores.
4
Para ocultar essa complexidade existe o sistema operacional.
Ele consiste em uma camada de software que oculta (parcialmente) o hardware e
fornece ao programador um conjunto de instruções mais conveniente.
Por exemplo, read block from file ("leia um bloco de um arquivo") é conceitualmente
mais simples do que ter de se preocupar com os detalhes da movimentação das
cabeças de leitura, como esperar que elas abaixem etc.
5
É importante notar que esses programas não constituem partes definitivas do
sistema operacional, mesmo que sejam normalmente fornecidos pelo fabricante do
computador.
Se o usuário não gostar de um determinado compilador, ele será livre para escrever
seu próprio compilador se o quiser; mas não lhe é permitido escrever sua própria
rotina de tratamento de interrupção de relógio, que é parte do sistema operacional e
está normalmente protegida pelo hardware contra tentativas de alterações pelo
usuário.
6
Em muitos sistemas há programas executados em modo usuário, mas que auxiliam
o sistema operacional ou realizam funções privilegiadas.
Por exemplo, existe um programa que permite aos usuários mudarem suas senhas.
Esse programa não faz parte do sistema operacional e não é executado em modo
núcleo, mas realiza uma função claramente delicada e precisa ser protegido de
maneira especial.
Tudo o que é executado em modo núcleo constitui sem dúvida parte do sistema
operacional, mas alguns programas executados fora dele são inquestionavelmente
também parte dele, ou pelo menos estão intimamente associados a ele.
Por fim, acima dos programas do sistema vêm os programas de aplicação, que são
comprados ou escritos por usuários para resolver problemas específicos, como
processamento de texto, planilhas, cálculos de engenharia ou armazenamento de
informação em um banco de dados.
7
SISTEMAS OPERACIONAIS DE SERVIDORES
Eles são executados em servidores,eles servem múltiplos usuários de uma vez em
uma rede e permitem-lhes compartilhar recursos de hardware e de software.
Servidores podem fornecer serviços de impressão, serviços de arquivo ou serviços
de Web.
8
SISTEMAS OPERACIONAIS DE TEMPO REAL
Outro tipo de sistema operacional é o de tempo real. Esses sistemas são
caracterizados por terem o tempo como um parametro fundamental. Por exemplo,
em sistemas de controle de processos industriais, computadores de tempo real
devem coletar dados sobre o processo de produção e usá-Ios para controlar as
máquinas na fabrica.
Outro tipo de sistema de tempo real é o sistema de tempo real não crítico, no qual o
descumprimento ocasional de um prazo é aceitável.
Importante:
Gerenciamento de Tempo;
Gerenciamento de processos críticos (aviões, caldeiras);
9
SISTEMAS OPERACIONAIS EMBARCADOS
Continuando a descer na escala de tamanho dos sistemas, vemos os sistemas de
computadores de mão e embarcados.
Eles têm, muitas vezes, características de sistemas de tempo real, mas também
apresentam restrições de tamanho, memória e de consumo de energia que os fazem
especiais.
10
SISTEMAS OPERACIONAIS DE CARTÕES INTELIGENTES
Os menores sistemas operacionais são executados em cartões inteligentes -
dispositivos do tamanho de cartões de crédito que contêm um chip de CPU.
Alguns desses cartões podem tratar múltiplas applets Java ao mesmo tempo,
acarretando multiprogramação e a conseqüente necessidade de escalonamento.
11
Sistemas Operacionais
SO Características
DOS Limite de memória de 640k;
Linhas de comando;
16-bit; Windows 3.11 (interface gráfica);
Mac OS Computadores Macintosh; Multitarefa; Interface
Gráfica;
OS/2 32-bit; computadores IBM; Multitarefa; Rede; Alta
performance;
Linux Software de código aberto (open-source);
Semelhante ao UNIX; Interface gráfica;
UNIX Processamento multi-usuário, multitarefa e rede;
estações de trabalho; linhas de comando;
Interface gráfica: X-win, Motif;
12
Sistemas Operacionais
SO Características
13
Arquitetura Básica do Hardware de
Computadores Padrão IBM- PC:
Microprocessadores, Microcontroladores e Dispositivos I/O.
14
A – CPU, Memória e I/O
Estes limites muitas vezes não satisfazem as restrições de sistemas em tempo real.
Nestes casos outras estratégias podem ser utilizadas para acelerar a transferência
de dados entre dispositivos. 15
B – CPU, DMA (Acesso direto a memória)
O uso da técnica de Acesso Direto a Memória (DMA) permite que dispositivos I/O
tenham acesso à memória do computador sem intervenção da CPU.
Ou seja. A informação é depositada diretamente na memória por um dispositivo
externo.
Para tal, é necessário a utilização de determinados circuitos de controle
denominados “controladores de DMA”. Note que, uma vez que a CPU não interfere
no processo, a transferência de dados é muito rápida (forma mais rápida de se
transferir dados para a memória de um computador).
Qualquer dispositivo que deseje utilizar DMA deve requerer o uso dos barramentos
ao controlador (DMAreq), este assegura que os barramentos estejam em tri-state
antes de liberá-los para o dispositivo (DMAack).
16
B – CPU, DMA (Acesso direto a memória)
Seqüência de operação:
I/O pede DMAreq (Request)
O controlador decide se atende ou não o pedido de acordo com prioridades
estabelecidas e se o DMA foi “habilitado”, para então requerer a paralisação do
processo em execução na CPU.
A CPU conclui a instrução corrente e envia um reconhecimento (Acknowledgement)
ao controlador, o qual deverá avisar o dispositivo I/O que o pedido de acesso direto à
memória foi aceito. Deste momento em diante o barramento de dados e endereços
estará livre e pode ser manipulado pelo dispositivo I/O para escrita ou leitura na
memória.
17
C – CPU, Interrupções
Uma terceira forma se prover transferência de dados entre dispositivos I/O e a
memória ou CPU é através do uso de interrupções.
Neste caso um sinal de interrupção, que pode ser enviado por hardware ou software,
é utilizado para parar o processamento atual e requerer à CPU a realização de uma
tarefa específica. Note que neste caso a CPU continua sendo responsável por todo o
processo.
Contudo, esta técnica é muito utilizada para transferência rápida de dados entre
dispositivos e para exigir que a CPU realize operações prioritárias, como por
exemplo tratamento de exceções e eventos imprevistos, etc.
18
Via Hardware
Seqüência de operação:
I/O pede INTRreq (Request)
O controlador decide se atende ou não o pedido de acordo com prioridades
estabelecidas e se a interrupção foi “habilitada”, para então requerer a interrupção do
processo em execução na CPU.
A CPU conclui a instrução corrente e envia um reconhecimento (Acknowledgement) ao
controlador, o qual deverá avisar o dispositivo I/O que a interrupção foi aceita.
19
Na CPU:
O PC (Program Counter) é empilhado e em seu lugar é colocado um endereço que
aponta para uma posição no vetor de interrupções do sistema.
Uma vez que o valor do PC aponta para uma posição no vetor de interrupções, a
próxima instrução a ser executada deve estar armazenada naquela posição.
Como poucos bytes são alocados (no vetor) para cada interrupção, normalmente na
referida posição são escritos códigos simples do tipo “JUMP
código_a_ser_executado”.
20
Via software
INT xx
Exemplo: INT 21h
execução se dá de forma similar ao descrito acima, com a exceção de que não há
envolvimento de hardware para o pedido seja aceito.
Para o exemplo acima, o valor do PC é para um endereço apontando para a 21a
posição no vetor de interrupções previamente preparado pelo sistema operacional).
21
D-MicroControladores em Geral
22
Software e sistemas operacionais para Sistemas em tempo Real
Definições de Sistemas Seqüenciais, Concorrentes, Paralelos e Distribuídos
Um sistema em tempo real normalmente realiza operações seqüenciais na forma
padrão, mas é extremamente importante que também seja capaz de manipular
múltiplos eventos ao mesmo tempo ou manipulá-los de forma que o tempo de reação
para cada evento seja tolerável para o processo em questão. Exemplo: Seja uma
operação SEQUENCIAL de 5 tarefas executadas como se segue:
SEQUENCIAL Loop
T1 – 100ms
T2 – 150 ms
T3 – 50 ms
T4 – 250 ms
T5 – 100 ms
end loop
Desta forma caso um evento ocorra durante a execução de T1, ele deve esperar no
máximo 40ms para ser manipulado por T5.
24
Definições básicas:
Sistema Concorrente: Um sistema computacional no qual instruções em threads
separadas podem ser executadas “aparentemente” ao mesmo tempo, dentro de um
pequeno intervalo de tempo. Nota: Unidades de concorrência podem ser
denominadas na literatura por processo, tarefa ou thread.
25
Threads
Operação seqüencial: Uma única thread de
execução
26
Operação Concorrente: Múltiplas . threads
de execução que podem ou não serem
independentes.
27
Operação Concorrente: Múltiplas threads
de execução em um único processador
28
Operação Concorrente Múltiplas threads
de execução em múltiplos processadores
(em paralelo)
29
Operação Paralela: Múltiplas threads de
execução em múltiplos processadores
30
Operação Distribuída: Múltiplas threads de
execução em múltiplos processadores,
distantes um do outro (interconectados).
31
Coordenação de Tarefas
Uma das primeiras providências a serem tomadas em um sistema concorrente é
definir o cronograma de alocação dos processos concorrentes, ou seja, definir as
unidades de concorrência para o processador e como estas utilizarão os recursos do
mesmo.
Técnicas Básicas
FIFO (First In First Out): As tarefas utilizam o processador em seqüência, MAS uma
vez que uma tarefa seja alocada no processador ela o usará sem qualquer
interrupção e só irá liberá-lo “voluntariamente”.
a) Regiões Críticas
Determinados trechos de códigos nunca devem ser executados simultaneamente por
dois ou mais processos. Nestas situações a linguagem de programação, ou seu
sistema de software deve possuir mecanismos que evitem situações de conflito.
b) Exclusão Mutua
Uma propriedade que o programa deve possuir para garantir que uma seção crítica
nunca é executada simultaneamente por mais que um processo.
c) Deadlock
Uma situação em que um processo P não pode continuar porque pois está
aguardando pela liberação de recursos destinados a um outro processo, que por sua
vez também não pode continuar pois depende da continuação do processo P.
d) Reentrância
Uma propriedade de um modulo de software que assegura que este pode ser
executado simultaneamente por mais que uma unidade de programa concorrente. 33
e) Segmento de Memória Compartilhada
Região de memória a ser compartilhada para escrita e/ou leitura por duas ou mais
unidade concorrentes.
O uso de memória compartilhada pode agilizar em muito a execução de processos
concorrentes pois elimina a necessidade troca de mensagens/dados por “canais
externos”, contudo não prove qualquer proteção automática do conteúdo da região
compartilhada.
f) Outras Características de um Sistema em Tempo Real que Serão Afetadas por uma
Operação Concorrente
f1) Tempo de Resposta
Uma medida do quão rápido se espera que, após a ocorrência de um dado evento, a
aplicação começará a manipular aquele evento. Esta propriedade deve ser sempre
definida pelo pior caso possível para manipulação do evento.
f2) Tempo de Processamento
Uma medida do quão rápido um evento já percebido pode ser processado. Esta
propriedade deve ser sempre definida pelo pior caso possível.
f3) Cronograma de Alocação de Recursos
Deve assegurar que todas as tarefas atinjam suas deadlines.
f4) Deadline
Um tempo, ou intervalo de tempo, precisamente definido após o qual um certo evento
(fim de uma tarefa, etc) deve ocorrer.
f5) Previsibilidade
Propriedade caracterizada pelo limite superior do tempo de reação (total) a estímulos
externos, de cada tarefa do sistema.
34
Conceitos sobre Sistema Operacional
PROCESSOS
Um conceito fundamental para todos os sistemas operacionais é o de processo.
contador de programa,
o ponteiro para a pilha,
outros registradores de hardware e todas as demais informações necessárias
para executar um programa.
Por exemplo, um processo pode ter, ao mesmo tempo, vários arquivos abertos para
leitura.
Existe um ponteiro, associado a cada um desses arquivos, que indica a posição atual
(isto é, o número do próximo byte ou registro a ser lido).
36
As principais chamadas ao sistema de gerenciamento de processos são aquelas que
lidam com a criação e o término de processos.
Assim que esse processo tiver terminado a compilação, ele executa uma chamada
ao sistema (System Calls) para se autofinalizar.
Outras chamadas ao sistema permitem requisitar mais memória (ou liberar memória
sem uso), esperar que um processo filho termine e sobrepor (overlay) seu programa
a um outro.
37
Ocasionalmente, há a necessidade de levar uma informação para um processo em
execução que não esteja esperando por essa informação.
Por exemplo, um processo que está se comunicando com outro processo em outro
computador envia mensagens para o processo remoto por intermédio de uma rede
de computadores.
Depois de ligar esse temporizador, o programa pode ser retomado e realizar outra
tarefa.
Esse sinal faz com que o processo suspenda temporariamente o que estiver
fazendo, salve seus registradores na pilha e inicie a execução de um procedimento
especial para tratamento desse sinal por exemplo, para retransmitir uma mensagem
presumivelmente perdida.
38
Quando o procedimento de tratamento desse sinal termina, o processo em execução
é reiniciado a partir do mesmo ponto em que estava logo antes de ocorrer o sinal.
Muitas interrupções (traps) detectadas por hardware como tentar executar uma
instrução ilegal ou usar um endereço inválido são também convertidos em sinais
para o processo causador.
Os usuários podem ser membros de grupos, cada qual com uma GID (group
identification - identificação do grupo).
39
Hierarquia Entre Processos
Um processo pode criar outros processos e que podem, por sua vez, criarem
também outros processos de maneira hierárquica.
Quando um processo (Processo pai) cria um outro processo, a este chamamos de
subprocesso ou processo filho, e este subprocesso poderá criar subprocessos que
podem criar outros subprocessos etc... gerando uma arvore hierárquica de
processos.
Este tipo de recurso evita que o usuário tenha que esperar que um processo termine
para que sua requisição seja processada melhorando o desempenho do sistema.
Se a hierarquia de processos possui este benefício, ela consome recursos deste pois
para cada processo será necessário a alocação dos referidos recursos de memória,
buffers, etc, principalmente nos SO's atuais que são multitarefa e muitas vezes são
obrigados a rodarem em maquinas domésticas e de recursos de hardware limitados,
de forma que depois de um certo numero de subprocessos a situação se torna crítica
gerando erros no sistema como podemos ver abaixo:
40
Quando você executa um programa dentro de outro, na verdade você está criando
um subprocesso que é subordinado ao processo principal e assim por diante.
Neste caso imagine um programa que é carregado e neste programa tem uma opção
"Ir para o DOS".
Quando você executar esta opção, será criado mais um subprocesso dentro deste
subprocesso que está sendo executado o referido programa.
Se, dentro deste ambiente do Dos você executar algum outro programa você nada
mais estará fazendo do que criando mais um subprocesso.
41
Comunicação Entre Processos
É comum processos trabalharem concorrendo e compartilhando recursos do
sistema, como arquivos, registros, dispositivos e áreas de memória.
Na verdade o importante é como estes processos irão usar e o que irão fazer com
estes recursos. Um recurso mal usado ou usado indevidamente pode comprometer o
sistema ou o próprio processo gerando falhas como podemos ver abaixo:
42
Para gerenciar este compartilhamento de forma que dois ou mais processos tenham
acesso a um mesmo recurso compartilhado, existe um mecanismo que controla este
acesso, chamado de MECANISMO DE SINCRONIZAÇÃO.
43
Thread's
Para resolver o problema da hierarquia de processos, foi criado o conceito de
"Thread" onde um processo pode efetuar varias operações concorrentemente ou
simultaneamente através das chamadas "Linhas de execução".
Neste caso, o processo é dividido no numero de Threads sem que haja necessidade
de ser criado um outro.
Desde que a IBM começou a promover o seu sistema operacional OS2 2.0 em 1991,
ouvimos falar de "threads" e software "Multi-thread". Mas o que é este recurso?
Por exemplo, enquanto uma Thread espera por uma operação de I/O, outra Thread
pode ser executada.
Cada Thread tem seu próprio conjunto de registradores mas todas elas
compartilham o mesmo espaço de endereçamento pois lembre-se que o processo é
um só.
44
Um programa "Multi-thread" pode estar sendo executado em vários locais ao mesmo
tempo.
E qual a vantagem disso? Vamos supor que um programa deseje imprimir um relatório.
O usuário não poderá emitir novos comandos, inserir um novo registro por exemplo,
enquanto a impressão não terminar.
Um programa "Multi-thread" pode iniciar uma "Thread" para imprimir enquanto os resto
do programa continua funcionando.
A diferença é que o MultiTarefa requer que seja iniciado um outro processo caso se
deseje a execução simultânea.
Isto aumenta bastante a complexidade dos aplicativos e traz uma grande perda de
performance.
Para efetuar troca de informações entre duas Threads de um mesmo programa, basta
utilizar uma variável comum.
45
Entre programas devem ser utilizados recursos mais sofisticados como arquivos
comuns, filas, etc. As várias threads podem ser codificadas em um mesmo fonte.
Iniciar uma Thread é uma tarefa barata para o sistema operacional, bem mais
simples do que carregar um outro processo.
Além disto, a troca de execução entre threads de um mesmo programa é feita com
um mínimo de desperdício.
46
Exemplo de uma thread, duas seções de copia de arquivos no Explorer são iniciadas
simultaneamente. Isto somente é possível porque cada seção corresponde a uma thread .
47
Uma interessante exemplo de como usar threads são as Dll's, procedimento este
conhecido como API.
Por exemplo, no ambiente Windows, um aplicativo qualquer chama uma DLL através
de um pedido de um recurso para o qual foi definida uma associação DLL/função.
O sistema operacional aloca este pedido recebido em uma thread, que ficará em
uma fila de espera.
Quando chegar sua vez, será criada para ela, uma estrutura de dados sobre o
pedido e este então começará a ser executado.
48
A chamada a um programa é substituída pelo carregamento de um objeto
compartilhado (DLL) que normalmente é feito somente uma vez.
Cada pedido tem seu próprio ECB alocado e estes não se comunicam entre si em
hipótese alguma.
Outra grande diferença entre as threads e os processos é que cada processo tem
seu próprio espaço de endereçamento enquanto N threads compartilham um espaço
de endereçamento de um único processo, otimizando o sistema e consumindo
menos recursos dele, mas ai aparece também a grande desvantagem deste recurso
pois, por causa desta característica (serem executadas no mesmo espaço de
endereçamento), elas compartilham este espaço sem nenhuma proteção ou
restrição o que permite que uma Thread possa alterar dados de uma outra ou vice
versa.
49
Com base nesta informação, você pode concluir que para que uma aplicação possa
funcionar eficientemente com threads, é preciso que haja mecanismos de
sincronização robustos e consistentes e que possam ter controle total sobre a fila de
threads que acessarão as funções e os recursos globais do servidor pois, um bug ou
um erro lógico de programação, pode criar um conflito entre duas ou mais Threads
que acabaria detonando todas as outras e consequentemente derrubar o processo.
50
Quando utilizar multitarefa
É vantajoso para um processo ter múltiplas threads em situações onde a aplicação
tem várias tarefas concorrentes. Por exemplo, uma aplicação que abre mais de uma
“janela” pode ter uma thread dedicada realizando o trabalho da aplicação associada
a cada janela.
Por exemplo, uma thread de alta prioridade manipula tarefas com tempo crítico, e
uma thread de baixa prioridade realiza outras tarefas.
51
Geralmente, é mais eficiente para uma aplicação, implementar multitarefa pela
distribuição de tarefas entre as threads de um único processo do que pela criar múltiplos
processos.
O sistema pode criar e executar threads mais rapidamente do que ele pode criar
processos, primeiramente porque o código para as threads já foi mapeado no espaço de
endereço do processo, enquanto o código para o novo processo precisa ser carregado;
Tanto para múltiplas threads quanto para múltiplos processos existem custos e riscos a
serem considerados:
52
Com múltiplas threads acessando os mesmos recursos, é necessário sincronizar as
mesmas para evitar conflitos.
53
Scheduling (escalonamento)
O scheduler do sistema controla a multitarefa determinando qual das threads
receberá o próximo time slice do processador.
Se o contador vai para zero, o scheduler determina qual será a próxima thread a
executar.
Quando o nível de prioridade mais alto é compartilhado por mais de uma thread
executável, o próximo time slice irá para a thread que está no topo fila de
prioridades.
A thread que terminou sua execução é colocada no final da fila de threads com sua
respectiva prioridade.
54
Threads que estão suspensas ou bloqueadas (por exemplo, esperando por um
semáforo ou uma entrada) não são executáveis, ou seja, até as mesmas se
tornarem desbloqueadas o scheduler não alocará qualquer tempo do processador
para as mesmas, independente de suas prioridades.
Quando o scheduler fornece o próximo time slice para uma outra thread, o contexto
da thread em execução é salvo e o estado da máquina é ajustado de acordo com o
contexto da próxima thread executável.
55
Deadlock
Quando estão interagindo, dois ou mais processos podem, algumas vezes, entrar
em uma situação da qual eles não conseguem sair. Essa situação é chamada
deadlock.
- Um processo além dos recursos já alocados, pode estar esperando por outros
recursos.
- Um processo pode ter de esperar por um recurso alocado a outro processo e vice-
versa (Espera circular).
56
Na abordagem dos problemas de comunicação entre processos, são usados
algoritmos nos programas que incorporam o mecanismo de sincronização e
gerenciam este acesso.
Para que sejam evitados problemas desta natureza, onde dois processos manipulem
o mesmo arquivo ou a mesma variável de memória simultaneamente, enquanto um
processo estiver acessando determinado recurso, todos os outros que queiram
acessar esse mesmo recurso deverão esperar. Isso se chama EXCLUSÃO MUTUA.
A exclusão mútua deverá agir apenas sobre os processos que estão concorrendo
em um determinado recurso.
Nesta região existe uma serie de procedimentos e protocolos que o programa deverá
fazer para que o sistema operacional libere o recurso para o mesmo.
A região critica deve ser sempre usada quando seu programa for fazer uso de
recursos que são passiveis de compartilhamento com algum outro suposto programa
na memória.
57
É nela também que os processos encontram-se em um momento mais critico, pois qualquer
erro ocorrido ali dentro pode fazer com que dois ou mais processos colidam gerando falhas e
derrubando o sistema .
58
PROBLEMAS DE SINCRONIZAÇÃO
A tentativa de implementar a exclusão mútua nos programas traz alguns problemas
com sincronização.
Um gargalo gerado pela consistência dos processos onde o mais rápido ficará
limitado à velocidade do mais lento. Conseqüência disto, o sistema todo fica lento
comprometendo o seu desempenho.
59
Sincronização condicional:
Quando um recurso não está pronto para ser utilizado, o processo que vai acessar o
recurso ficará em estado de espera até que o mesmo esteja pronto.
Existe o risco deste recurso nunca ficar pronto por já estar com problemas.
Um exemplo disto é o caso do uso de Buffers para leitura e gravação de dados feita
pelos processos. Uma possível falha na memória que impeça o acesso aos buffers e
todo o sistema está parado...
60
SOLUÇÕES DE HARDWARE
Também o hardware traz algumas soluções que ajudam a diminuir o problema da
exclusão mútua dos processos:
Desabilitação de interrupções:
Faz com que o processo, antes de entrar em sua região crítica desabilite todas as
interrupções externas e a reabilite após deixar a região critica.
Instrução Test-And-Set:
Na espera ocupada, todas vezes que um processo tenta entrar em sua região crítica
ele são impedidas por já existir um outro processo usando o recurso, fazendo o
sistema ficar parado esperando que o mesmo tenha acesso a este respectivo
recurso tais como.
Semáforos e Monitores
62
Semáforos
O semáforo é uma variável que fica associada a um recurso compartilhado,
indicando quando este está sendo acessado por um outro processo.
Ela terá seu valor alterado quando o processo entra e quando sai da região crítica
de forma que se um outro processo entrar em sua região critica ele possa checar
antes este valor para saber se o recurso esta ou não disponível.
Quando o processo tiver seu acesso impedido, ele será colocado em uma fila de
espera associada ao semáforo aguardando sua vez de utilizar o recurso. Todos os
processos da fila terão acesso ao recurso na ordem de chegada.
63
SEMÁFORO CONTADOR , chamado de mutex (mutual exclusion), exclusão
mutua é aquele que notifica os processos sobre o uso dos recursos.
Este semáforo é útil para evitar que um processo na região crítica sem que hajam
recursos disponíveis no sistema.
64
Monitores
São mecanismos de sincronização compostos de um conjunto de procedimentos,
variáveis e estrutura de dados definidos dentro de um módulo cuja finalidade é a
implementação automática da exclusão mútua entre seus procedimentos. Somente
um processo pode estar executando um dos procedimentos do monitor em um
determinado instante.
Para isto ele irá colocar todas as regiões críticas do programa em forma de
procedimentos no monitor e o compilador se encarregará de garantir a exclusão
mútua destes procedimentos.
65
Como ele é escrito em uma linguagem de programação, o compilador das outras
demais linguagens deverão ser capazes de reconhecê-la e implementa-la.
São raras as linguagens que permitem tal implementação criando uma limitação para
o uso deste recurso.
Troca de mensagens:
Caso o transmissor não receber esta mensagem em um certo espaço de tempo ele
irá retransmitir esta mensagem.
66
A comunicação entre processos pode ser feita diretamente.
67
Prevenção do Deadlock:
Para prevenir o Deadlock é preciso garantir que uma das quatro condições abaixo
citada nunca ocorra, dentre as diversas situações já citadas pode ser feito um
minucioso trabalho de determinar muito bem que recursos, quais recursos e quando
estes recursos deverão ser disponibilizados aos processos.
Detecção do Deadlock:
Em sistemas que não possuam mecanismos que previnam a ocorrência de
deadlocks, é necessário um esquema de detecção e correção do problema.
68
Um Exemplo deste tipo de detector é o próprio Gerenciador de tarefas do Windows
que detecta o aplicativo que parou de responder ao sistema causado, possivelmente,
69
Correção do Deadlock:
Este aplicativo pode estar em um processo de Deadlock, neste caso você manda
finalizar o aplicativo e tudo voltará ao normal.
Muitas vezes este mecanismo não resolve e pelo contrário gera novos problemas.
Se você finalizar um processo que esteja intimamente envolvido com o sistema
operacional ou que esteja usando recursos de baixo nível do mesmo, você poderá vir
a deixa-lo instável ou travado.
Abaixo vemos a caixa de dialogo do Windows que tentará fechar o processo que
pode estar parado por falta de comunicação com o sistema.
70
O problema do Deadlock é um problema que tende a tornar-se mais critico à medida
que os sistemas operacionais evoluem no sentido de implementar o paralelismo e
permitir a alocação dinâmica de um numero maior de recursos e a execução de um
numero maior de processos simultaneamente.
Os usuários sentem muita saudade dos computadores que rodavam o DOS nos
bons tempos quando quase não davam problemas.
Muitos destes programas trabalham não só com um, mas com vários processos
simultaneamente o que aumentam as chances de colisões entre eles ou com os
recursos do sistema.
71
Alterando
a prioridade de um processo
Você já deve ter trabalhado com programas pesados. Edição de vídeo é um caso
clássico.
Como regra geral, qualquer operação de codificação de vídeo e áudio tende a exigir
todo o tempo livre do processador.
Por exemplo, podemos precisar fazer uma consulta à Internet, ler e-mails, processar
textos.
Na maioria das vezes, mesmo tarefas leves que não chegariam a consumir 10% de
uso do processador ficam extremamente lentas porque um trabalho pesado está
consumindo 100%.
72
A idéia é configurar uma prioridade menor para a tarefa pesada que está quase
monopolizando o uso do processador.
Desta forma, tarefas mais leves de primeiro plano poderão ser executadas com
prioridade, e somente nos momentos de ociosidade seria executada a tarefa pesada.
Se uma tarefa leve em primeiro plano ocupar 20% de uso do processador, por
exemplo, uma tarefa pesada em segundo plano terá praticamente 80% do tempo do
processador.
Este programa tende a usar 100% do processador, mas opera com prioridade
mínima.
73
A maioria dos programas pesados entretanto não é tão “gentil” assim, e tendem a
usar 100% do tempo do processador com prioridade alta, tornando praticamente
inviável o uso de outros programas simultaneamente.
Clique-o então com o botão direito do mouse e escolha no menu a opção Definir
prioridade. Mude-a de “Normal” para “Abaixo da normal”.
O programa passará então a ficar sempre em último lugar na fila para uso da CPU.
Apenas quando nenhum outro programa precisar usar o processador, o programa
pesado será executado.
Para entender como esta mudança de prioridade funciona é preciso levar em conta
que o tempo do processador é dividido em pequenos intervalos de alguns milésimos
de segundo.
Todos os processos em execução ficam em uma fila para receber um time slice.
74
Por exemplo, ao usar um editor de texto, durante o pequeno intervalo de tempo entre
a digitação de dois caracteres consecutivos, o processador pode “congelar”
momentaneamente o editor para dedicar time slices para outros processos.
O programa pesado que antes monopolizava o uso da máquina agora será o último
a obter time slices.
Como durante o uso de programas comuns, existem muitos time slices livres (não
existem programas requerendo atenção imediata do processador), sobrará muito
tempo livre para a execução do programa pesado, mas sem tornar a máquina lenta.
75
76