Disciplina: Sistemas Operacionais - CAFW-UFSM Professor ...
Disciplina: Sistemas Operacionais - CAFW-UFSM Professor ...
Disciplina: Sistemas Operacionais - CAFW-UFSM Professor ...
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Disciplina</strong>: <strong>Sistemas</strong> <strong>Operacionais</strong> - <strong>CAFW</strong>-<strong>UFSM</strong><br />
<strong>Professor</strong>: Roberto Franciscatto
Introdução<br />
• Os primeiros sistemas operacionais<br />
permitiam a execução de apenas um<br />
programa de cada vez<br />
• Os sistemas de computação atuais<br />
permitem que múltiplos programas<br />
sejam carregados na memoria<br />
• Executados de modo<br />
concorrente<br />
Processo = programa em<br />
execução<br />
Um sistema é constituido<br />
portanto de uma coleção de<br />
processos<br />
Processos do sistema<br />
operacional<br />
Processos de usuário
Conceito de Processo<br />
• Mesmo em um sistema<br />
monotarefa (Windows) o usuário<br />
pode executar diversos programas<br />
ao mesmo tempo:<br />
• Um processador de texto<br />
• Um navegador de WEB<br />
• Um pacote de e-mail<br />
Ainda que usuário só possa<br />
executar um programa a cada<br />
momento<br />
O SO tem que suportar suas<br />
próprias atividades<br />
programadas, como o<br />
gerenciamento de memória
O Processo<br />
• Informalmente um processo é um<br />
programa em execução<br />
• Um programa por si só não é um<br />
processo<br />
• Um programa é uma<br />
entidade passiva como o<br />
conteudo armazenado no<br />
disco<br />
• Enquanto um processo é uma<br />
entidade ativa<br />
Exemplo de entidade ativa:<br />
Contador de programa<br />
especificando a próxima<br />
instrução a ser executada e,<br />
com um conjunto de recursos<br />
associados
Estado do Processo<br />
• Um processo muda de estado<br />
durante sua execução<br />
• O estado de um processo é<br />
definido em parte pela sua<br />
atividade em curso<br />
Cada processo pode estar em<br />
cada um dos seguintes estados:<br />
Novo: o processo está sendo<br />
criado<br />
Em execução: as instruções<br />
estão sendo executadas<br />
Em espera: o processo está<br />
esperando pela ocorrência de<br />
algum evento (como um<br />
termino de I/O)<br />
Pronto: o processo está<br />
esperando para ser designado<br />
a um processador<br />
Terminado: o processo<br />
terminou sua execução
Diagrama de estado de Processo<br />
novo admitido<br />
terminado<br />
pronto<br />
Término de I/O ou evento<br />
interrupção<br />
Despacho pelo scheduler<br />
Em<br />
espera<br />
saída<br />
Em<br />
execução<br />
Espera por I/O ou evento
Bloco de Controle de Processo<br />
• Cada processo é representado<br />
no sistema operacional por um<br />
bloco de controle de processo<br />
• Ele contém muitas<br />
informações associadas ao<br />
processo específico, incluindo<br />
as seguintes:<br />
• Estado do processo<br />
• Contador de programa<br />
• Registradores da CPU<br />
• Informação de<br />
gerenciamento da memória<br />
Informação de contabilização<br />
Informação de estado de I/O<br />
O PCB serve simplesmente<br />
como um repositório para<br />
qualquer informação que possa<br />
variar de um processo para<br />
outro.
Threads<br />
• Muitos SO modernos ampliaram o<br />
conceito de processo para permitir<br />
que um processo possa conter<br />
multiplas linhas de execução.<br />
• Assim estes sistemas<br />
permitem ao processo<br />
desenvolver mais de<br />
uma tarefa em um<br />
período de tempo<br />
Ex.: receber as palavras<br />
digitadas e verificar sua grafia<br />
Quando o programa estiver em<br />
execução, cada uma de suas<br />
linhas de ação corresponderá a<br />
um processo<br />
Assim, vários processos podem<br />
estar associados a um programa<br />
em execução
Filas de Scheduling<br />
• A medida que os processos entram<br />
no sistema, são incluidos numa fila de<br />
jobs<br />
• Esta fila consiste em todos<br />
os processos que estao no<br />
sistema<br />
• Os processos residentes na<br />
memória principal que<br />
estão prontos e em espera<br />
para entrar em execução<br />
são levados para uma lista<br />
chamada fila pronta<br />
O sistema operacional ainda tem<br />
outras filas<br />
Fila de dispositivos<br />
Lista de processos em<br />
espera por um<br />
determinado dispositivo<br />
de I/O<br />
Cada dispositivo tem sua<br />
própria fila
Diagrama de Enfileiramento<br />
I/O<br />
Fila pronta<br />
Fila de I/O<br />
Filho<br />
executa<br />
ocorre<br />
interrupção<br />
CPU<br />
Solicitação de<br />
I/O<br />
Fatia de tempo<br />
expirada<br />
Bifurca em um<br />
filho<br />
Espera por uma<br />
interrupção
Funcionamento do Enfileiramento<br />
• Um novo processo é inicialmente<br />
incluído na fila pronta<br />
• Ele aguarda nesta fila até que seja<br />
selecionado para execução (ou<br />
despachado)<br />
• Uma vez que o processo tenha sido<br />
designado para ocupar a CPU e<br />
esteja em execução, poderia ocorrer<br />
um entre diversos eventos:<br />
O processo poderia emitir uma<br />
solicitação de I/O e ser então<br />
colocado em uma fila de I/O<br />
O processo poderia criar um<br />
novo subprocesso e esperar pelo<br />
seu término<br />
O processo poderia ser obrigado<br />
a deixar a CPU como resultado<br />
de uma interrupção e ser<br />
colocado de volta na fila pronta
Comutação de Contexto<br />
• A comutação da CPU para um<br />
outro processo exige que o estado<br />
do processo antigo seja salvo<br />
• e que o estado salvo do novo<br />
processo seja carregado<br />
• Esta atividade é conhecida como<br />
comutação de contexto<br />
• O contexto de um processo é<br />
representado no PCB do processo;<br />
Ele inclui os valores dos<br />
registradores da CPU<br />
O estado dos processos<br />
E informação sobre o<br />
gerenciamento da memória
Operações sobre processos<br />
• Os processos no sistema podem<br />
executar concorrentemente e<br />
precisam ser criados e eliminados<br />
dinamicamente<br />
• Assim o SO deve fornecer um<br />
mecanismo para criação e<br />
eliminação de processos<br />
Criação de Processos<br />
Um processo pode dar<br />
origem a diversos novos<br />
processos durante o seu<br />
curso de execução<br />
Tudo isso, por intermédio de<br />
uma chamada de sistema<br />
create-process
Operações sobre processos<br />
• O processo criador é denominado<br />
processo pai<br />
• enquanto no novos processos são<br />
chamados os filhos do processo<br />
criador<br />
• cada um destes novos processos<br />
pode, criar outros processos,<br />
formando uma árvore de processos<br />
Em geral um processo irá<br />
requerer certos recursos<br />
Tempo de CPU<br />
Memória<br />
Arquivos<br />
Dispositivos de I/O<br />
Tudo isso para cumprir suas<br />
tarefas
Operações sobre processos<br />
• Quando um processo cria um novo<br />
subprocesso, existem duas<br />
possibilidades de execução:<br />
• O pai continua a<br />
executar<br />
concorrentemente com<br />
seus filhos<br />
• O pai aguarda até que<br />
alguns dos seus filhos ou<br />
todos eles tenham<br />
terminado<br />
Existem ainda duas<br />
possibilidade em relação ao<br />
espaço de endereçamento<br />
do novo processo:<br />
O processo filho é uma<br />
duplicata do processo pai<br />
o processo filho tem um<br />
programa carregado dentro<br />
dele
Terminação de processos<br />
• Um processo termina quando<br />
conclui a execução do seu último<br />
comando<br />
• e assim, solicita ao SO que o<br />
elimine utilizando a chamada de<br />
sistema exit<br />
• Neste ponto, o processo pode<br />
retornar dados (saída) para o seu<br />
processo pai<br />
Todos os recursos do<br />
processo<br />
Incluindo memória física<br />
e virtual<br />
Arquivos abertos e<br />
buffers de I/O<br />
são desalocados pelo SO
Terminação de processos<br />
• Um pai pode terminar a execução<br />
de um dos seus filhos por vários<br />
motivos, como:<br />
• o filho usou em excesso<br />
algum dos recursos a ele<br />
alocados<br />
• A tarefa atribuída ao<br />
filho não é mais exigida<br />
O pai está de saída e o SO<br />
não permite a um filho<br />
continuar quando o seu pai<br />
terminar.
Exercícios (1)<br />
1. De que forma posso verificar os<br />
processos correntes no<br />
ambiente windows?<br />
2. É possivel elimina-los?<br />
3. Pesquise como funcionam os<br />
processos no ambiente<br />
Windows
Exercícios (2)<br />
1. De que forma posso verificar os<br />
processos correntes no<br />
ambiente Linux?<br />
2. É possivel eliminá-los? Como ?<br />
3. Pesquise como funcionam os<br />
processos no ambiente Linux
Processos cooperativos<br />
• Os processos concorrentes em<br />
execução no sistema operacional<br />
podem ser:<br />
• Processos<br />
independentes<br />
• Processos cooperativos<br />
Um processo é independente<br />
se não puder afetar os outros<br />
processos em execução no<br />
sistema ou ser afetado por eles.<br />
Não compartilhar dado<br />
com outro processo<br />
Um processo é<br />
cooperativo se puder<br />
afetar outros processos em<br />
execução ou ser afetado<br />
por eles.
Processos cooperativos<br />
• Pode ser desejável propiciar um<br />
ambiente que permita a cooperação<br />
entre processos, por várias razões:<br />
• Compartilhamento de<br />
informação<br />
• Diversos usuários podem<br />
estar interessados na<br />
mesma informação<br />
• Processamento mais<br />
rápido<br />
• Subtarefas em exexução<br />
paralela com as outras<br />
• Velocidade aumentada caso<br />
o computador possua<br />
multiplos elementos de<br />
processamento<br />
• (CPU e canais de I/O)
Processos cooperativos<br />
• Modularidade<br />
• Dividir as funções do<br />
sistema em processos<br />
separados ou threads<br />
• Comodidade<br />
• Mesmo um usuário<br />
individual pode<br />
trabalhar com muitas<br />
tarefas em um dado<br />
momento<br />
• Por exemplo:<br />
• Um usuário pode estar<br />
editando, imprimindo e<br />
compilando em paralelo.
Processos cooperativos<br />
• A execução concorrente de<br />
processos cooperativos requer<br />
mecanimos que permitam aos<br />
processos<br />
• comunicarem-se uns<br />
com os outros e<br />
• sincronizarem suas<br />
ações<br />
• Para processos cooperativos<br />
usa-se o problema do<br />
produtor-consumidor<br />
• Um processo produtor gera<br />
informação que é<br />
consumida por um<br />
processo consumidor<br />
• Exemplo: um programa de<br />
impressão produz caracteres<br />
que são consumidos pelo<br />
driver da impressora
Processos cooperativos<br />
• Em síntese os processos<br />
cooperativos podem comunicar-se<br />
em um ambiente de memória<br />
compartilhada<br />
• O esquema exige que<br />
estes processos<br />
compartilhem<br />
• Uma cadeia de buffers<br />
comum<br />
• código para<br />
implementação do buffer<br />
seja escrito pelo<br />
programador da aplicação<br />
• O SO pode fornecer meios para<br />
que os processos cooperativos<br />
se comuniquem uns com os<br />
outros<br />
• por intermédio de uma<br />
facilidade de comunicação<br />
interprocessos IPC
Processos cooperativos<br />
• A IPC oferece um mecanismo que<br />
permite aos processos<br />
• Se comunicarem e<br />
sincronizarem suas<br />
ações sem<br />
compartilharem o<br />
mesmo espaço de<br />
endereçamento<br />
• A IPC é particularmente útil em<br />
um ambiente distribuido<br />
• Onde os processos em<br />
comunicação podem residir<br />
em computadores diferentes<br />
conectados a uma rede
Sistema de Transmissão de Mensagens<br />
• A função de um sistema de<br />
mensagens é<br />
• permitir que os<br />
processos se<br />
comuniquem uns com<br />
os outros sem a<br />
necessidade de recorrer<br />
a dados compartilhados
Nomeação<br />
• Processos que desejem estabelecer<br />
comunicação devem ter uma<br />
maneira de se referenciarem uns aos<br />
outros, podendo utilizar<br />
• Tanto a comunicação<br />
direta ou indireta<br />
• Comunicação Direta<br />
• Com a comunicação direta,<br />
cada processo que deseja se<br />
comunicar de ve nomear<br />
explicitamente<br />
• o receptor e o<br />
remetente da<br />
comunicação
Comunicação Direta<br />
• Neste esquema, os primitivos<br />
send e receive são definidos<br />
como:<br />
• Send (P, message) –<br />
envia uma message para<br />
o processo P<br />
• Receive (Q, message) –<br />
recebe uma message do<br />
processo Q<br />
• Um link de comunicação, nesta<br />
abordagem, tem as seguintes<br />
propriedades:<br />
• Um link é estabelecido<br />
automaticamente entre cada<br />
par de processos que<br />
desejem se comunicar<br />
• Os processos precisam<br />
conhecer apenas a<br />
identidade uns dos outros<br />
para estabelecer<br />
comunicação
Comunicação Direta<br />
• Um link é associado a<br />
exatamente dois processos<br />
• Existe exatamente um link<br />
entre cada par de processos<br />
• Tanto o processo remetente<br />
como o receptor precisam<br />
nomear um ao outro para se<br />
comunicarem
Comunicação Indireta<br />
• Com a comunicação<br />
indireta, as mensagens são<br />
enviadas para caixas postais<br />
ou portas e delas recebidas<br />
• Uma caixa postal pode<br />
ser vista abstratamente<br />
como um objeto no qual<br />
os processos podem<br />
colocar mensagens e do<br />
qual as mensagens<br />
podem ser retiradas<br />
• Cada caixa postal tem uma<br />
identificação única<br />
• Um processo pode se comunicar<br />
com algum outro processo por<br />
intermédio de um número de<br />
diferentes caixas postais<br />
• Dois processos podem<br />
estabelecer comunicação<br />
somente se compartilharem<br />
uma caixa postal
Comunicação Indireta<br />
• Os primitivos send e receive são<br />
definidos da seguinte forma:<br />
• Send (A, message) –<br />
envia uma message para<br />
a caixa postal A.<br />
• Receive (A, message) –<br />
recebe uma message da<br />
caixa postal A.<br />
• Nesta abordagem, um link de<br />
comunicação possui as seguintes<br />
propriedades:<br />
• Um link é estabelecido entre<br />
um par de processos<br />
somente se ambos os<br />
membros do par tem uma<br />
ciaxa postal compartilhada<br />
• Um link pode estar associado<br />
a mais do que dois processos
Comunicação Indireta<br />
• Exemplo: Suponha que os<br />
processos P1, P2 e P3 compartilhem<br />
todos a caixa postal A.<br />
• O processo P1, envia<br />
uma mensagem para A,<br />
enquanto P2 e P3<br />
executam, cada um<br />
deles um receive de A.<br />
• Qual dos processos irá<br />
receber a mensagem<br />
enviada por P1 ?<br />
• A resposta depende da opção<br />
que escolhermos:<br />
• Permitir que um link seja<br />
associado a dois processos no<br />
máximo<br />
• permitir que no máximo um<br />
processo de cada vez possa<br />
executar uma operação de<br />
receive<br />
• Permitir que o sistema<br />
selecione arbitrariamente<br />
qual processo irá receber a<br />
mensagem (ou um ou outro)
Comunicação Indireta<br />
• Uma caixa postal pode pertencer<br />
tanto a um processo quanto ao<br />
sistema operacional<br />
• Se a caixa postal<br />
pertence a um processo<br />
• proprietário e o usuário<br />
• Quando o processo que<br />
possui uma caixa postal<br />
termina, a mesma<br />
desaparece<br />
• Qualquer processo que enviar<br />
uma mensagem para esata caixa<br />
postal deve ser notificado de que<br />
ela não existe mais
Comunicação Indireta<br />
• Por outro lado, uma caixa postal<br />
que pertence ao SO é independente<br />
e não é associada a qualquer<br />
processo em particular<br />
• Neste caso, o SO<br />
oferece um mecanismo<br />
que permite a um<br />
processo fazer o<br />
seguinte:<br />
• Criar uma nova caixa postal<br />
• Enviar e receber mensagens por<br />
intermédio da caixa postal<br />
• Eliminar uma caixa postal
Sincronização<br />
• A sincronização entre processos<br />
realiza-se por chamadas aos<br />
primitivos send e receive<br />
• Existem diferentes decisões de<br />
projeto para implementar cada<br />
primitivo<br />
• a transmissão de<br />
mensagens pode ser<br />
tanto com bloqueio<br />
quanto sem bloqueio<br />
(síncrona e assíncrona)<br />
• Envio com bloqueio – o<br />
processo remetente é<br />
bloqueado até que a mensagem<br />
seja recebida pelo processo<br />
receptor ou pela caixa postal<br />
• Envio sem bloqueio – o<br />
processo remetente envia a<br />
mensagem e retoma a operação
Sincronização<br />
• Recepção com bloqueio – o<br />
receptor fica bloqueado até que a<br />
mensagem esteja disponível<br />
• Recepção sem bloqueio – o<br />
receptor recupera tanto uma<br />
mensagem válida quanto uma<br />
mensagem nula
Armazenamento em buffer<br />
•Tanto na comunicação direta como<br />
indireta, as mensagens trocadas por<br />
processos que se comunicam<br />
residem em uma fila temporária<br />
• Esta fila pode ser<br />
implementada de três<br />
maneiras<br />
Capacidade zero<br />
Um link não pode conter<br />
qualquer mensagem em<br />
espera<br />
Remetente bloqueado até<br />
que o receptor recebe a<br />
mensagem<br />
Capacidade limitada<br />
Tamanho da fila é finito<br />
Se o link estiver cheio, o<br />
remetente deve ser<br />
bloqueado até que haja<br />
espaço disponível na fila
Armazenamento em buffer<br />
• Capacidade ilimitada<br />
• A fila tem<br />
potencialmente um<br />
tamanho infinito<br />
• Assim, pode conter<br />
qualquer número de<br />
mensagens<br />
• O remetente nunca é<br />
bloqueado
Um exemplo: Windows 2000<br />
• Emprega modularidade para<br />
• Aumentar a<br />
fucnionalidade<br />
• Diminuir o tempo<br />
necessário para<br />
implementar novas<br />
características<br />
Fornece suporte para múltiplos<br />
ambientes operacionais ou<br />
subsistemas<br />
Com os quais os programas<br />
aplicativos se comunicam por<br />
intermédio de um<br />
mecanismo de transmissão<br />
de mensagens<br />
Os programas aplicativos<br />
podem ser considerados<br />
clientes do subsistema<br />
servidor do Windows 2000
Exercícios<br />
• Como é a estrutura de um kernel<br />
num sistema Linux ?<br />
• Quais são os benefícios e as<br />
desvantagens de cada uma das<br />
situações seguintes?<br />
• Comunicação direta e<br />
indireta<br />
• Comunicação simétrica e<br />
assimétrica<br />
• Armazenamento em<br />
buffer automático e<br />
explícito