1

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

На практике - давайте предположим, что приложения, которые не требуют большого дополнительного выделения ресурсов после запуска, - мне интересно, есть ли преимущество в запуске приложения A и ожидании, а затем запуске приложения B по сравнению с одновременным запуском приложений A и B. В последнем случае я мог бы представить, что A запрашивает некоторую память, затем B, затем снова A и т.д. (Хотя я не уверен, что это происходит так, но, с другой стороны, ОС не может знать заранее, сколько памяти будет необходимо, чтобы не было возможности зарезервировать один большой кусок заранее).

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

1 ответ1

1

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

Тебе придется:

  • посмотрите, что такое виртуальная и физическая память, и как они отображаются.

  • Посмотрите, выполняется ли кэширование на виртуальном или физическом уровне в вашей архитектуре.

  • посмотрите, как работает ваша ОС

Имеет ли значение фрагментированная физическая память? Только если это приводит к более сложным виртуальным и физическим картам (mmu и т.д.). Непрерывный виртуальный блок с несмежными физическими картами может привести к гораздо более сложной карте поиска. У Linux есть разные размеры страниц, которые он может использовать, он будет стараться использовать как можно больше (чтобы лучше всего соответствовать malloc). В моей системе Debian jessie с ядром 4.6.0-0 amd64 у меня есть страницы размером 4k (используется 154964), 2M (используется 3753) и 1G (используется 1).

Имеет ли значение фрагментированная виртуальная память? Я не могу видеть, что он делает, если процесс запросил несколько блоков с несколькими maloc, то он будет видеть их как отдельные, даже если они смежные. Один малок должен быть смежным в виртуальном. Система безопасности может защищать блоки между каждым выделенным блоком, таким образом предотвращая их прилегание.

В Linux многое будет разделено между процессами: если один и тот же исполняемый файл, то они будут совместно использовать все доступные для чтения блоки исполняемого файла (text, data-ro и т.д.). Они также будут обмениваться инициализированными данными (данными), пока один из них не изменит страницу, затем эта страница будет скопирована. То же самое сделано для всех динамически связанных библиотек, поэтому они будут делиться многими из них. Также файлы на диске являются подкачкой для этой памяти, поэтому он не будет беспокоиться о чтении данных до тех пор, пока это ему не понадобится (программа запустится без чтения, это приведет к отсутствию оперативной памяти и появлению страницы. после прочтения программа будет работать, пока не произойдет еще одна ошибка и т. д.). Если не хватает оперативной памяти, чтобы страницу можно было отбросить, ее можно прочитать позже (нет необходимости менять ее). Это может привести к большому количеству операций чтения с диска при нехватке памяти, что приведет к более медленному запуску. Если процессы запускаются отдельно, то второй процесс, оказывающий давление на подсистему памяти, приведет к удалению неиспользуемых страниц (возможно, страниц, которые использовались при запуске процесса 1, но с тех пор не использовались).

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .