¿Cómo arreglar un tamaño de memoria para mi aplicación en C?

Me gustaría asignar una memoria fija para mi aplicación (desarrollada usando C). Digamos que mi aplicación no debe cruzar 64MB de ocupación de memoria. Y también debo evitar usar más CPU. ¿Como es posible?

Saludos Marcel.

Bajo unix: “ulimit -d 64M”

Una forma de baja tecnología de la que podría asegurarme de no cruzar un umbral máximo de memoria en su aplicación sería definir su propia función malloc() especial que contará la cantidad de memoria asignada y devolverá un puntero NULO si el umbral se ha excedido. Por supuesto, esto dependería de que verifique el valor de retorno de malloc() cada vez que lo llame, lo que generalmente se considera una buena práctica, ya que no hay garantía de que malloc() encuentre un bloque de memoria contiguo del tamaño que solicitó .

Sin embargo, esto no sería infalible, ya que probablemente no tendrá en cuenta el relleno de memoria para la alineación de palabras, por lo que probablemente terminará alcanzando el límite de memoria de 64MB mucho antes de que su función informe que lo ha alcanzado.

Además, suponiendo que esté utilizando Win32, es probable que haya API que pueda usar para obtener el tamaño del proceso actual y verificar esto dentro de su función malloc() . Tenga en cuenta que agregar esta sobrecarga de comprobación a su código probablemente hará que use más CPU y que se ejecute mucho más lento de lo normal, lo que lleva muy bien a su próxima pregunta 🙂

Y también debo evitar usar más CPU.

Esta es una pregunta muy general y no hay una respuesta fácil. Podría escribir dos progtwigs diferentes que esencialmente hacen lo mismo, y uno podría ser 100 veces más intensivo en CPU que otro debido a los algoritmos que se han utilizado. La mejor técnica es:

  1. Establecer algunos puntos de referencia de rendimiento.
  2. Escribe tu progtwig.
  3. Mide para ver si llega a tus puntos de referencia.
  4. Si no alcanza sus puntos de referencia, optimice y vaya al paso (3).

Puede usar progtwigs de perfiles para ayudarlo a determinar dónde deben optimizarse sus algoritmos. Rational Quantify es un ejemplo de uno comercial, pero también hay muchos perfiladores gratuitos.

Si está en un sistema derivado de POSIX, Sistema V o BSD, puede usar setrlimit() con el recurso RLIMIT_DATA , similar a ulimit -d .

También eche un vistazo al recurso RLIMIT_CPU : es probablemente lo que necesita (similar a ulimit -t )

Compruebe man setrlimit para más detalles.

Para la CPU, hemos tenido una tarea de muy baja prioridad (menor que todo lo demás) que no hace más que contar. Luego puede ver con qué frecuencia se ejecuta esa tarea y saber si el rest de sus procesos consumen demasiada CPU. Este enfoque no funciona si desea limitar su proceso al 10% mientras se ejecutan otros procesos, pero si desea asegurarse de que tiene un 50% de CPU libre, entonces funciona bien.

Para las limitaciones de memoria, se queda atascado implementando su propia capa sobre malloc, o aprovechando su sistema operativo de alguna manera. En sistemas Unix ulimit es tu amigo. En VxWorks apuesto a que probablemente podría encontrar una manera de aprovechar el bloque de control de tareas para ver cuánta memoria está usando la aplicación … si no existe una función para eso. En Windows, probablemente podría al menos configurar un monitor para informar si su aplicación supera los 64 MB.

La otra pregunta es: ¿qué haces en respuesta? ¿Debería fallar su aplicación si supera los 64Mb? ¿Quieres esto solo como una guía para ayudarte a limitarte? Esto podría marcar la diferencia entre elegir un enfoque de “cumplimiento” frente a un enfoque de “monitorear e informar”.

Hmm buena pregunta. Puedo ver cómo se puede hacer esto para la memoria asignada de la stack, utilizando una versión personalizada de malloc y gratuita, pero no sé cómo aplicarla en la stack también.

Gestionar la CPU es aún más difícil …

Interesante.