Curso Aluno Integrado UFC CED SEDUC-Ce
Autor: Sandro Olimpio | Publicado: 2012-01-12T10:55:00-08:00



CUrso Aluno Integrado



MÓDULO III - SISTEMAS OPERACIONAIS









UNIDADE I - INTRODUÇÃO DO MÓDULO SISTEMA OPERACIONAL








No
 módulo anterior, vimos sobre o funcionamento de alguns componentes de 
hardware de um computador, tais como os processadores, memória RAM, 
componentes gráficos e barramentos.

Para possibilitar a interação do 
usuário com os componentes de hardware, é necessário utilizar um 
programa de computador denominado sistema operacional. Esse sistema 
esconde do usuário detalhes que possibilitam a utilização de 
computadores pessoais em larga escala.

Pensando nisso, desenvolvemos 
este módulo de maneira que você possa compreender um pouco de como a 
interação entre hardware e sistema operacional ocorre e possa, também, 
conhecer boa parte da história dos sistemas operacionais modernos.

Desde
 já, esclarecemos que não tratamos mais da parte física do computador, 
mas sim da parte lógica, responsável por manipular, de alguma forma, a 
física. (fig 01)





SISTEMA OPERACIONAL É SOFTWARE

Em
 um estudo mais detalhado, você poderá verificar que o sistema 
operacional está presente desde sistemas para controle de aviões de 
guerra, até em aparelhos celulares. Nesta unidade, descreveremos 
detalhes interessantes e intrigantes do Sistema Operacional. Para melhor
 compreensão dos Sistemas Operacionais, observamos que será necessário, 
antes de entrarmos em detalhes a esse respeito, definirmos o que venha 
ser um Software.



Software (ou programa de computador) pode ser 
definido como a sequência de instruções lógicas a serem seguidas e/ou 
executadas na manipulação, redirecionamento ou modificação de um dado, 
uma informação ou um acontecimento. Um exemplo que caracteriza bem essa 
situação é quando você navega na Web, pois para navegar você utiliza um 
software denominado navegador (em inglês, browser). Os Software podem 
ser categorizados em: aplicativos e software de sistema. (fig 02)



APLICATIVOS E SOFTWARES DE SISTEMA

Os
 aplicativos são softwares, com finalidades específicas, comprados, 
baixados da internet  ou desenvolvidos pelos usuários, por exemplo, 
editores de textos, planilhas, jogos e sistemas de controle de estoque. 
Já os softwares de sistema fornecem o ambiente e as ferramentas nos 
quais os aplicativos podem ser criados e executados. Nessa categoria, 
estão situados o interpretador de comandos (também conhecido como 
shell), os compiladores, programas independentes de aplicação e o 
sistema operacional. (fig 03)





PRINCIPAIS SISTEMAS OPERACIONAIS

No
 entanto, gostaríamos de ressaltar que nem todos os sistemas 
computacionais precisam de sistemas operacionais. Podemos citar como 
exemplo, a máquina de lavar. A partir da interação do usuário com alguns
 botões específicos, esta realiza um conjunto de ações relativamente 
simples tais como ligar, lavar, enxaguar, desligar etc. Por isso, a 
adoção de um sistema operacional, apenas aumentaria os custos de 
desenvolvimento e produção.



Nos sistemas computacionais que 
precisam de sistemas operacionais, tais como os computadores pessoais, 
os mais conhecidos e utilizados são:

Microsoft Windows: família de 
sistemas operacionais criados pela Microsoft. Entre as versões do 
Windows estão o Windows 95, Windows 98, Windows 2000, Windows ME e o 
Windows 7.



Mac OS: família de sistemas operacionais criados pela Apple, destinados aos computadores da linha Macintosh.

Unix:
 tem sido o sistema operacional favorito dos programadores e a versão 
Linux tem se tornado popular para computadores pessoais. (fig 04)



FUNÇÕES DO SISTEMA OPERACIONAL

