UNIVERSIDADE PAULISTA UNIP FUNDAMENTOS DE … · FUNDAMENTOS DE SISTEMAS OPERACIONAIS ... o mesmo...

18
UNIVERSIDADE PAULISTA – UNIP FUNDAMENTOS DE SISTEMAS OPERACIONAIS PROFESSOR PAULO HENRIQUE RODRIGUES > APOSTILA_02 < SISTEMAS MONOTAREFA, MULTITAREFA, MULTIUSUÁRIO Sistemas Monotarefa: Em computação, chama-se monotarefa um sistema operacional que permite a realização de apenas uma tarefa de cada vez. Um dos mais famosos sistemas operacionais monotarefa é o MS-DOS, um dos primeiros sistemas operacionais para computadores pessoais. Sistemas Multitarefa: O primeiro passo para a criação de programas multitarefas foi a criação dos programas TSR’s (Terminate and Stay Resident), que eram pequenos programas que permaneciam em memória enquanto se executava outro programa, geralmente alternados com combinações de teclas. Exemplo: agendas e antivírus. O passo seguinte foi a emulação de multitarefa. Exemplos são as primeiras versões do Windows (Windows 3.1 e Windows 3.11, em que este trabalhava sobre o DOS (sistema operacional monotarefa) mas o núcleo do programa tratava de fazer a sua própria gestão de processos. Se um processo bloqueasse o Windows, todas as aplicações também travariam pois eram dependentes de um mesmo gestor de controle. Posteriormente, surgiu um das principais componentes dos Sistemas Operacionais atuais, o escalonador de processos (scheduler) que faria a gestão, qualificação e gerenciamento de prioridade dos processos sem afetar o núcleo do Sistema Operacional. Existem dois tipos de sistemas multitarefa: 1) Multitarefa de antecipação – Sistemas Operacionais com esta qualidade esforçam-se para conseguir uma “democratização” dentro do processador. O kernel mantém em registro de todos os processos em execução (árvores de processos, em virtude desses processos estarem ligados uns aos outros como os ramos de uma árvore). Entre outros atributos acerca de cada processo, essa “árvore” inclui uma informação de prioridade com a qual o kernel calcula o tempo de CPU que deve dar a cada processo. Quando esse tempo acaba, o kernel tira o controle da CPU do processo e dá a outro processo que vem a seguir na fila. Quando a fila acaba, o kernel volta a dar o controle da CPU ao primeiro processo, fechando o ciclo. Exemplos de Sistemas Operacionais Multitarefa por Antecipação: Unix, Linux, BSD, Mac OS X, Windows NT4 e sistemas Windows posteriores. 2) Multitarefa de cooperação – Neste tipo de sistema não há controle sobre o tempo de CPU que cada processo consome. É dado o controle da CPU ao processo, e ele só devolve quando estiver pronto. Atualmente quase nenhum sistema operacional utiliza esse modelo de multiprocessamento. O problema maior nesse modelo é que quando um processo bloqueia a CPU, todos os processos em memória são atingidos. Esse sistemas são também conhecidos como sistemas operacionais com alternância de tarefas (task-switching). Exemplos: Windows 95/98, Mac OS.

Transcript of UNIVERSIDADE PAULISTA UNIP FUNDAMENTOS DE … · FUNDAMENTOS DE SISTEMAS OPERACIONAIS ... o mesmo...

UNIVERSIDADE PAULISTA – UNIP FUNDAMENTOS DE SISTEMAS OPERACIONAIS

PROFESSOR PAULO HENRIQUE RODRIGUES > APOSTILA_02 <

SISTEMAS MONOTAREFA, MULTITAREFA, MULTIUSUÁRIO

Sistemas Monotarefa: Em computação, chama-se monotarefa um sistema operacional que permite a realização

de apenas uma tarefa de cada vez. Um dos mais famosos sistemas operacionais monotarefa é o MS-DOS, um

dos primeiros sistemas operacionais para computadores pessoais.

Sistemas Multitarefa: O primeiro passo para a criação de programas multitarefas foi a criação dos programas

TSR’s (Terminate and Stay Resident), que eram pequenos programas que permaneciam em memória enquanto

se executava outro programa, geralmente alternados com combinações de teclas. Exemplo: agendas e antivírus.

O passo seguinte foi a emulação de multitarefa. Exemplos são as primeiras versões do Windows (Windows 3.1 e

Windows 3.11, em que este trabalhava sobre o DOS (sistema operacional monotarefa) mas o núcleo do

programa tratava de fazer a sua própria gestão de processos. Se um processo bloqueasse o Windows, todas as

aplicações também travariam pois eram dependentes de um mesmo gestor de controle.

Posteriormente, surgiu um das principais componentes dos Sistemas Operacionais atuais, o escalonador de

processos (scheduler) que faria a gestão, qualificação e gerenciamento de prioridade dos processos sem afetar o

núcleo do Sistema Operacional.

Existem dois tipos de sistemas multitarefa:

1) Multitarefa de antecipação – Sistemas Operacionais com esta qualidade esforçam-se para conseguir uma

“democratização” dentro do processador. O kernel mantém em registro de todos os processos em execução

(árvores de processos, em virtude desses processos estarem ligados uns aos outros como os ramos de uma

árvore). Entre outros atributos acerca de cada processo, essa “árvore” inclui uma informação de prioridade

com a qual o kernel calcula o tempo de CPU que deve dar a cada processo. Quando esse tempo acaba, o

kernel tira o controle da CPU do processo e dá a outro processo que vem a seguir na fila. Quando a fila

acaba, o kernel volta a dar o controle da CPU ao primeiro processo, fechando o ciclo. Exemplos de Sistemas

Operacionais Multitarefa por Antecipação: Unix, Linux, BSD, Mac OS X, Windows NT4 e sistemas Windows

posteriores.

2) Multitarefa de cooperação – Neste tipo de sistema não há controle sobre o tempo de CPU que cada

processo consome. É dado o controle da CPU ao processo, e ele só devolve quando estiver pronto.

Atualmente quase nenhum sistema operacional utiliza esse modelo de multiprocessamento. O problema

maior nesse modelo é que quando um processo bloqueia a CPU, todos os processos em memória são

atingidos. Esse sistemas são também conhecidos como sistemas operacionais com alternância de tarefas

