Buscar

SOII_Aula004_04122012

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 13 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 13 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 13 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

SISTEMA OPERACIONAL II – AULA 04/12/2012 
 
Elaborado por Luciana SA Amancio Página 1 
 
RESUMO AULA PASSADA – FALTA DE MEMÓRIA 
 
1) Overlay 
 
A primeira solução que falei na aula passada foi o Overlay solução mais antiga e não se usa há 
bastante tempo. Ela consiste em não carregar todo o código do processo na memória, logo você 
gasta menos memória com o código desse processo. 
 
Pelo fato de todo o código não esta na memória você terá rotinas que não vão estar na memória. 
Estas sub-rotinas não podem ser executadas na CPU. Elas podem ser usadas, pois o processo 
pode precisar dessas sub-rotinas. 
 
Então como vai fazer? O que tem que ser feito é carregar na memória a parte onde está as 
subrotinas antes de chamar elas. Depois que carrega pode chamar. Essa solução consiste em ficar 
trocando parte do código entre a memória e o disco de forma que toda vez que você for chamar 
uma subrotina eu tenho que garantir que aquela parte onde está o código daquela subrotina esteja 
na memória. E isto é implementado pelo próprio programador que escreveu o código do 
processo. 
 
O programador tem que se preocupar em carregar do disco para memória o código da parte que 
contem a rotina que vai chamar naquele momento. É uma solução que precisa muito do 
programador. 
 
O sistema operacional dá pouquíssima ajuda. Ajuda que ele dá é uma ajuda trivial que é a 
capacidade de ler um pedaço do dado arquivo, no caso, o arquivo executável e colocar na 
memória. E todo o resto que controla isto é feito pelo programador do processo. É bastante 
custoso para quem estava programando, mas era o que se fazia porque não tinha suporte ao SO 
para fazer uma coisa melhor do que essa. 
 
2) Biblioteca compartilhada 
 
A segunda solução que vimos não usa o disco. O que ela faz é uma coisa que é difícil ter um 
organismo genérico para se fazer isto. O que é feito nesta solução é economizar memória de 
alguma forma. 
 
Não gastar memória de forma desnecessária. Como isto é feito de forma geral? Não duplicar na 
memoria um pedaço do código que se repetiria normalmente. Que pedaço de código seria estes? 
As bibliotecas. 
 
Toda linguagem tem uma ou mais bibliotecas de código que normalmente eram incorporadas no 
arquivo executável e eram executadas quando você chamava a rotina que utilizava esta 
biblioteca. Então a consequência disto é que quando você tinha dois processos na memória que 
foram criados na mesma linguagem que utilizava as mesmas bibliotecas havia duplicação de 
códigos na memória da biblioteca. Pois, os processos utilizavam a mesma biblioteca. 
 
Então a biblioteca compartilhada não é incorporada ao arquivo executável. Ela fica em um 
arquivo separado e durante a execução do processo o SO verifica quais bibliotecas que aquele 
arquivo executável utiliza. 
 
SISTEMA OPERACIONAL II – AULA 04/12/2012 
 
Elaborado por Luciana SA Amancio Página 2 
 
Nesse momento carrega as bibliotecas na memoria, mas em um lugar diferente do lugar normal 
do processo. De forma que outro processo que usa a mesma biblioteca vai compartilhar aquela 
área e não vai ter um gasto duplicado de memoria com o código das bibliotecas. 
 
3) Swap de Processos 
 
Nessa solução o SO entra quando a memória acaba é o usuário pedi para executar um processo 
novo. Então não tem memória para executar esse processo novo. O que o SO faz nesta situação? 
Ele vai escolher um processo para ser salvo em disco e ao fazer isto o SO vai liberar um pedaço 
da memória. Nesse pedaço que a memória foi liberada o SO carrega o novo processo. E ai você 
consegue rodar um processo que não conseguiria porque a memória estava cheia. 
 