Existem
 ainda centenas de outros sistemas operacionais desenvolvidos para 
sistemas computacionais com finalidades específicas como mainframes, 
robótica, manufatura, sistema de controle em tempo real, entre outros.

Cada
 sistema operacional possui aspectos que se diferenciam em relação aos 
outros. Neste módulo, discutiremos os pontos que são comuns entre os 
sistemas da família Windows e Unix.

Resumindo, o sistema operacional 
realiza duas funções que não estão relacionadas: apresentar ao usuário 
uma interface conveniente com o hardware, o que é denominado de máquina 
estendida (ou máquina virtual), e gerenciar recursos do sistema (tais 
como processadores, memórias e dispositivos de entrada e saída). Essas 
funções serão detalhadas no decorrer deste módulo. (fig05)



ELEMENTOS DO SISTEMA OPERACIONAL

A figura, ao lado, mostra o sistema operacional em relação aos elementos de um sistema computacional.

Conforme
 essa figura, o sistema operacional gerencia recursos de hardware, 
permite aos aplicativos acessarem recursos de sistema (diretamente ou 
utilizando softwares de sistema) e fornece uma interação direta do 
usuário com o computador. (fig 06)



SISTEMA OPERACIONAL COMO UM GERENCIADOR DE RECURSOS

O
 primeiro destaque que fazemos a respeito do sistema operacional é que 
ele tem como principal tarefa manter o controle sobre quem está usando 
determinado recurso, evitando que haja conflitos de requisições entre 
diferentes programas e usuários.



Vale ressaltarmos que os 
recursos podem ser compartilhados de duas formas: no tempo e no espaço. E
 que cabe também ao sistema operacional, determinar como esse recurso 
será compartilhado no tempo e no espaço.



SISTEMA OPERACIONAL COMO UMA MÁQUINA ESTENDIDA

O
 sistema operacional também fornece ao programador, chamadas de sistema 
ou funções de biblioteca para permitir a programação de recursos. Por 
exemplo, para ler ou gravar dados em um disquete, o programador tem que 
se preocupar apenas com nomes de arquivos e as operações correspondentes
 a essas ações.

Para o programador lidar com a entrada e a saída de 
um CD, o sistema operacional oculta detalhes de implementação sobre o 
hardware e apresenta uma visão simples e agradável dos nomes dos 
arquivos que podem ser lidos e escritos. Dessa forma, o sistema 
operacional protege o hardware do disco e apresenta uma interface 
orientada para arquivos simples. Ele também oculta aspectos relacionados
 às interrupções, aos temporizadores, ao gerenciamento de memória e 
outros aspectos de nível inferior.



TAREFAS DO SISTEMA OPERACIONAL

Agora,
 vamos acompanhar como as tarefas que competem ao sistema operacional, 
mencionadas anteriormente, são executadas por ele. Quando o computador é
 ligado, normalmente o sistema operacional se torna ativo e controla os 
recursos do sistema. Nesse instante, é carregado um pequeno conjunto de 
instruções de sistema armazenadas na memória ROM (do inglês Read-Only 
Memory). Essas instruções verificam se o hardware do sistema está 
funcionando corretamente e, caso esteja, ativa as unidades de disco do 
computador. Além disso, todos os elementos chave do sistema operacional 
são carregados, os programas de inicialização são executados, a 
interface com o usuário é fornecida e o sistema é preparado para uso. 
Essa atividade é frequentemente denominada booting. (fig 07)





MULTIPROGRAMAÇÃO

Como
 já mencionamos anteriormente, na memória principal de um computador, 
podem existir vários programas armazenados simultaneamente. Esses 
programas disputam o acesso ao processador para serem executados. A 
técnica que possibilita manter, ao mesmo tempo, esses programas na 
memória principal, é denominada multiprogramação. (fig 08)





Um
 programa em execução reside na memória principal e suas instruções são 
processadas, uma após outra, em um ciclo denominado 
buscar-decodificar-executar (em inglês, fetch-decode-execute).