(task-switching). Exemplos: Windows 95/98, Mac OS.

Sistemas Multiusuário

Sistemas Operacionais Multiusuários são caracterizados por sistemas onde podem existir vários usuários para

uma mesma estação, garantindo a privacidade para os usuários e a possibilidade de gerenciamento dos recursos

de cada usuário em particular.

Um sistema multiusuário garante também uma maior segurança, principalmente para quem irá administrar o

sistema, pois em sistemas desse tipo cada serviço roda utilizando um usuário pertencente ao próprio serviço,

com permissão apenas para manipular arquivos utilizados para o funcionamento do serviço.

Caso houvesse apenas um usuário (uma única conta) e o mesmo pudesse manipular todo o sistema, o sistema

seria completamente vulnerável a ataques.

Uma conta pode ser vista como uma entidade a nível do sistema operacional que armazena informações do

tipo:

· Nome do usuário (username);

· Identificador do usuário no sistema (UID);

· Grupo ou equipe de trabalho;

· Diretório pessoal do usuário;

· Interpretador de comandos que o usuário utiliza;

· Credenciais ou senhas do usuário;

· Permissões do usuário.

Exemplos de Sistemas Operacionais Multiusuário: Unix, Linux, Windows Server.

SISTEMAS COM COMPARTILHAMENTO DE TEMPO (TIME SHARING)

Os sistemas operacionais multiprogramados apareceram numa época em que os usuários acessavam as

máquinas através de "terminais burros" (sem capacidade de processamento local). Todo o processamento era

feito num computador central, cujo tempo de processamento era então compartilhado pelos vários usuários.

São também conhecidos como sistemas online. Para cada usuário o sistema aloca uma fatia de tempo (time

slice) de processador, e caso o programa não seja concluído neste intervalo de tempo, é substituído por outro

usuário e aguarda outra fatia de tempo.

Memória e periféricos também são compartilhados.

O sistema cria para o usuário um ambiente de trabalho próprio, dando a impressão de que todo o sistema está

dedicado a ele.

SISTEMAS DISTRIBUÍDOS

Os sistemas são distribuídos quando ocorre a computação paralela e descentralizada, realizada por dois ou mais

computadores conectados através de uma rede, cujo objetivo é concluir uma tarefa em comum.

Segundo Tanenbaum, sistema distribuído é uma “coleção de computadores independentes que se apresenta ao

usuário como um sistema único e consistente”. Computação distribuída consiste em adicionar o poder

computacional de diversos computadores interligados por uma rede de computadores, ou quando temos dois

ou mais processadores trabalhando em conjunto num mesmo computador, para processar colaborativamente

determinada tarefa de forma coerente e transparente, ou seja, como se apenas um único e centralizado

computador estivesse executando a tarefa.

O uso de tais sistemas tem se expandido nos últimos anos principalmente devido ao contínuo barateamento e

disponibilidade de hardware para computadores, bem como de meios físicos de comunicação. As vantagens de

Sistemas Distribuídos incluem a possibilidade de seu crescimento incremental (ou seja, novos computadores e

linhas de comunicação serem acrescidos ao sistema), a possibilidade de implementação de tolerância a falhas

através da replicação de processos em unidades de computação distintas. Embora o hardware desses sistemas

estejam num estágio avançado de desenvolvimento, o mesmo não se pode afirmar em relação ao software,

devido a complexidade adicional inerente a sua distribuição.

A organização do hardware em sistemas com várias CPUs se dá por:

SISTEMAS PARALELOS

Constituído de vários processadores tipicamente homogêneos e localizados em um mesmo computador

Entre os sistemas paralelos, temos duas vertentes:

Multicomputadores – cada processador possui sua própria memória local

Multiprocessadores – os processadores compartilham memória

SISTEMAS FORTEMENTE ACOPLADOS

São compostos de dois ou mais processadores compartilhando a mesma memória e controlados por apenas um

único sistema operacional

Sistemas fortemente acoplados geralmente são utilizados em sistemas que fazem uso intensivo da CPU, e o

processamento é voltado para a solução de um único problema.

SISTEMAS FRACAMENTE ACOPLADOS

Possuem dois ou mais sistema de computação, conectados através de linhas de comunicação. Cada sistema

funciona de modo independente, possui seus próprios processadores, memória e dispositivos.

Podemos dizer que uma rede de computadores é um Sistema Fracamente Acoplado. Cada nó é totalmente

independente do outro, podendo inclusive possuir sistemas operacionais diferentes. Caso uma conexão ou nó

sofra qualquer problema, os sistemas podem continuar operando normalmente.

Um exemplo clássico de computação distribuída (Fracamente Acoplada) é o projeto “Seti at Home”

