Вы находитесь на странице: 1из 76

Ciência da Computação

SISTEMAS OPERACIONAIS I (SO)

Prof(a) Marta Pina


Sistema Computacional
 Um sistema computacional moderno consiste em um ou mais processadores,
memória principal, discos, impressoras, teclado, monitor, interfaces de rede e outros
dispositivos de entrada e saída. Enfim, é um sistema complexo.

 Desenvolver programas que mantenham o controle de todos esses componentes e


os utilizem corretamente de maneira otimizada é um trabalho extremamente difícil.

 Por isso, os computadores têm um dispositivo de software denominado sistema


operacional, cujo trabalho é gerenciar esses componentes e fornecer aos
programas do usuário uma interface com o hardware mais simples.

 A área de atuação do sistema operacional é mostrada na tabela abaixo.

Reserva de Visualizador Programas de aplicação


Sistema
passagens Web
bancário
aéreas
Interpretador
Compiladores Editores
de comandos Programas do Sistema
Sistema operacional
Linguagem de máquina
Microarquitetura Hardware
Dispositivos físicos
2
 Na parte inferior está o hardware, que em muitos casos é ele próprio composto de
dois ou mais níveis (ou camadas).

 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.

 Sua construção e seu funcionamento são atribuições da engenharia elétrica.

 Em seguida vem o nível de microarquitetura, no qual os dispositivos físicos são


agrupados em unidades funcionais.

 Normalmente, esse nível contém alguns registradores internos à CPU (unidade


central de processamento) e um caminho dos dados (data path) contendo uma
unidade lógico-aritmética.

 Em cada ciclo de máquina, um ou dois operandos são trazidos aos registradores e


combinados na unidade lógico-aritmética .

 O resultado é armazenado em um ou mais registradores.

 Em algumas máquinas, a operação do caminho dos dados é controlada por um


software denominado microprograma. Em outras, é controlado diretamente por
circuitos de hardware.

 A função do caminho dos dados é executar um determinado conjunto de instruções.


Algumas dessas instruções podem ser executadas em um ciclo de caminho dos
dados; outras podem necessitar de múltiplos ciclos.
3
 Essas instruções podem usar registradores ou outros recursos do hardware. Juntos,
o hardware e as instruções visíveis a um programador de linguagem de montagem
formam o nível ISA (instruction set architecture arquitetura do conjunto de
instruções).

 Esse nível é muitas vezes denominado linguagem de máquina.

 A linguagem de máquina tem, em geral, entre 50 e 300 instruções.

 A maioria delas serve para mover os dados por meio da máquina, fazer operações
aritméticas e comparar valores.

 Nesse nível, os dispositivos de entrada e saída são controlados carregando-se


valores em registradores de dispositivo.

 Por exemplo, principal, contador de bytes e a direção (leitura ou escrita) em seus


registradores.

 Na prática, vários outros parâmetros são necessários e o status que retoma à


unidade leitora depois de uma operação é bastante complexo.

 Além disso, para muitos dispositivos de E/S (entrada/ saída) a temporização


desempenha um papel fundamental na programação.

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.

 No topo do sistema operacional situa-se o restante do software do sistema.

 Nele encontramos o interpretador de comandos (também conhecido como shell), os


sistemas de janelas, os compiladores, os editores e os programas similares
independentes de aplicação.

5
 É importante notar que esses programas não constituem partes definitivas do
sistema operacional, mesmo que sejam normalmente fornecidos pelo fabricante do
computador.

 O sistema operacional é (normalmente) aquela parte do software executada em


modo supervisor ou modo núcleo (no caso, a parte mais interna de um sistema
operacional).

 Ele é protegido dos usuários pelo hardware

 Os compiladores e os editores são executados em modo usuário.

 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.

 Essa distinção, contudo, é às vezes confusa em sistemas embarcados que podem


não ter um modo núcleo) ou sistemas interpretados (como sistemas operacionais
baseados em Java, que usam interpretação, e não hardware, para separar os
componentes).

 Além disso, em computadores tradicionais, o sistema operacional é o que se executa


em modo núcleo.

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.

 Em alguns sistemas, essa idéia é levada ao extremo, e parte do que é


tradicionalmente tido como sistema operacional (como o sistema de arquivos) é
executado em espaço do usuário.

 Nesses sistemas, é difícil definir um limite claro.

 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.

 Provedores de acesso à Internet utilizam várias máquinas servidoras para dar


suporte a seus clientes.

 Sistemas operacionais típicos de servidores são Unix e Windows Server e Linux

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.

 Se as ações precisam necessariamente ocorrer em determinados instantes (ou em


determinado intervalo de tempo), tem-se então um sistema de tempo real crítico.

 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.

 Um computador de mão ou PDA (personal digital assistant) é um pequeno


computador que cabe em um bolso de camisa.

 Sistemas embarcados são executados em computadores que controlam dispositivos


que geralmente não são considerados computadores, como aparelhos de TV, fomos
de microondas e telefones móveis.

 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.

 Exemplos desses sistemas operacionais são o PalmOS e o Windows CE (consumer


electronics).

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.

 Possuem restrições severas de consumo de energia e de memória.


 Alguns deles podem realizar apenas uma única função, como pagamentos
eletrônicos, mas outros podem tratar múltiplas funções no mesmo cartão inteligente.

 São comumente sistemas proprietários.

 Alguns cartões inteligentes são orientados a Java.

 Isso significa que a ROM do cartão inteligente contém um interpretador para a


máquina virtual Java (Java virtual machine - JVM).

 As pequenas aplicações Java (applets) são carregadas no cartão e interpretadas


pelo JVM.

 Alguns desses cartões podem tratar múltiplas applets Java ao mesmo tempo,
acarretando multiprogramação e a conseqüente necessidade de escalonamento.

 O gerenciamento de recursos e a proteção são também um problema quando duas


ou mais applets estão presentes simultaneamente. Esses problemas dever ser
tratados pelo sistema operacional contido no cartão.

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

Windows CE Versão dos Windows para computadores de


mão com rede sem fio; Mais enxuto;

Windows NT/2000 32-bit; Interface gráfica; Multiprogramação;


Servidor;

Windows 95/98/ME 32-bit; Interface gráfica;


Win98 com suporte à rede e
Multiprogramação;
Windows Server/XP 32-bit e 64-bit; Alta performance;
Multiprogramação; Rede; Servidor;

13
Arquitetura Básica do Hardware de
Computadores Padrão IBM- PC:
Microprocessadores, Microcontroladores e Dispositivos I/O.

 A – CPU, Memória e I/O

 Sistemas de mapeamento de memória e I/O permitem que a CPU acesse tais


 dispositivos sem que seja necessária sua intervenção direta.

 Ou seja, a CPU apenas define o endereço desejado e o tipo de operação requerida


(leitura ou escrita).

 O sistema de decodificação se encarregará de “apontar” o dispositivo e permitir que


a CPU seja capaz de ler ou enviar dados àquele dispositivo.

 A figura a seguir mostra um diagrama de blocos típico dos sistemas computacionais


atuais.

14
A – CPU, Memória e I/O

 Observe que, neste caso, o sistema de decodificação transforma os dispositivos I/O


(outros que não a memória) em locações de memória virtual.

 Em outras palavras, a CPU não pode definir se o dispositivo endereçado é uma


memória ou um outro dispositivo qualquer.
 Cabe então ao projetista tomar as necessárias precauções para certificar-se de que
o dispositivo correto será acessado pela CPU.

 Toda transferência de dados entre os dispositivos I/O e a CPU, entre a CPU e a


memória e entre I/O e memória deve necessariamente ser controlada pela CPU, e
portanto existirão limites máximos de velocidade (impostos pela velocidade da CPU,
tempo de execução das instruções do programa, etc) para transferência de dados
entre dispositivos.

 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).

 É função do controlador de DMA assegurar que apenas um dispositivo tenha acesso


aos barramentos de dados e endereço num dado momento.

 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.

 O endereço (posição) no vetor de interrupções depende do número da interrupção


recebida.

 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”.

 O código da interrupção é normalmente concluído com uma instrução de retorno


(Interrrupt RETURN = IRET).

 Neste ponto o valor no topo da pilha será desempilhado e colocado no PC (note


então que o código da interrupção deve deixar a pilha exatamente como era no início
de sua execução).
 A execução do programa original é então retomada.

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

 Nem todo sistema em tempo real é baseado em microcomputadores e


microprocessadores, muitos são sistemas dedicados a tarefas específicas e, em
geral, utilizam- se microcontroladores como elemento principal.

 Os microcontroladores são sistemas computacionais programados via


microinstruções específicas. Contudo, não suportam, em sistema de decodificação
de macro-instruções muito complexo e, portanto, o tempo execução dos programas
tende a ser muito pequeno.

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

 O que acontecerá se durante a execução de T1 ocorrer um evento que deve ser


manipulado por T5? O evento deve esperar até que o segmento T5 se torne ativo, o
que pode demorar até 550ms.
 Uma possível solução seria executar concorrentemente as tarefas anteriores.
 Na concorrência cada tarefa será alocada num processador único por um período de
tempo curto (por exemplo 10 ms), e depois retirada para que uma nova tarefa possa
ser alocada no processador.
23
 Observe que agora devemos mudar nosso “programa” para uma linguagem que
permita a execução daquelas 5 tarefas. Por exemplo:
Concorrente
loop T1
T1 – 100 ms
end loop T1
loop T2
T2 – 150 ms
end loop T2
loop T3
T3 – 50 ms
end loop T3
loop T4
T4 – 250 ms
end loop T4
loop T5
T5 – 100 ms
end loop T5

 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.

 Sistema Paralelo: Um sistema computacional no qual instruções em threads


separadas podem ser executadas simultaneamente.

 Sistema Distribuído: Um sistema computacional no qual instruções em threads


 separadas podem ser executadas simultaneamente, mas não se pode medir um
“tempo global de execução”.

 Threads são unidades de um trecho menor que um processo, ou ainda, são as


entidades básicas para as quais o sistema operacional aloca o tempo da CPU

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”.

 Round Robin: As tarefas utilizam o processador em seqüência, MAS apenas por um


período de tempo pre-determinado chamado time slice, após o qual a tarefa atual é
removida e uma próxima tarefa passa a utilizar o processador. Aquela que acabou
de ser removida vai para o fim da seqüência (fila) e aguarda a próxima “chance” de
utilizar o processador.

 Priority-Based: As tarefas utilizam o processador dependendo de seu nível de


prioridade. Uma tarefa utiliza o processador continuamente até que uma outra tarefa
de maior prioridade esteja pronta para operar.
 Prioridade: Nível de urgência definido para uma tarefa. Assim, pode-se ganhar o
 controle de um certo recurso antes de se completar a transação corrente
(Preemption).

 Rate-Monotonic: Uma técnica baseada em prioridades (Priority-Based) para tarefas


periódicas. A prioridade de cada tarefa é determinada de acordo com o seguinte
princípio: Quanto menor o período de execução de uma tarefa, maior será sua 32
prioridade.
Considerações Básicas Para
Manipulação de Sistemas Concorrentes
 A manipulação de tarefas concorrentes pode, por vezes, se tornar bastante
complicada devido a um grande número de fatores que devem ser levados em
consideração para uma operação segura e correta.
 Descreve-se a seguir alguns aspectos fundamentais a serem observados.

 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.

 Um processo é basicamente um programa em execução.

 Associado a cada processo está o seu espaço de endereçamento, uma lista de


posições de memória, que varia entre uma quantidade mínima (normalmente 0
posição) e uma quantidade máxima de posições que esse processo pode ler e
escrever.

 O espaço de endereçamento contém o programa executável, os dados do programa


e sua pilha.

 Também associado a cada processo está um conjunto de registradores, que inclui o

 contador de programa,
 o ponteiro para a pilha,
 outros registradores de hardware e todas as demais informações necessárias
para executar um programa.

 Periodicamente, o sistema operacional decide parar de executar um processo e


iniciar a execução de outro porque, por exemplo, o primeiro havia excedido seu
tempo de compartilhamento da CPU.
35
 Quando um processo é suspenso temporariamente dessa maneira, ele deverá ser
reiniciado mais tarde, exatamente do mesmo ponto em que ele estava quando foi
interrompido.

 Isso significa que todas as informações relativas ao processo devem estar


explicitamente salvas em algum lugar durante a suspensão.

 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).

 Quando um processo é suspenso temporariamente, todos esses ponteiros devem


ser salvos de .forma que uma chamada read, executada após o reinício desse
processo, possa ler os dados corretamente.

 Em muitos sistemas operacionais, todas as informações relativas a um processo -


que não sejam o conteúdo de seu próprio espaço de endereçamento - são
armazenadas em uma tabela do sistema operacional denominada tabela de
processos, que é um vetor (ou uma lista encadeada) de estruturas, uma para cada
processo existente.

 Assim, um processo (suspenso) é constituido de seu espaço de endereçamento,