Outro 
aspecto que gostaríamos de frisar é que todos os sistemas operacionais 
modernos empregam a multiprogramação. Isso significa que, 
consequentemente, um sistema operacional deve realizar a gerência de 
memória para conhecer os programas que estão na memória e em que parte 
desta, eles residem. (fig 08)



PROCESSOS

Chamamos
 sua atenção também, para outro conceito importante do sistema 
operacional, o da ideia de processo, que pode ser definido como um 
programa em execução. Em outras palavras, um programa é um conjunto de 
instruções estáticas e um processo é a entidade dinâmica que representa o
 programa quando é executado. (fig 09 A)



GERENCIAMENTO DE PROCESSOS

Assim,
 com a multiprogramação, um sistema pode ter vários processos ativos ao 
mesmo tempo. O sistema operacional deve controlar esses processos com 
cuidado e, para evitar conflitos, ele realiza o gerenciamento de 
processos para rastrear o progresso de um processo e todos os seus 
estágios intermediários. (fig 09 B)





SINCRONIZAÇÃO DA CPU

Em
 relação às ideias de gerência de memória e de processos, outra 
necessidade é a sincronização da CPU, que determina qual processo é 
executado pela CPU em determinado ponto da memória. Gerenciamento de 
memória, de processo e compartilhamento de CPU são os três principais 
tópicos discutidos neste módulo.



É importante você ter sempre em 
mente que o sistema operacional é apenas um programa que deve ser 
executado. Os processos do sistema operacional devem ser controlados e 
mantidos na memória principal, junto com outros softwares de sistema e 
aplicativos. O sistema operacional é executado na mesma CPU que os 
outros programas.



Antes de detalharmos o gerenciamento de 
recursos, tais como a memória principal e a CPU, vamos explorar o 
conceito de tempo compartilhado.



TEMPO COMPARTILHADO

Uma
 vez feita a contextualização do assunto, passamos a observar que 
inicialmente, os sistemas de tempo compartilhado foram desenvolvidos 
para mainframes e que um mainframe é um computador de grande porte, 
dedicado normalmente ao processamento de uma grande quantidade de 
informações. Conectados ao mainframe normalmente existem vários 
terminais burros. Cada terminal burro consiste, essencialmente, de 
monitor e teclado conectados ao mainframe. O sistema operacional reside 
no mainframe e gerencia o compartilhamento de recursos entre vários 
usuários.

Quando um programa é executado no mainframe, a propriedade 
do processo resultante desse programa é atribuída para o usuário que 
executou o processo. A CPU é compartilhada entre todos os processos 
criados por todos os usuários e, para cada processo, é atribuído um 
tempo de acesso à CPU.

Nos mainframes, a premissa é que a CPU é tão 
rápida que pode lidar com as necessidades de vários usuários sem que 
nenhum deles perceba uma queda no desempenho do computador. Na verdade, 
os usuários de um sistema de tempo compartilhado às vezes podem sentir a
 degradação nas respostas do computador, dependendo da quantidade de 
usuários ativos e das capacidades da CPU. Quando o tempo de resposta é 
demorado, o usuário tem a impressão que o computador está lento.

Atualmente,
 vários computadores de mesa suportam sistemas operacionais que utilizam
 o compartilhamento de tempo para permitir que vários usuários utilizem o
 computador simultaneamente. (Fig 10)





OUTROS FATORES

Como
 o próprio nome implica, um computador pessoal não foi projetado para 
ser utilizado por múltiplos usuários e, originalmente, os sistemas 
operacionais não levavam isso em consideração. Com o passar dos anos, as
 funcionalidades dos computadores pessoais evoluíram e incorporaram 
muitos aspectos de sistemas maiores, tais como o compartilhamento de 
tempo.

Gostaríamos de destacar que, embora o termo computador de mesa
 seja comumente utilizado como sinônimo de PC, o termo estação de 
trabalho (em inglês, workstation) é mais apropriado para substituir o 
termo PC, descrevendo que o computador é individual, entretanto, com 
capacidade de suportar muito mais usuários. Os sistemas operacionais 
evoluíram para suportar essas mudanças no uso dos computadores.

Outro
 fato que também devemos levar em consideração quanto aos sistemas 
operacionais, é que nos dias atuais, os computadores estão conectados em
 redes.



UNIDADE II - GERENCIAMENTO DE PROCESSOS



PROCESSOS

Ao
 executar um programa, o usuário tem a impressão de possuir o 
processador e todos os demais recursos reservados exclusivamente para 
seu uso. Na realidade, o processador executa o programa de um usuário 
durante um intervalo de tempo e, no instante seguinte, poderá processar 
um outro programa.



Para que a troca de programas ocorra sem 
problemas, é necessário que todas as informações do programa 
interrompido sejam guardadas para que, quando este voltar a ser 
executado, não lhe falte nenhuma informação necessária à continuação do 
seu processamento. 



ESTRUTURA DO PROCESSO

Observe
 a figura 1. Nela, você pode verificar que um processo é formado por 
três partes, conhecidas como contexto de hardware, contexto de software e
 espaço de endereçamento que, juntas, mantêm todas as informações 
necessárias à execução de um programa.



CONTEXTO DE HARDWARE

Importante
 sabermos que, quando um processo está em execução, o seu contexto de 
hardware está armazenado nos registradores do processador e que no 
momento em que o processo perde a utilização da CPU, o sistema salva as 
informações do processo no contexto de hardware desse processo. (fig 11 e
 12)





CONTEXTO DE SOFTWARE

O
 destaque que fazemos em relação ao contexto de software, é que a  maior
 parte de suas informações é proveniente de um arquivo do sistema 
operacional, conhecido como arquivo de contas. Nesse arquivo, gerenciado
 pelo administrador de sistema, são especificados os limites dos 
recursos que cada processo pode alocar. O contexto de software é 
composto por três grupos de informações sobre o processo: identificação,
 quotas e privilégios (Fig 13).



BLOCO DE CONTROLE DO PROCESSO

Nesta
 seção, falaremos a respeito do Bloco de Controle do Processo que, de 
certa maneira, contempla o assunto focalizado anteriormente sobre 
estrutura de processo.



O processo é implementado pelo sistema 
operacional, por uma estrutura de dados denominada bloco de controle do 
processo (PCB, do inglês Process Control Block) e, a partir do PCB, o 
sistema operacional mantém todas as informações sobre o contexto de 
hardware, contexto de software  e espaço de endereçamento de cada 
processo.



ESTADOS DO PROCESSO

No slide 
anterior, comentamos a respeito de Bloco de Controle do Processo, aqui, 
dando sequência nesse assunto, discutiremos sobre os estados do 
processo. Iniciamos observando que os processos passam por diferentes 
estados ao longo do seu processamento, em função de eventos gerados pelo
 sistema operacional ou pelo próprio processo. Dessa forma, um processo 
pode encontrar-se em um dos seguintes estados: NOVO, PRONTO, EM EXECUÇÃO
 e FINALIZADO. Confira nos próximos slides a definição de cada um (Fig 
14).



ESTADO NOVO

O processo foi criado. Por exemplo, quando o 
usuário executa um aplicativo, o processo entra nesse estágio. A criação
 de um processo ocorre a partir do momento em que o sistema operacional 
adiciona um novo PCB à sua estrutura e aloca um espaço de endereçamento 
na memória, para uso. A partir da criação do PCB, o sistema operacional 
já reconhece a existência do processo, podendo gerenciá-lo e associar 
programas ao seu contexto para serem executados.



ESTADO PRONTO

O
 processo tem condições para ser executado e aguarda a oportunidade de 
utilizar o processador. A partir de um mecanismo conhecido como 
escalonamento, o sistema operacional determina a ordem e os critérios 
pelos quais os processos, em estado de pronto, devem utilizar o 
processador.