(http://setiathome.ssl.berkeley.edu/), que visa procurar, em sinais de rádio interplanetários, algum vestígio de

vida extraterrestre. Um exemplo são os clusters de Servidores de Datacenters.

SISTEMAS DE TEMPO REAL

Sistemas de tempo real são sistemas cujas características dependem do cumprimento de requisitos temporais e

lógicos e onde as consequências do não cumprimento desses mesmos requisitos podem causar prejuízos

nefastos, como por exemplo, relacionados a segurança de pessoas. Nesta perspectiva, um Sistema Operacional

de Tempo Real (SOTR ou RTOS – em inglês, “real-time operating system”) é uma aplicação multitarefa na qual

várias tarefas críticas devem ser processadas em simultâneo. O sistema deve assegurar que as tarefas críticas

sejam tratadas em tempo útil. O uso de SOTR simplifica o projeto de um sistema. De um modo geral, um sistema

pode sempre ser desmontado num conjunto de processos. A função do SOTR é gerenciar esses processos

atribuindo-lhes "espaço" para que cada um deles execute, sem que isso destrua a integridade temporal do

sistema, isto é, dando prioridade para os processos críticos.

GERENCIAMENTO DE PROCESSOS

CONCEITUAÇÃO DE PROCESSOS

Um conceito chave em qualquer sistema operacional é o processo. Um processo é basicamente um programa

em execução. Associado com cada processo está seu espaço de endereçamento que o processo pode ler e

gravar. O espaço de endereçamento contém o programa executável, os dados do programa e sua pilha. Também

associado com cada processo está um conjunto de registradores, incluindo o contador de programa, o ponteiro

da pilha, outros registradores de hardware e todas as demais informações necessárias para executar o

programa.

Quando um processo é interrompido por qualquer motivo, ele deve ser reiniciado exatamente no mesmo

estado em que estava quando foi suspenso. Isso significa que todas as informações sobre o processo devem ser

explicitamente salvas em algum lugar durante a suspensão. Quando um processo é suspenso temporariamente,

todos esses ponteiros devem ser salvos. Em muitos sistemas operacionais, todas as informações sobre cada

processo são armazenados em uma tabela do sistema operacional chamada tabela de processos, que é uma

matriz (ou lista encadeada) de estruturas, uma para cada processo atualmente existente.

As chamadas-chave do sistema de gerenciamento de processos são as que lidam com a criação e com o

encerramento de processos. Um exemplo típico é um processo chamado de interpretador de comandos ou shell

(que lê comandos do terminal). O usuário digita um comando que requisita a compilação de um programa. O

shell agora deve criar um novo processo que executará o compilador. Quando esse processo terminar a

compilação, ele executa uma chamada de sistema para encerrá-lo.

Se um processo pode criar um ou mais processos (referidos como processos-filho), os quais podem criar

processos-filho, rapidamente chegamos a estrutura de árvore de processos. Processos relacionais que estão

cooperando para executar uma tarefa frequentemente precisam comunicar-se entre si e sincronizar suas

atividades. Essa comunicação é chamada comunicação interprocessos.

Outras chamadas de sistema:

requisitar mais memória ou liberar memória não utilizada;

esperar um processo-filho terminar;

substituir o programa por um diferente.

Os sinais são análogos ao software das interrupções de hardware e podem ser gerados por uma variedade de

causas além da expiração de temporizadores.

CONCEITO DE PROCESSO E/OU PROGRAMA

Uma analogia para um processo (ou programa) é um confeiteiro seguindo a receita para se fazer um bolo (o

programa é a receita do bolo)

Se o filho do confeiteiro se machuca então o processo e todos os estados “fazer o bolo” é salvo pelo

confeiteiro e ele dá início ao processo de prioridade mais alta, seguindo o livro de primeiros socorros

Cada processo constitui uma atividade

Todo processo possui um programa associado, uma entrada, uma saída e um estado.

CRIAÇÃO DE PROCESSOS

Nos sistemas simples ou aqueles projetados para executar apenas uma única atividade (controlador de forno de

microondas) é possível ter todos os processos que serão necessários quando o sistema é ligado. Em sistema de

propósito geral, é necessário algum modo de criar e terminar processos durante a operação, quando for preciso.

Quatro eventos principais fazem com que processos sejam criados:

1) início do processo;

2) execução de uma chamada ao sistema de criação de processo por um processo em execução;

3) uma requisição do usuário para criar um novo processo;

4) início de um job em lote.

Quando um sistema operacional é iniciado criam-se vários processos, alguns processos de usuários (em primeiro

plano), outros do próprio sistema (segundo plano) e que apresentam função específica.

Exemplos de processo em segundo plano: requisições de páginas web, mensagens eletrônicas (outlook). Esses

processos são chamados de “daemons”.

Para ver os processos que estão em execução em Sistemas Unix/Linux utiliza-se o comando “ps uxa”

Para ver os processos que estão em execução em Sistemas Windows pressiona-se CTRL + ALT + DEL

Muitas vezes, um processo em execução emitirá chamadas ao sistema para criar um ou mais novos

processos para ajudá-lo em seu trabalho. Em um sistema multiprocessado, permitir que cada processo execute

em uma CPU diferente também torna o trabalho mais rápido.

Em sistemas interativos, os usuários podem iniciar um programa digitando um comando ou clicando (duas

vezes) em um ícone. Cada uma dessas ações inicia um novo processo e executa nele o programa selecionado.

Em sistemas Unix, baseados em comandos que executam o “X Window”, o novo processo toma posse da

janela na qual ele se iniciou. No Windows, quando iniciado, um processo não tem uma janela, mas ele pode criar

uma (ou mais de uma). Nos dois sistemas os usuários podem ter múltiplas janelas abertas ao mesmo tempo,

cada uma executando algum processo. Usando o mouse, o usuário seleciona uma janela e interage com o

processo.

TÉRMINO DE PROCESSOS

Todos os processos executam e terminam, em razão de alguma das seguintes condições:

1) saída normal (voluntária)

2) saída por erro (voluntária)

3) erro fatal (involuntário)

4) cancelamento por um outro processo (involuntário)

Quando um processo termina no Unix/Linux ele emite uma chamada ao sistema com a função “kill”. No

Windows a função correspondente chama-se “TerminateProcess”.

ESTADO DE PROCESSOS

Cada processo é uma entidade independente, com seu próprio contador de programa e estado interno, mas

muitas vezes os processos precisam interagir com os outros. Um processo pode gerar uma saída que outro

processo usa como entrada.

Exemplo Unix/Linux: “cat arquivo arquivo2 arquivo3|grep sorocaba”

Existem três estados para um processo:

1) em execução (usando realmente a CPU naquela momento)

2) pronto (executável, mas temporariamente parado para dar lugar a outro processo)

3) bloqueado (incapaz de executar enquanto um evento externo não ocorrer)

Transições 2 e 3 são causados pelo escalonador de processos – uma parte do sistema operacional – sem que o

processo saiba disso. Transição 2 ocorre quando o escalonador decide que o processo em execução já teve

tempo suficiente de CPU e é o momento de deixar outro processo ocupar o tempo da CPU.

IMPLEMENTAÇÃO DE PROCESSOS

Para implementar o modelo de processos, o sistema operacional mantém uma tabela (um vetor de estruturas)

chamada de tabela de processos, com uma entrada para cada processo. Essa tabela contém informações sobre

o estado do processo, seu contador de programa, o ponteiro da pilha, a alocação de memória, os estado de seus

arquivos abertos, sua informações sobre contabilidade e escalonamento e tudo o mais sobre o processo que

deva ser salvo quando o processo passar do estado em execução para o estado pronto ou bloqueado, para que

ele possa ser reiniciado depois, como se nunca tivesse sido bloqueado.

CONDIÇÕES DE CORRIDA A REGIÕES CRÍTICAS

