Auxiliar 1

Fazer download em doc, pdf ou txt
Fazer download em doc, pdf ou txt
Você está na página 1de 22

UNESA - Sistemas OperacionaisI 1

Capítulo 3 – Processos e Estrutura de Sistemas Operacionais


Parte I – Processos

 Conceito de Processo

Num ambiente monotarefa vimos que a CPU executa um programa seqüencialmente, utilizando os
recursos de hardware e software na ordem em que são solicitados e aguardando o término da
execução de um para começar o outro. Quando estudamos os sistemas batch, vimos que a CPU
executava um job também seqüencialmente, solicitando os recursos na ordem em que eram pedidos.
Já no ambiente multitarefa, entendemos que o que está executando no processador muda
constantemente. Isso ocorre para dar a impressão a cada usuário (no caso multiusuário) ou a cada
tarefa do mesmo usuário (monousuário) que a máquina está a disposição de somente aquele
usuário/tarefa. Nós vimos que esses “pedaços” de programas ou tarefas que ora estavam sendo
executados pela CPU, ora estavam fazendo um acesso de E/S, ora estavam aguardando para
execução na CPU, etc. na verdade ficavam “disputando” os recursos (CPU, E/S, memória) entre si.
Isso nos leva ao conceito de um processo  esses “pedaços” de programas ou tarefas que estão
fazendo acesso concorrente aos recursos do sistema.

RESPONDA: 3.1) O que ocorre quando um programa deixa a CPU, de forma que ele possa
retornar no mesmo ponto e nas mesmas condições que saiu ?

O estado atual do programa na CPU tem que ser salvo para que o programa possa retornar e
continuar sua execução como se não tivesse sido interrompido. Isso inclui não só os registradores
(como já estudamos no mecanismo de interrupção) como também outros detalhes como, por
exemplo, quais eram os arquivos que estavam abertos. Podemos dizer que este estado completo do
que estava em execução define um ambiente de execução  é o PROCESSO. Ou seja, processo é
o ambiente onde se executa um programa, a estrutura responsável pela manutenção de todas as
informações necessárias a execução de um programa.

 Materialização do Processo

Para poder definir o ambiente completo de execução e assim


materializar o conceito de processo, o sistema operacional mantém Ponteiros
uma estrutura de dados que contém os todos os detalhes necessários Estado do processo
para esta definição. Esta estrutura chama-se PCB (Process Control
Block = BLOCO DE CONTROLE DO PROCESSO). Alguns sistemas Nome
dão o nome de BLOCO DE CONTROLE DA TAREFA (task control
Prioridade
block).
Registradores
O conteúdo exato do PCB varia com o sistema operacional, mas
basicamente contém dados como: ponteiro (uma forma de indicar Limites de memória
algum outro processo), endereço de memória, nome do processo, Arquivos abertos
tamanho, usuário que criou o processo, registradores (PC, SP, etc.),
grupo de usuários que podem acessar o processo, prioridade, pilha, ___
classe de escalonamento, lista de arquivos abertos, quando o processo
Figura 3.0 - Bloco de
foi iniciado, estado do processo, tempo acumulado de execução, etc.
Controle de Processo (PCB)
UNESA - Sistemas OperacionaisI 2
É através de várias chamadas de sistema (como será visto a seguir) que o sistema operacional
gerencia os processos. Todos esses elementos que definem o ambiente de execução, o processo,
podem ser classificados em três grandes grupos: contexto de hardware, contexto de software e espaço
de endereçamento.

RESPONDA: 3.2) Você acha que a freqüente troca de contexto (troca de processos) na CPU
introduz algum overhead ?

O tempo gasto com a troca de contexto vai variar com as especificações do hardware. Basicamente:
tamanho da memória, número de registradores que devem ser copiados, existência ou não de
instruções especiais (exemplo: uma instrução simples para carregar ou salvar registradores; os
processadores RISC possuem essas instruções load e store), tamanho do disco (para swapping),
velocidade da CPU.

RESPONDA: 3.3) Sobre troca (mudança) de contexto, reponda:


a) Em que consiste? b) Que “programa” está em execução durante a troca de contexto?

A troca de contexto pode produzir um gargalo (bottleneck) fazendo decair em muito a performance.
Atualmente há uma solução para esse problema: a utilização de threads. O uso de threads passa pela
programação, o que não é simples, e pelo suporte por parte do próprio sistema operacional, que deve
suportar sua criação e controle. A idéia principal é diminuir o tempo gasto na criação/eliminação de
um PCB para cada subprocesso criado. Sendo assim, subprocessos se diferenciam de threads pelo
espaço de endereçamento independente que possuem. Threads compartilham o mesmo espaço de
endereçamento de um processo, passando pelos mesmos estados de um processo.

Contexto de Hardware

É o contexto que é copiado para o hardware (CPU) para que a execução possa ocorrer. Basicamente
os registradores : PC (program counter, que contém o endereço da próxima instrução a ser
executada) , SP (stack pointer, o ponteiro de pilha, que é o registrador que contém o endereço de
memória do topo da pilha), a pilha toda (para que a CPU, ao completar uma função ou subrotina,
saiba para que endereço irá retornar), registrador de estado (PSW).

Contexto de Software

São as características que vão influir na execução. O contexto de software define basicamente 3
grupos de informações : identificação, cotas e privilégios.

 Identificação – Cada processo ao ser criado recebe uma identificação, que é um número e,
normalmente, também um nome. Chamamos esse número de PID (Process IDentification =
identificação do processo). O processo pode receber também, de acordo com o S.O., um
número relacionado à identificação do usuário que o criou UID (User IDentification =
identificação do usuário) e uma identificação do grupo de usuários aos quais é permitido o
acesso a arquivos, processos, etc.: GID (Group identification = identificação do grupo).
Esses dois últimos estão ligados ao modelo de segurança implementado por alguns S.O. para
permitir acessos ou não. Por exemplo, um usuário não pode normalmente deletar os processos
de outros. O super-usuário pode deletar todos os processos do sistema.

Um processo pode criar um ou mais processos (estes são chamados de processos-filho = child
process). O processo filho tem um PPID (Parent Process IDentification = identificação do
processo-pai), para que o filho possa retornar ao pai. O PPID de um processo-filho é o UID
do processo-pai.
UNESA - Sistemas OperacionaisI 3

 Cotas – Limites de cada recurso que pode ser utilizado pelo processo. Esses limites são