ESTADO EM EXECUÇÃO

O processo está sendo executado.



ESTADO FINALIZADO

O processo foi executado ou encerrado e o sistema operacional não precisa manter informações relativas a esse processo.



MUDANÇA DE ESTADO DO PROCESSO



É
 importante ressaltarmos que muitos processos podem estar nos estados 
pronto ou espera, simultaneamente. Entretanto, em um computador com 
processador de um único núcleo, apenas um processo pode estar no estado 
execução.



Destacamos ainda, que um processo muda de estado 
durante seu processamento em função de eventos originados por ele mesmo 
(eventos voluntários) ou pelo sistema operacional (eventos 
involuntários). Basicamente, existem cinco mudanças de estado que podem 
ocorrer a um processo, conforme mostrado na figura 15.





PROCESSOS INDEPENDENTES

Falaremos
 agora sobre três processos: independentes, subprocessos e thread. Esses
 processos são maneiras diferentes de implementar a concorrência dentro 
de uma aplicação. O que significa que, busca-se subdividir o código em 
partes para trabalharem de forma cooperativa. Vamos tratar de cada um 
desses processos (fig 16).



O uso de processos independentes é a 
forma mais simples de implementar a concorrência em sistemas 
multiprogramáveis. Neste caso, não existe vínculo do processo criado, 
com o seu criador. A criação de um processo independente exige a 
alocação de um PCB.



SUBPROCESSOS

Subprocessos
 são processos criados dentro de uma estrutura hierárquica. Neste 
modelo, o processo criador é chamado de processo pai, enquanto o novo é 
chamado de processo filho. Além disso, os processos filhos possuem seu 
próprio PCB  e podem compartilhar quotas com o processo pai.



Uma 
característica desta implementação é a dependência existente entre o 
processo criador e o subprocesso. Caso um processo pai deixe de existir,
 os subprocessos subordinados são automaticamente eliminados.



O 
uso de processos independentes e subprocessos demanda consumo de 
diversos recursos do sistema. Sempre que um novo processo é criado, o 
sistema deve alocar recursos, consumindo tempo da CPU, neste trabalho. 
Outro problema é a comunicação e sincronização entre processos, 
consideradas pouco eficientes, visto que cada processo possui seu 
próprio espaço de endereçamento (fig 17).



THREAD

O
 conceito de thread foi introduzido na tentativa de reduzir o tempo 
gasto na criação, eliminação e troca de contexto de processos nas 
aplicações concorrentes, bem como economizar recursos do sistema como um
 todo.



Em um ambiente multithread, um único processo pode 
suportar múltiplos thread, cada qual associado a uma parte do código da 
aplicação. Neste caso, não é necessário haver diversos processos para a 
implementação da concorrência.



Cada thread possui seu próprio 
contexto de hardware, porém compartilha o mesmo contexto de software e 
espaço de endereçamento com os demais thread do processo. O 
compartilhamento do espaço de endereçamento permite que a comunicação de
 thread, dentro de um mesmo processo, seja realizada de forma simples e 
rápida (fig 18).



COMPLEXIDADE DOS SOFTWARES

...A invisibilidade é uma das dificuldades essenciais ao desenvolvimento de software.



Quando
 Frederick Brooks, um notável cientista da computação de origem 
norte-americana, conferiu à invisibilidade a denominação de "uma das 
dificuldades essenciais do software", ele se referia a algo presente no 
domínio dos bits, sendo possível evitar deadlocks em software , desde 
que se contorne o surgimento de quaisquer das quatro condições (fig 19).
 Há técnicas sofisticadas para isso, que fazem uso, por exemplo, de um 
ramo da matemática, denominado Teoria dos Grafos. Mas este é um assunto 
para outra conversa.



COMO DETECTAR E TRATAR DEADLOCKS 

