Процессу выделяется свое "частное" 4-гигабайтное виртуальное адресное пространство (вообразите, что у компьютера оперативная память размером в сотни гигабайт и что каждый процесс получает свои 4 Гб). Программа может обращаться к любому байту в этом адресном пространстве, используя единственный 32-битный линейный адрес. При этом в адресном пространстве каждого процесса содержится множество самых разных элементов, в том числе:
Слова о том, что адресное пространство процесса — его частная собственность, слегка не верны. Верхние 2 Гб вовсе не являются таковой, и их содержимое — общее для всех процессов. А вот нижние 2 Гб по-настоящему закрыты, в частности, это относится к стеку, кучами глобальной памяти с доступом по чтению/записи. Однако, двух идентичных процессов были отдельные копии кода и данных только для чтения, то какой бы в том был смысл? И действительно, образ ЕХЕ-файла проецируется на адресное пространство каждого процесса по одному и тому же адресу — обычно начиная с 0х40000000. То же относится и к DLL-модулям, если есть возможность их загрузки по одному и тому же адресу для каждого процесса. Закрытая память процесса занимает нижние 2 Гб (от 0 до Ox7FFFFFFF), но младшие 4 Мб (64 Кб под Windows NT) не используются.
Насколько все это надежно? Посторонний процесс практически не имеет возможности перезаписать стек, кучи или глобальную память другого процесса, поскольку эта память, расположенная в нижних 2 Гб виртуального адресного пространства, принадлежит только тому, второму процессу. Пространство, занятое ЕХЕ- и DLL-модулями, помечено как "только для чтения", поэтому в том, что они проецируются на несколько разных процессов, никакой проблемы нет. Однако со старшим гигабайтом адресного пространства дело обстоит хуже, так как сюда отображаются важные данные Windows, доступные по чтению и записи. Сбойная программа вполне может уничтожить расположенные в этой области системные таблицы. (В Windows NT такой проблемы нет, потому что верхние 2 Гб защищены от записи.) Существует также вероятность того, что один процесс испортит содержимое спроецированного в память файла, используемого другим процессом, поскольку файлы проецируются на область, разделяемую всеми процессами. (В Windows NT и это не проблема, так как файлы проецируются на адреса ниже 0x80000000 (в нижние 2 Гб)).