determinados para o processo no momento de sua criação. Alguns sistemas incluem também,
dinamicamente, porcentagem do recurso já utilizado ou que ainda pode ser utilizado.
Basicamente são: número máximo de arquivos abertos simultaneamente, tamanho máximo de
memória que o processo pode alocar, número máximo de operações de E/S pendentes, tamanho
máximo de buffers para o acesso de E/S, número máximo de subprocessos que podem ser
criados.

 Privilégios – Definem o que um processo pode ou não fazer em relação ao sistema e aos
outros processos. Já vimos ( acima ) os privilégios associados à segurança. Existem outros
privilégios associados à operação e à gerência do sistema.

Espaço de Endereçamento

É a área da memória onde reside o processo. Quando um programa é colocado na memória principal,
para que a sua execução seja possível, temos que as instruções estão arrumadas em ordem de
execução em endereços adjacentes. Logo após ao bloco de instruções temos a seção de dados que
serão utilizados pelo programa. Da mesma forma um processo reside na memória principal com o
seu código, em endereços adjacentes, seguido de um bloco de dados.

 Estados do processo

RESPONDA: 3.4) Qual a diferença entre subproceso e thread (criação/eliminação,


gerenciamento)?
3.5) Como o sistema operacional escolhe entre os vários processos do sistema, qual irá executar,
em um determinado momento ?

A política implementada, normalmente, é a de várias listas de acordo com o que o processo precisa
fazer. Os nomes aqui citados e a quantidade de estados que um processo pode ter vão diferir de um
SO para outro. Ao ser criado o processo vai para a lista de PRONTO (READY), que indica pronto
para começar a execução. Assim que houver oportunidade o SO vai selecioná-lo (escalonamento)
para ocupar a CPU. Normalmente usa-se a política de listas encadeadas, ou seja, ao colocar na lista o
SO já leva em conta as prioridades. Em cada lista o ponteiro de um processo aponta (indica) o
próximo processo da lista.

Quando estiver executando, esse processo pode: terminar, fazer uma requisição de I/O, ser
interrompido, ter sua fatia de tempo terminada, criar um novo processo. Enquanto está executando,
ou seja, ocupando a UCP, o processo está no estado EXECUÇÃO (RUNNING).

RESPONDA: 3.6) Numa máquina com um processador, quantos processos podem estar no estado
EXECUÇÃO simultaneamente? E num ambiente com múltiplos processadores?

Quando faz uma requisição de I/O o processo pode ter que esperar pela liberação de algum
dispositivo de I/O. Cada dispositivo tem a sua lista. Nesse caso o processo fica no estado de
ESPERA (WAIT). Se o recurso do sistema desejado não está disponível ainda, podemos ter uma
diferenciação do estado de ESPERA, chamado de estado BLOQUEADO. Um processo pode estar
no estado de ESPERA quando ele cria um processo-filho e tem que esperar pelo término do
processo-filho para continuar a sua execução. Pode também ocorrer que um processo não precise
esperar pelo término do processo-filho para voltar à sua execução, nesse caso os processos pai e filho
executam concorrentemente.
UNESA - Sistemas OperacionaisI 4

O término de um processo envolve uma chamada de sistema, que faz com que o SO retire o
processo da lista e desaloque o seu PCB. Se há processos-filho ainda não terminados, o SO “aborta”
esses processos-filho.

RESPONDA: 3.7) Quantos processos podem estar no estado PRONTO ? E no estado ESPERA ?

3.8) Em que estado deve estar um processo para “entrar” na CPU ? Por que motivo?

3.9) Os processos em estado de PRONTO e ESPERA necessariamente precisam estar ocupando


espaço na memória principal? Que técnica ou recurso é utilizado para solucionar esse tipo de
ocorrência?

 Mudanças de estado

Pelo que vimos acima, diversos eventos causam uma mudança de estado em um processo.
Chamamos de eventos voluntários aqueles gerados pelo próprio processo e de eventos
involuntários aqueles gerados pelo sistema operacional.

Existem basicamente quatro mudanças de estado do processo, conforme será visto abaixo.

RESPONDA: 3.10) Complete o diagrama abaixo com os estados “básicos” de um processo e


indicação das mudanças de estado possíveis (completando as setas e numere-as). Em seguida,
responda:

a) O que acontece ao processo em cada um dos estados?


b) O que ocasiona cada tipo de mudança?
c) Quais mudanças são ocasionadas por eventos voluntários? E por eventos involuntários?

 Tipos de processo

Os processos podem ser classificados de acordo com o tipo de processamento que realizam, a saber:

 CPU-bound (ligado à CPU) – passa a maior parte do tempo no estado de execução, ou seja,
utilizando o processador. Esse tipo de processo realiza poucas operações de E/S.
 I/O-bound (ligado à E/S) – passa a maior parte do tempo no estado de espera, pois realiza um
elevado número de operações de E/S.
UNESA - Sistemas OperacionaisI 5
Parte II – Estrutura

 Estrutura do Sistema Operacional


Podemos criar um sistema tão grande e complexo como um sistema operacional somente dividindo-o
em pequenas partes. Cada uma dessas partes deve ser uma porção bem delineada do sistema, com
entradas, saídas e funções, cuidadosamente definidas. Logicamente, nem todos os sistemas têm a
mesma estrutura, ou seja, não apresentam a mesma forma de ligação entre as partes. Contudo, os
sistemas operacionais modernos geralmente possuem as seguintes partes:

 Gerenciamento de processos - criar e eliminar, suspender e retomar, sincronismo e


comunicação entre processos;
 Gerenciamento da memória principal – manter o controle das partes da memória que estão
sendo usadas e por quem, decidir que processos serão carregados para memória quando
houver espaço disponível, alocar e desalocar espaço de memória quando necessário;
 Gerenciamento de memória secundária – o SO é responsável pelas atividades de alocação de
espaço livre, scheduling de disco;
 Gerenciamento de Entrada/Saída – manter os device drivers para comunicação com os
diferentes dispositivos, um buffer-caching para o sistema;
 Gerenciamento de arquivos – criar e eliminar arquivos e diretórios, manter mapeamento dos
