4 Answers
4

If the app is AWE aware then they can use an address space beyond 4Gb, though less efficiently than a 64-bit app would. It is even possible for 32-bit processes under 32-bit Windows variants to access more than the 32-bit address space would allow, if PAE is anabled and the process is capable of using it.

An individual 32-bit process (that is not AWE aware) is usually limited to 3Gb (the first Gb of its virtual address space being reserved for kernel related action) but if you are running multiple processes then they will be able to use more in total(each can use up to 3Gb, total memory permitting) as their virtual address spaces are not shared.

The limit being per-process is more helpful in a Unix-like environment where services tend to be process based rather than thread based (multiple threads in one process share the processes resources and therefore share a single 3Gb virtual address space) as is more common under Windows (starting a new process in Windows as quite expensive so threads are preferred, under most Unix environments starting a new process isn't much more resource consuming than starting a new thread). It isn't very helpful for a machine that is running just SQL Server, for instance, as that it only going to be one process so will hit the 3Gb limit (some editions can be configured to be AWE aware but not all, and the feature is slated to be removed in the next major release).

As well as the 32-bit processes being able to use more than 3Gb in total the OS will be able to use any unused memory for disk caching, so it may not go to waste, assuming the processes do not open files in such a way as to tell the OS not to bother doing this.

If the OS is 64-bit, a 32-bit process by default gets 2 GB of user-address virtual address space. If the PE header of the .exe file is marked with the IMAGE_FILE_LARGE_ADDRESS_AWARE flag, then the process will get 4 GB of user-addressable virtual address space. In either case, the kernel's virtual address space is the same as 64-bit processes, since it is shared across all processes. Also of note, 64-bit processes that do not set the IMAGE_FILE_LARGE_ADDRESS_AWARE flag also only have access to 2 GB of user virtual address space.

The things you hear about special boot flags, 3 GB, /3GB switches, or /userva are all about 32-bit operating systems and do not apply on 64-bit Windows.

A 32 bit process on a 32 bit OS has a 4GB address space, 2GB of which is reserved by the OS, 2GB available for the process.
There is a switch that can be specified to the OS (/3GB) that changes the amount reserved for the OS to only 1GB and allows the process to have 3GB, BUT, only if the process declares it self as large address aware in the flags of the executable.

On a 64 bit OS a 32 bit process will get 4GB if it is large address aware, 2GB otherwise.

All of this is for non AWE aware processes. If the process is capable of using AWE then, as others have said, it can use a large address space, but less efficiently then a 64 bit process.

PAE allows a 32 bit OS to use more than 4GB of RAM, however, it has compatability issues and was disabled in XP by one of the service packs so it is only available on server OS versions.