Por causa do paralelismo dos processos pode ocorrer que num dia tudo funcione bem e no outro dia haja uma

pane com o mesmo procedimento. Ex: num dia o operador manda o Word imprimir um arquivo e em seguida

manda o Excel imprimir outro arquivo. Em geral esta operação dá certo. Num certo dia, não dá. Por quê?

Porque, por coincidência, tanto o Word quanto o Excel perguntaram ao mesmo tempo quantos arquivos havia

no spool. E os dois receberam a resposta de que o spool estava vazio. E os dois pegaram o primeiro "slot" do

spool e colocaram nele um arquivo a ser impresso.

Chamamos de CONDIÇÃO DE CORRIDA a esta situação em que o resultado final depende de uma condição

particular. Se nenhuma providência for tomada, a CONDIÇÃO DE CORRIDA existe. Nem por isto o resultado será

necessariamente desastroso. E isto é o mais grave. Se você fizer, testar e vender um sistema, mas simplesmente

esquecer de verificar se há CONDIÇÃO DE CORRIDA, pode estar vendendo uma bomba de retardo. A pane pode

surgir só muitos anos depois.

Como impedir que dois processos executem ao mesmo tempo, cada um, a sua REGIÃO CRÍTICA?

REGIÃO CRÍTICA é o trecho de programa do processo que manipula um RECURSO COMUM. Veja que para um

dado recurso (o spool, no exemplo) pode haver dois ou mais processos que tenham regiões críticas. Outras

regiões de programa podem ser críticas em relação a diferentes recursos. Uma região de programa só é crítica

se ela se refere, se ela manipula, um recurso que outro programa (processo) também manipula.

O ideal é que exista uma variável comum, que é consultada por todos os processos envolvidos, quando desejam

utilizar aquele recurso, de forma a impedir os problemas descritos acima.

CONCORRÊNCIA E SINCRONIZAÇÃO

MONITORES E SEMÁFOROS

Um semáforo é um protocolo usado para controle do acesso a recursos compartilhados. Seu objetivo é assinalar

a ocorrência de eventos ou sincronizar tarefas. Genericamente, é uma permissão que uma tarefa adquire para

continuar sendo executada. Se o semáforo já estiver em uso, a tarefa é suspensa até que o semáforo seja

liberado.

COMUNICAÇÃO INTERPROCESSOS

É possível projetar um sistema controlador de um forno de microondas (simples) ou controlador de uma central

nuclear (complexo) sem usar o conceito de processos, e sem o perigo de duas tarefas críticas serem executadas

ao mesmo tempo. Bsta uma série de “ifs” dentro de um grande while:

While (1){ if(hora_de_baixar_as_barras){....}

if(hora_de_medir_a_radiacao){....}

if(hora_de_recarregar_uranio){....}

...

}

Por que escrever o controle da Usina Nuclear usando o conceito de processos, se é perfeitamente possível viver

sem isso?

Perceba que dentro de cada bloco acima há muito tempo perdido. Se era hora de baixar as barras o computador

tinha de dar a ordem ao robô que baixa as barras e o computador fica esperando até o robô terminar o serviço.

Só depois ia tratar de medir a radiação. Alguém teve a brilhante idéia de reescrever o sistema de controle da

usina atômica usando o conceito de SISTEMAS OPERACIONAIS. Só que, como toda a solução, novos problemas

surgiram.

Cada bloco acima foi colocado na memória, e para cada bloco foi criada uma área de dados, e para cada bloco

foi criada uma pilha nova, e cada bloco foi rebatizado de PROCESSO_A, PROCESSO_B, PROCESSO_C.

Uma das grandes vantagens de escrever um sistema operacional e depois escrever programas para ele,

programas que se tornarão processos, é que não precisa compilar todo o grande laço da usina nuclear hipotética

mostrado acima a cada vez que um dos blocos é modificado.

A outra grande vantagem foi dita: os processos rodam todos ao mesmo tempo, usando melhor a CPU.

E uma terceira vantagem é que o mesmo programa pode servir para núcleo de outros processos. Basta ver o

Word. Uma só cópia do Word fica na memória e ele pode editar muitos arquivos ao mesmo tempo. Basta trocar

de janela. Em cada janela a pilha, os dados e o arquivo aberto são diferentes.

Mais uma vantagem: podemos criar um novo processo com o sistema em funcionamento. Qual o preço a

pagar?

O preço é que há processos INDEPENDENTES e há processos COLABORADORES. Há processos que devem

trabalhar em harmonia. Para harmonizar os processos foi necessário dotá-los de um sistema de comunicação. É

a COMUNICAÇÃO INTERPROCESSOS. Exatamente como dois motoristas numa cidade: cada um pode ir para

onde quiser, quando quiser, ao mesmo tempo que os outros motoristas. SALVO nas esquinas. A manobra de

acelerar, numa esquina, não pode ser feita ao mesmo tempo. Essa manobra é chamada, em informática,

REGIÃO CRÍTICA DO PROGRAMA. A faixa pintada na esquina é o RECURSO COMUM AOS DOIS PROCESSOS. Pode

ser comum a vários processos.

Podemos fazer um paralelo entre processos e seres vivos. Eles obviamente foram programados por alguém, mas

a partir do momento em que o programa do processo ganha um espaço em memória, ganha uma pilha, ganha

uma área de dados, e, principalmente, ganha uma identidade, ele se torna autônomo.

Um mesmo programa, colocado mais tarde na memória, vai se comportar de forma diferente. Porque

dependerá de dados a lhe serem fornecidos. Dependerá da política de escalonamento...

Nem todo processo precisa se comunicar com outro processo. Se um processo cuida de abrir as portas da usina

conforme o horário, o dia da semana, os feriados, ele não precisa se comunicar com o processo que controla as

barras de combustível nuclear. Em geral os processos rodam simultaneamente, mas em alguns casos é

conveniente que os processos interessados num recurso se ponham de acordo.

Não é apenas para decidir quem pode entrar em sua região crítica, e quem deve esperar para entrar em sua

região crítica que precisamos da comunicação interprocessos.

Há também o caso em que um processo deve passar uma informação a outro, como os processos que ordenam

arquivos e depois enviam o nome do arquivo para o processo de impressão.

ESCALONAMENTO DE PROCESSOS