A grande dificuldade é o fato do processo está em disco faz com que ele não seja executado 
porque ele está em disco. O processador só consegue executar código que está na memória. 
Quando for necessário executar esse processo, por exemplo, o usuário clicar na janela desse 
processo. Isto não poderia ser feito porque o processo está em disco. 
 
Qual é a solução para esta questão? A solução para essa questão é o SO neste momento. O 
usuário clica na janela desse processo que está em disco. Nesse momento o SO traz de volta para 
a memória este processo. Só que se a memória continua cheia. 
 
Então como o SO vai conseguir trazer o processo para a memória? Ele consegue trazer fazendo 
aquilo que vez antes. Que é escolhendo outro processo para ser salvo em disco. Fazendo isto o 
SO consegue trazer de volta o processo que foi salvo em disco para a memória. 
 
O que ocorre é uma troca entre os processos que estão em disco e os processo que estão em 
memória. Dai o nome swap de processos que quer dizer troca de processos. 
 
Esta solução não depende nada do programador. É transparente para quem está programando o 
processo. Para esta solução poder funcionar tem uma restrição em relação ao endereço que os 
processos utilizam. O processo está em um conjunto de endereço na memória ele vai para o disco 
e quando volta para memória vai para outro conjunto de endereço. 
 
No caso do SO utilizar endereço absoluto da memória quer dizer a partir do zero não é possível 
porque depois que o processo começa a executar. Ele passa a ter variáveis que contem endereços 
que são variáveis ponteiros que com o endereço a partir do zera elas vão estar apontando aonde 
o processo estava originalmente. 
 
Se o processo volta para memória em outro conjunto de endereços estas variáveis ponteiros vão 
estar apontando para o lugar original. Nenhum SO hoje em dia sabe corrigir estes endereços 
contidos nas variáveis ponteiros. Então dessa forma não é possível fazer a correção e ai você não 
consegue fazer o swap de processo como todo. Isso quando se usa os endereços absolutos. 
 
Mas quando não se usa os endereços absolutos, por exemplo, quando você usa registrador de 
base. O endereço conta a partir da base do processo. Neste caso o swap de processo pode ser 
feito. O processo vai ao disco quando ele volta para memória ele volta em outro conjunto de 
endereços e isto não atrapalha o processo desde que o SO muda a base do processo neste 
momento. Como todo o endereço que o processo usa é a partir da base. Se o SO muda a base 
tudo continua funcionando. 
 
SISTEMA OPERACIONAL II – AULA 04/12/2012 
 
Elaborado por Luciana SA Amancio Página 3 
 
O critério que o SO utiliza para escolher um processo é escolher os processos que estão no 
estado bloqueado já algum tempo porque dessa forma. O processo que está bloqueado há muito 
tempo tende a ficar bloqueado por muito tempo. O processo fica bloqueado no disco e quando é 
desbloqueado ele tem que voltar para memória. 
 
Qual a diferença entre o overlay e o swap? 
 
Overly não traz todo o código que está em disco (arquivo executável) para memória quando o 
processo começa. No swap de processos a memória fica cheia e o SO grava todo o processo em 
disco e quem faz isto é o SO. No overlay quem decide o que vai para memória é o programador. 
 
AULA DE HOJE 
 
SEGMENTAÇÃO SOB DEMANDA 
 
A segmentação ocorre na memória e depende do hardware ser capaz de implementar a 
segmentação. Não são todos os hardwares que permitem isso. A intel, por exemplo, permite. 
 
O nome do hardware que gerencia a memória. Existe um componente do hardware (HW) 
responsável por controlar a memória – Memory Mangement Unit (MMU) – Unidade de 
Gerenciamento de Memória. Este componente é responsável por implementar boa parte da 
segmentação. 
 
Antigamente este componente de HW era um chip separado que ficava na placa mãe. Hoje em 
dia, não. Esse componente de HW está contido no chip da CPU. Embora ele não faça parte da 
CPU. A CPU tem registradores, executa instruções, faz cálculos. Isto é a CPU. 
 
