Pregunta

He estado leyendo acerca de las condiciones de memoria en Linux, y el siguiente párrafo de las páginas man me hizo pensar:

  

Por defecto, Linux sigue una estrategia de asignación de memoria optimista. Esto significa que cuando malloc () devuelve un valor no nulo no hay garantía de que la memoria es realmente disponible. Este es un muy mal bicho. En caso de que resulte que el sistema está fuera de la memoria, uno o más procesos serán matados por el asesino OOM infame. [...]

Teniendo en cuenta que el operador nueva aplicación va a terminar llamando malloc en algún momento, se garantiza que cualquier nueva en realidad lanzar en Linux? Si no los hay, ¿cómo se puede manejar esta situación de error, aparentemente indetectable?

¿Fue útil?

Solución

Depende; puede configurar los parámetros del kernel overcommit usando vm.overcommit_memory.

Herb Sutter discutió hace unos años cómo este comportamiento es en realidad no conforme con el estándar C ++ :

  

"En algunos sistemas operativos, incluyendo Linux, específicamente la asignación de memoria siempre tiene éxito. Punto final. ¿Cómo puede la asignación siempre tienen éxito, incluso cuando la memoria solicitada realmente no está disponible? La razón es que la asignación en sí se limita a registrar una solicitud de la memoria;. bajo las mantas, la memoria (físico o virtual) es en realidad no comprometido con el proceso solicitante, con almacén de respaldo real, hasta que la memoria se utiliza realmente

     

"Tenga en cuenta que, si nuevos usos de las instalaciones del sistema operativo directamente, entonces nueva siempre tendrá éxito, pero ningún código inocentes tarde como buf [100] = 'c'; puede lanzar o no o detener Desde un punto estándar de C ++ de vista. , ambos efectos son no conformes, porque el estándar C ++ requiere que si nuevo no puede cometer suficiente memoria debe fallar (esto no lo hace), y que código como buf [100] = 'c' no debería lanzar una excepción o de otra manera fallar (esto podría) ".

Otros consejos

No se puede manejar en su software, pura y simple.

Para su aplicación que recibirán un puntero perfectamente válido. Una vez que se intente acceder a ella, se generará un error de página en el núcleo, el núcleo intentará asignar una página física para ello y si no puede ... auge.

Pero como ves, todo esto sucede en el interior del núcleo, su aplicación no puede ver eso. Si se trata de un sistema crítico puede desactivar la overcommit alltogether en el sistema.

Creo que el malloc todavía puede devolver NULL. La razón es que hay una diferencia entre la memoria del sistema (RAM + swap) y la cantidad de espacio de direcciones de su proceso.

Por ejemplo, si usted pide 3 GB de memoria de malloc en un sistema Linux x86 estándar, seguramente devuelve NULL ya que esto es imposible, por la cantidad de memoria dada a aplicaciones de espacio de usuario.

Perdóname si estoy equivocado, pero no tratar de ajustar a cero la memoria asignada ser suficiente para garantizar que dispone de todos los bytes que ha solicitado? O incluso sólo escribir hasta el último byte, sería una excepción si la memoria no era realmente el suyo ¿verdad?

Si eso es cierto, usted podría tratar de escribir a la última (y en primer lugar?) Byte de la memoria y ver si funciona bien, y si lo hace, no se podía volver nula de malloc.

Sí, hay una nueva garantía de que habrá finalmente lanzar. Independientemente de sobreasignación, la cantidad de espacio de direcciones es limitada. Así que si se mantiene la asignación de memoria, tarde o temprano se quedará sin espacio de direcciones y de nuevo se verá obligado a lanzar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top