«Доступная память», которую операционная система сообщает дочерним процессам.

«Доступная память», которую операционная система сообщает дочерним процессам.

Мне интересно, как операционные системы сообщают дочерним процессам, сколько у них свободной памяти.

Допустим, весь компьютер имеет встроенную оперативную память объемом 1 ГБ. Операционная система работает и использует 100 МБ (я понятия не имею, сколько на самом деле использует операционная система). Таким образом, остается 900 МБ.

Затем вы запускаете 10 программ. Каждая программа создает 10 дочерних процессов. Вопрос в том, что эти родительские и дочерние процессы видят в качестве общей доступной им памяти.

В качестве второй части вопроса, чтобы сделать его немного более сложным, скажем, что приложения работали некоторое время и теперь на компьютере доступно 500 МБ (скажем, операционная система использовала на 100 МБ больше, а приложения использовали на 300 МБ больше, чтобы достичь этого уровня в 500 МБ). Теперь вопрос в том, что эти родительские и дочерние процессы видят как доступную память в этот момент. То же самое, что и раньше, или другое, и чем это отличается.

Причина этого вопроса в том, что я прочитал оВиртуальная памятьв котором говорится:

виртуальная память[это] метод, который обеспечивает «идеализированную абстракцию ресурсов хранения, которые фактически доступны на данной машине», что «создает для пользователей иллюзию очень большой (основной) памяти».

Так что, по сути, это звучит так, как будто каждый процесс в случае (1) получит сообщение либо "у вас 1 ГБ доступной памяти", либо "у вас 900 МБ доступной памяти". Я не уверен, что он на самом деле скажет, если он скажетобщийна всем компьютере, или в целом - использование операционной системы.

Тогда для случая (2) он будет читать либо "1 ГБ доступно", "900 МБ доступно", "600 МБ доступно", или "500 МБ доступно". Та же ситуация, я не уверен, что он будет говорить.

Это также может отличаться от этих значений. Операционная система может каким-то образом приблизительно оценить доступную память для каждого из 100 дочерних процессов, возможно, разделив ее поровну. Так что если на компьютере осталось 500 МБ, это будет означать, что каждому процессу будет сказано: «У вас есть 500 / 100 == 5 МБ доступного пространства». Но затем, если это так, если один процесс использовал 5 МБ, и осталось еще 495 МБ, интересно, будет ли ему разрешено начать использовать это, и ему будет сообщено новое число того, что доступно. Вот почему я не думаю, что это обычно делается, и скорее кажется, что ОС сказала бывероятночто доступно на компьютерев целом(итого 1 ГБ).

Кроме того, причина, по которой я думаю, что всегда будет указано «1 ГБ», заключается в том, что я не уверен, есть ли способ определить, сколько памяти использует отдельный процесс (или знает ли операционная система, сколько памяти она использует). Если ОСделаетесли знать, сколько он сам использует, то, похоже, он сообщит о 900 МБ.

Другая часть путаницы заключается в том, что если использование памяти постоянно меняется, и ОС сообщает каждому процессу, каков общий объем памяти — используемая память, то вам придется постоянно проверять, сколько памяти доступно, если вы попытаетесь получить доступ к большему объему памяти. То есть вы не сможете кэшировать использование памяти при запуске программы. Может быть, что программа, простаивая несколько часов, запустится со 100 МБ памяти «на компьютере», но затем, после этого, она снова проверит и обнаружит: «О, подождите, доступно только 5 МБ». По какой-то причине это кажется нежелательным поведением, но я не уверен.

Любая помощь в понимании того, как ОС сообщает дочерним процессам, сколько доступной памяти есть в разные моменты времени, была бы полезна. Спасибо.

решение1

Операционная система ничего не «говорит» программе о свободной памяти.

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

В системе с ОЗУ объемом всего 1 ГБ это означает, что когда физическая память заполнена, операционная система начинает выталкивать данные в файл подкачки или раздел. Это делается без участия фактического процесса, память которого выгружается. Если процесс пытается получить доступ к выгружаемой памяти, операционная система останавливает процесс, извлекает данные обратно с диска и возобновляет процесс.

Программа можетзапроссколько физической оперативной памяти свободно, чтобы они могли ограничивать себя в ситуациях нехватки памяти, но они не ограничены искусственно операционной системой, если только у нее не закончится физическая оперативная память и пространство подкачки; в этом случае программа просто получит сообщение об ошибке при попытке выделить память.

решение2

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

ОС предоставляет приложениям стандартную виртуализированную среду, которая не зависит от оборудования. Вместо прямого доступа к ОЗУ приложения получают доступ только к виртуальному адресному пространству, которое не зависит от размера ОЗУ. Для приложения это то, чем является память. ОЗУ — это просто оптимизация производительности (при современных технологиях это необходимо) и деталь реализации. Части кода и данных приложений будут находиться в ОЗУ, файле подкачки или в исходных файлах. Это может меняться в зависимости от потребностей приложения и доступности ресурсов. Эти детали управляются ОС и невидимы для приложения, которое не могло бы узнать об этом, даже если бы захотело.

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

Все это ради блага. Это означает, что разработчики приложений могут посвятить свое время требованиям приложения, не разбираясь с запутанными деталями оборудования, на котором оно работает. Для этого и нужна ОС. Это означает, что правильно написанное приложение, разработанное для Windows 95 с 4 МБ ОЗУ, может работать на современной системе Windows 10 с множеством ГБ ОЗУ. И приложение работает так же и не замечает разницы. Не все приложения написаны так хорошо. Конечно, современная система будет работать лучше и предоставит пользователю гораздо больше возможностей, но приложение ничего об этом не знает.

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

Связанный контент