arquivos em disco;
 Proteção do sistema – se um sistema é multiusuário e permite mútliplos processos
concorrentes, estes processos devem ser protegidos de outras atividades;
 Networking – em um sistema distribuído (fracamente acoplado) cada processador tem sua
própria memória e seus processadores que se comunicam através do SO. A comunicação
entre eles deve considerar roteamento e estratégias de conexão;
 Interpretador de comandos – um dos mais importantes programas do SO é o interpretador de
comandos, que serve de interface entre o usuário e o SO. Alguns SO’s incluem este programa
no próprio núcleo (kernel). Já outros sistemas, como o DOS e o UNIX, tratam o interpretador
de comandos como um programa especial que é executado quando uma sessão é iniciada.

Com isso, um sistema operacional fornece um ambiente para execução, melhor dizendo, fornece
serviços para os programas e também para os usuários desses programas.

 System Calls

System Calls fornecem a interface entre os processos e o sistema operacional. Estas “chamadas”
estão geralmente disponíveis como instruções da linguagem Assembly, e são normalmente
encontrados nos manuais usados por programadores de linguagens Assembly. Alguns sistemas
permitem que as system calls sejam criadas diretamente a partir de um programa em linguagem de
alto nível (linguagem C, Pascal, FORTRAN).
Elas podem ser agrupadas, na maioria dos sistemas, em cinco categorias principais:
 controle de processos (end, abort, load, execute, create, terminate, wait event, signal event,
set attributes);
 manipulação de arquivos (create, delete, open, close, read, write, set attributes)
 manipulação de dispositivos (request, release, read, write, logically attach or detach);
 manutenção de informação (get and set time or date, get and set process or file);
 comunicação (create and delete communication connection, send and receive messages)
UNESA - Sistemas OperacionaisI 6
A partir do momento que as “chamadas ao sistema” servem de interface entre os processos e o SO,
essas são o mecanismo de proteção ao núcleo do SO e também de acesso aos seus serviços, como se
fossem as portas de entrada para os processos.

 Modos de acesso

 Dispositivos/recursos compartilhados (E/S de um sistema) devem ser acessados por instruções


exclusivas pelo SO;
 Instruções podem ser: privilegiadas (podendo comprometer a estabilidade do sistema) ou não-
privilegiadas (não oferecem perigo ao sistema);
 Para execução de instruções privilegiadas, o processador implementa através de um registrador
especial, o mecanismo de modos de acesso:
- modo usuário  permite a execução de um subconjunto do total de instruções
disponíveis, ou seja, as instruções não-privilegiadas;
- modo kernel ou supervisor  todo conjunto as as instruções podem ser executadas;
 O SO executa em modo kernel, protegendo o hardware do usuário, enquanto os demais software
(editores, compiladores) executam em modo usuário;
 Quem determina o acesso, controla e alterna o modo?
As system calls e, caso o programa tente executar uma instrução privilegiada, sem o processador
estar em modo kernel, uma exceção é gerada e o programa encerrado.

 Estruturas

A seguir, serão apresentadas algumas maneiras como o código do sistema é organizado e o


relacionamento entre seus diversos componentes, ou em outras palavras, sua estrutura interna.

Sistemas Monolíticos

A organização mais comum aos sistemas


operacionais é a monolítica. Em um sistema
monolítico temos um conjunto de rotinas
responsável pela interpretação dos parâmetros
passados quando da chamada do sistema por parte
de um programa aplicativo, pela execução do
serviço solicitado e pelo retorno dos resultados.
Qualquer rotina presente no sistema operacional
pode vir a chamar qualquer outra das rotinas.

Um bom exemplo é o MS-DOS, originalmente


escrito para fornecer o máximo de funcionalidade no
menor espaço, até pela limitação do hardware no
qual era executado. Como o INTEL 8088 da época não tinha registrador de modo de acesso,
os desenvolvedores do MS-DOS não tinham escolha, deixando o hardware básico
desprotegido (popular; não foi dividido em módulos; seus níveis de funcionalidade não são
separados; programas errados ou maliciosos podem comprometer seu funcionamento).
UNESA - Sistemas OperacionaisI 7

Sistemas em Camadas

A modularização de um sistema
operacional pode ser feita de
diferentes formas; a mais utilizada é a
aproximação em camadas, que
consiste em dividir o sistema
operacional em um número de
camadas (níveis), hierarquicamente
dispostas, cada nível construído sobre
o nível imediatamente abaixo. O nível
mais baixo (nível 0) é o hardware e o
mais alto é a interface com o usuário.
Módulos de uma camada oferecem
funções aos módulos de camadas
superiores; cada camada é
implementada usando somente
aquelas operações fornecidas pelas
camadas de mais baixo nível, sendo
que a camada não necessita saber
como estas operações são
implementadas; ela necessita saber o
que estas operações fazem.

Sistemas Cliente-Servidor

O kernel do SO passa a ser responsável pela comunicação entre processos e pela


implementação de operações que seriam difíceis de serem executadas a partir dos processos
servidores. A maioria dos serviços que seriam prestados pelo SO, executado em modo
supervisor em uma organização monolítica, passariam a ser prestados por um conjunto de
processos servidores que seriam executados em modo usuário, sendo apenas o kernel ainda
executado em modo supervisor.
UNESA - Sistemas OperacionaisI 8
No caso do Windows NT, da Microsoft, cada subsistema do ambiente e o NT Executive são
implementados como sendo vários processos. Cada processo espera por uma solicitação de
um cliente para um de seus serviços (por exemplo, serviços de memória, serviços de criação
de processos, ou serviços de escalonamento do processador). Um cliente, que pode ser uma
aplicação do usuário ou outro módulo do sistema operacional, solicita um serviço por envio
de uma mensagem. A mensagem é direcionada através do NT Executive para o servidor
apropriado. O servidor realiza a operação solicitada e retorna os resultados por meio de uma
outra mensagem, que é direcionada através do NT Executive de volta ao cliente. [STAL98]
UNESA - Sistemas OperacionaisI 9
Capítulo 4 – Gerência do Processador

 Conceito de Escalonamento

Com a possibilidade da UCP ser compartilhada entre diversos processos (multiprogramação), o SO


possui critérios para determinar qual a ordem na escolha dos processos para que estes passem do
estado de PRONTO para EXECUÇÃO.

