2011-05-04 7 views
5

Estoy trabajando en programas en Linux que necesitan archivos mmap desde disco duro, pero tengo una pregunta, ¿qué puede hacer que falle? como si todas las memorias fueran fragmentarias, que tiene solo 200M cada una, pero quiero mapear un archivo a una memoria de 1000M, ¿tendrá éxito? y otra pregunta: ¿hay alguna herramienta en Linux para recordar memoria como algunas herramientas en Windows, p. Ej. la herramienta incorporada para xp.¿Cómo funciona mmap? Quiero decir, qué tipo de problema puede hacer que falle

dar gracias,

Respuesta

12

mmap() usa direcciones fuera del área del montón de su programa, por lo que la fragmentación del montón no es un problema, excepto en la medida en que puede hacer que el montón ocupe más espacio y reduzca el espacio disponible para mapeos.

Si tiene muchos archivos asignados, podría tener problemas con la fragmentación en un sistema de 32 bits donde el espacio de direcciones está relativamente restringido. En un sistema de 64 bits, es poco probable que la fragmentación sea un problema porque incluso si solo hay regiones pequeñas disponibles entre las asignaciones existentes, todavía hay mucho espacio de direcciones contiguas disponible, adyacente a las asignaciones existentes.

El problema más común en un sistema de 32 bits es que el espacio de direcciones es demasiado pequeño para asignar grandes archivos. Del espacio de direcciones de 4 GB, normalmente 2 GB están disponibles para el espacio de usuario, mientras que los otros 2 GB están reservados para el kernel. De esos 2GB disponibles, tus mapeos tienen que compartir espacio con el código y las pilas del programa (típicamente pequeñas) y el montón (potencialmente grande).

En resumen, mmap() a menudo puede fallar en sistemas de 32 bits si el archivo es demasiado grande, pero es poco probable que tenga un archivo lo suficientemente grande como para causar ese problema en un sistema de 64 bits.

Si está creando una asignación privada de escritura-escritura, también puede fallar debido a la falta de espacio de intercambio. El kernel debe garantizar que la suma de RAM y swap disponibles sea lo suficientemente grande como para mantener el tamaño de su mapeo, en caso de que modifique todas las páginas para que el kernel se vea obligado a hacer copias privadas de todas ellas. Una asignación compartida no debería tener este problema, ya que los cambios se pueden eliminar en el archivo en el disco, y luego las páginas se pueden descartar si la memoria es escasa y se vuelve a cargar desde el disco más adelante.

Por supuesto, una asignación también puede fallar si no tiene permiso para acceder al archivo, o si no es un tipo de archivo que se puede asignar (como un directorio o un socket).

No está claro qué quiere decir acerca de cómo recordar la memoria. Recuerde que el recurso escaso que mmap() consume no es memoria, es espacio de direcciones. Puede asignar un archivo de 1 GB potencialmente, incluso si la máquina solo tiene 128 MB de RAM, pero en un sistema de 32 bits no puede asignar un archivo de 4 GB, incluso si la máquina tiene 16 GB de RAM.

El concepto de virtual memory es esencial para entender lo que mmap() hace, así que lea sobre eso si no está familiarizado con él ya.

+0

bien explicado. – Marenz

+0

Tengo una situación en la que estoy trabajando en un sistema integrado con un doble núcleo ARM9 y estoy creando dos estructuras en un controlador para contener todos los datos que necesito para dos dispositivos de caracteres que registro en una sonda de plataforma. Para abreviar, mmap no falla en el espacio de usuario, pero cuando escribo en datos que deben mapearse, solo algunos de ellos cambian en las áreas de espacio de kernel equivalentes. my mmap usa remap_pfn_range. ¿Te importa especular? –

0

La respuesta corta es: depende.

Dependiendo de la cantidad de memoria que tenga, el entorno en el que esté trabajando o la forma en que se acceda a la asignación, hay varias maneras en que mmap puede fallar. Lea la página del manual de mmap para más detalles.

3

mmap funciona manipulando la tabla de páginas de su proceso, una estructura de datos que su CPU usa para mapear espacios de direcciones.La CPU será translate "virtual" addresses to "physical" ones, y lo hará de acuerdo con el page table configurado por su kernel.

Cuando accede a la memoria mapeada por primera vez, su CPU genera un page fault. El kernel del sistema operativo puede saltar, "reparar" el acceso a la memoria no válida asignando memoria y haciendo E/S de archivos en el búfer recién asignado, luego continúe la ejecución de su programa como si nada hubiera sucedido.

mmap puede fallar si su proceso está fuera del espacio de direcciones, algo a tener en cuenta estos días para el código de 32 bits, donde todas las direcciones utilizables se pueden mapear rápidamente con grandes conjuntos de datos. También puede fallar para cualquiera de las cosas mencionadas en la sección "Errores" de the manpage.

El acceso a la memoria dentro de una región mapeada también puede fallar si el kernel tiene problemas para asignar memoria o hacer E/S. En ese caso, su proceso obtendrá un SIGBUSsignal.

Cuestiones relacionadas