Necesito asignar memoria pero no puedo usar malloc
porque no se vuelve a introducir, así que básicamente implementaré la asignación de memoria dinámica usando la función POSIX mmap
. ¿Es posible usar mmap
?Use mmap para asignar memoria
Respuesta
EDIT: reemplazado por reentrada flujos seguros
malloc es seguro para subprocesos en la mayor parte del sistema operativo.
¿Cuál está utilizando y está seguro de que no es seguro para subprocesos? ¿O es necesario que sea reentrante (supongo que no)?
Estoy usando glibc, así que supongo que es una función no reentrante. ¿Crees que puedo usar malloc? – domlao
En la mayoría de los sistemas, hoy malloc es seguro para subprocesos pero no reentrante. – janneb
Sí, puedes usar glibc malloc. Como dice janneb, es seguro para hilos y no reentrante, pero supongo que eso es lo que necesitas. –
Sí, mmap() debe reentrada, por lo que debería poder utilizarlo. Tenga en cuenta que mmap() suele ser una operación bastante lenta, por lo que probablemente sea mejor usarla solo en aquellos (con suerte) pocos y muy distantes entre los casos en los que realmente se necesita, en lugar de como un reemplazo de malloc() de propósito general.
POSIX 2008 contiene una lista de funciones de seguridad de señal asíncrona que son seguras para llamar desde una función de manejador de señal (consulte la tabla en la sección 2.4.2 en el enlace). mmap() no está en esa lista, es decir, llamar a mmap() desde una función de manejo de señal puede dar como resultado un comportamiento indefinido.
Lo que puede hacer es evitar asignar memoria a los manejadores de señal, simplemente establezca un indicador y realice el trabajo real más adelante.
No funciona siempre, por ejemplo, si la tarea del controlador de señal es exactamente guardar los datos de señal (para un procesamiento posterior). malloc() no se puede usar debido a la reentrada, la pila no se puede usar porque se destruirá en la devolución del controlador, así es como el OP comenzó a pensar en una solución poco común. – peterh
- 1. mmap (2) vs mmap (3)
- 2. llamada del sistema para asignar la memoria a un descriptor de archivo (mmap inverso)?
- 3. problema mmap, asigna grandes cantidades de memoria
- 4. Asignar memoria para un vector
- 5. ¿Cómo liberar memoria asignada usando mmap?
- 6. ¿Cuándo debo usar malloc para asignar memoria?
- 7. Linux MMAP partes internas
- 8. Compartir memoria entre procesos mediante el uso de mmap()
- 9. ¿Cuánta memoria debería poder asignar?
- 10. zlib, deflate: ¿Cuánta memoria asignar?
- 11. ¿Asignar memoria al puntero doble?
- 12. ¿Mmap/mprotect-readonly cero páginas cuentan hacia la memoria comprometida?
- 13. mmap con/dev/zero
- 14. No se puede asignar memoria
- 15. Sin memoria al asignar cursores
- 16. Cuándo usaría mmap
- 17. Pre-asignar memoria entre HostApp y DLL
- 18. NumPy vs. multiprocesamiento y mmap
- 19. Use un System.Drawing.Printing.PrintDocument para generar un PDF en la memoria
- 20. mmap: operación no permitida
- 21. shmem vs tmpfs vs mmap
- 22. malloc vs mmap en C
- 23. Android: no se pudo asignar memoria
- 24. Asignar memoria y guardar cadena en C
- 25. ¿Puede un programa asignar la memoria directamente?
- 26. SIGKILL al asignar memoria en C++
- 27. Memoria máxima. Un proceso .NET puede asignar
- 28. ¿Crear cadenas en D sin asignar memoria?
- 29. ¿Cuánta memoria debe asignar 'managed_shared_memory'? (Impulso)
- 30. Linux/perl mmap performance
"reentrant" se entiende generalmente para incluir todas las funciones de hoja como 'malloc'. 'malloc' no tiene un mecanismo de devolución de llamada a su código, por lo que no hay forma de que pueda volver a ingresarlo de todos modos (en el mismo hilo). Cualquier reentrada estaría completamente dentro y bajo el control de la biblioteca estándar en sí misma. – MSalters
@MSalters: presumiblemente quiere asignar memoria en un manejador de señal, en cuyo caso malloc() no reentrante es un problema. – janneb
@janneb: ¿No es eso prohibido? – MSalters