O componente que organiza a memória é uma coisa que não faz isso. Ele não faz calculo só 
controla a memória que é uma coisa importante. Alguns dispositivos que antigamente ficavam 
em um chip na placa mãeestão sendo acoplados no chip da CPU para ter um único chip na placa 
mãe. 
 
Unidade de processamento específicos para gráficos que se chama GPU – Graphical Processing 
Unit. 
 
O que diferencia a GPU da CPU? É o tipo de instrução que tem. No caso da GPU a instrução que 
ela tem é especifica para o cálculo vetorial, a soma de vetores. É importante também para o 
processamento de imagens. No caso da CPU a instrução efetua o cálculo número a número. 
Existe atualmente um movimento dos fabricantes de incorporar no chip da CPU a GPU. 
 
Não existe hoje nenhum caso que o componente de HW que gerencia a memória não esteja 
dentro do chip da CPU. 
 
Para você ter um maquina que tenha Segmentação tem que ter um MMU que implemente 
segmentação. 
 
O que é Segmentação? 
A ideia básica é você ter aquela divisão que o processo tem áreas é uma coisa conhecida pelo 
próprio hardware. Não é uma coisa que só o SO tem conhecimento que o processo tem 3, 4, 5 
áreas e aloca estas áreas na memória. O próprio HW tem conhecimento destas coisas. O que 
SISTEMA OPERACIONAL II – AULA 04/12/2012 
 
Elaborado por Luciana SA Amancio Página 4 
 
acontece? Normalmente cada área do processo é igual a um segmento. Por exemplo, os 
segmentos são numerados: 
 
- Código: 0 
- Dados (variáveis globais e dinâmicas): 1 
- Pilha (variáveis locais): 2 
- Biblioteca Compartilhada: 3 
 
Então cada área tem um segmento e um número. Durante a programação da linguagem de 
máquina esses segmentos são usados pelas instruções de linguagem de máquina. Você usa o 
endereço que leva estes segmentos em consideração. 
 
Então, por exemplo, vou chamar uma subrotina da biblioteca: CALL 3: 1000. 
Onde 3 representa o Nº do segmento e 1000 o Deslocamento a partir do início do segmento. 
 
Normalmente você passa um CALL é um endereço a partir do zero ou a partir do registrador de 
base. No caso acima, tem dois campos. Um campo é justamente qual é o número do segmento. 
Este campo é referente a biblioteca que pode ter várias subrtotinas. Qual é a subrotina que está 
valendo? Que estou chamando neste momento? Este é o segundo campo que é o Deslocamento a 
partir do inicio do segmento, por exemplo, 1000. Conforme mostra a Figura 1. 
 
 
 
 
O que estou querendo chamar aqui? Uma subrotina dentro da biblioteca. Onde está esta subrotina 
dentro da biblioteca? 1000 bytes além do início. No ponto sinalizado na Figura 1 está o código 
que estou chamando. 
 
Então todos os endereços que vou utilizar no meu código que usa segmentação são endereços 
que tem dois campos. Também chamado de endereço bidimensional (Número do segmento e 
Deslocamento dentro do segmento). 
 
SISTEMA OPERACIONAL II – AULA 04/12/2012 
 
Elaborado por Luciana SA Amancio Página 5 
 
Uma observação importante é que quando o computador gera o código na linguagem de 
máquina. Não se faz menção ao endereço absoluto do lugar onde está a biblioteca. Não estou 
usando o endereço absoluto no caso da biblioteca compartilhada apresentada na Figura 1. O que 
torna possível utilizar algumas coisas a segmentação. 
 
Uma vantagem da segmentação é fazer a proteção da memória. 
 
Proteção da memória 
 
Impedir que um processo utilize uma área da memória que não foi alocada a ele. Então um 
processo não consegue alterar a área de memória de outro processo. A Figura 2 mostra dois 
processos na memória. 
 
 
 