normalmente chamado de imagem do núcleo e em sua entrada na tabela de
processos, a qual contém seus registradores, entre outras coisas.

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.

 Considere um exemplo típico: um processo denominado interpretador de


comandos ou shell lê os comandos de um terminal.

 O usuário acaba de digitar um comando pedindo que um programa seja compilado.

 O shell deve então criar um novo processo, o qual executará o compilador.

 Assim que esse processo tiver terminado a compilação, ele executa uma chamada
ao sistema (System Calls) para se autofinalizar.

 Se um processo pode criar um ou mais processos (chamados processos filhos), e


se esses processos, por sua vez, puderem criar outros processos filhos, rapidamente
chegaremos a uma estrutura de árvores

 Processos relacionados que estiverem cooperando para executar alguma tarefa


precisam freqüentemente se comunicar um com o outro e sincronizar suas
atividades.

 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.

 Para se prevenir contra a possibilidade de que uma mensagem ou sua resposta se


perca, o processo emissor pode requisitar que seu próprio sistema operacional
notifique-o após um determinado número de segundos, para que possa retransmitir a
mensagem se nenhuma confirmação (acknowledgement) enviada pelo processo
receptor tiver sido recebida.

 Depois de ligar esse temporizador, o programa pode ser retomado e realizar outra
tarefa.

 Decorrido o número especificado de segundos, o sistema operacional avisa o


processo por meio de um sinal de alarme.

 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.

 Sinais são os análogos em software das interrupções em hardware e podem ser


gerados por diversas causas além da expiração de um temporizador.

 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.

 A cada pessoa autorizada a usar um sistema é atribuída uma UID (user


identification - identificação do usuário) pelo administrador do sistema.

 Todo processo iniciado tem a UID de quem o iniciou.

 Um processo filho tem a mesma UID de seu processo pai.

 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.

 Imagine a situação em que o Command.com é executado dentro do processo


principal e os programas, que serão executados no prompt do DOS, em
subprocessos.

 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.

 Não confunda hierarquia de processos com multiprocessamento.

 O ambiente de multiprocessamento é aquele ambiente onde vários processos


podem ser executados ao mesmo tempo, o chamado "Multitarefa"

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:

 Um dos exemplos é de dois processos concorrentes que trocam informações através


de operação de gravação e leitura em um Buffer.
 Um processo só poderá gravar dados no Buffer caso ele não esteja cheio, da mesma
forma, um processo só poderá ler dados armazenados no Buffer se existir algum
dado a ser lido.

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.

 Este mecanismo tem o propósito de garantir a confiabilidade e a integridade da


gravação dos dados, evitando que os dados armazenados fiquem sem consistência.

 Como exemplo dois processos efetuando operações de gravação, de dados


diferentes, em disco exatamente no mesmo setor ou no mesmo arquivo.

 Esta situação se torna mais crítica ainda em sistemas operacionais


MULTIPROGRAMÁVEIS.

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?

 Threads compartilham o processador da mesma maneira que um processo.

 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ó.

 As Threads passam pelos mesmos estados de espera que o processo, ou seja,


Running, ready, wait.

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.

 Enquanto o programa estiver enviando os dados para a impressora, a execução dele


estará bloqueada.

 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.

 Mas qual a diferença de "Multi-thread" para MultiTarefa?

 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.

 Múltiplos processos exigem a quebra do projeto em vários executáveis.

 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.

 Diversos fornecedores oferecem API's proprietárias que permitem que outros


aplicativos sejam ampliados de uma maneira mais eficiente.

 Utilizando este método, a lógica é implementada por meio de um conjunto de


funções de aplicativos que são empacotadas como bibliotecas compartilhadas na
forma de DLL (Dynamic Linked Library) no ambiente Windows ou um SO (Shared
Object) no ambiente UNIX/LINUX e que permitem, às funções do aplicativo, o
acesso direto às estruturas de dados do sistema Operacional.

 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.

 Quando estiver completo, a thread será retornada ao pool de threads gerenciadas,


até que sejam necessárias novamente.

 Normalmente esta técnica tem um desempenho de até 5 vezes superior ao de um


processo comum. A razão disto é muito simples.

48
 A chamada a um programa é substituída pelo carregamento de um objeto