Escalonamento se refere a como os processos são distribuídos para execução no processador (ou

processadores) em um Sistema de Computação.

Segundo Tanenbaum: “Quando mais de um processo é executável, o Sistema Operacional deve decidir qual será

executado primeiro. A parte do Sistema Operacional dedicada a esta decisão é chamada escalonador (scheduler)

e o algoritmo utilizado é chamado algoritmo de escalonamento (scheduling algorithm).”

A forma como ocorre o escalonamento é, em grande parte, responsável pela produtividade e eficiência atingidas

por um Sistema de Computação. Mais do que um mecanismo, o escalonamento deve representar uma política

de tratamento dos processos que permita obter os melhores resultados possíveis em um sistema.

Escalonamento Não Preemptivo

Quando o processador responsável por um processo não pode ser retirado até que o processo seja finalizado.

Escalonamento Preemptivo

A CPU designada para um processo pode ser retirada em favor de outro processo. Algoritmos preemptivos são

mais adequados para sistemas em que múltiplos processos requeiram atenção do sistema (no caso de sistemas

multiusuários interativos - de tempo compartilhado) ou sistema de tempo real. A preempção, nesses casos,

representa a mudança do processo em execução. Dessa forma, para que a CPU seja retirada de um processo,

anteriormente interrompido, é fundamental que ocorra a mudança de contexto dos processos. Essa mudança

existe que todo o estado de execução de um processo seja adequadamente armazenado para sua posterior

recuperação.

Já os algoritmos não preemptivos são mais simples, comparados aos preemptivos, e adequados ao

processamento não interativo, como o caso de processamentos em lote. Embora não proporcionem

interatividades, são mais eficientes e previsíveis quanto ao tempo de entrega de suas tarefas.

ALGORITMOS DE ESCALONAMENTO

Existem vários algoritmos de escalonamento cujo objetivo fundamental é alocar o processados para um certo

processo, dentre os vários existentes, otimizando um ou mais aspectos do comportamento geral do sistema. Os

mais algoritmos mais conhecidos são:

1) FIFO (First In, First Out)

Forma mais simples. No escalonamento FIFO (primeiro a entrar, primeiro a sair) os processos prontos são

colocados em uma fila organizada por ordem de chegada. Em seu momento, cada processo recebe a CPU até

que sua execução total seja completada, ou seja, o processo permanece em execução até que seja finalizado.

Dessa forma, o escalonamento FIFO é um algoritmo não preemptivo.

Embora todos os processos sejam tratados igualmente, processos de pequena duração serão favorecidos, pois

dependendo da quantidade de processos que existem para serem processados antes dele, e da duração de cada

um dos processos, o serviço oferecido para estes processos menores pode ser ruim.

Outro ponto a ser analisado é que processos importantes podem ficar esperando a execução de outros

processos menos importantes, pois FIFO não possui mecanismos para distinguir os processos, ou seja, não

distingue níveis de prioridade.

2) Escalonamento Round Robin (escalonamento circular)

No escalonamento Round Robin os processos também são organizados por fila segundo a ordem de chegada e

são despachados para execução pelo processador. Entretanto, ao invés de serem executados até o final, a cada

processo é concedido um pequeno intervalo de tempo, denominado fatia de tempo, também chamado de time-

slice, quantum de tempo ou quantum. Se o processo não finalizar nesse tempo, ele é substituído pelo próximo

processo na fila de processos prontos, sendo o processo interrompido colocado no final da fila. Isto quer dizer

que ao final da fatia de tempo do processo, ocorre a preempção do processador, ou seja, o processador é

designado a outro processo, sendo salvo o contexto do processo interrompido para permitir a continuidade da

conexão deste processo quando chegar o seu momento novamente.

O escalonamento Round Robin se baseia na utilização de temporizadores, sendo um algoritmo preemptivo e

bastante adequado para ambientes interativos, ou seja, em sistemas de tempo compartilhado onde existem

vários usuários simultâneos sendo, portanto, necessário garantir tempos de resposta razoáveis.

3) Escalonamento Shortest Job First

O escalonamento Shortest Job First (SJF - Menor Job Primeiro) é uma variante do escalonamento FIFO, onde os

processos em espera pelo processador são organizados em uma fila segundo seu tempo de serviço, sendo

colocados na frente os menores jobs, isto é, os que serão processados em intervalos de tempo menores.

Mesmo sendo uma forma de escalonamento não preemptivo, oferece a vantagem de proporcionar tempos

médios de espera menores do que aqueles obtidos por um esquema FIFO. O grande problema deste esquema

de escalonamento é que o tempo de processamento de um job não pode ser determinado antes de seu

processamento, sendo necessario o uso de estimativas feitas pelo usuário ou programador, ainda assim pouco,

precisas.

4) Escalonamento Multilevel Feedback Queues

O escalonamento MFQ (Multilevel Feedback Queues - Filas Multinível Realimentadas) é um interessante

esquema de escalonamento baseado em várias filas encadeadas.

Todos os processos são colocados inicialmente na fila de nível 1, a qual possui comportamento FIFO. Quando

utilizar a CPU podem ocorrer três situações:

1) o processo é finalizado e então retirado das filas;

2) o processo solicita o uso de dispositivos de E/S, ficando bloqueado até que o pedido de E/S seja atendido,

voltando para a mesma fila até que seu quantum se esgote;

3) tendo esgotado seu quantum inicial de tempo, o processo é colocado na fila de nível 2.

4) Observações:

O escalonamento MFQ possui níveis de prioridades sendo os processos que estão atualmente na fila 1 e os de

mais alta prioridade.A última fila apresenta um comportamento um pouco diferente: ela possui escalonamento

Round Robin, onde os processos permanecem até que sejam finalizados.

As seguintes observações são relevantes neste tipo de escalonamento:

a) processos cursos são favorecidos pois recebem tratamento prioritário enquanto permanecem nas filas de

nível superior;

b) processos com uso intenso de E/S são favorecidos, pois a utilização de E/S não os desloca para filas

inferiores, até que o seu quantum termine;

c) processos de duração maior também são favorecidos, pois os quanta de tempo são progressivamente

maiores nas filas de nível inferior.

GERENCIAMENTO DE MEMÓRIA

Memória é um importante recurso que deve ser gerenciado cuidadosamente. É senso comum perceber que,

