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.
Nenhum comentário:
Postar um comentário