Compreensão simples de segmentação e paginação no gerenciamento de memória do sistema operacional

Autor: codinghuang
link: https: //www.zhihu.com/question/50796850/answer/522734117
Fonte: sabemos quase
protegidas por copyright do autor. Para reprodução comercial, entre em contato com o autor para obter autorização e, para reprodução não comercial, indique a fonte.
 

Para entender a segmentação e a paginação, é necessário entender por que a tecnologia de segmentação e paginação

Primeiro de tudo, essas duas tecnologias são usadas para utilizar e gerenciar a memória de recursos do computador .

Antes que a tecnologia de segmentação ainda não tenha surgido, o programa precisa alocar memória contínua suficiente da memória e carregar o programa inteiro nela. Por exemplo, um tamanho de programa é 10M e, em seguida, você precisa ter 10M de espaço em memória contínuo para carregar esse programa na memória. Se você não conseguir encontrar 10M de memória contínua, não poderá carregar este programa na memória e o programa não poderá ser executado.

O método acima para carregar diretamente todo o programa na memória é problemático. Por exemplo:

1. O espaço de endereço não está isolado

Como entender que o espaço de endereço não está isolado?

Por exemplo, suponha que eu tenha dois programas, um programa A e um programa B. O endereço do programa A na memória é assumido como 0x00000000 ~ 0x00000099 e o endereço do programa B na memória é assumido como 0x00000100 ~ x00000199. Então, suponha que você originalmente desejasse operar o endereço 0x00000050 no programa A e manipulou acidentalmente o endereço 0x00000150 com uma mão residual , para que coisas ruins pudessem acontecer. Você só precisa afetar o programa A, também estragou o programa B.

2. O endereço quando o programa está em execução é incerto

Como entender o endereço incerto quando o programa está sendo executado?

Como nosso programa precisa ser carregado na memória toda vez que queremos executá-lo, suponha que você escreva na memória para operar em um endereço no programa, por exemplo, você deseja o endereço 0x00000010. Mas a pergunta está chegando, você pode garantir que o endereço que você opera é 0x00000010, qual é o local que você originalmente queria operar? É possível que o local em que o programa é carregado na memória pela primeira vez seja 0x00000000 ~ 0x00000099 e, quando o programa for executado pela segunda vez, o local em que o programa é carregado na memória se torne 0x00000200 ~ 0x00000299 e o endereço 0x00000010 em que você opera não seja de todo A memória ocupada pelo programa.

3. Baixo uso de memória

Como entender o baixo uso de memória?

Por exemplo, suponha que você tenha gravado 3 programas, o tamanho do programa A é 10M, o tamanho do programa B é 70M e o tamanho do programa C é 30M. A memória total do seu computador é 100M.

Esses três programas somam 110 M. Obviamente, esses três programas não podem existir na memória ao mesmo tempo .

E no máximo apenas dois programas podem ser executados ao mesmo tempo. Pode ser esse o caso, o espaço de memória ocupado pelo programa A é 0x00000000 ~ 0x00000009 e o espaço de memória ocupado pelo programa B é 0x00000010 ~ 0x00000079. E se o programa C for executado neste momento? Você pode trocar um dos programas para o disco e carregar o programa C na memória. Supondo que o programa A seja trocado, o programa C ainda não pode ser carregado na memória, porque há duas áreas contíguas livres na memória, uma é a 10M original ocupada pelo programa A e há 20M de 0x00000080 a 0x00000099 , O programa C de 30 milhões não pode ser carregado na memória. Então, a única maneira é trocar o programa B e manter o programa A, mas, neste momento, haverá 60M de memória que não pode ser usada, o que é um desperdício, certo?

Então, as pessoas foram encontrar uma maneira de resolver esses problemas.

Há um bom ditado: qualquer problema no campo da ciência da computação pode ser resolvido adicionando uma camada intermediária indireta .

(Essa ideia também é amplamente usada hoje em dia, como muitas excelentes camadas do meio: Nginx, Redis etc.)

Portanto, a técnica de segmentação apareceu.