compartilhado (DLL) que normalmente é feito somente uma vez.

 Depois disto, este objeto permanece dentro do espaço de endereço do sistema


operacional, e as sobrecargas se restringem às chamadas de função.

 À estrutura de dados sobre o pedido, fornecida pelo sistema operacional para se


comunicar com o objeto compartilhado, recebe o nome de ECB (EXTENSION
CONTROL BLOCK) e consiste em um conjunto de variáveis, tanto de ambiente
como oriundas do pedido e funções de chamada para suporte à geração da
resposta.

 Cada pedido tem seu próprio ECB alocado e estes não se comunicam entre si em
hipótese alguma.

 Em outras palavras, um ECB é a forma que o sistema operacional tem de


compartilhar entre as threads, o conjunto de variáveis ambientes e também de
disponibilizar dados que somente interessarão ao pedido sem que outro pedido
tenha acesso à estes.

 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.

 O uso de múltiplas threads pode ser um modo conveniente de estruturar um


programa que realiza várias tarefas similares ou idênticas.

 Como exemplo, podemos citar o uso de múltiplas threads em processos que


realizam ações como:
 Manipulação de entradas para múltiplas janelas.
 Gerenciamento da entrada de diversos dispositivos de comunicações.
 Distinção entre tarefas de prioridades diferentes.

 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.

As razões básicas para isto são:

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;

 Todas as threads de um processo compartilham o mesmo espaço de endereço e


podem acessar as variáveis globais do mesmo, o que simplifica a comunicação entre as
threads;

 Todas as threads de um processo podem usar handles(manusear) abertos para


recursos tais como arquivos e pipes(Sincronizar recursos compartilhados).

Tanto para múltiplas threads quanto para múltiplos processos existem custos e riscos a
serem considerados:

O sistema consome memória para as estruturas requeridas pelos processos e threads.


Manter um grande número de threads consome tempo da CPU.

52
 Com múltiplas threads acessando os mesmos recursos, é necessário sincronizar as
mesmas para evitar conflitos.

 Se a sincronização de múltiplas threads não estiver correta (em um ou vários


processos) podem ocorrer problemas tais como deadlock e race conditions(condição
de Competição).

 Em geral os sistemas operacionais (como a API -aplication program Interface -


Win32) e algumas linguagens de programação fornecem um conjunto de objetos de
sincronização e funções que podem ser usadas para coordenar múltiplas threads.

53
Scheduling (escalonamento)
 O scheduler do sistema controla a multitarefa determinando qual das threads
receberá o próximo time slice do processador.

 Cada time slice consiste de um número fixo de pulsos de clock.

 O scheduler do Windows é preemptivo, ganhando controle sempre que uma


interrupção de clock ocorre e decrementando o contador de pulsos de clock
restantes no time slice da thread que está em execução.

 Se o contador vai para zero, o scheduler determina qual será a próxima thread a
executar.

 O scheduler mantém uma fila de threads executáveis em cada nível de prioridade.

 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.

 O Deadlock existe em qualquer sistema multiprogramável. Dizemos que um


processo está em Deadlock quando este para de responder porque está esperando
por um evento que nunca ocorrerá.

 Esta situação é conseqüência do problema da exclusão mútua.

 Existem as condições onde o Deadlock irá ocorrer:

 - Cada recurso só pode estar alocado a um único processo em um determinado


instante. (Exclusão mútua)

 - Um processo além dos recursos já alocados, pode estar esperando por outros
recursos.

 - Um recurso não pode ser liberado de um processo porque outros processos


desejam o mesmo recurso (Não-preempção)

 - 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.

 Um bom exemplo disto é quando desenvolvemos programas para trabalharem em


rede onde você precisará fazer o bloqueio de um arquivo para usa-lo impedindo
assim que outra estação de trabalho manipule aquele mesmo arquivo no momento
em que você estiver usando-o.

 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.

 Quando desenvolvemos um programa, que faça tratamento de exclusão mutua, este


deverá terá uma seção chamada REGIÃO CRÍTICA.

 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 .

figura abaixo mostra uma falha ocasionada quando um processo


apresentou problemas e acabou interferindo no funcionamento de outro:

58
PROBLEMAS DE SINCRONIZAÇÃO
 A tentativa de implementar a exclusão mútua nos programas traz alguns problemas
com sincronização.

 As mais freqüentes são:

 Velocidade de execução dos processos:

 Um dos problemas causados pela exclusão mutua é quando um processo mais


rápido é obrigado à esperar que um lento use o recurso e o libere.

 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.

 Quem determina as prioridades dos processos é o sistema operacional. Neste caso


existem duas formas do sistema operacional determinar qual será a vez de quem.
Ou por escolha aleatória ou por prioridades.

 Quando a escolha é aleatória, existirá a probabilidade de um processo nunca ser


escolhido, quando for uma escolha por prioridades, um processo de menor
prioridade nunca receberá o acesso ao recurso, e ai este processo nunca executará
sua rotina.

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.

 Ai todo o sistema fica esperando o Recurso resolver sua vida.

 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.

 Este mecanismo também traz seus inconvenientes.

 Se um processo entrou na região crítica e desabilitou todas as interrupções ao sair


dela ele deverá HABILITÁ-LAS novamente sob risco de todo o sistema estar
comprometido.

 Instrução Test-And-Set:

 Instrução especial onde um processo apenas lê o conteúdo de uma variável, e


armazena seu valor em outra área podendo neste caso fazer todas as manipulações
necessárias e devidas sem precisar de prioridades ou esperar que a variável original
seja liberada.
61
SOLUÇÕES DE SOFTWARE
 Além da exclusão mútua, que soluciona os problemas de compartilhamento de
recursos, existem outros fatores fundamentais para a solução de problemas de
sincronização:

 - O número de processadores e o tempo de execução dos processos.


 - Um processo fora de sua região crítica não pode impedir que outros processos
entrem em suas próprias regiões críticas.
 - Um processo não pode permanecer indefinidamente esperando para entrar em sua
região crítica.

 Todas as soluções que foram apresentadas para contornar estes inconvenientes


apresentavam problemas da ESPERA OCUPADA,

 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.

 O semáforo pode ser usado também para implementar sincronizações condicionais.


Isto consiste em um processo que necessita ser notificado sobre a ocorrência de um
evento. Pode-se usar o semáforo para notificar este processo sobre a ocorrência
deste evento.

 Outro tipo de semáforo usado é SEMÁFORO CONSUMIDOR onde ele pode


informar ao processo se o buffer está cheio ou está vazio.

63
 SEMÁFORO CONTADOR , chamado de mutex (mutual exclusion), exclusão
mutua é aquele que notifica os processos sobre o uso dos recursos.

 Sempre que um processo usa um recurso qualquer, este semáforo é incrementado


sempre que um processo liberar um recurso ele será decrementado.

 Este semáforo é útil para evitar que um processo na região crítica sem que hajam
recursos disponíveis no sistema.

 O uso de semáforos exige do programador muito cuidado, pois qualquer engano


pode gerar bugs em seu programa que o levem a falhas de sincronização
ocasionando quedas e travamento geral do 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.

 Toda vez que um processo chamar um destes procedimentos, o monitor verifica se


já existe outro processo executando algum procedimento do monitor. Caso exista, o
processo fica aguardando a sua vez ate que tenha permissão para executa-lo.

 A implementação da exclusão mútua nos monitores é realizada pelo compilador do


programa e não mais pelo programador.

 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.

 A comunicação do processo com o monitor passa a ser feita através de chamadas a


seus procedimentos e dos parâmetros passados para eles.

 Outra característica do monitor é que os processos, quando não puderem acessar


estes procedimentos, ficarão aguardando em uma fila de espera e enquanto isto,
eles poderão executar outros 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:

 A troca de mensagens é um mecanismo de comunicação e sincronização entre os


processos, implementado pelo sistema operacional através de duas rotinas do
sistema SEND e RECEIVE.

 A rotina SEND é a responsável pelo envio de uma mensagem para o processo


receptor enquanto a rotina RECEIVE por receber a mensagem do processo
transmissor.

 Tais procedimentos mesmo não sendo mutuamente exclusivos permitem a


comunicação entre os processos e a sincronização entre eles, pois uma mensagem
somente poderá ser lida depois de ter sido enviada e ela somente será envidada
após a ocorrência de um evento.

 No sistema de troca de mensagens, existe a possibilidade da mensagem se perder.


Para isto foi implementado o recurso de que o processo receptor ao recebe-la
deverá enviar ao processo transmissor uma mensagem de recebimento.

 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.

 Bastando que o processo que deseja enviar uma mensagem enderece


explicitamente o nome do receptor.

 Esta característica chama-se ENDEREÇAMENTO DIRETO e só é permitida à


comunicação entre dois processos.

 Existe também o ENDEREÇAMENTO INDIRETO que é um mecanismo que consiste


no uso de uma área compartilhada, onde as mensagens podem ser colocadas pelo
processo transmissor e retiradas por qualquer processo.

 Existem duas formas de comunicação entre os processos: COMUNICAÇÃO


SINCRONA e COMUNICAÇÃO ASSINCRONA. Uma comunicação é dita Síncrona,
quando um processo envia uma mensagem e fica esperando até que o processo
receptor leia a mensagem e mande a notificação de recebimento.

 Uma comunicação assíncrona é aquela em que o processo que envia a mensagem


não espera notificação de recebimento.

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.

 - Cada recurso só pode estar alocado a um único processo em um determinado


instante. (Exclusão mútua)
 - Um processo além dos recursos já alocados, pode estar esperando por outros
recursos.
 - Um recurso não pode ser liberado de um processo porque outros processos
desejam o mesmo recurso (Não-preempção)
 - Um processo pode ter de esperar por um recurso alocado a outro processo e vice-
versa (Espera circular).

 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.

 A Detecção do Deadlock é um mecanismo que determina a existência deste e


identifica os recursos envolvidos no 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,

por um deadlock, como podemos ver logo abaixo:

69
 Correção do Deadlock:

 Geralmente o problema é resolvido eliminando os processos envolvidos e


desalojando os recursos para ele já garantidos.

 É aquele processo em que você dá um Alt+Cr+Del no Windows e aparece uma


janela informando o aplicativo que não responde.

 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.

 Mas é bom lembrar que o DOS era um sistema operacional monotarefa e


monousuário onde praticamente tínhamos apenas um único processo rodando de
cada vez.

 Neste caso não existiam os problemas que um ambiente multitarefa e multiusuário


tem hoje.

 Todos os recursos do sistema estavam exclusivamente disponíveis para aquele


processo e, portanto ele tinha total e plena liberdade de fazer com estes o que bem
entendia.

 Hoje os sistemas operacionais são mais complexos rodando em maquinas mais


críticas devido à velocidade de processamento tendo um maior numero de
aplicações que rodam simultaneamente e demandando praticamente todos os
recursos do sistema ao mesmo tempo.

 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.

 O ponto mais crítico é a geração do arquivo de vídeo, quando é preciso aplicar um


CODEC que exige muito processamento.

 Como regra geral, qualquer operação de codificação de vídeo e áudio tende a exigir
todo o tempo livre do processador.

 Dependendo do volume de dados a serem processados, o tempo total pode ser


muito grande, facilmente passando por aproximadamente uma hora

 Normalmente queremos realizar outras tarefas enquanto o trabalho pesado é feito.

 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%.

 Podemos melhorar bastante esta situação alterando a prioridade das tarefas no


Windows .


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.

 Poderá ser executada normalmente (apenas demorará um tempo ligeiramente maior


para ser concluída) enquanto usamos outras tarefas leves em primeiro plano, sem
perceber lentidão.

 Este procedimento já é usado automaticamente por alguns programas, como o


FLASKMPEG, conversor de DVD para AVI.

 Este programa tende a usar 100% do processador, mas opera com prioridade
mínima.

 Aproveita então os breves momentos de ociosidade existente durante o uso normal


do computador.

 Como resultado, podemos usar o computador normalmente durante o uso do


FLASKMPEG, sem notar lentidão.

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.

 Para resolver o problema, reduza a prioridade do programa pesado que está


monopolizando a máquina.

 No Windows XP, ative o Gerenciador de tarefas (pressione Control-Alt-Del). Clique


em Processos e a seguir em CPU, para colocar todos os processos por ordem de
uso da CPU.

 O processo que usa maior porcentagem é o que está monopolizando o processador.

 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.

 Cada um desses intervalos é chamado de time slice (fatia de tempo).

 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.

 Esses pequenos períodos de ociosidade serão dedicados a outros programas.

 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.

 OBS: O processo de menor prioridade no Windows é o “Tempo ocioso do sistema”.

 Só é executado nos instantes em que nenhum outro processo requer o uso do


processador.

 Conforme executamos programas pesados, ou um número grande de programas


mais simples, a porcentagem de uso da CPU para este processo tende a diminuir.

75
76

Вам также может понравиться