«Доступная память», которую операционная система сообщает дочерним процессам
508
Lance Pollard
Мне интересно, как операционные системы позволяют дочерним процессам знать, сколько доступно памяти.
Скажем, во весь компьютер встроена 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 ГБ», заключается в том, что я не уверен, есть ли способ определить, сколько памяти использует один процесс (или операционная система знает, сколько памяти использует). Если операционная система действительно знать, сколько он сам использует, то кажется, что он сообщит 900Mb.
Другая часть путаницы заключается в том, что, если использование памяти постоянно меняется, и ОС сообщает каждому процессу, какой объем памяти - используемая память, вам придется постоянно проверять, сколько памяти доступно, если вы пытаетесь получить доступ. больше памяти То есть вы не могли кэшировать использование памяти при запуске программы. Может случиться так, что программа, которая простаивает несколько часов, запускается с 100 МБ памяти «на компьютере», но затем, после этого, снова проверяет, «о, подождите, доступно только 5 МБ». По некоторым причинам это кажется нежелательным поведением, но я не уверен.
Любая помощь в понимании того, как ОС сообщает дочернему процессу, сколько памяти доступно в разные моменты времени, была бы полезна. Спасибо.
ОС будет сообщать только размеры виртуальной памяти для любых отчетов «памяти» процессу, поскольку физическая память не доступна напрямую.
sawdust 6 лет назад
0
2 ответа на вопрос
1
Mokubai
ОС ничего не говорит программе о свободной памяти.
Каждая программа работает в своей области виртуальной памяти, где она имеет доступ к (Что видит) всего потенциального адресное пространство памяти допустимого. Для 32-битного процесса то, что он знает как «память», - это целые 4 ГБ адресуемой памяти, для 64-битного пространство намного больше. Процесс может выделить память из этой области, которая затем сообщает операционной системе, что ему необходимо обеспечить резервирование областей этого адресного пространства физической памятью, чтобы ее можно было читать и записывать, но программа (теоретически) имеет столько памяти, сколько это хочет.
В системе с 1 ГБ ОЗУ это означает, что, когда физическая память заполнена, операционная система начинает выгружать данные в файл или раздел подкачки. Это делается без участия самого процесса, чья память выгружается. Если процесс пытается получить доступ к выгруженной памяти, то операционная система останавливает процесс, извлекает данные обратно с диска и возобновляет процесс.
Программа может запросить, сколько физической ОЗУ свободно, чтобы они могли ограничить себя в ситуациях нехватки памяти, но они не были искусственно ограничены операционной системой, если у нее не осталось физической памяти и пространства подкачки, и в этом случае программа просто получит ошибка при попытке выделить память.
1
LMiller7
Одной из замечательных особенностей работы на современной ОС является то, что приложениям не нужно знать, сколько оперативной памяти находится в системе или сколько доступно. Фактически, большинство приложений находятся в блаженном незнании деталей ОЗУ, количества ядер ЦП, размера и количества физических дисков, подключен ли компьютер к сети или Интернету и многое другое. Это так и должно быть. ОС была разработана для использования таким образом.
ОС предоставляет приложениям стандартную виртуализированную среду, независимую от аппаратного обеспечения. Вместо прямого доступа к ОЗУ приложения получают доступ только к виртуальному адресному пространству, которое не зависит от размера ОЗУ. Для приложения это и есть память. Оперативная память - это просто оптимизация производительности (с необходимой современной технологией) и деталь реализации. Части кода и данных приложений будут находиться в ОЗУ, файле подкачки или в исходных файлах. Это может измениться в зависимости от потребностей приложения и доступности ресурсов. Эти детали управляются ОС и невидимы для приложения, которое не может узнать, даже если оно хочет.
Для приложений, которым нужна эта информация, аппаратные детали могут запрашиваться у ОС, но немногие делают. По большей части эта информация нужна только системным утилитам. Большинство приложений нуждаются в этом так же мало, как средний водитель должен знать о сроках зажигания или топливных смесях.
Все это на пользу. Это означает, что разработчики приложений могут посвятить свое время требованиям приложения без необходимости разбираться со сложными деталями оборудования, на котором оно работает. Это то, для чего предназначена ОС. Это означает, что правильно написанное приложение, разработанное для Windows 95 с 4 МБ ОЗУ, может работать в современной системе Windows 10 с большим количеством ГБ ОЗУ. И приложение работает так же и не знает о разнице. Не все приложения написаны так хорошо. Конечно, современная система будет работать лучше и предоставит пользователю гораздо больше возможностей, но приложение ничего об этом не знает.
Это означает большую работу для разработчиков и разработчиков ОС, но многие миллионы пользователей пожинают плоды.
Это все имеет смысл. Относительно «Большинство приложений нуждается в этом так же мало, как средний водитель должен знать о времени зажигания или топливных смесях». Я думаю о том, как работает отладчик, такой как [отладка операционной системы] (https://stackoverflow.com/questions/2029639/debugging-an-operating-system).
Lance Pollard 6 лет назад
0