embora a capacidade de memória disponível nos sistemas de computação cada vez aumente mais, os

desenvolvedores de software demandam por mais memória para que seus programas possam ser armazenados

e executados.

Como o próprio nome sugere, gerenciamento de memória é a tarefa desempenhada pela parte do SO que

gerencia a memória. É função desta parte do SO conhecer quais regiões da memória estão em uso e quais não

estão sendo usadas, alocar memória para processos quando eles necessitam dela e desalocá-la quando os

processos terminarem de ser executados e gerenciar o swapping entre a memória principal e o disco, quando a

memória principal não for grande o suficiente para comportar todos os processos.

A necessidade de manter múltiplos programas ativos na memória do sistema impõe outra necessidade: a de

controlar como esta memória é utilizada por estes vários programas. O gerenciamento de memória é, portanto,

o resultado da aplicação de duas práticas distintas dentro de um sistema de computação:

• como a memória é vista, isto é, como pode ser utilizada pelos processos existentes neste sistema;

• como os processos são tratados pelo SO quanto às suas necessidades de uso de memória.

ORGANIZAÇÃO HIERÁRQUICA DE MEMÓRIA

Em um sistema de computação, o armazenamento de dados ocorre em diversos níveis. Em outras palavras, o

armazenamento é realizado em diferentes tipos de dispositivos devido à quatro fatores básicos:

1.) tempo de acesso;

2.) velocidade de operação;

3.) custo por unidade de armazenamento;

4.) capacidade de armazenamento.

Armazenamento interno: posições de memória disponíveis internamente ao processador para permitir ou

agilizar sua operação. É constituído dos registradores do processador e de seu cache interno.

Armazenamento primário: posições de memória externa diretamente acessíveis pelo processador. Ex: SRAM,

DRAM, EPROM, PROM, entre outras.

Armazenamento secundário: posições de memória externa que não podem ser acessadas diretamente pelo

processador, devendo ser movidas para o armazenamento primário antes de sua utilização. Geralmente são os

dispositivos de armazenamento de massa, tais como o disco rígido.

O armazenamento interno possui as maiores velocidades de acesso, ou seja os menores tempos de acesso,

representando os melhores dispositivos em termos de desempenho, embora sejam os mais caros. Por outro

lado, os dispositivos de armazenamento secundário são os de maior capacidade e os de melhor relação

custo/byte, mas consideravelmente mais lentos. O armazenamento primário representa um caso intermediário,

onde a velocidade e o tempo de acesso são adequadas a operação direta com o processador, mas cujo custo

ainda assim é alto.

Os registradores, implementados em número limitado devido ao seu custo, são geralmente usados para manter

dentro do processador dados freqüentemente utilizados. Os caches interno e externo devido a sua maior

velocidade, são usados para manter uma porção do programa que pode ser executada mais rapidamente do que

na memória principal, aumentando o desempenho do sistema. A memória primária armazena os programas e

dados em execução no sistema. Os dispositivos de armazenamento secundário são usados para preservação dos

dados de forma que permaneçam por um bom tempo. O cache de disco é utilizado para acelerar a operação das

unidades de disco, podendo esta técnica ser utilizada para outros tipos de periféricos.

Alocações Particionadas Estática e Dinâmica

Nos sistemas multiprogramados, a memória primária foi dividida em blocos chamados de partições.

Inicialmente, as partições, embora de tamanho fixo, não tinham necessariamente o mesmo tamanho,

possibilitando diferentes configurações para sua utilização. Este esquema era conhecido como alocação

particionada estática e tinha como grandes problemas:

- O fato dos programas, normalmente, não preencherem totalmente as partições onde eram carregados,

desperdiçando espaço;

- Se um programa fosse maior do que qualquer partição livre, ele ficaria aguardando uma que o acomodasse,

mesmo se existisse duas ou mais partições adjacentes que, somadas, totalizassem o tamanho do programa. Este

tipo de problema, onde pedaços de memória ficam impedidos de serem usados por outros programas, é

chamado de fragmentação ou segmentação.

Dado o problema da fragmentação/segmentação na alocação particionada estática, foi necessário um outro tipo

de alocação como solução e, conseqüentemente, o aumento do compartilhamento da memória. Na alocação

particionada dinâmica, foi eliminado o conceito de partições de tamanho fixo. Nesse esquema, cada programa

utilizaria o espaço que necessitasse, passando esse pedaço a ser sua partição.

A princípio, o problema da fragmentação/segmentação pareceu estar resolvido, porém, neste caso, a

fragmentação/segmentação começará a ocorrer, realmente, quando os programas forem terminando e

deixando espaços cada vez menores na memória, não permitindo o ingresso de novos programas.

ARQUIVO DE PAGINAÇÃO / MEMÓRIA VIRTUAL / ARQUIVO DE TROCA

Em um sistema de Processamento em Lotes, a organização de memória em partições fixas é simples e eficiente.

Desde que jobs suficientes possam ser mantidos na memória de modo que a CPU fique ocupada todo o tempo,

não existe razão para usar outra organização mais complexa. Em sistemas de tempo compartilhado, a situação é

diferente: normalmente existem mais usuários do que memória para manter todos os seus processos

(programas), de modo que é necessário manter os processos em excesso no disco. Para executar tais processos,

é necessário que eles sejam trazidos para a memória principal. O movimento de processos da memória principal

para o disco e vice-versa é denominado de swapping/ paginação.

Nas alocações particionadas estática e dinâmica, um programa permanecia na memória principal até o final da

sua execução, inclusive nos momentos em que esperava um evento, como uma operação de leitura ou gravação

em periféricos. Em outras palavras, o programa somente sairia da memória principal quando tivesse terminada

sua execução. Swapping pode ser usado em sistemas multiprogramados com partições de tamanho variável.

Desta forma, de acordo com algum critério, um programa pode ser movido da memória principal para o disco

(swap out) e, este mesmo programa, pode voltar do disco para a memória principal (swap in), como se nada

tivesse acontecido.

O swapping é realizado por rotinas especiais do SO chamadas de relocadores ou swappers. O relocador realiza

uma cópia desta área de memória em um arquivo especial denominado arquivo de troca ou swap file. Ao copiar

a área de memória para o disco, tal área é assinalada como livre, tornando-a disponível para outros processos.

