2010-01-02 10 views
8

¿Es seguro usar asignaciones dinámicas en un sistema de misión crítica/vital, o se debe evitar?Uso de asignaciones dinámicas en un software crítico para la vida o crítico para la vida

+6

¡misión crítica! = vida crítica. –

+3

Es una cuestión de tiempo, no asignar mientras la máquina de rayos X entrega la dosis. http://en.wikipedia.org/wiki/Therac-25 –

+2

Expandir en GregS: misión crítica significa que algo importante falla si el software no funciona. No implica necesariamente en tiempo real. La vida crítica significa que es probable que alguien muera por fallas en el software o por sus consecuencias inmediatas y directas, y por lo general es en tiempo real. –

Respuesta

7

Con software crítico que quiere que su sistema tenga el comportamiento más determinista posible.

Memoria dinámica, fragmentación de la memoria, posibles fugas, y en algunos casos de esquina (no demasiado raro) la mala conducta de malloc hará que sea mucho más difícil obtener el 100% de determinismo.

Dicho esto, si una parte de su programa (por ejemplo un algoritmo) requiere la asignación dinámica y se puede demostrar que su asignación de memoria y desasignación (gratis) serán determinista (ver notas valiosas por RickNZ), entonces' estamos más cerca de tener un sistema determinista.

8

Si está escribiendo este tipo de software, debe tener un libro grande para la especificación que está conforme (FAA, OTAN, FDA, lo que sea) de lo que puede y no puede hacer, y se lo dirá.

En general, sin embargo; no, ya que los sistemas que describes son muy difíciles de probar como correctos. Aunque en software crítico para la vida normalmente tiene que haber hardware responsable de reiniciar el software si se señala una condición de error (es decir, un temporizador de vigilancia que el software debe reiniciar ems 100ms para evitar un reinicio del hardware)

+0

¿Y si estoy escribiendo este libro? –

+28

Si tiene que hacer esta pregunta aquí, entonces no debería ser. –

+0

¡Oh! Entonces probablemente deberías saber mejor que la mayoría de las personas que responderán a esta pregunta :) Diría que no: no permitas la asignación dinámica. La memoria es tan barata que los grandes búfers estáticos deberían ser suficientes. – James

0

Mejor evitar eso. La pérdida de memoria más pequeña en su sistema hará que el sistema se bloquee con el tiempo. Por ejemplo, el sistema de vida crítica como el automóvil y el avión no utilizan la asignación dinámica.

+0

No todas las fugas son pérdidas de memoria. –

+0

así que no hay GC tampoco! piense en esas referencias permanentes que pensó que fueron liberadas. No se trata tanto de pérdidas de memoria como de tiempo para asignarlas, de vez en cuando la memoria dinámica puede tardar un tiempo en casos muy fragmentados, al igual que un GC puede tardar un tiempo en recopilarse. – gbjbaanb

+0

Hay sistemas de GC duraderos en tiempo real que ofrecen tiempos de ejecución acotados. El GC en tiempo real es bastante común: Erlang usa un GC de manera predeterminada y Java tiene una especificación estándar, aunque nunca he utilizado una implementación. –

3

Todos los sistemas de comercio y otros softwares bancarios en los que he trabajado usan muy fuertemente la asignación dinámica, y son críticos para los IB que los utilizan. Prefiero evitar trabajar en sistemas críticos para la vida, por lo que no puedo hablar por ellos.

0

Soy nuevo en C++; pero dado que todo está en la memoria; lo vas a usar de alguna manera. entonces; ¿Por qué debería un programador evitarlo?

PD: se agradecen los comentarios informativos. :)

+3

Es posible en C++ que todas las asignaciones estén en la pila, aunque no he visto eso en ningún sistema grande. –

+0

O para que todos los datos sean estáticos o en la pila. – James

+3

Y para toda la memoria asignada durante el inicio de la aplicación. – erikkallen

4

Un enfoque que he utilizado cuando no puedo evitar completamente la asignación dinámica en aplicaciones de tipo "no puede fallar" es asignar los búferes y otras estructuras de datos que necesito una sola vez, cuando la aplicación se inicia por primera vez: - entonces nunca necesitan ser liberados Son bucles y liberaciones/eliminaciones que no se corresponden con noticias/allocs que tienden a causar problemas ...