Por
 ora, o que provavelmente interessa a você, Aluno Integrado, é que a 
manifestação dos deadlocks mais comum é aquela que a você, certamente, 
causa mais irritação: os travamentos de programas. Na maioria das vezes 
em que um programa de computador deixa de responder, a causa não passa 
da imperícia do desenvolvedor de perceber as sutilezas envolvidas; 
tornando-se, portanto, refém daquilo que, tão tragicamente, denominam: 
invisibilidade.



A um usuário comum, tudo que resta fazer é 
notificar os desenvolvedores responsáveis pela criação do software a 
respeito do travamento e, preferencialmente, determinar de que maneira 
seria possível que eles, os desenvolvedores, reproduzissem o problema no
 local onde trabalham. Uma das vantagens de se usar software livre em 
relação aos softwares proprietários, é que o acesso a desenvolvedores de
 softwares livres costuma ser bastante direto - senão pelas barreiras 
impostas pela língua. E há chances de que eles tenham tempo suficiente 
para corrigir o erro, antes que ele volte a aparecer na tela do seu 
computador (fig 20).



ESCALONAMENTO DA CPU

Outra
 observação que fazemos, a respeito do assunto tratado no vídeo, é que 
as decisões de escalonamento da CPU também podem ser realizadas quando 
se desloca o processo do estado em execução para o estado de pronto, ou 
quando se desloca o processo do estado de espera para o estado de 
pronto. Esses são exemplos de escalonamento preemptivo, porque o 
processo atualmente em execução tem seu estado alterado pelo sistema 
operacional.



Os algoritmos de escalonamento são avaliados 
frequentemente por métricas específicas, como por exemplo, o tempo de 
retorno, que mensura o tempo entre o momento em que um processo chega ao
 estado de pronto e o instante que vai para o estado de execução. O 
ideal é que esse tempo de retorno seja pequeno.



ABORDAGENS DE ESCALONAMENTO

É
 importante você saber que existem várias abordagens que podem ser 
utilizadas para determinar qual processo será escolhido para passar do 
estado de pronto para o estado de execução. Destacamos, aqui, as três 
mais conhecidas: o primeiro a chegar é o primeiro a ser atendido (FCFS, 
em inglês First-Come, First-Served), o menor trabalho é o próximo (SJN, 
em inglês Shortest Job Next), e distribuição do tempo de processamento 
de forma equivalente entre todos os processos no estado pronto 
(Round-robin)(fig 21).



FCFS

A FCFS é uma 
abordagem de escalonamento não preemptiva que consiste em enviar os 
processos para a CPU, na ordem em que eles chegam ao estado de execução.
 Quando um processo obtém acesso à CPU, esse acesso é mantido desde que a
 CPU faça uma solicitação obrigando o processo a esperar, como na 
solicitação de um dispositivo em uso por outro processo.



Suponha 
que os processos P1 a P5 cheguem ao estado pronto no mesmo instante, mas
 na ordem e tempo de serviço, conforme mostrado na figura 22.



Na 
abordagem de escalonamento FCFS, cada processo recebe acesso à CPU. Para
 simplificar, vamos assumir que os próprios processos não se colocam no 
estado de espera. Uma vez que estamos supondo que todos os processos 
chegaram ao estado pronto ao mesmo tempo, o tempo de resposta para cada 
processo é o mesmo que o seu tempo de conclusão. Dessa forma, o tempo 
médio é igual a (140 + 215 + 535 + 815 + 940) / 5 ou 529.



O 
algoritmo FCFS é fácil de implementar, mas não usa fatores importantes, 
tais como requisitos de tempo de serviço. Apesar do tempo de serviço ter
 sido utilizado em nossos cálculos do tempo de resposta, o algoritmo não
 utiliza essa informação para auxiliar na definição da ordem de execução
 dos processos. O gráfico de Gantt, abaixo, mostra a ordem e o tempo de 
conclusão dos processos.



SJN