SISTEMAS DE ARQUIVO

CONCEITUAÇÃO

Um conceito habitual que compõe praticamente todos os sistemas operacionais é o sistema de arquivos. Uma

das principais funções do sistema operacional é ocultar as peculiaridades dos discos e de outros dispositivos de

E/S, fornecendo ao programador um modelo agradável e claro de arquivos, independente de dispositivos.

Chamadas ao sistema são obviamente necessárias para criar, remover, ler e escrever arquivos. Antes que possa

ser lido, um arquivo deve ser localizado no disco, aberto e, depois de lido, ser fechado. Desse modo, chamadas

ao sistema são fornecidas para fazer essas tarefas.

Para ter um local para guardar os arquivos, a maioria dos sistemas operacionais fornece o conceito de diretório

como um modo de agrupar arquivos. São necessárias chamadas ao sistema para criar, renomear e remover

diretórios e também para colocar arquivos nesses diretórios e/ou removê-los de lá. Podemos colocar dentro de

diretório arquivos ou outros diretórios. Esse modelo dá origem a uma hierarquia, chamada de sistema de

arquivos.

Conceito importante de um sistema baseado em Unix: sistema de arquivos montados

Hierarquias de processos e de arquivos são organizadas como árvores, com a diferença que hierarquia de

processos normalmente não são muito profundas (mais de três níveis não é comum); já hierarquias de arquivos

compõe-se, em geral, de quatro, cinco ou mais níveis de profundidade. Hierarquias de processos costumam ter

pouco tempo de vida, no máximo alguns minutos; hierarquia de diretórios, por outro lado, podem existir por

anos.

Cada arquivo dentro da hierarquia de diretórios pode ser especificado fornecendo-se o caminho (path name) a

partir do topo da hierarquia de diretórios, o diretório-raiz. Esse caminhos absolutos formam uma lista de

diretórios que deve ser percorrida a partir do diretório-raiz para chegar até o arquivo, com barras separando os

componentes.

Ex: /etc/sysconfig/network-scripts/ifcfg-eth0

Permissões: antes que possa ser lido ou escrito, um arquivo precisa ser aberto e, nesse momento, as permissões

são verificadas.

Conceitos de arquivos em Unix: arquivos especiais permitem que dispositivos de E/S pareçam-se com arquivos.

Desse modo, eles podem ser lidos e escritos com as mesmas chamadas ao sistema usadas para ler e escrever

arquivos. Existem dois tipos de arquivos especiais: arquivos especiais de bloco e arquivos especiais de

caracteres. Arquivos especiais de bloco: discos. Arquivos especiais de caracteres: usados para modelar

impressoras , modems e outros dispositivos que recebem ou enviam caracteres serialmente. Por convenção os

arquivos especiais são mantidos no diretório /dev. Ex: /dev/lp (impressora)

DIRETÓRIOS

Para controlar os arquivos, os sistemas de arquivos têm, em geral, diretórios ou pastas, que em muitos sistemas

são também arquivos.

Sistema de diretório em nível único

A maneira mais simples de sistemas de diretório é ter apenas um diretório contendo todos os arquivos.

Nos primeiros sistemas esse sistema era comum, em parte porque havia apenas um usuário (projetos de

software mais simples).

A vantagem desse sistema é a facilidade de encontrar os arquivos rapidamente.

Sistema de diretório em dois níveis

Para evitar conflitos causados por diferentes usuários escolhendo o mesmo nome para seus arquivos, o próximo

passo foi oferecer a cada usuário um diretório privado. O que está implícito é que quando um usuário tentar

abrir um arquivo o sistema sabe qual é o usuário e então sabe em qual diretório buscar. Com consequência é

necessário algum tipo de procedimento de identificação, através de nome ou identificador, que não era

requerido em sistema de diretório de nível único.

Quando esse sistema é implementado em sua forma mais básica, os usuários podem ter acesso somente aos

arquivos em seus próprios diretórios. Contudo, uma pequena extensão é feita para permitir que os usuários

tenham acesso aos arquivos de outros usuários, fornecendo alguma indicação sobre o proprietário do arquivo a

ser aberto.

Uma situação na qual os usuários precisam ter acesso a outros arquivos, além dos seus próprios, é na execução

de programa do sistema. Ter as cópias de todos os programas utilitários em cada diretório é obviamente

ineficiente. Portanto, há a necessidade de um diretório de sistema que contenha os programas executáveis.

Sistema de diretórios hierárquicos

Hierarquia em dois níveis elimina os conflitos de nomes entre os usuários, mas náo é satisfatório para os

usuários com número muito grande de arquivos. É comum aos usuários quererem agrupar seus arquivos,

assumindo critérios lógicos.

Faz-se necessária, dessa forma, uma hierarquia geral, ou seja, uma árvore de diretórios. Com essa estratégia,

cada usuário pode ter tantos diretórios quantos necessários para agrupar os arquivos de uma maneira natural.

Quase todos os modernos sistemas de arquivos são organizados assim.

Nomes de caminhos

Quando o sistema de arquivos é organizado como uma árvore de diretórios, é preciso algum modo de

especificar o nome dos arquivos. São usados, comumente, dois métodos.

Nome de caminho absoluto – caminho formado entre o diretório raiz e o arquivo.

Exemplos:

Sistemas Unix: /usr/sysconfig/network-scripts/ifcfg-eth0

Sistemas Windows: c:\windows\system32\ansi.sys

Nome de caminho relativo – diretório atual de trabalho ou apontamento para um diretório próximo, não sendo

necessário mostrar todo o caminho ao SO.

Ex: “cat group” ou “cat ../passwd”

MÉTODOS DE ALOCAÇÃO E GERENCIAMENTO DE ESPAÇO

Os sistemas são geralmente armazenados em disco; portanto, o gerenciamento do espaço em disco é uma das

principais preocupações dos projetistas de sistemas. Existem duas estratégias geralmente utilizadas para

armazenar um arquivo de “n” bytes:

são alocados “n” bytes consecutivos de espaço em disco

o arquivo é dividido em vários blocos (não necessariamente contíguos)

Tamanho de bloco - Uma vez que se opte pelo armazenamento em blocos de tamanho fixo, a questão que surge

