Professional Documents
Culture Documents
A cada dia que passa os programadores necessitam de mais memória e mais programas
rodando simultaneamente para poderem tratar cada vez mais informações. O tratamento
necessário da memória utilizada não é uma tarefa fácil de ser implementada. Existem
vários requisitos que devem ser observados para o correto funcionamento, tais como,
Segurança, Isolamento, Performance, entre outros. Para isto a função de gerenciar a
memória passa a ser do sistema operacional e não mais do aplicativo. Para que uma
memória funcione de maneira correta, é necessário que se tome cuidado com vários
elementos como segurança e isolamento, e para isso é utilizado o gerenciamento de
memória. Este desenvolve sua função a partir de duas tarefas, a Alocação de Memória e
a Fragmentação. A Alocação pode ser tanto estática, feita quando o programa é
compilado, e a dinâmica, adiada até a execução. A Fragmentação, desperdício de
memória, por sua vez pode ser interna, sobra na memória reservada ao programa, e
externa que acontece quando após o termino dos programas são deixadas pequenas
lacunas entre as páginas. Para que a utilização da memória seja mais vantajosa, é
utilizada a Paginação, processos virtuais da memória, aplicados na divisão da memória
física em partições menores, chamadas de frames. O conjunto de registradores especiais
rápidos chama-se Translation Lookaside Buffer, estes são subdivididos em chave valor
que lhe é dado em todos os registradores ao mesmo tempo, e valor. Existe uma técnica
de gerencia de memória chamada memória virtual, que é onde memórias principais e
secundárias juntas criam a ilusão de que há muito mais memória, com isso os programas
e suas estruturas de dados não se limitam ao tamanho da memória física, e assumem
endereços na memória secundária. O gerenciamento de memória virtual pode ocasionar
vazamento de memória, ou seja, quando determinada quantia de memória é alocada e
não liberada mesmo que não sendo utilizada, assim dados perdem a referencia sem ao
menos terem usado memória. O gerenciamento automático chama-se Garbage collector.
Ele retira os blocos de memória automaticamente. Seus algoritmos são divididos em
duas famílias: a Identificação direta, por contagem de referência, e a Identificação
indireta, por varrimento.
[editar] Alocação
• Alocação Local:
Este processo de alocação é usado para variáveis que são locais a funções e sub-rotinas.
Isso significa que o processo em execução deve manter acessível as variáveis locais da
função ou procedimento que está executando no momento. Além disso, pelas
propriedades do escopo em blocos, também devem estar acessíveis as variáveis de
blocos mais externos. Em linguagens que permitem a definição de funções aninhadas,
acessando as variáveis de quaisquer funções definidas externamente à função
atualmente em execução. Como uma função pode chamar outras funções, um número
arbitrário de funções pode estar no meio de sua execução em um determinado momento,
mesmo que apenas uma esteja realmente sendo executada, isso indica que o contexto de
várias funções deve ser mantido enquanto as mesmas não concluíram sua execução.
[editar] Fragmentação
Externa: Ocorre à medida que os programas vão terminando e deixando lacunas cada
vez menores de espaços entre as páginas. Dependendo do tamanho que precisa ser
escrito em memória, estes espaços podem ser pequenos demais para serem úteis, e
assim ficam inutilizados.
[editar] Paginação
No contexto dos sistemas operacionais, a paginação da memória do computador é um
processo de virtualização da memória que consiste na subdivisão da memória física em
pequenas partições (frames), para permitir uma utilização mais eficiente da mesma. A
alocação de memória é requisitada por páginas, a menor unidade deste método. Cada
página é mapeada numa frame de memória através de um processo que chama
paginação. O sistema operacional pode estar em base do espaço de endereçamento, em
RAM, ou estar no topo do espaço de endereçamento, em ROM, e o restante do sistema
mais embaixo, em RAM. O primeiro modelo foi inicialmente empregado em
computadores de grande porte e minicomputadores (mas não é muito usado). O segundo
modelo é utilizado em alguns computadores de mão e em sistemas embarcados. O
terceiro modelo fez parte dos primeiros computadores pessoais, nos quais a parte do
sistema contida em ROm é denominada BIOS. Quando o sistema é organizado dessa
maneira, somente um processo pode ser executado a cada instante. Tão logo um usuário
tecle um comando, o sistema operacional carrega o programa solicitado do disco na
memória e o executa. Quando o processo finaliza, o SO coloca na tela um caractere de
prompt e espera por um novo comando. Ao receber um novo comando, carregará o
novo programa na memória, no espaço de endereçamento ocupado pelo programa
anterior.
• Algoritmo Ótimo
• Algoritmo Não Usada Recentemente
• Algoritmo FIFO
• Algoritmo Segunda Chance
• Algoritmo do relógio
• Menos Recentemente Usada
• WSClock
Quando deixam de existir referências a um objeto, este passa a ser considerado apto a
ser "coletado" pelo garbage collector, que significa dizer que será removido da
memória, deixando-a livre para uso por outros objetos.
• 640KB
o Para o sistema operacional e programas
• 384KB - área de memória superior (Upper Memory Area) ou UMA
o Para os adaptadores diversos como EGA & VGA, MDA, adaptadores
CGA, e de redes.
o ROM BIOS e Shadow RAM.
o E mais tarde, área de paginação de expansão de memória (EMS) vista
mais adiante.
Logo depois, foi provado que esta quantidade de memória se tornaria insuficiente para
as necessidades futuras.
[editar] Emm386.exe
[editar] Himem.sys
[editar] Smartdrv.exe
Já esse método permite que programas sejam executados mesmo que estejam apenas
parcialmente carregados na memória principal.
O espaço de endereçamento de cada processo precisa ser contíguo (i.e. contínuo) para
que se possa implementar o mecanismo de proteção descrito acima usando os
registradores base e limite.
O SO reserva espaço extra para expansão a cada processo ao seu carregado na memória.
Se o espaço previsto for insuficiente:
• O processo é abortado;
• O processo é deslocado para outro espaço livre maior;
• Outro processo é enviado ao disco para liberar a memória para o processo
originário da demanda.
Exemplo: se tamanho do bloco = 1 byte, 1/9 da memória serão utilizados para o mapa
de bits.
Desvantagens:
A lista ligada pode estar ordenada pelo campo início do segmento (vantagem da
atualização rápida da lista quando um processo termina):
• AXB ⇒ A_B
• AX_ ⇒ A__
• _XB ⇒ __B
• _X_ ⇒ ___
Os buracos adjacentes devem ser combinados num único. Para escolher o ponto em que
deve ser carregado um processo recém criado ou que veio do disco por uma troca,
vamos utilizar alguns algoritmos assumindo que o gerenciador de memória sabe quanto
espaço alocar no processo: - First Fit (primeiro encaixe): percorrer a fila até encontrar o
primeiro espaço em que caiba o processo. É um algoritmo rápido.
- Next Fit (próximo encaixe): o mesmo que o algoritmo anterior, só que ao invés de
procurar sempre a partir do início da lista, procura a partir do último ponto em que
encontrou. Desempenho próximo ao anterior.
- Best Fit (melhor encaixe): consiste em verificar toda a lista e procurar o buraco que
tiver espaço mais próximo das necessidades do processo. É mais lento, e desempenho
pior que o First Fit.
- Worst Fit (pior ajuste): pega sempre o maior buraco disponível. Desempenho ruim.
Esses algoritmos podem ter sua velocidade aumentada pela manutenção de duas listas
separadas, uma para processos e outra para buracos. Quando temos duas listas
separadas, outro algoritmo é possível. É o Quick Fit (ajuste rápido), que consiste em
manter listas separadas para alguns dos tamanhos mais comuns especificados (ex. uma
fila para 2k, outra para 4k, outra para 8k etc). Neste caso, a busca de um buraco com o
tamanho requerido, é extremamente rápido, entretanto, quando um processo termina, a
liberação de seu espaço é complicada, devido à necessidade de reagrupar os buracos e
modificá-los de fila.