Prévia do material em texto
SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 Elaborado por Luciana SA Amancio – 2012/2 Página 1 Como conseguir executar um processo em um endereço qualquer de memória? 1) Correção de endereços em tempo de carga 2) Registrador de base 3) Uso de endereçamento relativo a instancia atual 4) Segmentação 5) Paginação O USO DE ENDEREÇO RELATIVO A função usa o endereço a partir do endereço de memória e usa-se o endereço a partir da função em execução. Então os dois endereços neste caso é positivo a alguma coisa ou negativo a alguma coisa. Esta alguma coisa é a função que está em execução no momento. A INTEL tem Registrador de base e Endereçamento relativo a instancia atual. Ela tem estes tipos de endereçamento somente para alguns tipos de instruções. Antes de entrar no tema da aula de hoje, precisamos saber O que a memória contém? O que é armazenado na memória? A memória possui dois tipos de coisas: Código executável que está na memória e Variáveis Globais, Locais e Dinâmicas. A CPU só executa coisas que estão na memória. Cada processo tem códigos executáveis e variáveis. Esta é a divisão básica. ÁREAS DE MEMÓRIA DE UM PROCESSO As variáveis mudam de valor. Não existem processos que não usem variáveis. Embora o código executável não tenha muita diferença entre eles. As variáveis possuem uma divisão importante dentro delas. Existem diversas formas de se usar uma variável em um programa de linguagem de auto nível como Delfi ou C. As formas de se usar a variável determina como elas serão armazenadas dentro da área de código do processo. Existem três formas de se armazenar a variável dentro da área de código do processo: Global, Local e Dinâmica. As variáveis Globais existem o tempo todo no processo que está em execução e geralmente qualquer parte do processo consegue usar, alterar e consultar esta variável. As variáveis Locais só podem ser usadas dentro de uma sub-rotina. Elas são declaradas em uma sub-rotina, por exemplo, uma função. As variáveis Dinâmicas são criadas pela “vontade” do programador. Ele escreve um comando na linguagem para criar a variável. Só depois que este comando é executado que se pode utilizar a variável criada. SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 Elaborado por Luciana SA Amancio – 2012/2 Página 2 Durante a compilação do programa o compilador verifica quantas variáveis Globais existem e qual o tamanho de cada uma delas. E coloca no cabeçalho do arquivo executável para informar ao processo durante sua execução a quantidade de KB necessários para as variáveis Globais. As variáveis Locais possuem algumas particularidade e se assemelha muito ao parâmetro de uma função. Por exemplo, a função FAT (N: Integer) dos exemplos 2 e 3 abaixo, calcula o fatorial de um número. O parâmetro também se assemelha muito a variável local porque só é usado em um determinado local. Exemplo 1 Procedure P; Var I = Integer Begin For I=1 to 10 Do Begin … End; End; Exemplo 2 - Delfi Function FAT(N:Integer); Var A, I:Integer Begin A:=1; For I:=1 to N Do A:=A*I; End; FAT:=A //Return A End; Exemplo 3 - Pascal Function FAT(N:Integer); Begin If N>1 Then Return FAT(N-1)*N Else Return 1 End; Análise da variável N na memória A variável N é um parametro, ou seja, uma variável local. Ela tem particularidades. Que particularidades são estas? A memória contém ao mesmo tempo vários N diferentes. Então vamos vê isto, digamos que chamamos a subrotina, ou seja, a função: J:=FAT(3); O que vai acontecer? Em alguma parte da memória temos a variável N que é um parametro com o valor inicial 3. Entra na subrotina FAT(N:Integer) e verifica que 3 > 1. O then da função chama recursivamente a função FAT, mas agora o parametro mudou para N=2. Não podemos simplismente trocar o N que está com o valor 3 pelo valor 2. Por que não podemos fazer isto? Porque depois que calcula o fatorial de 2 falta multiplicar por N cujo o valor original era 3. O valor original de N não pode mudar o valor do parametro N. O que acontece? Na memória é criado outro N com o valor 2. Como a função sabe qual N utilizar? Ela sabe porque tem indicação externa que diz qua é o N válido naquele momento. Neste caso, o N=2. Executa-se mais uma vez a função FAT, mas agora o valor de N=1. Memória N = 3 N = 2 N = 1 FAT(3) = FAT(2)*3 = 6 FAT(2) = FAT(1)*2 = 2 FAT(1) = 1 SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 Elaborado por Luciana SA Amancio – 2012/2 Página 3 Obs.: Quando for fazer o cálculo do fatorial de 3 ao criar o N a seta vai descendo ao utilizar o N no cálculo a seta vai subindo. Este é o jeito de persistir na memória vários valores do N, pois só assim é possível fazer o cálculo. A variável local é diferente da variável Global. A variável Global só tem uma para o programa inteiro. A local não para a mesma sub-rotina tem várias variáveis na memória com valores diferentes. No entanto, em um determinado momento de tempo somente uma variável estará sendo utilizada. E diferente é a forma de se guardar as variáveis Globais e Locais. Variáveis Locais tem mais de uma a medida que necessite, por exemplo, se o N for igual a 100. Quantas variáveis Locais teríamos na memória? 100. Então não se sabe a priori quantas variáveis locais serão necessárias. Este número é descoberto na execução. A variável Global é criada no início do programa e a variável Local é criada durante a execução do programa. Enquanto que a variável Local é criada dinamicamente depois que a rotina acaba as variáveis são destruídas dinamicamente deixando de ocupar espaço na memória. Antes de se chamar a sub-rotina função FAT, não existe N na memória ao chamar a FAT passa a alocar o 1º N na memória o 2º N e o 3º N. Ao retornar o valor do 3º N ele é apagado. Assim sucessivamente até o 1º N. Destruição da variável A primeira variável local a ser destruída e a última que foi criada e a última a ser destruída é a primeira que foi criada. A variável local é criada e destruída no momento da execução. A variável local ativa é sempre a última da execução no momento. Memória N = 3 N = 2 N = 1 O N=1 está ativo ao executar a função FAT do código a seguir: Function FAT (N:Integer); Begin If N>1 Then Return FAT(N-1)*N Else Begin N:=33; SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 Elaborado por Luciana SA Amancio – 2012/2 Página 4 Return 1; End; End; Ao entrar no Else a primeira coisa que é feita é atribuir 33 ao N. O N ativo que era igual a 1 mudou para 33. Mudou o valor do N=2? Não, pois ele não estava ativo no momento da execução. Vai mudar? Não, pois quando o N for igual a 2 não se tem a atribuição de N:= 33. A variavel local alterada é sempre a que está ativa no momento. A pilha é a estrutura de dados perfeita para lógica de criação e destruição de variáveis locais. A última coisa a empilhar é a primeira a desempilhar. A primeira coisa a empilhar é a última a desempilhar. A área de dados das variáveis locais é uma pilha. Existe uma parte da memória que é a parte da pilha e dentro da pilha tem uma área da pilha. Tem um pedaço com as variáveis já criadas, abaixo é área livre e no meio tem o topo da pilha conforme mostra a Figura 1. Quando uma subrotina começa a executar é criada uma variável nova. Então o topo da pilha é decrementado de forma a colocar na pilha um novo conjunto de variáveis locais e parâmetros. Por exemplo, as variáveis locais N=3, N=2 e N=1. Conforme mostra a Figura 2. Quando a subrotina acabar de executar o que vai acontecer? Desalocação das variáveis locais da subrotina Função FAT, ou seja, o topo é incrementado evolta a ser como era antes da execução dessa subrotina. Onde estavam as variáveis locais N volta a ser área livre da memória da pilha. Conforme mostra a Figura 3. Assim é alocar e desalocar na pilha. Você aloca decrementando o topo e desaloca incrementando o topo. A ideia de pilha para o processo poder executar é uma coisa tão importante e fundamental para as variáveis locais que as CPUs tem instruções especificas para trabalhar com as pilhas isto por causa das variáveis locais. Então a Intel tem instruções para o uso da pilha. Push EAX empilha o valor do registrador EAX decrementando o topo da pilha. Pop EBX pega o valor do topo da pilha, coloca no registrador EBX e incrementa o topo da pilha. Existem mais instruções para lidar com a pilha. Estas são as mais básicas de todas. SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 Elaborado por Luciana SA Amancio – 2012/2 Página 5 EAX e EBX são registradores. Isto acontece na passagem de parâmetros. Linguagem de máquina Mov EAX, 3 Push EAX Exemplo 1 Call 500 Mov EAX, [1000] (Endereço da variavel X) Push EAX Exemplo 2 Call 500 Endereço da Função FAT No caso da função FAT o EAX será o N. Então a variavel local fica em uma área de memória que é chamada de área de pilha que é diferente da área das variáveis Globais que é uma área separada. Uma parte do processo é o código executável, as variáveis Globais, as variáveis Locais e as variáveis dinâmicas. Variaveis Dinamicas A variavel dinâmica normalmente é usada em linguagens de programação mais sofisticadas. Em linguagem orientada a objetos tipicamente um objeto é uma variavel dinâmica. Exemplo, uma lista encadeada de empregados. A seguir o código 1: Type Emp = Relor Matricula: Integer; Nome: String; Prox: ^Emp; //Ponteiro para o próximo registro de Empregado Emp Procedure Var P:^Emp; // Criação de um ponteiro para P Begin New(P); //Cria a variavel dinamica do tipo Emp e a variavel local P passa a apontar para esta variavel dinamica criada. P^.Matricula = 123; P^.Nome = ‘João’ As vezes se confundi variavel dinâmica com variavel ponteiro. P é variavel ponteiro ele aponta. P dinâmico ele é local fica na pilha. O comando new cria a variavel dinâmica que não está na pilha e faz a variavel local que é o P apontar para a dinâmica. O que é apontar? É guardar o endereço de memória da variável. Temos a memória e dentro da memória temos o processo. Dentro do processo temos a área de pilha e tem outro pedaço que é área da variável dinâmica que se chama Heap. SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 Elaborado por Luciana SA Amancio – 2012/2 Página 6 Conforme mostra a Figura 4 o P é uma variável local por ser local ele fica onde? Na Pilha. Em algum lugar na Pilha tem o valor de P. Qual é o valor de P? O endereço. Quando executar o comando o que acontece? Na Heap onde ficam as variáveis dinâmicas é alocado em um pedaço dela uma variável dinâmica do tipo Empregado. Digamos que na Pilha a variável local P guarde o endereço 2000. O comando New não apenas reserva uma área da memória do Heap para variável dinâmica do tipo Emp, mas também atribui o valor desta variável ao ponteiro P. O que é atribuir o valor da variável ao ponteiro? O que é apontar para empregado? É colocar o endereço para variável empregado. Isto é apontar. O comando New faz duas coisas: primeiro aloca um pedaço da Heap para a variável dinâmica e em seguida coloca na variável ponteiro o endereço onde foi alocada a variável dinâmica. Então é assim que é criada a variável dinâmica. Além da variável ponteiro é a variável local tem outra variável que fica na Heap que é a variável dinâmica. A variável dinâmica não tem nome. O ponteiro é que aponta para esta variável dinâmica que tem nome. Para se usar um campo do Empregado tem fazer isto com o a variável ponteiro P. Em P.Matricula e P.Nome estou atribuindo valores a variável dinâmica. Como ela não tem nome temos que usar o ponteiro para os campos da variável dinâmica. No caso de linguagens orientadas a objetos. O objeto é uma variável dinâmica, mas é mais escondido. Diferenciação entre o ponteiro e a variável dinâmica em uma linguagem OO tradicional Type L_Emp = Class Public Matricula: Integer; Nome: String; Prox: L_Emp End; SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 Elaborado por Luciana SA Amancio – 2012/2 Página 7 Procedure X; Var E: L_Emp; Begin E:= New L_Emp; // A variável E é um ponteiro para o endereço da variável L_Emp E.Matricula:= 123; E2:=E; // Neste caso ambas as variáveis estão apontando para o mesmo endereço 2000 E2.Matricula:= 567; Na linguagem OO não temos o ponteiro explícito. A linguagem OO esconde o ponteiro. Embora a linguagem OO não tem o ponteiro como uma coisa explícita na linguagem o código na linguagem de máquina do código 1 e 2 é o mesmo. Nos dois casos você tem uma variável ponteiro. Se for criada uma outra variável, por exemplo E2 e atribuir ao E. Se alterar o valor de E2 altera o valor da matricula do próprio E, pois o objeto é um só. E e E2 são ponteiros que apontam para o mesmo endereço. Quando se atribui E ao E2. O que está acontecendo? Estou copiando o valor do E que é 2000 para o E2. Ambas as variáveis apontam para o mesmo endereço 2000. Embora a linguagem OO não tenha ponteiros explícitos eles estão lá. Type Emp = Relo Matricula: Integer; Nome: String; Prox:^Emp; Emp Procedure X; Var P1, P2:^Emp; Begin New(P); P^.Matricula:= 123; P^.Nome = ‘João’; New(P2); P2^.Matricula = 567; ... Dispose(P) //Destruindo a variável dinâmica apontada por P SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 Elaborado por Luciana SA Amancio – 2012/2 Página 8 Em linguagem de programação mais antiga você tem o comando de alocação/criação que é o New e você tem também o comando de destruição da variável dinâmica. O que é destruir a variável dinâmica apontada por P? É tornar a área da Heap livre. O que está acontecendo? A Heap é uma coisa diferente da Pilha. A Heap pode ter lugres ocupados e lugares livres. Então, a área da Heap funciona diferente. Você é obrigado ter áreas diferentes para cada uma das variáveis. A Heap não tem ordem correta para alocação da variáveis, pois depende do programador. Ele vai determinar quando cria e quando destrói a variável dinâmica. Então pode ficar bagunçado? Não. Fica uma coisa misturada. Para as três formas de se usar a variável temos três áreas de memória do processo. Uma para as variáveis Globais, uma para as variáveis locais e outra para as variáveis dinâmicas. Esta é a forma mais completa do processo. Temos três áreas distintas a área de código, área de variáveis globais, área das variáveis locais (Pilha) e área das variáveis dinâmicas (Heap). No caso do Unix eles simplificam um pouco isto. Então no Unix duas variáveis estão condensadas em uma só área. Existe uma área de dados que é igual as variáveis globais mais a Heap. Dá para ajuntar, pois não temos maiores problemas. As globais são bem comportadas. Como fica no Unix? Fica conforme mostra a Figura 6, um exemplo de alocação sequencial do processo na memória. SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 Elaborado por Luciana SA Amancio – 2012/2 Página 9 Então são três áreas: Código, Dados e Pilha. Os dados condensam as Globais e a Heap. Uma coisa importante é que dentro dessas áreas além das variáveis alocadas dinamicamente tem as áreas livres. Tanto na Heap quanto na Pilha. Você tem dentro delas áreas livres para alocação de variáveis locais (no caso a Pilha) e variáveis dinâmicas (no caso a Heap). Mas, além das áreas livres internas no processo existemas áreas livres externas ao processo. As áreas livres externas ao processo servem para alocação de novos processos. As áreas livres internas ao processo são para as variáveis locais e dinâmicas que o processo vai precisar. Assim é a organização dos processos na memória. Este exemplo fala da alocação dos processos de forma continua é a forma mais fácil de fazer e mais simples. As áreas de memória do processo código, Pilha e dados. Elas podem ser alocadas separadamente na memoria conforme mostra a Figura 7, pois não precisam estar sequencialmente. Qual a vantagem de alocar separadamente? É mais fácil encontrar uma área livre. Se existe uma regra que obrigue as áreas do processo serem alocadas juntas isto restringe um pouco a alocação. Por exemplo, queremos alocar um processo de 300 KB é mais fácil encontrar três pedaços de 100 KB de área de memória livre do que um único espaço de 300 KB na memória. Então exigir que as três áreas do processo sejam alocadas juntas é uma desvantagem, pois dificulta a alocação de processos. É uma vantagem alocar separadamente as áreas dos processos. A outra vantagem de alocar dessa forma é que se tem mais chance de crescer as áreas do processo quando necessário se tiver área livre. Se for profissional o módulo de alocação é separado. Para uma questão didática o modelo junto é mais utilizado, pois é mais fácil. Uma questão que deve ser resolvida pelo Sistema Operacional é a questão de alocação dos novos processos. Esta questão existe tanto no caso de alocação do processo junto quanto no caso separado. SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 Elaborado por Luciana SA Amancio – 2012/2 Página 10 A alocação não sequencial do processo na memória é melhor do que a alocação sequencial porque é mais fácil encontrar áreas livres de memória. Algoritmo de Alocação Então o problema é que tenho mais de uma área livre. Em qual área livre irei usar para alocar o processo? Tem vários algoritmos de alocação. Veremos alguns tipos de algoritmos de alocação. A Figura 8 a seguir mostra os processos 1 de 100 KB, o processo 2 de 200 KB, e o processo 3 de 80 KB, o processo 4 de 100 KB e a área livre de 200 KB. Quando o processo acaba sua execução a área de memória que ele ocupava fica livre. Digamos que os processos 1 e 3 acabaram sua execução e liberaram a memória. Então temos três áreas livres (100 KB, 80 KB e 200 KB). Temos agora um processo 5 com 80 KB. Temos que fazer uma SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 Elaborado por Luciana SA Amancio – 2012/2 Página 11 escolha. Onde alocar o processo 5? Temos três áreas livres de memória. Esta escolha é feita pelo algoritmo de alocação. Algoritmo de alocação First Fit Utilizando o algoritmo de alocação First Fit ele vai alocar aonde? No primeiro lugar que encontrar de área livre que caiba o processo (ou uma das áreas do processo). Então alocará no 100 KB, ou seja, onde estava o processo 1. O processo 5 ocupará 80 KB e sobrará 20 KB de área livre que não será utilizada. Isto é um desperdício conforme mostra a Figura 9. Alocar uma área e deixar um pedaço livre não é muito interessante, pois muitas vezes o pedaço pequeno não é o suficiente para alocar um novo processo. A área que sobra neste caso, 20 KB fica sem uso porque nada novo consegue ser alocado nela. Fragmentação da Memória Conforme mostra a Figura 10, os espaços de área livre que sobram ao alocar um processo pelo algoritmo de alocação são chamados de Fragmentação. SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 Elaborado por Luciana SA Amancio – 2012/2 Página 12 O First Fit tem esta característica embora ele seja muito rápido ele pode gerar fragmentos. Algoritmo Best Fit Existe outro algoritmo que é mais sofisticado que se chama Best Fit. Ele pesquisa entre as áreas livres de memória o espaço mais adequado para alocar o processo. Exemplo, alocar o processo 5 de tamanho 80 KB. Tem um espaço adequado para alocar 80 KB? Tem. A área de 80 KB ao invés de alocar na área de 100 KB. Conforme mostra a Figura 11. Agora digamos que o processo 5 tenha 60 KB. Onde alocar este processo? Este processo será alocado onde melhor se adeque, ou seja, na área livre de 80 KB. Conforme mostra a Figura 12. Neste caso, sobra 20 KB que é um desperdício (fragmento). SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 Elaborado por Luciana SA Amancio – 2012/2 Página 13 First Fit pesquisa a partir do “zero” da memória e o Next Fit é a partir da última alocação na memória. Algoritmo Worst Fit A ideia do Worst Fit é a seguinte aloca-se a área de tamanho exato se existir. Se não existir uma área de tamanho exato então ele aloca a maior área encontrada. Conforme mostra a Figura 13, queremos alocar um processo de 60 KB. Como não existe uma área de memória com este tamanho exato. O Worst Fit aloca a maior área livre de memória encontrada que é de 200 KB sobrando 140 KB de área livre. O Worst Fit não gera fragmento porque quando ele não encontra uma área de memória de um tamanho exato ele aloca a maior área e o que sobra é um tamanho grande. Embora ele seja bom ele não é tão bom assim. Por quê? Digamos que se tenha um processo 7 de 150 KB. Ele poderia ser alocado na área livre de 200 KB e sobraria 50 KB, mas como o Worst Fit já matou a área livre de 200 KB (a área maior) o processo 7 não poderá ser alocado neste espaço. E o Worst Fit é pior para este caso. Então não dá para dizer de forma eficiente qual destes algoritmos é o melhor. O que dá para dizer é que o First Fit é o mais rápido para executar e implementar do que os outros algoritmos Best e Worst. No caso de alocar o processo por áreas separadas temos o mesmo problema e utiliza-se os mesmos algoritmos de alocação. E este mesmo problema existe dentro da área de Heap, pois tem espaço livre e SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 Elaborado por Luciana SA Amancio – 2012/2 Página 14 alocado. Na Heap é alocado as variáveis dinâmicas, mas temos o mesmo problema de alocar memória só que o espaço é menor. Quem controla o espaço da Heap é a própria linguagem de programação e não o Sistema Operacional. O Windows até tem suporte para isto, mas normalmente é a própria linguagem de programação que gera o código de alocação executa internamente o algoritmo segundo o fabricante da linguagem escolheu para implementar. Compactação Como a fragmentação pode ser resolvida? Pela compactação. Conforme mostra a Figura 14. A compactação junta todos os processos e toda área livre na parte de baixo da memória e acima junta todas as áreas livres. A compactação tem um problema que é a mudança dos endereços dos processos e das suas respectivas áreas. Digamos que o processo 7 tem uma variável global que estava no endereço 65000 após a compactação seu endereço foi modificado. Então a mera compactação simples não vai funcionar. Figura 14 Não adianta fazer somente a compactação. Precisamos alterar os ponteiros para os novos endereços de memória. A compactação exige que se tenha mecanismos para modificar os endereços, pois senão dará problemas. O sistema operacional tem condição de corrigir o endereço perdido. Uma coisa que ele pode fazer é apontar o endereço de carga. Ele pode corrigir a carga e pode corrigir o endereço. O problema é que os sistemas operacionais de hoje em dia não sabem dentro da área de memória do processo onde estão as variáveis do ponteiro. SISTEMA OPERACIONAL II – REVISÃO PARTE 2 – AULA 13/11/2012 Elaborado por Luciana SA Amancio – 2012/2 Página 15 O sistema operacional sabe na hora da execução onde estão os endereços. Ele não sabe dentro da área de memória dos processos onde estão os ponteiros. Em um esquemacomo este a compactação não pode ser usada, pois o sistema operacional não sabe corrigir a variável de ponteiro. A compactação nem sempre pode ser implementada. Neste caso não pode. Porém, existe outro caso que é o caso do registrador de base. Compactação com o Registrador de Base O endereço será feito a partir do registrador de base. Durante a execução o valor de deslocamento e somando ao valor do registrador de base gerando o novo endereço. Assim, a compactação vai funcionar, ou seja, com o registrador de base é possível compactar sem ele não é possível, pois não consegue recuperar o endereço da variável ponteiro. Para o caso dos processos alocados por áreas? A base não é única. Algumas CPUs permitem várias bases. A Intel permite três bases. Uma base para área de código, uma base para área de dados e outra base para área de Heap. Tem três registradores de base diferentes um para cada área Mecanismos para lidar com a falta de memória Existem casos que se tem memória livre, mas está separada. Digamos que temos uma memória com 200 KB livre. Criou um processo novo de 100 KB. Criou um processo de 80 KB. Ficou sobrando 20 KB. Cria um processo novo de 100 KB. Não vai dá, pois sobrou só 20 KB. A memória está insuficiente para rodar o processo de 100 KB. Então isto é um problema? Em teoria é. Hoje em dia temos memórias grandes (4 GB). Vai existir um caso que os processo na memória a soma seja mais de 4 GB. Hoje em dia isto fica muito improvável de acontecer. O problema de memória insuficiente é antigo e hoje em dia acontece muito menos. O tratamento das imagens digitais só foi possível a partir do momento que passamos ter mais memória na máquina para guardar a imagem na memória. Hoje em dia o caso que faz sentido de uso de muita memória é a edição de vídeo. Neste caso a memória pode encher e é preciso ter um mecanismo para não dá erro para você. Então, embora isto fosse mais comum no passado é importante ter hoje em dia. Isto pode acontecer no computador pessoal e no servidor. Resolve-se o problema de falta de memória através de mecanismos. Usa-se o disco ou gastar menos memória.