é qual deverá ser o tamanho do bloco (cluster). Tamanhos de blocos devem ser pensados em relação aos dados

que o sistema comportará.

Quotas de disco – Para impedir exageros no uso do espaço em disco, os sistemas operacionais multiusuário

oferecem um mecanismo para impor cotas de disco. A idéia é que o administrador de sistema atribua a cada

usuário um pedaço de espaço em disco e o sistema operacional assegure que os usuários não excedam suas

cotas.

CONFIABILIDADE E SEGURANÇA

A destruição de um sistema de arquivos é muitas vezes um desastre maior que a destruição de um computador.

Se um computador for aniquilado pelo fogo, por descarga elétrica ou outros meios, geralmente troca-se o

computador e resolve-se o problema.

Para um sistema de arquivo de um computador que estiver irrecuperavelmente perdido, seja por causa do

hardware, do software, etc, pode ser impossível. Se programas, documentos, fichas de clientes, comprovantes

de pagamento de impostos, bancos de dados, planos de marketing, ou outros dados forem perdidos para

sempre, as consequências podem ser catastróficas. Embora sistema de arquivos não ofereça qualquer proteção

contra destruição física do equipamento ou do meio de armazenamento, ele pode ajudar a proteger a

informação.

Eis algumas formas de realizar a proteção de sistemas de arquivos:

Cópias de segurança (backup) – Utilizados para recuperação e restauração de arquivos deletados, sobrescritos

ou alterados indevidamente.

Os backups são feitos, geralmente uma vez por dia, em fitas que possuem dezenas ou centenas de GB de dados.

Normalmente apenas dados/documentos são guardados em fita (arquivos do sistema operacional não fazem

parte do backup) e podem ser:

● completos – de todos os dados e documentos, mesmo os que não foram alterados

● incrementais – apenas dos dados e documentos que foram alterados

Compressão de dados – Quando se trabalham com quantidades imensas de dados, pode ser desejável

comprimir os dados antes de escrevê-los na fita. Contudo, para muitos algoritmos de compressão, um pequeno

defeito na fita de cópia de segurança pode pôr a perder o algoritmo de descompressão e tornar impossível ler

todo um arquivo ou até mesmo toda a fita. Portanto, a decisão de comprimir os dados de cópia de segurança

deve ser cuidadosamente considerada.

Dados ”vivos” – É difícil realizar a cópia dos dados quando o sistema de arquivo estiver sendo utilizado. Se os

arquivos e os diretórios estiverem sendo criados, removidos e modificados durante o processo de cópia, a cópia

poderá se tornar inconsistente. Além do mais, fazer uma cópia (backup) pode levar horas. Portanto talvez seja

necessário deixar o sistema off-line para que o backup seja realizado de forma consistente. É por esse motivo

que muitos backups são realizados após a meia-noite (ou fora de horário comercial).

GERENCIAMENTO DE ENTRADA E SAÍDA

Todos os computadores possuem dispositivos físicos para entrada e saída. Afinal, para que serviria um

computador se os usuários não pudessem dizer o que deve ser feito e não conseguissem verificar os resultados

depois do trabalho finalizado? Existem vários tipos de dispositivos de entrada e saída, como teclados, monitores

e impressoras. Cabe ao sistema operacional gerenciar esses dispositivos.

Consequentemente todo sistema operacional possui um subsistema de E/S para gerenciar seus dispositivos de

E/S. Alguns dos programas de E/S são independentes de dispositivo, isto é, aplicam-se igualmente bem a muitos

ou a todos os dispositivos. Outras partes dele, como os drivers de dispositivo, são específicos a cada dispositivo

de E/S.

ENTRADA/SAÍDA MAPEADA NA MEMÓRIA

Cada controlador tem alguns registradores usados para a comunicação com a CPU. Por meio da escrita nesses

registradores, o sistema operacional pode comandar o dispositivo para entregar ou aceitar dados, alternar por si

mesmo entre ligar e desligar ou executar alguma outra tarefa. A partir da leitura desses registradores, o sistema

operacional pode descobrir o estado do dispositivo, se ele está preparado para aceitar um novo comando e

assim por diante.

Além dos registradores de controle, muitos dispositivos têm um buffer de dados que o sistema operacional pode

ler ou escrever. Por exemplo, é comum aos computadores exibirem gráficos na tela de vídeo por meio de uma

memória de acesso aleatório (RAM) para vídeo, a qual é basicamente apenas um buffer de dados, disponível

para ser escrita pelos programas ou pelo sistema operacional.

A questão que surge é como a CPU se comunica com os registradores dos controladores e com os buffers de

dados dos dispositivos. Há duas possibilidades. A primeira é a seguinte: cada registrador de controle é associado

a um número de porta de E/S. A outra é mapear todos os registradores de controle no espaço de

endereçamento da memória.

DISPOSITIVOS DE ENTRADA E SAÍDA (INPUT E OUTPUT)

Os dispositivos de entrada e saída (E/S) ou input/output (I/O) são também denominados periféricos. Eles

permitem a interação do processador com o meio externo.

Exemplos de dispositivos de entrada de informações: teclado, mouse, drive de CD / DVD-ROM, scanner,

microfone, joystick, câmera filmadora, câmera digital, tela sensível ao toque, mesa gráfica e caneta ótica.

Exemplos de dispositivos de saída de informações: monitor de vídeo, drive de CD-ROM, caixa de som,

impressora, sensores (movimento, temperatura etc) e óculos (para realidade virtual).

Exemplos de dispositivos tanto de entrada como de saída de informações: modem, drive de disquete, gravador

de CD/DVD e disco rígido.

CHAMADAS AO SISTEMA (SYSTEM CALL)

A interface entre o sistema operacional e os programas dos usuários é definida pelo conjunto de chamadas ao

sistema que o sistema operacional oferece. As chamadas ao sistema disponíveis na interface variam de um

sistema operacional para outro (embora os conceitos básicos tendam a ser os mesmos). Exemplo:

computadores baseados em Unix possuem bibliotecas de procedimentos de chamadas ao sistema diferentes

daqueles baseados em Windows. Essa biblioteca de procedimentos de chamadas ao sistema são programas em

C e/ou em outras linguagens.

// PROF. PAULO HENRIQUE RODRIGUES – UNIVERSIDADE PAULISTA UNIP //