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

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

5 голосов
/ 04 февраля 2009

Большая часть литературы по виртуальной памяти указывает на то, что как разработчик приложений, понимание виртуальной памяти может помочь мне использовать ее мощные возможности. Некоторое время я занимался разработкой приложений для Linux, но мне было все равно, что делать с виртуальной памятью, пока я пишу код. Я что-то пропустил? Если это так, пожалуйста, пролите некоторый свет на то, как я могу использовать работу виртуальной памяти. Иначе дайте мне знать, если я не понимаю вопроса!

Ответы [ 5 ]

4 голосов
/ 04 февраля 2009

Ну, на самом деле концепция довольно проста. Я не буду повторять это здесь, но вы должны взять любую книгу по дизайну ОС, и это будет объяснено там. Я рекомендую «Концепции операционной системы» от Silberscahtz и Galvin - это то, что я должен был использовать в университете, и это хорошо.

Я могу подумать о том, что может дать вам знание виртуальной памяти:

  • Обучение распределению памяти по границам страниц, чтобы избежать потерь (применяется только к виртуальной памяти, а не к обычной памяти кучи / стека);
  • Заблокируйте некоторые страницы в оперативной памяти, чтобы они не были перенесены на жесткий диск;
  • Страницы хранителя;
  • Резервирование некоторого диапазона адресов и последующая фиксация фактической памяти;
  • Возможно, для повышения безопасности используется бит NX (неисполняемый), но я не уверен в этом.
  • PAE для доступа> 4 ГБ в 32-разрядной системе.

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

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

2 голосов
/ 04 февраля 2009

Это немного расплывчатый вопрос.

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

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

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

Основные преимущества использования сопоставленных файлов:

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

Некоторые недостатки:

  • 32-разрядные машины могут легко исчерпать адресное пространство
  • Хитрый, чтобы правильно обрабатывать расширение файла
  • Нет простого способа узнать, сколько / какие страницы в настоящее время являются резидентными (однако могут быть некоторые способы)
  • Не подходит для приложений реального времени, поскольку сбой страницы может вызвать запрос ввода-вывода, который блокирует поток (однако файл может быть заблокирован в памяти, но только если его достаточно).
1 голос
/ 04 февраля 2009

Если вас интересует производительность - важно понимать иерархию памяти.

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

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

Например, если вы объявляете матрицу в C (int a[rows][cols]), она распределяется по строкам. Таким образом, при сканировании матрицы вам нужно сканировать по строкам, а не по столбцам. В противном случае вы будете пейджировать одни и те же данные много раз.

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

1 голос
/ 04 февраля 2009

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

Мне известна одна статья, в которой говорится об управлении памятью компьютера с упором на Linux [http://lwn.net/Articles/250967]. Надеюсь, это поможет.

1 голос
/ 04 февраля 2009

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

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

И я думаю, что статья Википедии может стать хорошим началом.

...