O procedimento de seleção é função do SO, sendo conhecido como escalonamento (scheduling). A


parte do código do SO responsável pelo escalonamento é o escalonador (scheduler). O SO deve
tratar todos os processos igualmente, evitando starvation.

EXECUÇÃO
(UCP)

ESCALONADOR
Processo

ESPERA
PRONTO
(E/S)

Processo Processo
Processo

Como já foi mostrado anteriormente, um bom sistema operacional multitarefa deve levar em conta os
critérios abaixo. Lembre-se que alguns podem ser mais “importantes” que outros, dependendo da
atividade que o sistema operacional desempenhará com suas aplicações:

- Utilização da CPU : o processador principal deve estar ocupado a maior parte do tempo
possível, a não ser que não haja o que executar mesmo;

- Throughput : é o número de processos executados por unidade de tempo; é desejável que a


quantidade de processos “atendidos” pelo sistema em um determinado intervalo de tempo
seja a maior possível;

- Tempo de turnaround : tempo decorrido desde a admissão do processo no sistema até o seu
término. Então, inclui tempo na fila de espera + tempo na fila de pronto + tempo de
execução;

- Tempo de Resposta : Em sistemas interativos, é o tempo decorrido entre o instante da


submissão de um pedido (teclar um ENTER após um comando, por exemplo) e a
apresentação da primeira resposta.

Algoritmos de escalonamento buscam otimizar a utilização da UCP e o throughput, enquanto tentam


diminuir os tempos de turnaround e de resposta. No entanto, o escalonamento somente afeta o tempo
de resposta de processos na fila de pronto.
UNESA - Sistemas OperacionaisI 10
 Tipos de Escalonamento

Exemplo: Para um sistema de tempo


compartilhado o tempo de resposta deve ser
o mais importante De forma geral o tempo de
utilização da CPU e throughput
Vários fatores influenciam os tempos devem ser máximos; o tempo de
turnaround e o tempo de resposta
acima: o sistema operacional, velocidade
do processador, velocidade dos dispositivos devem ser mínimos.
de I/O, tamanho da memória principal, etc.

ESCALONAMENTO
NÃO-PREEMPTIVO

Processo nunca é retirado da CPU


=> só sai por evento gerado pelo ESCALONAMENTO
próprio processo, ou seja, por PREEMPTIVO
evento voluntário, como:
• o processo acabou Além de sair da CPU por
• o processo fez requisição ao S.O. eventos voluntários, o processo
• o processo executou um coman também pode ser retirado pelo
do de “espera” (WAIT) sistema operacional (evento
involuntário)

FIFO(First-In-First-Out) SJF (Shortest-Job-First)


Processos PRONTOS Processos PRONTOS CIRCULAR POR MÚLTIPLAS
todos em UMA fila . todos em UMA fila. É FILAS COM
É escolhido o PRIMEIRO escolhido o processo que REALIMENTAÇÃO
da fila precisar de MENOS
tempo de execução.

COOPERATIVO : Processos PRONTOS todos em uma POR PRIORIDADES POR MÚLTIPLAS FILAS
fila. De tempos em tempos o processo que está em execução
verifica uma fila de mensagens e se houver algum processo
solicitando a UCP, então o que está em execução executa
DE SISTEMAS DE TEMPO REAL
um comando tipo WAIT e vai para o final da fila de
PRONTO,
liberando a UCP.

Alguns PROBLEMAS encontrados em escalonamentos não preemptivos:

 FIFO – previsão de início da execução do processo; processos CPU-bound de menor


importância prejudicam processos I/O-bound mais prioritários;

 SJF – determinar quanto tempo de UCP cada processo necessita para terminar seu
processamento;

 COOPERATIVO – não existe nenhuma intervenção do SO na execução do processo, o que


pode ocasionar problemas caso o processo não libere o processador.
UNESA - Sistemas OperacionaisI 11
Escalonamento Circular ou Round Robin

Implementação: UMA fila de PRONTO. Os processos entram na fila na ordem de chegada e sai
primeiro o que chegou primeiro (FIFO). É definida uma fatia de tempo (time-slice).

Um processo em execução pode deixar a CPU pelos seguintes motivos :


- acabou  nesse caso deixa de estar ativo no sistema
- fez requisição ao SO  nesse caso fica em estado de ESPERA
- acabou a fatia de tempo  nesse caso fica em estado de PRONTO, entrando no
final da fila de processos PRONTOs

Quando termina a fatia de tempo, sem que o processo tenha terminado ou feito uma requisição ao
SO, é o SO quem retira o processo de execução. Chamamos este evento (que é involuntário) de
preempção por tempo.

Lista de processos no Lista de processos


estado de PRONTO no estado de
ESPERA
C B A UCP Término do
processamento

Preempção POR TEMPO

Escalonamento por Prioridades

Implementação: UMA fila de PRONTO. Cada processo tem, associada a ele, uma prioridade de
execução. Tal prioridade pode ser dada ao processo pelo usuário ou pelo SO; pode ser estática
(quando é sempre a mesma ao longo da vida do processo) ou pode ser dinâmica (quando o SO a
modifica durante a vida do processo, de acordo com o tipo de processamento e/ou carga do sistema).

Um clock interrompe o processador em determinados intervalos de tempo, para que seja executada a
rotina de escalonamento . Esta rotina arruma os processos na fila de acordo com suas prioridades.
Se na fila de PRONTO estiver um processo com prioridade maior do que a prioridade do processo
que estava em execução, este que estava em execução passa a ficar em estado de PRONTO e o outro
de maior prioridade é escalonado para execução. Chama-se preempção por prioridade o evento em
que o SO retira um processo que estava em execução para dar lugar a outro processo de maior
prioridade. Note que este evento é involuntário, ou seja, não depende do processo que está sendo
“preemptado”.

Exemplo de prioridade dinâmica: para compensar o tempo


que os processos ficam em estado de ESPERA, o S.O faz
um acréscimo à prioridade dos processos sempre que saem
do estado de ESPERA.
UNESA - Sistemas OperacionaisI 12
Escalonamento por Múltiplas Filas