A primeira coisa que a proteção da memória vai me garantir que o processo 2 só vai usar as áreas 
dele. E o processo 1 só consegue usar as áreas dele. Quem implementa a proteção de memória é 
o HW e só ele pode proibir que um processo não acesse o endereço que não pertence a ele. 
 
Qual é a vantagem da proteção da memória? A vantagem é que um processo com defeito não 
atinge a memória de outro processo. É muito ruim um processo alterar a memória de outro 
processo. Por exemplo, o processo 1 se tivesse com defeito tinha que mudar de endereço e 
poderia alterar a variável do processo 2. O processo 2 não vai funcionar direito, pois o valor da 
variável foi alterado. 
 
SISTEMA OPERACIONAL II – AULA 04/12/2012 
 
Elaborado por Luciana SA Amancio Página 6 
 
Se isto fosse possível o próprio sistema operacional poderia ter suas variáveis alteradas e isto 
seria muito ruim. Não existir proteção da memória muitas coisas erradas podem acontecer. 
 
Quando um processo está com defeito ele pode estragar a própria memória dele, pois ele não 
consegue alterar as áreas que não são dele. Se ele tentar usar uma área que não é alocada a ele o 
HW a MMU não vai deixar. 
 
Então é a segmentação que introduz este conceito que é muito importante. Então o processo 1 
não consegue acessar as áreas de memória do processo 2. Logo, ele não consegue estragar a área 
do processo 2 e ambos não conseguem estragar a área do Sistema Operacional isto em termos de 
memória. 
 
 As vantagens da segmentação são você não ter endereços absolutos sendo usado e a proteção da 
memória. 
 
Implementação da Segmentação 
 
Existe uma Tabela para cada processo que guarda os dados dos segmentos do processo. Essa 
tabela tem um conjunto de registros e tem um registro para cada área do processo. Conforme 
mostra a Figura 3. Esta tabela é preenchida pelo sistema operacional e ela guarda informação 
sobre cada segmento do processo. 
 
 
Figura 3 
 
 
Que informações são estas? Vamos ver duas por enquanto. Início do segmento na memória e o 
Tamanho do segmento. O processo 2 tem uma tabela equivalente a tabela da Figura 3. 
 
Esta tabela é preenchida pelo sistema operacional. De onde vêm as informações que são 
preenchidas na tabela pelo SO? O tamanho do segmento é um dado de controle que existe no 
arquivo executável por consequência no processo ou é um dado da biblioteca compartilhada. 
Com esta informação o SO sabe qual o tamanho de cada segmento. 
 
Como o SO preenche o início do segmento na tabela de segmentos? Usando o algoritmo de 
alocação. O SO vai rodar um dos algoritmos de alocação n vezes. Uma vez para cada área. E vai 
alocar uma área de memória para o processo. Então esta área que o SO escolheu e preenchida na 
coluna início de segmento na tabela de segmentos do processo. 
 
Esta tabela vai ser consultada pelo HW na hora da execução do código desse processo. Por 
exemplo, executar a instrução CALL 3:1000. Onde 3 é o nº do segmento e 1000 é o 
deslocamento do segmento. 
 
SISTEMA OPERACIONAL II – AULA 04/12/2012 
 
Elaborado por Luciana SA Amancio Página 7 
 
Várias coisas acontecem na hora de executar a instrução CALL 3:1000. A primeira coisa que é 
feita é verificar se o segmento é um segmento válido porque pode não ser. MMU verifica se o 
segmento é válido. O maior segmento é visto na tabela de segmentos. Neste caso é 3. 
 
Verifica se 3 nº segmento informando no CALL é maior que o máximo nº de segmento da tabela. 
Se for maior tem um problema. Por exemplo, se fosse CALL 5:1000. 5 > 3 . 3 é o máximo 
segmento da tabela de segmento. Não existe o segmento 5 no processo. Neste caso, a MMU 
(HW) gera uma interrupção. 
 
