Виртуальное адресное пространство в контексте программирования - PullRequest
3 голосов
/ 01 марта 2012

Я запутался в том, что подразумевается под виртуальным адресным пространством.В 32-битной машине процесс может адресовать 2 ^ 32 ячейки памяти.Означает ли это, что виртуальное адресное пространство каждого процесса составляет 2 ^ 32 (4 ГБ)?

Ниже приведен снимок виртуального адресного пространства процесса.Может ли это вырасти до 4 ГБ?Есть ли ограничение на количество процессов в такой системе?

enter image description here

Ответы [ 4 ]

3 голосов
/ 01 марта 2012

Да, виртуальное адресное пространство каждого процесса составляет 4 ГБ в 32-разрядных системах (2 32 байт).В действительности, небольшой объем виртуальной памяти, который фактически используется, соответствует расположению в кэше (-ах) процессора, физической памяти или диске (или куда-либо еще, где компьютер решает поместить данные).

Теоретически (и такое поведение довольно распространено среди обычных операционных систем), процесс мог бы фактически использовать всю свою виртуальную память, если бы ОС решила поместить на диск все, что не помещалось в физической памяти, но это сделало бы программу чрезвычайно медленной, потому чтокаждый раз, когда он пытался получить доступ к какой-либо ячейке памяти, которая не была кэширована, ему приходилось извлекать ее с диска.

Вы спрашивали, может ли размер предоставленной вами фотографии увеличиться до 4 ГБ.На самом деле, фотография, которую вы дали, уже занимает все 4 ГБ.Это способ разделения 4 ГБ виртуальной памяти процесса на разные разделы.Также, если вы думаете о куче и стеке, «растущем», они на самом деле не растут;у них есть определенный объем памяти, выделенный для них в этой схеме разделения, и они просто используют эту память по своему усмотрению (стек перемещает указатель, куча поддерживает структуру данных используемой и неиспользуемой памяти и т. д.).

2 голосов
/ 01 марта 2012

Может ли это вырасти до 4 ГБ?

Размер адресного пространства ограничен числом уникальных значений указателя. Для 32-разрядного процессора 32-разрядное значение может представлять 2 ^ 32 различных значения. Если вы позволите каждому такому значению обращаться к разному байту памяти, вы получите 2 ^ 32 байта, что равно четырем гигабайтам.

Итак, да, виртуальное адресное пространство процесса теоретически может увеличиться до 4 ГБ. Однако в действительности это также может зависеть от системы и процессора. Как видно:

Однако этот теоретический максимум не может быть достигнут на процессорах класса Pentium. Одна из причин заключается в том, что младшие биты значения сегмента кодируют информацию о типе селектора. В результате из 65536 возможных значений селектора только 8191 из них могут использоваться для доступа к данным пользовательского режима. Это опустит вас до 32 ТБ.

Обратите внимание, что есть два способа выделить память из системы, вы, конечно, можете выделить память для вашего процесса неявно , используя C malloc (ваш вопрос помечен ), но явно отображает байт файла.

Есть ли ограничения на количество процессов в такой системе?

процесс включает в себя один или несколько потоков, которые фактически выполняют код в процессе (технически процессы не запускаются, потоки выполняются) и которые представлены объектами потоков ядра.

Согласно некоторым тестам, проведенным здесь , 32-разрядная система Windows XP с 2 ГБ адресного пространства по умолчанию может создать приблизительно 2025 потоков:

Thread Limit of 2025

Однако 32-разрядный тестовый предел работает на 64-разрядной Windows XP с выделенным 4 ГБ адресного пространства. создано около 3204 тем:

32bit test limit on 64 bit XP created 3204 threads

Однако точный предел потока и процесса чрезвычайно изменчив, это зависит от множества факторов. Способ, которым потоки задают размер своего стека, способ, которым процессы задают их минимальный рабочий набор, объем доступной физической памяти и предел системной фиксации. В любом случае вам обычно не нужно беспокоиться об этом на современных системах, поскольку, если ваше приложение действительно превышает ограничение потока, вы должны переосмыслить свой дизайн, поскольку почти всегда есть альтернативные способы достижения того же самого голов с разумным количеством.

2 голосов
/ 01 марта 2012

Вы читали виртуальную память Википедии , процесс , адресное пространство страниц?

Какую книгу вы прочитали о продвинутом программировании в Unix ? или на расширенное программирование на Linux ?

Как правило, адресное пространство представляет собой набор допустимых сегментов (на рисунке не показано синим цветом).

См. Также mmap (2) и execve (2) с.

Попробуйте (в системе Linux)

cat /proc/self/maps

и

cat /proc/$$/maps

чтобы понять немного больше.

См. Также этот вопрос и этот . Чтение Операционные системы: три простые части

Конечно, ядро ​​может установить некоторые ограничения (см. Также setrlimit (2) syscall). И они являются ограничением ресурсов (пространство подкачки, оперативная память, ...).

0 голосов
/ 01 марта 2012

Ответ на пренебрегаемую часть ...

Существует ограничение на количество процессов, которые могут быть.Все структуры данных для каждого процесса, которые ядро ​​хранит в своей части виртуального адресного пространства (которое совместно используется, иначе вы не сможете получить доступ к ядру в каждом процессе), занимают некоторое пространство.Так, например, если для этих данных имеется 1 ГБ и для каждого процесса в ядре требуется только страница 4 КБ, то получается максимум около 250 тысяч процессов.На практике это число обычно намного меньше, потому что все более сложно, и для каждого процесса зарезервирована физическая память на разные вещи.См., Например, Марк Марк Руссинович в статье об ограничениях процессов и потоков в Windows для получения более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...