Implementação: VÁRIAS FILAS DE PRONTO, sendo que a cada uma está associada uma
prioridade. Cada processo é associado a UMA e SOMENTE UMA fila e nela PERMANECE durante
toda a sua vida no sistema.
O sistema SÓ PODE ESCALONAR PROCESSOS DE UMA DAS FILAS QUANDO TODAS AS
OUTRAS DE MAIOR PRIORIDADE ESTIVEREM VAZIAS.

Exemplo
Seja um sistema com três filas:

Maior prioridade
Fila de processos do sistema
(Escalonamento em prioridades)

Fila de processos interativos


(Escalonamento circular)

Fila de processos batch


(Escalonamento circular)
Menor prioridade

Escalonamento por Múltiplas Filas com realimentação

Implementação: VÁRIAS FILAS DE PRONTO, sendo que a cada uma está associada uma
prioridade. O sistema SÓ PODE ESCALONAR PROCESSOS DE UMA DAS FILAS QUANDO
TODAS AS OUTRAS DE MAIOR PRIORIDADE ESTIVEREM VAZIAS.
O SO PODE MUDAR um processo DE FILA de acordo com as características do processo e/ou
carga do sistema. Chama-se este esquema de mecanismo adaptativo.

Quando o processo é criado, entra no final da fila de MAIOR prioridade. Quando um processo em
execução deixa a CPU seja por preempção por prioridade ou por uma requisição ao SO, ele é
reescalonado dentro da MESMA fila. Quando deixa a CPU por preempção por tempo, o processo é
redirecionado para uma fila de MENOR prioridade. Quanto maior for a prioridade de uma fila
menor será a fatia de tempo associada a esta fila.

Escalonamento de Sistemas de Tempo Real

É um escalonamento UNICAMENTE por prioridade ESTÁTICA.

Escalonamento com Múltiplos Processadores

- Sistemas Fortemente Acoplados (Memória Compartilhada): UMA única fila de PRONTO


para todos os processadores. Todos os processos estão presentes nesta fila e são escalonados no
primeiro processador disponível. Naturalmente, cada processo só pode ser escalonado para um
processador.
UNESA - Sistemas OperacionaisI 13

- Sistemas Fracamente Acoplados (Memória Distribuída): cada processador tem o seu


próprio escalonamento, visto que cada processador tem sua memória própria, seu sistema
operacional próprio e consequentemente seu algoritmo de escalonamento próprio.

Exercícios
4.1 Qual a parte do sistema operacional responsável pela escolha de processos no estado de pronto
que passarão para o estado de execução?
4.2 O que é escalonamento?
4.3 Justifique: um algoritmo de escalonamento busca otimizar a utilização da UCP e o throughput,
enquanto tenta diminuir os tempo de turnaround e de resposta?
4.4 O que é starvation? O escalonamento de processos pode levar um processo a sofrer starvation?
Explique?
4.5 Cite fatores que possam influenciar no tempo total de execução de processos.
4.6 O que é preempção? Diferencie escalonamento preemptivo de não-preemptivo.
4.7 Como funciona o escalonamento FIFO? (Lembre-se de uma fila de banco)
4.8 Sejam os processos abaixo:

Identificação do CPU (u.t.) Característica do processo


processo
A 52 faz requisição de I/O a cada 15u.t.
B 11 faz requisição de I/O a cada 3u.t.
C 3 faz requisição de I/O a cada 2u.t.
onde por “CPU (u.t.)” estamos representando quantas unidades de tempo são necessárias para a execução dos processos em CPU

Suponhamos que sejam necessárias 8 u.t. (oito unidades de tempo) para que se realize qualquer uma
das requisições de I/O e que nenhum processo fique em momento algum bloqueado. Vamos
desconsiderar o overhead de criação/deleção de processos e de troca de contexto. O tempo gasto no
escalonamento de processos por parte do S.O. é de 1 u.t. (uma unidade de tempo). Considere que os
processos A, B e C entraram no sistema nessa ordem (A, B e depois C), mas a diferença entre tais
instantes é tal que pode ser desconsiderada. Considere também que os processos foram criados no
instante inicial de funcionamento do sistema (0 u.t.). Faça o papel do sistema operacional e complete
os quadros abaixo:

1a situação) Para um algoritmo de escalonamento não-preemptivo FIFO

Instante de tempo (u.t.) Fila de Pronto Executando na UCP Fila de Espera

Tempo que a CPU ficou inativa = ______ % do tempo total


UNESA - Sistemas OperacionaisI 14
a
2 situação) Para um algoritmo de escalonamento preemptivo ROUND ROBIN com quantum de
10u.t.

Instante de tempo (u.t.) Fila de Pronto Executando na UCP Fila de Espera

Tempo que a CPU ficou inativa = ______ % do tempo total

Baseado nos resultados dos quadros acima, preencha: (1,0p)

Tempo de turnaround Tempo de turnaround Avaliação


com sem multiprogramação ( MELHOROU OU PIOROU)
multiprogramação (“monotarefa”)
I) II) I) II)
Processo A % %
I) II) I) II)
Processo B % %
I) II) I) II)
Processo A + B % %

4.9 Considerando na fila de PRONTO de um sistema operacional que implementa um algoritmo de


escalonamento de processos de forma preemptiva circular, sem prioridades e de quantum fixo, as
seguintes situações:

1a situação) Muitos processos CPU-Bound e poucos processos I/O-Bound


2a situação) Somente processos I/O-Bound
3a situação) Muitos processos I/O-Bound e poucos processos CPU-Bound

Classifique cada sentença como Verdadeira (V) ou Falsa (F), justificando-as quando falsas:

I. Na 2a situação, mesmo que o único dispositivo de E/S seja rápido, a concorrência à


utilização é grande o que ocasiona menor utilização de tempo da UCP. ( )
II. Pode-se afirmar que o escalonamento de processos por parte do sistema operacional é o
único responsável pelo tempo de turnaround dos processos, afetando até o tempo que os
processo ficam na fila de espera. ( )
III. Na 3a situação a minoria de processos CPU-Bound sofreria starvation. ( )
IV. Com exceção da 2a situação, os processos CPU-Bound certamente irão monopolizar o
processador, mesmo que o tempo máximo de utilização do processador seja igual ao
quantum. ( )
V. Na 1a situação, quanto menor o tempo perdido na troca de contexto pior é, pois os
processos I/O-Bound solicitam operações de E/S a todo instante, independente do
aproveitamento do processador por parte dos processos CPU-Bound. ( )
UNESA - Sistemas OperacionaisI 15
Capítulo 5 – Comunicação entre processos

 Problemas de comunicação