O que é uma interrupção? É quando a CPU para de fazer o que está fazendo e executa uma outra 
rotina que é tratadora daquele tipo de interrupção. Por exemplo, neste caso aqui CALL 5:1000. O 
que o HW vai fazer? Vai vê que 5 > 3 vai gerar uma interrupção. 
 
Qualquer rotina que trata interrupção é uma rotina do Sistema Operacional. Então, neste caso 
especifico, a rotina do SO que trata este tipo de interrupção tipicamente aborta o processo. 
 
Esta é a primeira coisa que o HW implementa para garantir a proteção de memória. 
 
Supondo que não gerou a interrupção. O número de segmento é usado para identificar qual o 
registro de segmento que será utilizado para continuar executando esta instrução. É feita uma 
segunda verificação. Se o valor 1000 (da instrução CALL 3:1000 ) é maior ou menor que 
Tamanho do Segmento equivalente ao Maximo Número de Segmento daTabela de Segmentos 
do Processo 1 = 1000 > 5000? Não. Ok! Mas poderia ser, por exemplo, ao invés de 1000 ser 
21000. Se isso fosse possível, estará dentro do processo do Sistema Operacional. 21000>5000? 
Sim. Isto é um problema e a MMU gera uma interrupção. Tipicamente a rotina do SO que trata 
este tipo de interrupção aborta o processo. 
 
1000 é somado com o valor do início do segmento, ou seja, 1000 + 45000 = 46000 é o endereço 
de memória utilizada conforme mostra a Figura 2. O endereço 46000 guarda o código da 
subrotina a ser executada pela CPU depois que o CALL 3:1000 é feito. 
 
Então é um HW mais sofisticado do que o registrador de base e é uma coisa simples. As 
primeiras CPUs da Intel não tinham isto. Na 3ª geração de CPU de 16 bits da Intel que passou a 
ter segmentação. Hoje em dia isto é trivial. 
 
Outra vantagem é que na segmentação podemos fazer a compactação. Digamos que não tivesse o 
processo 2 na memória. Conforme mostra a Figura 4. 
 
Agora cada segmento tem um novo início. Conforme mostra a Figura 5. Então compactei a 
memória e alterei o inicio do segmento. A instrução CALL 3:1000 vai continuar executando. 
Aquela subrotina que estava no 46000 agora está no 21000. 
 
A tabela de segmentos do processo fica no PCB do processo. Cada processo tem a sua tabela e o 
HW MMU sabe qual é a tabela do processo que está em execução. 
 
Então a segmentação faz com que o HW tenha um grande controle do que está na memória. 
Impedindo que um processo atinja as áreas do outro processo. Esse controle que a MMU HW faz 
vai além da memória simples. 
 
SISTEMA OPERACIONAL II – AULA 04/12/2012 
 
Elaborado por Luciana SA Amancio Página 8 
 
Ela também controla se o processo faz o uso correto de cada uma das suas áreas. Cada área que o 
processo tem um proposito específico. 
 
 
 Figura 4 Figura 5 
 
Área de código contem o código executável do processo que tem que ser executado. Área de 
dados contem as variáveis globais e as variáveis dinâmicas do processo. Área de pilha contem as 
variáveis locais do processo que vão ser utilizadas durante a execução dele. Área da biblioteca 
que contem código executável que é comum a mais de um processo. 
 
A tabela de segmentos do processo contém mais dois campos que permitem o HW controlar se o 
uso das áreas de segmentos está correto. Estes dois campos são chamados de Executável e 
Alterável. Onde 1 representa que o segmento é executável ou alterável e 0 que o segmento não é 
executável ou alterável. Conforme mostra a Figura 6. Então este é o controle que o SO preenche 
na tabela de segmentos do processo. 
 
Não faz sentido alterar o código do processo quando ele está executando, geralmente isto é feito 
alterando o código do arquivo fonte e recompilando. 
 
 
Figura 6 
 