A SJN (Shortest 
Job First), assim como o FCFS, é uma abordagem de escalonamento não 
preemptiva que consiste em observar todos os processos no estado pronto e
 despachar aquele com o menor tempo de serviço. A figura mostra o 
gráfico de Gantt para o mesmo conjunto de processos que examinamos no 
exemplo do FCFS. Devido os critérios de seleção serem diferentes do 
FCFS, a ordem na qual os processos são programados e concluídos pelo SJN
 também são diferentes. Observe que o algoritmo de SJN se baseia no 
conhecimento do futuro, ou seja, ele envia à CPU o processo que é 
executado em menor tempo. Esse tempo é praticamente impossível de 
determinar. Assim, para executar esse algoritmo, o valor de tempo de 
serviço para um processo geralmente é estimado pelo sistema operacional,
 usando fatores de probabilidade diferentes e levando em consideração o 
tipo de trabalho. Entretanto, se essas estimativas estiverem incorretas,
 a eficiência do algoritmo se deteriora. O algoritmo de SJN é 
comprovadamente ótimo, o que significa que se pudéssemos saber o tempo 
de serviço de cada trabalho, o algoritmo SJN produziria o menor tempo de
 resposta para todos os trabalhos, em comparação com qualquer outro 
algoritmo. No entanto, uma vez que não podemos prever o futuro, fazemos 
suposições e esperamos que essas suposições estejam corretas.



ROUND-ROBIN

O
 algoritmo de escalonamento round-robin distribui o tempo de 
processamento de forma equivalente entre todos os processos no estado 
pronto. Esse algoritmo estabelece uma fatia de tempo determinado, que é a
 quantidade de tempo que cada processo recebe antes de retornar ao 
estado de pronto para permitir que outro processo seja executado. 
Eventualmente, será atribuída, ao processo de preempção, outra fatia de 
tempo de CPU. Esse processo continua até obter todo o tempo que precisa e
 finaliza sua execução. Note que o algoritmo round-robin é preemptivo. A
 expiração de uma fatia de tempo é uma razão arbitrária para remover um 
processo da CPU. Essa ação é representada pela transição do estado de 
execução para o estado de pronto. Suponha que a fatia de tempo utilizada
 para um determinado algoritmo de round-robin seja de 50 e que tenha 
sido utilizado o mesmo conjunto de processos dos exemplos anteriores. Os
 resultados do gráfico de Gantt(fig 25).



SISTEMA OPERACIONAL COMO UM GERENCIADOR DE RECURSOS

Para
 cada processo é dado um intervalo de tempo de 50 unidades, a menos que 
ele não precise de uma fatia completa. Por exemplo, o processo 2, 
originalmente, necessita de 75 unidades de tempo. Vamos supor que foi 
dada uma fatia de tempo inicial de 50. Quando a sua vez de usar a CPU 
chegar novamente, ele vai precisar de apenas 25 unidades. Portanto, o 
processo 2 termina e o processamento finaliza em 325 unidades de tempo.



O
 tempo médio para este exemplo é (515 + 325 + 940 + 920 + 640) / 5, ou 
668. Note que esse tempo de resposta é maior do que nos outros exemplos.
 Isso significa que o algoritmo round-robin não é tão bom como os 
outros? Não. Não podemos fazer tais afirmações gerais com base em um 
exemplo. Só podemos dizer que um algoritmo é melhor que o outro para o 
conjunto específico de processos.



O algoritmo de escalonamento 
round-robin é provavelmente o mais amplamente utilizado. Em geral, ele 
auxilia em todos os tipos de trabalho e é considerado o mais exato (fig 
25).



GERENCIAMENTO DE MEMÓRIA

MEMÓRIA PRINCIPAL

Gostaríamos
 de iniciar essa nossa conversa, chamando sua atenção para o fato de que
 todo computador possui uma memória principal onde são armazenados os 