Cuando eso no es suficiente, otro truco que he usado es ejecutar con mi propia versión personalizada de malloc y gratuita , con un código que tiene especial cuidado para verificar condiciones de error comunes, como liberar algo que ya se ha liberado, verificar regularmente la integridad del puntero de los libreros, ver si el uso total de la memoria aumenta con el tiempo, etc.

0

Siento que definitivamente podría usar la asignación de memoria dinámica en aplicaciones de misión crítica, las aplicaciones MC, no necesariamente tienen que ser aplicaciones RT, solo significan que son críticas para el funcionamiento de la empresa. Cuando se utilizan construcciones de asignación de memoria dinámica, siempre es esencial tener grandes pruebas de tensión, que pueden mostrar fugas de memoria, cuando se simula el entorno real del cliente, de esa manera usted comprendería el impacto de la asignación dinámica de memoria, si tuviera una.

0

En sistemas integrados y aplicaciones de misión crítica & vida, el objetivo es reducir la dependencia en la asignación de memoria dinámica.En general, se necesita memoria dinámica cuando no se puede determinar el número de instancias durante el tiempo de ejecución. Por ejemplo, la memoria dinámica se usa cuando se obtiene información del usuario.

Al leer datos de sensores y obtener datos en tiempo real de otras fuentes, no se utiliza la memoria dinámica. Muchas aplicaciones usan una cola y conservan solo los datos actuales.

Los sistemas incorporados, cuando se usa la asignación de memoria dinámica, tendrán algún tipo de algoritmo de recuperación de memoria, ya sea Garbage Collection (GC) o la memoria se consolida en la asignación. Si no hay memoria disponible, muchos sistemas multihilo y de tareas múltiples forzarán la recolección de basura, la eliminación de variables innecesarias o esperarán una duración y volverán a intentar la asignación.

En el caso de que no haya absolutamente ninguna memoria disponible (y se han agotado todos los esfuerzos para reclamar la memoria) es hora de consultar la especificación de requisitos y ver lo que dice.

0

Creo que será muy difícil escribir cualquier sistema razonablemente grande sin asignación de memoria dinámica.

Pero la gestión de memoria predeterminada es un administrador de memoria general con garantías muy limitadas.
Si tiene requisitos específicos, entonces debería haber escrito una biblioteca de administración de memoria especializada que cumpla con los requisitos que necesita.

-4

Bueno, no se puede evitar la asignación dinámica. De alguna manera, en algún lugar, tu pila tiene que ser asignada al menos. Por lo general, cuando la gente comienza a preocuparse demasiado por si algo está en la pila o en el montón, es una señal de que se han vuelto un poco graciosos. Puede tener tantos o más errores relacionados con la pila como relacionados con el montón, pero puede detectar los relacionados con el montón bastante fácilmente en las pruebas siempre que evite libs que usen su propia administración de memoria. Pero, en primer lugar, C++ no es el mejor lenguaje para este tipo de aplicaciones.

+0

Sin duda puede evitar la asignación dinámica en la ruta rápida de un programa persistente. Ese es un paso crucial hacia el comportamiento determinista en tiempo real. – Tom

+0

Gracias por el downmodding juvenil. la asignación dinámica es ciertamente determinista. También puede especificar cualquier asignación que desee, incluida una implementación de pila. –

+0

La respuesta no necesariamente proporciona ayuda; habla más sobre la implementación actual que sobre cómo se pueden superar los problemas de DMA. –

0

Claro, no hay ningún problema con esto. SIN EMBARGO: la falla de una asignación no debe causar que su programa falle.

Este principio se extiende a los programas en tiempo real. Un malloc en tiempo real debería tener un límite de tiempo superior; puede haber casos en los que la memoria simplemente no está disponible a tiempo y tiene que devolver NULL.

Ahora, uno podría preguntarse por qué un sistema de misión crítica puede funcionar cuando falla una asignación de memoria. Esto es simple: "trabajar" normalmente no es una condición en blanco y negro. Cualquier sistema crítico de misión crítica tiene una mezcla de requisitos "DEBERÁ" y "DEBERÍA". La asignación de memoria dinámica se puede usar cuando una falla en la asignación de memoria viola un requisito "DEBERÍA". P.ej. "el sistema DEBERÁ soportar 200 widgets y DEBERÍA soportar 400" - asignar estáticamente los primeros 200 widgets y asignar dinámicamente los siguientes 200.

Cuestiones relacionadas