Para realizar essa técnica de segmentação, é necessário introduzir o conceito de espaço de endereço virtual. Então, o que é um espaço de endereço? Simplificando, é um espaço endereçável. Se esse espaço é virtual, somos chamados de espaço de endereço virtual; se esse espaço é real, somos chamados de espaço de endereço físico. O espaço de endereço virtual pode ser arbitrariamente grande porque é virtual. O espaço físico do endereço é real, portanto é limitado.

Então, o que a técnica de segmentação faz?

Ele mapeia o espaço de endereço virtual para o espaço de endereço físico, e o programa que você escreve opera no endereço virtual . Suponha que o espaço de endereço virtual do programa A seja 0x00000100 × 0x00000200. Neste momento, não é necessária apenas uma memória física contínua para armazenar o programa A, mas também o espaço de endereço virtual do programa A precisa ser mapeado (traduzido) no espaço de endereço físico. Possivelmente, o espaço de endereço virtual do programa A é mapeado de 0x00000100 a 0x00000200 para o espaço de endereço físico de 0x00000000 a 0x00000100.

Então, que problema a tecnologia segmentada pode resolver? Pode resolver os dois problemas acima.

Na pergunta 1, suponha que o espaço de endereço virtual do programa A seja 0x00000000 ~ 0x00000099, o espaço de endereço físico mapeado seja 0x00000600 ~ 0x00000699, o espaço de endereço virtual do programa B seja 0x00000100 ~ 0x00000199 e o espaço de endereço físico mapeado seja 0x00000300 ~ 0x00000399. Supondo que você ainda esteja com deficiência, o endereço 0x00000150 foi operado no programa A, mas o endereço 0x00000150 em inglês no momento é virtual e a operação de virtualização está sob o controle do sistema operacional, portanto, o sistema operacional pode julgar esse virtual O endereço 0x00000150 é problemático e impede operações subseqüentes. Então, isso mostra o isolamento. (Outra maneira de incorporar o isolamento é operar no mesmo endereço virtual, mas na verdade pode operar em endereços físicos diferentes)

(Observe que, de fato, é provável que os endereços virtuais do programa A e do programa B sejam 0x00000000 ~ 0x00000099. Os exemplos aqui são apenas para facilitar o entendimento.)

O problema 2 também está bem resolvido. É por causa desse mapeamento que o programa não precisa prestar atenção ao endereço físico, desde que o endereço virtual não tenha sido alterado, o programa não manipulará o endereço incorretamente.

Mas o problema 3 ainda não está resolvido .

A terceira questão é devido à troca em questão trocados, o principal problema é que ele não pode ser trocada em uma completa após o procedimento, o outro uma completa mudança de programa para vir. E esse mecanismo de segmentação mapeia um pedaço contínuo de memória física, de modo que o problema 3 não pode ser resolvido.

Onde está o problema? É completo e contínuo .

O surgimento da tecnologia de paginação é resolver esse problema. A tecnologia de paginação ainda é um mecanismo de mapeamento do espaço de endereço virtual para o espaço de endereço físico. No entanto, a granularidade é ainda menor. A unidade não é o programa inteiro, mas uma "página", uma página composta por um espaço de endereço virtual, é mapeada para uma página composta por um espaço de endereço físico. (Como entender esse conceito de "página", outros alunos dessa pergunta responderam)

A tecnologia de paginação, seu espaço de endereço virtual ainda é contínuo, mas o endereço físico mapeado após cada página não é necessariamente contínuo. É precisamente por causa do conceito de paginação que o programa pode ser trocado dentro e fora em unidades de páginas. Então, por que você pode trocar uma determinada página? De fato, não é por isso que você pode trocar uma determinada página, mas sim códigos e dados de programas que não são usados ​​pela CPU. No entanto, troque-os para o disco, e se a CPU usar esses códigos e dados na próxima vez? Você precisa carregar esses códigos e dados na memória. O desempenho tem um impacto, certo? Portanto, reduzimos as unidades para dentro e para fora e nos tornamos "páginas". (Na verdade, isso tira proveito da localidade espacial)

Então, os alunos pensam sobre isso, o problema 3 está resolvido?

Portanto, a diferença entre segmentação e paginação é: granularidade .

 

 

Publicado 59 artigos originais · Curtidas46 · Visita mais de 30.000

Acho que você gosta

Origin blog.csdn.net/sinat_41852207/article/details/104693369
Recomendado
Clasificación