A comunicação entre processos concorrentes deve ser tratada pelos sistemas operacionais. Os
mecanismos que garantem a comunicação entre processos concorrentes e o acesso a recursos
compartilhados são chamados mecanismos de sincronização;
Vejamos um exemplo onde pode ocorrer acesso concorrente a um arquivo em disco (memória
secundária):

 Imagine um arquivo de contas bancárias (ARQ_CONTAS) que contenha as informações de cada


cliente do banco (REG_CLIENTE), dentre elas o saldo. Quando é realizado algum lançamento
por um caixa, seja depósito ou retirada, um simples programa é executado:

READ (ARQ_CONTAS, REG_CLIENTE);


READLN (VALOR_DEP_RET);
REG_CLIENTE.SALDO : = REG_CLIENTE.SALDO+VALOR_DEP_RET;
WRITE (ARQ_CONTAS, REG_CLIENTE);

 Se em um mesmo instante dois caixas diferentes processarem seus lançamentos no saldo de um


mesmo cliente e, não houver controle do compartilhamento, o que pode acontecer?
Suponha que os dois caixas leiam do arquivo o saldo (R$ 100,00, por exemplo), um deles realize
uma operação de depósito de R$ 50,00 (total de R$ 150,00) e o outro de 500,00 (total de R$
600,00); o que realizou o maior depósito atualiza a informação do arquivo primeiro e o outro
atualize a informação logo depois, no instante seguinte; o resultado seria um saldo de R$ 150,00
para os dois depósitos.

 Exclusão mútua e região crítica

A solução mais simples para evitar problemas de compartilhamento de recursos é impedir que dois
ou mais processos acessem este recurso no mesmo instante. Essa exclusividade de acesso é chamada
exclusão mútua, ou seja, enquanto um processo acessa determinado recurso, todos os outros que
queiram acessá-lo deverão esperar até o término deste acesso.

A exclusão mútua deve afetar os processos concorrentes apenas quando um deles estiver realizando
acesso ao recurso compartilhado.

Somente a parte do código do programa onde é realizado o acesso ao recurso compartilhado,


chamada de região crítica, é executada de forma mutuamente exclusiva em relação a todas as
outras. Em outras palavras, se for possível evitar que dois processos entrem em suas regiões críticas
ao mesmo tempo, evitam-se problemas decorrentes do compartilhamento.
UNESA - Sistemas OperacionaisI 16
 Soluções de software para exclusão mútua

A) SEMÁFOROS

Um semáforo é uma variável inteira, não negativa, que só pode ser manipulada por duas instruções:
DOWN e UP. No caso da exclusão mútua, essas instruções funcionam para que um processo possa
entrar e sair de sua região crítica, respectivamente.

O semáforo fica associado a um recurso compartilhado, indicando quando este recurso está sendo
acessado por um dos processos concorrentes.

O uso de semáforos exige do programador muito cuidado, pois qualquer engano pode levar a
problemas de sincronização imprevisíveis e difíceis de reproduzir, devido a execução concorrente
dos processos.

B) MONITORES

O monitor é um conjunto de procedimentos, variáveis e estrutura de dados definido dentro de um


módulo, onde a exclusão mútua é implementada automaticamente entre seus procedimentos. O mais
importante é que toda a implementação da exclusão mútua nos monitores é realizada pelo
compilador, e não mais pelo programador, como no caso dos semáforos. As regiões críticas são
colocadas em forma de procedimentos no monitor e o compilador se encarrega de garantir a
exclusão mútua desses procedimentos, sendo as chances de erro menores.
UNESA - Sistemas OperacionaisI 17
Capítulo 6 – Gerência da Memória

 Alocação de memória

Ao executar um programa residente na memória secundária, deve-se, de alguma forma, carregá-lo


para a memória principal. A organização e a gerência da memória principal são fatores importantes
no projeto de sistemas operacionais modernos. Melhor dizendo, os sistemas operacionais devem
ocupar pouca memória e otimizar ao máximo sua utilização.

A) Alocação contígua simples – comum em sistemas monoprogramáveis, onde a memória principal


é dividida em duas partes: uma para o sistema operacional e outra para o programa do usuário. O
programador deve se preocupar em não ultrapassar o espaço disponível de memória endereçável,
ou seja, o tamanho total da memória principal menos o que está sendo ocupado pelo sistema
operacional. Para proteger a área do sistema operacional alguns desses sistemas implementavam
proteção através de um registrador, que delimita as áreas.
Nesse esquema de fácil implementação e código reduzido, apenas um usuário poderia dispor do
processador e da memória, que ficava sem utilização caso o programa do usuário não o
preenchesse totalmente. Como os programas estavam limitados ao tamanho da memória principal
disponível, a situação foi contornada dividindo-se o programa em partes (módulos) que pudessem
executar independentemente uma da outra, utilizando uma mesma área de memória (overlay);

B) Alocação particionada estática – para que a multiprogramação fosse eficiente, era necessário
que vários programas estivessem na memória principal ao mesmo tempo. Por esse motivo, a
memória foi dividida em pedaços de tamanho fixo, chamados partições. O tamanho das partições
era estabelecido na fase de inicialização do sistema, em função do tamanho dos programas que
iriam executar no sistema. Sempre que fosse necessária a alteração do tamanho de uma partição,
o sistema deveria ser desativado e reinicializado com a nova configuração.
Quando os compiladores e linkeditores geravam CÓDIGO ABSOLUTO, o código gerado
possuía endereços físicos de memória (observação: vamos trabalhar com endereços expressos em
decimal). O formato geral das instruções de máquina é:

endereço instrução

Para facilitar, vamos supor que cada instrução de alto nível gera 1 (uma) instrução de máquina.
Com código absoluto as instruções de máquina de um trecho do programa ficariam:

ENDEREÇO CÓDIGO DA INSTRUÇÃO


501
502 Ler B, C e H
503 A=B+C
504 D=H–A
505 Se D < 0 então vá para 502
506 J=V*H
507 Escreve J
508

Este programa SÓ PODE SER carregado na memória nos endereços físicos 502 a 507.

Com a evolução dos compiladores, linkeditores e loaders, a geração de CÓDIGO


