Области очищаемой памяти в Linux - PullRequest
5 голосов
/ 21 марта 2011

В Mac OS X vm_allocate() позволяет создать очищаемую область памяти. Этот регион может быть восстановлен ядром в любое время (кроме случаев, когда он заблокирован) при обнаружении нехватки памяти. Это полезно для кэширования данных и т. Д.

Мне интересно, существует ли подобный механизм в Linux (ядро 2.6). Поиски в Google привели меня к некоторой информации об Android, где обсуждается распределение разделяемой памяти, которое может быть очищено, но я не видел никаких разговоров об API для того, чтобы фактически делать это на vanilla Linux. Обзор справочных страниц для mmap, shmat и т. Д. Не показывает флагов для установки очищаемого региона. Доступна ли эта функциональность в Linux?

Примечания об этой функции на Android находятся здесь:

Ссылка на файл памяти

Образец MemoryFile

Спасибо!

Ответы [ 4 ]

2 голосов
/ 31 марта 2011

В 2.6.39-rc1 есть такая похожая система. Это называется «Трансцендентная память»:

Обновление: в википедии также есть короткое сообщение: https://en.wikipedia.org/wiki/Transcendent_memory

В вычислениях трансцендентная память (также известная как tmem) - это концепция, исследованная Дэном Магенхаймером. Трансцендентная память - это класс памяти, который имеет неизвестный и динамически изменяемый размер, адресуется ядром только косвенно, может быть сконфигурирован как постоянный или как «эфемерный» (то есть некоторое время будет присутствовать, но может исчезнуть без предупреждения ) и все еще достаточно быстр, чтобы быть синхронно доступным

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

Представлено в ядре Linux 2.6.39. [1] [2] Внедрение Дэна Магенхаймера из корпорации Oracle. Xen 4.0 поддерживает tmem в гипервизоре.

1 голос
/ 21 марта 2011

Я никогда не слышал о такой функции для Linux.

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

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

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

С более новым ядром с событиями трассировки вы, вероятно, могли бы перехватить трассировку давления памяти и сделать это таким образом. Это не было бы особенно переносимо для других версий ядра Linux.

1 голос
/ 22 марта 2011

Спасибо за ссылки! Я копаю код до ashmem_pin_region функции. Это ioctl (ioctl(fd, ASHMEM_PIN, &pin);) на устройстве http://www.google.com/codesearch/p?hl=en#2wSbThBwwIw/libcutils/ashmem-dev.c&q=ashmem_pin_region&exact_package=git://android.git.kernel.org/platform/system/core.git&sa=N&cd=1&ct=rc&l=76

и отсутствие операции на хосте: http://www.google.com/codesearch/p?hl=en#2wSbThBwwIw/libcutils/ashmem-host.c&q=ashmem_pin_region&exact_package=git://android.git.kernel.org/platform/system/core.git&sa=N&cd=2&ct=rc&l=86

А вот и часть ядра /kernel/msm.git›mm›ashmem.c: http://www.google.com/codesearch/p?hl=en#KMCRKdMbI4g/mm/ashmem.c&q=ASHMEM_PIN&exact_package=git://android.git.kernel.org/kernel/msm.git&sa=N&cd=1&ct=rc&l=463

ASHMEM, похоже, является расширением Google: http://cs736 -android.pbworks.com / w / page / 5834465 / ASHMEM http://elinux.org/Android_Kernel_Features Его нет в магистрали.

Была (неудачная) попытка нажать на нее (сначала - регистратор и объяснение письма от Грега "KH" в субботу, 28 ноября 2009 г. в 21:58, тема "Re: [PATCH 0/2] постановка / исправления для Android "). Также было предложение по проекту Google Summer of Code: http://elinux.org/Mainline_Android_kernel_functionality (на этой странице есть полезные ссылки и хорошая презентация от Грега К.Х. об исправлениях Google для Android и Linux.)

0 голосов
/ 21 марта 2011

Кажется (насколько я могу), подобный интерфейс не может быть использован для пользовательского пространства в Linux.

Очищаемая память встроена в микроядро Mach от Apple. И они защищают эту технику патентом http://www.faqs.org/patents/app/20090024809 (Патент США 7831784).

Существует нечто подобное, используемое самим ядром - дисковый кеш (кеш страниц). Кэширует страницы, поддерживаемые FS. Их (если они не загрязнены) можно удалить, если потребуется больше памяти. Подробнее об этом на http://www.westnet.com/~gsmith/content/linux-pdflush.htm

Также есть madvise() с флагом MADV_DONTNEED (http://linux.die.net/man/2/madvise), но это немедленно освободит (очистит) заданную область памяти.

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