Quanta memória um processo de 32 bits pode acessar em um sistema operacional de 64 bits?

86

No Windows, em circunstâncias normais, um processo de 32 bits pode acessar apenas 2 GB de RAM (ou 3 GB com uma opção especial no arquivo boot.ini). Ao executar um processo de 32 bits em um sistema operacional de 64 bits, quanta memória está disponível? Existem opções ou configurações especiais que podem alterar isso?

jjxtra
fonte

Respostas:

92

2 GB por padrão. Se o aplicativo reconhecer grande espaço de endereço (vinculado a / LARGEADDRESSAWARE), ele obterá 4 GB (não 3 GB, consulte http://msdn.microsoft.com/en-us/library/aa366778.aspx )

Eles ainda estão limitados a 2 GB, pois muitos aplicativos dependem da parte superior dos ponteiros para ser zero.

Michael
fonte
5
Alguém pode explicar por que os processos não podem acessar os 4GB completos?
BlueTrin
1
O que você quer dizer? Se você mesmo o construiu, pode usar o sinalizador / LARGEADDRESSAWARE e fazê-lo funcionar com 4 GB; caso contrário, você estará à mercê dos desenvolvedores que o fizeram.
SilverbackNet
É porque o ponteiro pode ser perigosamente interpretado com o complemento de dois?
rosstex
1
Com isso, since many application depends on the top bit of pointers to be zerovocê quer dizer que o 32º bit do esquema de endereçamento não é considerado ou usado ao percorrer o espaço de endereço do processo.
RBT de
21

4 GB menos o que está em uso pelo sistema se você vincular com / LARGEADDRESSAWARE.

Obviamente, você deve ser ainda mais cuidadoso com a aritmética de ponteiro se definir esse sinalizador.

MSN
fonte
-1: O sistema usará endereços de 64 bits para si mesmo, então não há necessidade de subtrair algo
Thomas Weller
@ThomasW., Isso não é verdade, pelo menos no Windows. WOW64 ainda requer thunks de 32 bits para chamadas de sistema de 64 bits. Consulte msdn.microsoft.com/en-us/library/windows/desktop/…
MSN
1
Você quer dizer aqueles 605 kB de DLLs? Não entendi porque a pergunta era mais sobre GBs de memória.
Thomas Weller
7
@ThomasW., É por isso que eu disse "menos o que está em uso pelo sistema."
MSN
FYI Link morto neste aqui
jjxtra
14

Ninguém parece tocar no fato de que, se você tiver muitos aplicativos de 32 bits diferentes, o subsistema wow64 pode mapeá-los em qualquer lugar na memória acima de 4G, portanto, em uma janela de 64 bits com memória suficiente, você pode executar muitos outros aplicativos de 32 bits do que em um sistema nativo de 32 bits.

Prejudicar dez Napel
fonte
7
Você está falando sobre RAM física, onde o OP está falando sobre memória virtual. Mesmo em sistemas de 32 bits, você pode executar muitos aplicativos, desde que o arquivo de página seja grande o suficiente.
Thomas Weller
8

Um processo de 32 bits ainda está limitado às mesmas restrições em um sistema operacional de 64 bits. O problema é que os ponteiros de memória têm apenas 32 bits de largura, então o programa não pode atribuir / resolver qualquer endereço de memória maior que 32 bits.

Ben S
fonte
4
Isso teria sido útil se você tivesse deixado claro que 32 bits correspondem a 4 GB de espaço.
Engenheiro de
4

Um único processo de 32 bits em um sistema operacional de 64 bits é limitado a 2 Gb. Mas se for compilado em um arquivo EXE com IMAGE_FILE_LARGE_ADDRESS_AWAREconjunto de bits, terá um limite de 4 GB, não 2 Gb - consulte https://msdn.microsoft.com/en-us/library/aa366778(VS.85).aspx

O que você ouve sobre sinalizadores de inicialização especiais, 3 GB, /3GBinterruptores ou /uservatudo sobre sistemas operacionais de 32 bits e não se aplicam ao Windows de 64 bits.

Consulte https://msdn.microsoft.com/en-us/library/aa366778(v=vs.85).aspx para obter mais detalhes.

Quanto aos sistemas operacionais de 32 bits, ao contrário do que se pensa, não há limite físico de 4 GB para sistemas operacionais de 32 bits. Por exemplo, sistemas operacionais de servidor de 32 bits como o Microsoft Windows Server 2008 de 32 bits podem acessar até 64 GB(Edições Windows Server 2008 Enterprise e Datacenter) - por meio de Physical Address Extension (PAE), que foi introduzido pela Intel no Pentium Pro, e depois pela AMD no processador Athlon - ele define uma hierarquia de tabela de página de três níveis, com entradas de tabela de 64 bits cada em vez de 32, permitindo que essas CPUs acessem diretamente um espaço de endereço físico maior do que 4 gigabytes - então, teoricamente, um SO de 32 bits pode acessar 2 ^ 64 bytes teoricamente, ou 17.179.869.184 gigabytes, mas o segmento é limitado por 4 GB. No entanto, devido a razões de marketing, a Microsoft limitou a memória máxima acessível em sistemas operacionais não servidores a apenas 4 GB, ou até 3 GB efetivamente. Portanto, um único processo pode acessar mais de 4 GB em um sistema operacional de 32 bits - e o servidor Microsoft SQL é um exemplo.

Os processos de 32 bits no Windows de 64 bits não têm nenhuma desvantagem em comparação aos processos de 64 bits no uso do espaço de endereço virtual do kernel compartilhado (também chamado de espaço do sistema ). Todos os processos, sejam de 64 ou 32 bits, no Windows de 64 bits compartilham o mesmo espaço de sistema de 64 bits.

Dado o fato de que o espaço do sistema é compartilhado por todos os processos , no Windows de 32 bits , os processos que criam uma grande quantidade de identificadores (como threads, semáforos, arquivos, etc.) consomem espaço do sistema por objetos do kernel e podem ficar sem memória até mesmo se você tiver muita memória disponível no total. Em contraste, no Windows de 64 bits , o espaço do kernel é de 64 bits e não é limitado a 4 GB. Todas as chamadas do sistema feitas por aplicativos de 32 bits são convertidas em chamadas nativas de 64 bits no modo de usuário .

Maxim Masiutin
fonte
1
Esta pergunta é sobre quanta memória um único processo pode acessar. Isso é limitado pelo espaço de endereço da memória virtual de 32 bits. Claro, você pode ter vários processos de 32 bits, cada um usando 4 GB no mesmo computador, mesmo com um sistema operacional de 32 bits usando PAE. Mas não é isso que esta pergunta está perguntando.
Peter Cordes
@PeterCordes - desculpe e obrigado - atualizei a resposta sobre o limite de 2 GB / 4 GB.
Maxim Masiutin
@PeterCordes, obrigado por sua observação, eu atualizei a resposta para enfatizar que vários processos de 32 bits podem usar 4 GB cada no mesmo computador, mesmo com um sistema operacional de 32 bits usando PAE, e que processos de 32 bits em 64- OS de bit não sofrem da limitação de espaço do sistema de 2 GB, o que era um problema no OS de 32 bits.
Maxim Masiutin
-1

Você tem a mesma restrição básica ao executar um processo de 32 bits no Win64. Seu aplicativo é executado em um subsistema de 32, mas que faz o possível para se parecer com o Win32, e isso inclui as restrições de memória para o seu processo (menos 2 GB para você, mais 2 GB para o sistema operacional)

Sean
fonte
-11

O limite não é 2g ou 3gb, é 4gb para 32 bits.

A razão pela qual as pessoas pensam que são 3 gb é que o sistema operacional mostra 3 gb de graça quando na verdade eles têm 4 gb de memória RAM.

Sua RAM total de 4 GB. Portanto, se você tiver uma placa de vídeo de 1 gb que conta como parte da memória RAM total visualizada pelo sistema operacional de 32 bits.

4Gig não 3 não 2 entendeu?

BobJ
fonte
2
Isso está incorreto. Para um sistema x86 padrão (sem extensões de memória), o kernel pode acessar os 4GiB completos de espaço de memória (mesmo se o computador tiver apenas 1GiB de RAM devido ao paging). O kernel reserva o 2GiB superior (alguns kernels reservam 1GiB ou 3GiB) para seu próprio uso. A memória virtual de cada processo também possui a memória reservada do kernel mapeada e, portanto, o processo não pode usar 2GiB de memória.
Alex Jorgenson
3
Além disso, as placas de vídeo não têm nada a ver com a quantidade de memória que um processo pode usar. As tabelas ACPI, IO mapeada de memória, etc. usam endereços de memória física, mas isso é evitado graças à memória virtual.
Alex Jorgenson
1
Isso está incorreto. A Microsoft escolheu (escolha de design) dividir o espaço de endereço Virtual de 32 bits com o Windows NT de forma que 2 GB fossem reservados para mapear o sistema operacional (driver / API / chamadas de sistema etc.) e os 2 GB restantes para uso do aplicativo. O switch de inicialização / 3GB altera esse comportamento (1GB para o mapeamento do sistema operacional, 3GB para o código do aplicativo). Vou embora encontrando os documentos da antiga arquitetura de memória virtual do Windows NT 3.x como um exercício para o leitor :-)
ripvlan