LINUX.ORG.RU

Виртуальная память


0

2

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

Но есть такая ситуация, когда нет свопа, а виртуальной памяти выделено к примеру 25 Гб. Откуда? И как оно работает, как не падает?

У меня сейчас на жестком диске свободно 5 Гб памяти, оперативы 4 Гб, свопа нет вообще. Всего под все процессы сейчас выделено более 50 Гб виртуальной памяти. Я наверное неверно понимаю какие-то основы технологии? Как это работает? Что будет, если все мои процессы хором затребуют все 50 Гб памяти?


Ответ на: комментарий от panter_dsd

Но означает, что процесс, если захочет, то может воспользоваться этой памятью. Иначе я не понимаю в чем смысл такого выделения памяти.

tanenn
() автор топика
Ответ на: комментарий от sn1ln

Считаю так.

tanenn@tanenn-K52F:~$ ps aux | awk '{ SUM += $5 } END { print SUM }' 53482176

free другое показывает.

tanenn
() автор топика

>Но есть такая ситуация, когда нет свопа, а виртуальной памяти выделено к примеру 25 Гб. Откуда?

Ниоткуда. «Выделено» - не означает «есть на самом деле».

Как это работает?

Примерно как банковская система

Что будет, если все мои процессы хором затребуют все 50 Гб памяти?

Тормоза, ступор, OOM-Killer

Un
()

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

Проведи эксперимент, запусти свои процессы и по сигналу или таймауту заставь их одновременно начать писать в выделенную память (memset, например).

staseg ★★★★★
()

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

Кроме того, общий объем одновременно доступной физический памяти (той, с которой можно реально работать, читать и записывать) НЕ равен ОЗУ+СВОП. Своп это просто хранилище (на диске) временно не используемых данных (страниц) из физической памяти. В ситуации, когда свободной физ. памяти осталось мало, а приложению как то надо работать, механизм подчкачки (своп) сохраняет редко используемые данные из озу на диск, а на их месте в озу уже будут данные другого приложения. Таким образом при недостатке озу своп постоянно гоняет туда сюда данные, с диска в память и обратно, подменяет.
И вообще своп это программная фишка операцинной системы, процессор не догадывается что его «обманывают», подменяя данные.

s0L
()

а ну и сопсно
«Что будет, если все мои процессы хором затребуют все 50 Гб памяти?»

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

s0L
()
Ответ на: комментарий от s0L

> своп это программная фишка операцинной системы, процессор не догадывается что его «обманывают», подменяя данные.

вообще-то процессор самый первый знает, что пора что-нибудь подкачать с диска, и даёт об этом знать операционке

unC0Rr ★★★★★
()
Ответ на: комментарий от unC0Rr

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

s0L
()

> Виртуальная память изначально означает, что в адресное пространство проецируется память оперативная и память дисковая.

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

unC0Rr ★★★★★
()
Ответ на: комментарий от s0L

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

Тем не менее именно процессор инициирует всю цепочку. Естественно, что при этом не его забота откуда и как берутся данные для заполнения отсутствующей в оперативке странички. Эти данные могут быть и просто нулями, и браться из какого-либо другого файла помимо свопа.

unC0Rr ★★★★★
()

>Но есть такая ситуация, когда нет свопа, а виртуальной памяти выделено к примеру 25 Гб. Откуда? И как оно работает, как не падает?

Думаю, что ты забыл про mmap, в случае отображения файла в память роль свопа выполняет отображаемый файл.

anonymous
()
Ответ на: комментарий от unC0Rr

если не ошибаюсь, то он page miss выкидывает, или что-то вроде того. типа «ахтунг! ахтунг! нал закончился!» и ОС берет кредит.

milo
()
Ответ на: комментарий от unC0Rr

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

s0L
()
Ответ на: комментарий от anonymous

>в случае отображения файла в память роль свопа выполняет отображаемый файл.

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

s0L
()
Ответ на: комментарий от s0L

>при записи в этот участок памяти, данные не попадают напрямую на диск, данные с накопителем синхронизируются позже, это делает кэш диска.

Ну вроде бы ничего не мешает в любой момент времени произвести синхронизацию с диском и пометить страницу как отсутствующую в памяти. Или я не прав и линукс так не делает?

anonymous
()
Ответ на: комментарий от anonymous

>Ну вроде бы ничего не мешает в любой момент времени произвести синхронизацию с диском и пометить страницу как отсутствующую в памяти. Или я не прав и линукс так не делает?

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

s0L
()

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

Но есть такая ситуация, когда нет свопа, а виртуальной памяти выделено к примеру 25 Гб. Откуда? И как оно работает, как не падает?

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

Deleted
()

У меня сейчас на жестком диске свободно 5 Гб памяти, оперативы 4 Гб, свопа нет вообще. Всего под все процессы сейчас выделено более 50 Гб виртуальной памяти. Я наверное неверно понимаю какие-то основы технологии? Как это работает?

Это называется memory overcommit. Характерно для некоторых программ, языков программирования и подходов к написанию программ. Реально используется только малая часть, смотри Anonymous memory в /proc/meminfo.

Если хочется предслазуемости поведения системы, overcommit можно выключить где-то в /proc. Но тогда некоторые программы могут валиться преждевременно.

Например, в многопоточных программа обычно сразу выделяется по 8 MB на стек каждого потока. Но реально вряд ли вам понадобится больше нескольких килобайт. Далее, на 64-битных системах любая динамическая библиотека «сожрет» не менее 2 MB виртуальной памяти из-за особенностей формата ELF. Программы на C++ тоже любят выделять больше, чем им надо. И так далее, список длинный.

Deleted
()
Ответ на: комментарий от Deleted

>У меня сейчас на жестком диске свободно 5 Гб памяти, оперативы 4 Гб, свопа нет вообще. Всего под все процессы сейчас выделено более 50 Гб виртуальной памяти. Я наверное неверно понимаю какие-то основы технологии? Как это работает?

?$ ps aux | awk '{ SUM += $5 } END { print SUM }' 53482176

53482176 = 51Mb

Где превышение то?

sn1ln
()
Ответ на: комментарий от Deleted

> Далее, на 64-битных системах любая динамическая библиотека «сожрет» не менее 2 MB виртуальной памяти

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

anonymous
()
Ответ на: комментарий от anonymous

Виртуального адресного пространства. Причем реально это место не будет обеспечено ничем.

Deleted
()
Ответ на: комментарий от anonymous

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

а по какому критерию вы отличаете понятия виртаульной памяти и виртуального адресного пространства в данном контексте

s0L
()
Ответ на: комментарий от s0L

> а по какому критерию вы отличаете понятия виртаульной памяти и виртуального адресного пространства в данном контексте

В памяти можно что-нибудь сохранить, а в адресном пространстве нельзя :)

anonymous
()
Ответ на: комментарий от anonymous

>В памяти можно что-нибудь сохранить, а в адресном пространстве нельзя :)

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

а вообще, я бы советовал не забивать голову и считать эти понятия одинаковыми по значению)))))

s0L
()
Ответ на: комментарий от s0L

не в ту степь меня понесло... да, есть принципиальная разница между памятью и адресом, указывающим на эту память)))) тут все осложняется тем, что память виртуальная, т.е. это только адрес.

s0L
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.