Intereting Posts
Наиболее эффективный способ получения столбцов многомерного массива в C Восстановление пакета для ввода через pcap Могу ли я использовать scanf для захвата директивы с шириной, указанной переменной? Как написать структуру в файл в C? Является ли амперсанд перед массивом char влиять на scanf? Это законно? Как нам разрешено использовать объект или функцию, объявляемую вперед, и как мы не можем? В C, почему переменная const не может использоваться как инициализатор размера массива? Инициализация только одного члена в структуре C для массива элементов структуры Несоответствие типа указателя с PyArray_SimpleNew Как отключить предупреждения при компиляции кода C? Передайте дополнительный параметр в компаратор для qsort Как правильно освободить char ** в C как передать аргумент конструктору при загрузке библиотеки? Диапазон значений типа char в C Segfault при использовании mmap в C для чтения двоичных файлов

Виртуальное адресное пространство в контексте программирования

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

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

введите описание изображения здесь

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

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

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

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

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

Существует ли ограничение на количество процессов в такой системе?

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

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

Предел темы 2025

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

32-битный тестовый предел на 64-битном XP создал 3204 потока

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

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

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

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

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

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

Обычно адресное пространство представляет собой набор сегментов, которые действительны (не синим цветом).

См. Также mmap (2) и execve (2) страницы.

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

 cat /proc/self/maps 

а также

 cat /proc/$$/maps 

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

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

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

Отвечая на забытую часть …

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