2011-03-21 20 views
5

En Mac OS X, vm_allocate() permite la creación de una región de memoria purgable. Esta región puede recuperarse en cualquier momento (excepto cuando esté bloqueado) por el núcleo cuando se detecta la presión de la memoria. Es útil para el almacenamiento en caché de datos, etc.Regiones de memoria purgables en Linux

Me pregunto si existe un mecanismo similar en Linux (kernel 2.6). Las búsquedas de Google me llevan a cierta información sobre Android sobre la asignación de la memoria compartida que puede hacerse purgable, pero no he visto hablar de API para hacerlo en Linux. Una revisión de las páginas man para mmap, shmat, etc., no muestra indicadores para establecer una región purgable. ¿Esta funcionalidad está disponible en Linux?

Las notas acerca de esta característica en Android están aquí:

MemoryFile Reference

MemoryFile Sample

Gracias!

+0

un poco de código de XNU http://fxr.watson.org/fxr/source/osfmk/vm/vm_object.c?v=xnu-1228;im=bigexcerpts#L5265 – osgx

+0

Gracias por las correcciones de formato @osgx. El código XNU es de hecho lo que veo en OS X. –

+0

¿Puede agregar algunos enlaces sobre discusiones de Android? – osgx

Respuesta

2

Existe un sistema similar en 2.6.39-rc1. Se llama "memoria trascendente":

Actualización: También hay una breve descripción en wikipedia: https://en.wikipedia.org/wiki/Transcendent_memory

En informática, la memoria trascendente (también conocida como "tmem") es un concepto explorado por Dan Magenheimer. La memoria trascendente es una clase de memoria que es de tamaño desconocido y dinámicamente variable, es direccionable solo indirectamente por el núcleo, puede configurarse como persistente o como "efímera" (lo que significa que estará disponible por un tiempo, pero podría desaparecer sin advertencia), y sigue siendo lo suficientemente rápido para ser accesible sincrónicamente

Uno puede pensar en la memoria trascendente como una especie de disco RAM con algunas características interesantes: nadie sabe qué tan grande es, escribe en el disco puede no tener éxito, y potencialmente, los datos escritos en el disco pueden desaparecer antes de volver a ser leídos. A primera vista, puede parecer un tipo de dispositivo relativamente inútil, pero se espera que la memoria trascendente pueda mejorar el rendimiento en algunas situaciones.

Introducido en Linux kernel 2.6.39. [1] [2] Implementación por Dan Magenheimer de Oracle Corporation. Xen 4.0 es compatible con tmem en el hipervisor.

+0

Parece que podría funcionar. Solo tengo que esperar a que 2.6.39 se estabilice, supongo :) –

+0

Gracias por la cita. Me pregunto por qué en la Tierra se eliminó el artículo de Wikipedia: "El artículo está ampliamente copiado, la falta de diversas fuentes puede no ser notable". Me parece una razón bastante oscura. –

0

Parece (tan rápido como pueda), no se puede usar una interfaz similar para el espacio de usuario en Linux.

La memoria purgable está integrada en Mach microkernel por Apple. Y protegen esta técnica mediante la patente http://www.faqs.org/patents/app/20090024809 (Patente de Estados Unidos 7831784).

Hay algunos similares, utilizados por el propio kernel: caché de disco (caché de página). Almacena en caché las páginas, respaldado por FS. Ellos (si no están sucios) se pueden eliminar si se necesita más memoria. Más acerca de esto es en http://www.westnet.com/~gsmith/content/linux-pdflush.htm

Además, no es madvise() con MADV_DONTNEED bandera (http://linux.die.net/man/2/madvise) pero Esto liberará (purga) dada región de memoria inmediatamente.

+1

Escribí un programa de prueba rápido para experimentar con 'madvise()' y vi los mismos resultados que usted mencionó. Las cosas de pdflush parecen estar en kernel y no disponibles para el espacio del usuario. No estoy seguro si agregar una pregunta de seguimiento es apropiado, pero ¿qué recomendaría para tratar de implementar una configuración de almacenamiento en caché como la que puede obtener con 'vm_allocate()'? El truco sería lograr que las regiones afectadas se descarten bajo la presión de la memoria del sistema, pero, por supuesto, al estar en el espacio del usuario, solo se podría notificar DESPUÉS de que el kernel intente asignar, no mientras está asignando. –

+0

Solo puedo ofrecer para escribir (o buscar) un sistema de archivos virtual especial que permita guardar memoria en la memoria, pero no respaldará (almacenará) datos en ningún dispositivo físico, solo en la memoria caché de página. – osgx

+0

Un sistema de archivos como ese tendría que estar en el núcleo al igual que el caché de disco que mencionaste anteriormente, ¿no? Para esta aplicación (aplicación userland) un sistema de archivos personalizado es un poco exagerado. ¡Gracias por su ayuda e ideas! –

1

Nunca he oído hablar de una característica para Linux.

En Linux, la memoria se puede intercambiar en cualquier momento. Si se trata de un mapa de memoria respaldado por archivos, puede escribirse en el disco y liberarse en lugar de intercambiarse.

Probablemente lo más cercano que podrá obtener es revisar periódicamente el uso de la memoria actual y liberar el caché, o usar un kernel de Linux parchado con un notificador de poca memoria que enviará una señal o un identificador de archivo evento cuando la presión de la memoria es alta.

Digo un kernel parchado porque no creo que ninguna de las propuestas para un notificador de recursos haya sido aceptada en el núcleo de la línea principal. Here was one attempt.

Con un kernel más nuevo con eventos de seguimiento, probablemente podría enganchar un rastro de presión de memoria y hacerlo de esa manera. Sin embargo, no sería particularmente portátil para otras versiones de kernel de Linux.

1

¡Gracias por los enlaces! Excavo código hasta la función ashmem_pin_region.Es un ioctl (ioctl(fd, ASHMEM_PIN, &pin);) en el dispositivo 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

y no-op en el host: 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

Y aquí está una parte del núcleo /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 parece ser una extensión de Google: http://cs736-android.pbworks.com/w/page/5834465/ASHMEMhttp://elinux.org/Android_Kernel_Features se no está en la línea principal.

Hubo un intento (fallido) de presionarlo (en el primer registro, y explicar la carta de Greg "KH" el sábado, 28 de noviembre de 2009 a las 9:58 PM, asunto "Re: [PATCH 0/2 ] puesta en escena/correcciones de android "). También hubo una propuesta de proyecto de código de Google Summer: http://elinux.org/Mainline_Android_kernel_functionality (esta página tiene enlaces útiles y una buena presentación de Greg KH sobre los parches y Linux de Android de Google)

+1

Eso es lo que temía, que la función estaba presente en Android porque Google la había puesto allí. Gracias por desenterrar esa información! –

+1

característica tipo ashmem: POSIX_FADV_VOLATILE http://lwn.net/Articles/468896/ (2011) – osgx

+0

Eso es exactamente lo que quiero. Lamentablemente a partir de 3.13 no está en un núcleo principal. –

Cuestiones relacionadas