RELOCÁVEL foi possível, e os programas podiam então ser carregados em qualquer região
UNESA - Sistemas OperacionaisI 18
disponível da memória. Ou seja, as instruções são geradas com um endereço virtual e não com o
endereço físico.

ENDEREÇO CÓDIGO DA INSTRUÇÃO


VIRTUAL

0 Ler B, C e H
1 A=B+C
2 D=H–A
3 Se D < 0 então vá para 0
4 J=V*H
5 Escreve J

No momento em que o programa é carregado na memória, um registrador de relocação recebe


o endereço inicial da região de memória que o programa irá ocupar (relocação dinâmica). Toda
vez que ocorrer uma referência a algum endereço virtual, o endereço contido na instrução será
somado ao conteúdo do registrador de relocação, obtendo-se desta forma o endereço físico. Então
esse programa (como qualquer outro) PODERÁ RESIDIR EM QUALQUER PARTE da
memória. REGISTRADOR DE
721
Para o exemplo anterior: RELOCAÇÃO

ENDERE ENDERE CÓDIGO DA INSTRUÇÃO


ÇO ÇO
VIRTUAL FÍSICO

0 0+721=721 Ler B, C e H
1 1+721=722 A=B+C
2 2+721=723 D=H–A
3 3+721=724 Se D < 0 então vá para 0+721=721
4 4+721=725 J=V*H
5 5+721=726 Escreve J

Como os programas normalmente não preenchiam totalmente as partições onde eram carregados,
eles deixavam pedaços de memória que ficariam impedidos de ser utilizados por outros
programas (fragmentação). E mesmo que existissem duas ou mais partições adjacentes que,
somadas, totalizassem o tamanho do programa, ele ficaria aguardando uma única que o
acomodasse;

C) Alocação particionada dinâmica – Como foi visto no item anterior, havia a necessidade de
diminuir o problema da fragmentação, aumentado o compartilhamento da memória principal. Na
alocação particionada dinâmica foi eliminado o conceito de partições de tamanho fixo, de forma
que cada programa utilizasse o espaço de que necessitasse, passando esse pedaço a ser uma
partição. A fragmentação no entanto, começaria a ocorrer quando os programas fossem
terminando e deixando espaços cada vez menores na memória, não permitindo ingresso de novos
programas.
Existiam duas possíveis soluções para este problema: na primeira, apenas os espaços adjacentes
são reunidos, produzindo um único espaço de tamanho maior; a segunda maneira envolve a
relocação de todas as partições ocupadas, eliminando todos os espaços entre elas e criando uma
única área livre contígua (alocação dinâmica com relocação). Porém a complexidade do seu
UNESA - Sistemas OperacionaisI 19
algoritmo e o consumo de recursos do sistema, como processador e área em disco, podem tornar
essu esquema inviável;
 Estratégias para escolha de partição

Na tentativa de evitar, ou mesmo reduzir, a fragmentação antes que ela ocorra, algumas estratégias
são implementadas pelos sistemas para determinar em qual partição livre um programa será
carregado para execução:

 BEST-FIT – escolhe a partição em que o programa deixa o menor espaço sem utilização; a
lista de áreas livres está ordenada por tamanho; desvantagem: com a alocação de partições
que deixem as menores áreas livres, a tendência é que cada vez mais a memória fique com
pequenas áreas não contíguas, aumentando o problema da fragmentação;

 WORST-FIT – é escolhida a partição em que o programa deixa o maior espaço sem


utilização; apesar de utilizar as partições maiores, os espaços livres maiores permitem o
aproveitamento da memória por um maior número de programas;

 FIRST-FIT – esse mecanismo escolhe a primeira partição livre, que tenha tamanho suficiente
para carregar o programa; a lista de áreas livres está ordenada por endereços crescentemente;
é mais rápida, consumindo menos recursos do sistema.

 Swapping

É uma técnica utilizada para tentar solucionar o problema de falta de memória. Seja uma memória
com área livre para programas de usuário de 500Kb. Imagine que há 4 programas A, B, C e D, cada
um com 200Kb, que poderiam estar todos ativos se coubessem na memória. Então aloca-se os
programas A e B somente. Se o programa A tiver que aguardar por algum evento, podemos retirá-lo
da memória e levá-lo para o disco, enquanto aguarda pelo evento. Enquanto isso o programa C, por
exemplo, pode ir para a memória para que sua execução seja iniciada.

SWAP OUT  retirada de um programa da memória para o disco


SWAP IN  retorno do programa do disco para a memória

 Memória Virtual

A utilização da memória virtual é uma outra técnica para tentar solucionar o problema de falta de
memória. Esta técnica consiste em: - utilizar os endereços virtuais
- o disco com continuação da memória principal
sem que o usuário perceba.
Se um programa de 200Kb só pode utilizar 100Kb da memória, porque não há mais área livre, os
outros 100Kb ficarão em disco. Somente quando os endereços virtuais que estão no disco forem
referenciados é que a 2a parte do programa vai para a memória.

 Mapeamento

Mecanismo que permite ao SO traduzir os endereços virtuais em endereços reais.


Implementação por software: o SO tem uma tabela com a tradução, que é mantida ma memória
principal. Esse mecanismo é custoso, pois envolve percorrer tabelas

End. Real Nº processo End. Virtuais


210 3174 20 a 133
UNESA - Sistemas OperacionaisI 20
323 2022 74 a 191
431 3174 0 a 20

Implementação por hardware: Translation Lookside buffer ou memória associativa


Qual o tamanho desses pedaços de programa?

 Paginação

O espaço de endereçamento virtual e o espaço de endereçamento real são divididos em blocos do


mesmo tamanho.
O princípio da localidade é a tendência dos programas de fazerem referência às posições
consecutivas da memória. Baseado nisso surgiu a idéia de se dividir os processos em blocos de
tamanhos fixos, chamados PÁGINAS. Se dividirmos também o espaço real em blocos do mesmo
tamanho, teremos na memória principal, por exemplo, algo assim:

Página 4 do
processo A
Página 10 do
Processo B
Página 1 do
processo A

Com isso não haverá espaços livres entre os espaços ocupados, isto é, fragmentação. As páginas são
levadas para a memória principal de acordo com a sua necessidade. Ao ser referenciado um endereço
qualquer de uma página, toda a página é colocada na memória.
Nesse esquema o endereço virtual é:

nº da deslocamento dentro da página


página

Cada processo tem sua tabela de páginas:

nº da página end. físico Bit de


validade
000 0
001 7024 1
002 810 1

O bit de validade informa se a página está na memória (igual a 1) ou não (igual a 0).
Por exemplo: o endereço virtual 001 3 do processo A está no endereço real 7024+3=7027. Se um
endereço referenciado não está na memória principal a página é alocada e a tabela de páginas é
atualizada. Esse mecanismo de só levar para a memória principal as páginas que são necessárias
chama-se PAGINAÇÃO POR DEMANDA. E chama-se FALHA DE PÁGINA (page fault) o evento
de o processo precisar de 1 página que não está na memória.
WORKING SET de um processo é o conjunto de páginas referenciadas por ele durante um intervalo
de tempo. Uma segunda definição: o conjunto das páginas constantemente referenciadas pelo
processo, devendo permanecer na memória principal. Caso contrário, o processo poderá sofrer com a
UNESA - Sistemas OperacionaisI 21
elevada taxa de paginação (TRASHING) comprometendo seu desempenho. O working set do
processo deve ter um limite máximo de páginas permitidas; quanto maior a working set , menor a
chance de ocorrer FALHA DE PÁGINA.

A paginação envolve uma operação de E/S, então é aconselhável que haja uma política que diminua
a taxa de paginação. A escolha da página “certa” a ser retirada da memória principal para que outra
seja carregada em seu lugar é importante. A página que está sendo retirada não deverá ser usada
posteriormente, o que ocasionaria nova troca. As estratégias para retirar páginas de um processo da
memória (realocação de páginas) são:

 Aleatória: retira uma página aleatoriamente; algoritmo fácil  pouco overhead  pouca
eficiência;
 FIFO (First In First Out): a 1a página referenciada é a 1a página a sair; algoritmo simples
utilizando fila  pouca eficiência;
 LRU (Least Recently Used): retira a página menos recentemente utilizada, ou seja, a que está
há mais tempo sem ser referenciada;
 NRU (Not Recently Used): parecida com a anterior, um flag de referência indica se a página
foi ou não utilizada. Inicialmente todas as páginas tem 0 (zero). Quando a página é utilizada,
seu flag=1. De tempos em tempos, todos os flags são zerados. Overhead menor que a
anterior, boa eficiência;
 LFU (Least Frequently Used): retira a menos freqüentemente utilizada. Utiliza um contador
que recebe um acréscimo cada vez que a página for referenciada. Grande eficiência; overhead
razoável.

Para qualquer estratégia: ANTES DE RETIRAR UMA PÁGINA DA MEMÓRIA é preciso verificar
o seu bit de modificação. Se a página foi modificada tem que ser atualizada no disco.

O tamanho da página é determinado pelo SO de acordo com o hardware (geralmente entre 512bytes
e 64Kb). Se a página for . . . então . . .

MUITO PEQUENA: tabelas de mapeamento muito grandes  grande overhead para percorrer
tabela  muita paginação  menor fragmentação;

MUITO GRANDE: memória ocupada sem utilização  custo maior a cada swap in, swap out
 maior fragmentação;

 Segmentação

Com o uso da paginação tentou-se deixar na memória apenas as páginas mais utilizadas de cada
processo, ao invés de deixar residente o processo inteiro. Mas o sucesso dessa técnica vai depender
da estrutura do programa. Uma outra idéia é dividir o programa pela sua estrutura e não em tamanhos
fixos. Os blocos tem então tamanhos diferentes e são chamados segmentos. O endereço virtual é
composto pelo número do segmento e o deslocamento dentro do segmento. O endereço físico é
calculado a partir do endereço físico do segmento + o deslocamento dentro do segmento. E somente
os segmentos referenciados são alocados na memória principal.
A eficiência desta técnica vai depender da modularização da aplicação: módulos grandes (cada
módulo será um segmento) nos quais somente uma parte do código é referenciada vai retornar ao
problema de ocupação desnecessária na memória.
UNESA - Sistemas OperacionaisI 22

SEGMENTAÇÃO COM PAGINAÇÃO


Os segmentos são estabelecidos de acordo com a estrutura do programa e os segmentos são divididos
em páginas. As páginas tem tamanho único no sistema. Os segmentos tem tamanho variável. O
endereço virtual é formado assim:

nº do nº de página dentro do segmento deslocamento dentro da página


segmento

Exercícios
1. Qual a diferença da alocação particionada estática e dinâmica?
2. Como funciona a alocação dinâmica com relocação e quais suas desvantagens?
3. O que é e qual a importância da análise do working set dos programas?
4. Qual a relação entre working set e trashing?
5. O que é falha de página e quais as formas de se evitá-la?
6. Diferencie paginação de segmentação com relação aos seguintes aspectos:
a) lógica dos programas X divisão dos espaços de endereçamento
b) fragmentação (quando e como ocorre)

7. Working Set de um processo A tem seu tamanho limitado a quatro frames e encontra-se ocupado
conforme quadro abaixo:

Página Última Flag de Entrada no Contador de


referência Referência sistema referências
1 260 u.t. 1 200 u.t. 3
5 150 u.t. 0 150 u.t. 0
2 200 u.t. 1 100 u.t. 1
4 250 u.t. 1 180 u.t. 2
Tabela 1 – Frames do processo A
Às 300 u.t. ocorre uma falha de página referente à página 3, pertencente ao processo A.
Responda qual página será escolhida para cada estratégia de relocação abaixo, justificando sua
resposta:
a) LRU b) FIFO c) NRU d) LFU

8. O working set de um processo possui quatro frames. O momento da carga (em segundos), o
momento do último acesso (em segundos), o contador de referências e o bit de modificação
(M) para cada uma das páginas na memória são mostrados abaixo:

PÁGINA CARGA ÚLTIMA CONTADOR M


REFERÊNCIA
0 126 279 2 0
1 230 260 4 0
2 120 272 3 1
3 160 280 1 1

a) Qual página será substituída pelo algoritmo FIFO? Justifique.


b) Qual página será substituída pelo algoritmo LFU? Justifique.
c) Qual página será substituída pelo algoritmo LRU? Justifique.

Você também pode gostar