SISTEMA OPERACIONAL II – AULA 04/12/2012 
 
Elaborado por Luciana SA Amancio Página 9 
 
O HW durante a execução de acordo com o tipo de instrução ele permite ou não que o segmento 
seja alterado ou executado. Por exemplo, CALL 1:500. Isso faz sentido? Não, pois o segmento 1 
é não executável. O que vai acontecer? A MMU vai gerar uma interrupção, pois o segmento está 
definido como não executável na tabela de segmento deste processo. 
 
A MMU sempre que vê alguma coisa errada ela gera uma interrupção. E o SO trata a 
interrupção. Tipicamente o SO aborta o processo com este tipo de interrupção. Porque é um erro 
um processo ter chamar um subrotina em uma área que contem variável que é a área de dados. 
 
Como o HW acessa esta tabela? Existe um registrador que tem o endereço da tabela de 
segmentos do processo que está em execução. Por exemplo, endereço X que aponta para onde 
está a tabela. O HW antes de executar vai neste registrador e descobre onde está a tabela de 
segmentos do processo. 
 
Digamos que se tem uma variável local P que é um ponteiro que aponta para variável dinâmica 
que está na Heap na área de dados. Como é este ponteiro? 1:200. Então a variável dinâmica está 
no endereço 30200 na área de dados do processo1. Conforme mostra a Figura 7. 
 
 
Figura 7 
 
Quando se vai usar o ponteiro que fica em outro canto a mesma lógica de verificação se é valido 
ou não vai acontecer. 
 
Linguagens 
 
1 – Compiladas 
2 – Compiladas + Interpretada 
3 – Interpretadas 
 
SISTEMA OPERACIONAL II – AULA 04/12/2012 
 
Elaborado por Luciana SA Amancio Página 10 
 
No caso 1 linguagem compilada, por exemplo, C e Delphi. O compilador compila o código fonte 
e gera um arquivo executável na linguagem da maquina que vai rodar o arquivo executável. 
 
No caso 2 a linguagem precisa primeiro ser compilada par uma linguagem intermediária. A 
linguagem interpretada às vezes é chamada de máquina virtual no caso do Java. 
 
As linguagens do caso 3 não são muito utilizadas. Exemplos, deste tipo de linguagem: arquivo 
Bat, cmd.exe. Existe um programa que é o interpretador que lê o arquivo fonte e executa este 
arquivo. Então a CPU ela executa o código executável do interpretador e é o interpretador que lê 
o que está no arquivo fonte e executa. Evidentemente que um código interpretado é mais lento 
porque é o código do interpretador que tem que entender o que o programador escreveu. O 
interpretador tem que entender durante a execução do código fonte. 
 
Na linguagem compilada já está direto o que tem que fazer é um CALL. É muito mais rápido, 
pois está na linguagem de máquina. Todas as verificações são feitas antes do código fonte ser 
compilado. Então o código gerado é um código perfeito para executar. 
 
Na interpretação todas as validações são vista na hora que o arquivo fonte está sendo 
interpretado. 
 
Em Java se compila para um linguagem intermediaria que depois será interpretada para uma 
linguagem de máquina. A linguagem intermediária é algo mais próximo da linguagem de 
máquina. O que acontece é que boa parte do trabalho já é feito na compilação que é a validação 
do código fonte. 
 
Add Eax, Ebx  isto é o que gera a compilação. O HW executa direto. É mais rápido. 
 
No caso do Java a linguagem intermediaria se chama Bytecode. Para agilizar na execução do 
código Java um mecanismo é utilizado. Este mecanismo se chama Compilação Just in Time. O 
que é isto? Java tem métodos. Alguém chama um método que está compilado em Bytecode. O 
compilador interpreta qual método vai executar. Mais tarde este mesmo método é chamado de 
novo. Então interpretar de novo este método. O método é chamado pela terceira vez. E o 
Bytecode percebe que estão chamando muito este método. Então ao invés de interpretar de novo. 
Este método de Bytecode é compilado para linguagem de maquina Intel. Agora quando este 
método for chamado novamente não será mais executado em Bytecode, mas sim em linguagem 
de maquina final da Intel. 
 
Então com este mecanismo Java não fica muito lento. 
 
A máquina virtual Java é um processo que tem um código, dado, pilha. No interpretador normal 
o código que ele esta interpretando fica na área de dados dele. Na área de código do interpretador 
tem um código que interpreta a linguagem intermediaria. 
 
Java tem uma coisa diferente que é uma área de código do tipo novo. Uma nova área na memoria 
do processo da maquina virtual que é uma área. Que onde está gerando o código executável gera 
o código final e ao mesmo tempo eu preciso de uma área que possa alterar o conteúdo e possa 
chamar o executável. Então nesse caso a área de compilação que é uma área da maquina virtual 
do Java. É uma área que vai ter na memoria no bit de executável igual a 1 e no bit de alterável 
também igual a 1. Então essa e a exceção a regra que quando um é executável não pode ser 
alterável e quando é alterável não pode ser executável. 
SISTEMA OPERACIONAL II – AULA 04/12/2012 
 
Elaborado por Luciana SA Amancio Página 11 
 
 
O que o SO faz quando dá uma interrupção de uso de memória errada? Ele tipicamente aborta o 
processo,mais isso pode ser alterado pelo programador que criou o processo. Existe uma 
chamada que permite você alterar o comportamento da rotina do SO que executa o tratamento 
deste tipo de interrupção. Isto dá uma chance do processo fazer alguma coisa útil antes de 
abortar. Um exemplo onde isso ocorre e no Office da Microsoft que muda o comportamento 
normal do SO quando o programa comete uma falha que infringe a proteção da memória. Por 
exemplo, ocorre um problema no seu documento word. Ao invés do SO abortar o processo que 
executa o word pedi para executar uma rotina de tratamento do word que salva o que foi feito e 
recarrega o processo para memória. Mas nem sempre isto é possível, mas quando é possível é 
muito benéfico. 
 
Falha de Segmento (Segmentation Fault) o tipo de interrupção de acesso errado a memória 
tem esse nome. 
 
Paginação sob demanda 
 
Digamos que em uma memória a área do processo está disposta conforme mostra a Memória 
Lógica 1 da Figura 8. O que a paginação faz de diferente? Ela faz uma divisão da memória em 
unidades de tamanho igual que são as páginas. O tamanho da página é igual a 4 KB. Cada área 
tem um número inteiro de páginas. 
 
 
Figura 8 
 
O que tem de especial é que essa memória é uma memória ilusória (Memória Lógica). Isso não 
corresponde ao que existe de verdade. O chip de memória de verdade é outra memória. 
Conforme mostra a Memória Física Verdadeira da Figura 8. Essa outra memória que de fato 
existe. Ela basicamente é a memória ilusória com as páginas fora de ordem. 
 
Tudo que tem algum conteúdo na memória ilusória tem que existir no mundo verdadeiro. Então 
tem uma relação das páginas do mundo ilusório para o mundo real. Só que as páginas que estão 
no mundo ilusório aparecem no mundo real em outra ordem conforme mostra a Figura 8. Esta é a 
primeira diferença importante. 
 
SISTEMA OPERACIONAL II – AULA 04/12/2012 
 
Elaborado por Luciana SA Amancio Página 12 
 
Os processos acham que existe somente a memória ilusória. O que existe de verdade é a 
memória física que é a logica só que em outra ordem. As páginas da memória lógica que não tem 
conteúdo não são representadas na memória verdadeira. 
 
 Vantagens da Paginação 
 
O primeiro ponto é o seguinte se a memória lógica não existisse de verdade é uma ilusão então 
ela pode começar do zero. Tem a Memoria logica 1 e a Memoria logica 2 conforme mostra a 
Figura 8. 
 
Para que serve esta ilusão? Cada processo tem a sua memória lógica. As páginas que tem 
conteúdo existem no mundo verdadeiro. As páginas que não tem conteúdo não existem no 
mundo verdadeiro. 
 
Com esta ilusão do processo achando que a memória é toda dele. É garantido da proteção da 
memória. O conteúdo do processo 2 não aparece na memória lógica do processo 1. 
 
Segundo ponto existe uma questão que é colocar na memória dois processos que estão em 
execução. A dificuldade é o endereçamento. O endereçamento é absoluto que o processo pode 
ter. Preciso usar um mecanismo para conseguir ter na memória dois processos em execução. 
Então tem que usar registrador de base ou usar o endereço bidimensional que é a segmentação. 
 
Cada memória lógica tem o seu endereço zero. Na hora que o compilador está compilando para 
linguagem de máquina ele pode assumir que o endereço inicial do processo sempre será o 
endereço zero. Então todo o código fonte que é compilado é compilando com esta suposição. 
 
Então esta é uma vantagem conseguir colocar dois processos na memória verdadeira sem 
problemas de um processo confundir sua memória com a memória de outro processo, pois para o 
processo acha que está sozinho na memória física só que isto só é verdade na memória lógica. 
 
Ou vantagem importante é ausência da fragmentação. Na paginação a questão da fragmentação 
deixe de existir se no mundo real não existe a regra da continuidade. A mesma área está separada 
no mundo verdadeiro. 
 
A regra de ter que alocar uma área continua na memória isto é verdade na memória lógica, mas 
não é verdade na memória física. As áreas do processo precisam estar continua no mundo 
ilusório. No mundo ilusório nunca vai ter fragmentação, pois existem milhares de páginas 
lógicas entre as áreas de pilha e a área de dados. Se estas áreas precisarem crescer vão poder. 
 
Para conseguir criar uma página nova no mundo ilusório precisa existir página livre no mundo 
verdadeiro. Se precisar criar uma área de biblioteca vai ter espaço para criar na memória lógica 
desde que tenha página livre na memória verdadeira. 
 
Então a fragmentação que costuma ser um problema seria não tem na paginação. Não tem na 
memória lógica e nem na memória física. Esta é uma grande vantagem da paginação. 
 
O somatório das paginas logicas que tem conteúdo tem que ser menor ou igual às paginas da 
memória física da máquina. 
 
SISTEMA OPERACIONAL II – AULA 04/12/2012 
 
Elaborado por Luciana SA Amancio Página 13 
 
Usando a memória diretamente existem muito problemas, por exemplo, tem que usar registrador 
de base. Colocando a ilusão da memória lógica no meu do caminho resolve todos estes 
problemas. 
 
Há muito tempo atrás o SO rodava um processo por vez. A memoria real da máquina tinha um 
processo só. Eram muito mais simples neste tempo as coisas. A paginação traz esta simplicidade 
de volta. 
 
Tem uma desvantagem a paginação que é o seguinte o número inteiro de páginas por áreas. Na 
paginação cada área tem sempre um número inteiro de páginas. Só que o espaço que o processo 
precisa utilizar não necessariamente é um múltiplo do tamanho da página (4 kb). Podemos ter um 
código que precise apenas de 6 KB. 
 
Como existe a regra de sempre alocar um número inteiro de páginas. Terei que alocar 2 páginas. 
Terei um desperdício de 2 KB que será o final da última página. Este final é chamado de 
Fragmento interno. Que é um problema teórico da paginação. Isto é um problema que não é 
muito serio. 
 
Digamos que eu tenha um código que tem o tamanho de 8192 Bytes. Neste caso, não sobra nada 
ocupa duas paginas certinhas. Este é o melhor caso, perda de 0 bytes. O pior caso é quando o 
código oculpa um byte a mais, por exemplo, 8193 Bytes. Neste caso, a perda é de 4095 bytes e a 
perda média é de (0 + 4095)/2 = 2047,5 bytes.

Outros materiais