programas em execução. E que essa memória pode ser vista como um grande 
bloco de espaço contínuo dividido em grupos de 8, 16 ou 32 bits. Cada 
byte (ou palavra de memória) possui um endereço correspondente, que é 
simplesmente um número inteiro que identifica determinada região da 
memória.



HIERARQUIA DAS MEMÓRIAS

Relembramos,
 portanto, que os primeiros sistemas operacionais possibilitavam que, em
 determinado momento, somente um programa ocupasse a memória principal. 
Quando o usuário executava outro programa, o que estava na memória era 
removido para que esse fosse colocado.



Nos sistemas operacionais,
 em que apenas um programa por vez é carregado em memória para execução,
 a alocação da memória principal é um problema simples de se resolver: 
basta reservar uma área de memória para o núcleo do sistema operacional e
 alocar o programa na memória restante. Assim, nos sistemas operacionais
 em que vários programas podem ser carregados na memória para execução 
simultânea, o espaço de memória destinado aos programas deve ser 
dividido entre eles para possibilitar o uso eficiente da memória 
principal.



De um modo geral, os programas são armazenados em 
memórias secundárias (por exemplo, disco rígido, CDs, DVDs e disquetes) 
devido ao baixo custo, à alta capacidade e à possibilidade de 
armazenamento permanente de dados (fig 26).



EXECUÇÃO DE PROCESSOS

Vamos
 pensar o seguinte... como o processador executa apenas instruções 
localizadas na memória principal, antes de um programa ser executado, o 
sistema operacional deve transferi-lo da memória secundária para a 
memória principal. Além disso, o tempo de acesso à memória secundária é 
muito superior ao tempo de acesso à memória principal.



Com isso, 
para maximizar o uso de recursos computacionais, tal como o 
compartilhamento do processador, o gerenciamento de memória deve manter,
 na memória principal, a maior quantidade possível de processos.



O
 que nos faz perceber que mesmo na ausência de espaço livre na memória 
principal, o sistema operacional deve permitir que novos processos sejam
 aceitos e executados.



RASTREAR PROGRAMA

Importante
 sabermos ainda, que o sistema operacional também deve proteger as áreas
 de memória ocupadas por cada programa, além da área onde reside o 
próprio sistema. Por exemplo, caso um programa tente realizar algum 
acesso indevido à memória, o sistema deve impedi-lo de alguma forma.



Você
 se lembra o que frisamos no começo deste módulo? Que em um ambiente de 
multiprogramação, múltiplos programas (e seus dados) são armazenados na 
memória principal?



Pois é, isso significa que o sistema 
operacional deve empregar técnicas para rastrear onde e como um programa
 reside na memória e converter o endereço lógico de um programa, no 
endereço físico da memória (FIG 27).



ENDEREÇOS LÓGICOS

Os
 endereços lógicos são criados como se o programa fosse carregado na 
localização 0 da memória principal. Vamos ser mais específicos: suponha 
que um programa seja carregado no endereço 500 da memória física. Assim,
 se esse programa utilizar o endereço lógico 200, ele fará referência ao
 endereço 700 na memória física.



Você pode dizer neste momento 
que, se nós mudarmos as posições de memória do sistema operacional e do 
programa, então os endereços lógicos e físicos para o programa seriam os
 mesmos. Isso é verdade. Mas você teria outras coisas para se preocupar.
 Por exemplo, um esquema de gerenciamento de memória deve sempre levar 
em conta a segurança, especialmente em um ambiente de multiprogramação. 
Dessa forma, é necessário impedir que um programa tenha acesso a 
determinado endereço que esteja além do seu espaço de memória alocado.



Com
 o sistema operacional colocado na posição 0, todos os endereços lógicos
 para o programa são válidos, com exceção daqueles que ultrapassam os 
limites da memória principal. Agora, se movermos a posição do sistema 
operacional, teremos que impedir que determinado endereço lógico de um 
programa acesse o espaço de memória dedicado ao sistema operacional. 
Isso não é complicado, mas aumenta a complexidade de processamento.