quarta-feira, 13 de outubro de 2010

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.