tipos sistema procesos llamadas llamada arbol c++ c operating-system heap

c++ - procesos - ¿Es la asignación de memoria una llamada al sistema?



llamada al sistema exec (4)

¿Es la asignación de memoria una llamada al sistema? Por ejemplo, malloc y new . Es el montón compartido por diferentes procesos y gestionado por el sistema operativo. ¿Qué pasa con el montón privado? Si la asignación de memoria en el montón es administrada por el sistema operativo, ¿qué tan costoso es esto?

También me gustaría tener algún enlace a los lugares donde puedo leer más sobre este tema.


(Suponiendo un sistema operativo con protección de memoria. Podría no ser el caso, por ejemplo, en dispositivos integrados).

¿Es la asignación de memoria una llamada al sistema?

No necesariamente cada asignación. El proceso debe llamar al kernel si su montón no es lo suficientemente grande como para la asignación solicitada, pero las bibliotecas C suelen solicitar porciones más grandes cuando lo hacen, con el objetivo de reducir el número de llamadas al sistema.

Es el montón compartido por diferentes procesos y gestionado por el sistema operativo. ¿Qué pasa con el montón privado?

El montón no se comparte entre procesos. Sin embargo, se comparte entre hilos.

El costo de las llamadas al sistema de asignación de memoria del kernel depende completamente del sistema operativo. Como eso es algo muy común, puede esperar que sea eficiente en circunstancias normales. Las cosas se complican en situaciones de poca memoria RAM.


En general, malloc y new no realizan una llamada al sistema en cada invocación. Sin embargo, utilizan un mecanismo de nivel inferior para asignar grandes páginas de memoria. En Windows, el mecanismo inferior es VirtualAlloc() . Creo que en los sistemas POSIX, esto es algo equivalente a mmap() . Ambos realizan una llamada al sistema para asignar memoria al proceso en el nivel del sistema operativo. Las asignaciones subsiguientes utilizarán partes más pequeñas de esas páginas grandes sin incurrir en una llamada al sistema.

El montón normalmente es un proceso interno y no se comparte entre procesos. Si necesita esto, la mayoría de los sistemas operativos tienen una API para asignar memoria compartida . Un contenedor portátil para estas API está disponible en la biblioteca Boost.Interprocess .

Si desea obtener más información sobre la asignación de memoria y la relación con el sistema operativo, debe consultar un buen libro sobre sistemas operativos. Siempre sugiero los sistemas operativos modernos de Andrew S. Tanenbaum ya que es muy fácil de leer.


Las funciones de asignación de memoria y las declaraciones de idioma como malloc / free y new / delete no son llamadas del sistema. Malloc / free es una parte de la biblioteca C / C ++ y new / delete es una parte del sistema de tiempo de ejecución de C ++. Las llamadas de ambos pueden llevar ocasionalmente a las llamadas del sistema. En la asignación de memoria de otros idiomas implementada de la misma manera.

En general, la administración de memoria no se puede implementar sin involucrar al sistema operativo en absoluto, ya que la memoria es uno de los recursos principales del sistema, y ​​debido a esta administración de memoria global realizada por el núcleo del sistema operativo. Pero debido a que las llamadas al sistema son relativamente caras, las personas intentan diseñar idiomas y bibliotecas de asignación de memoria para minimizar la cantidad de llamadas al sistema.

Como sé, Heap es una entidad de proceso interno. Esto significa que todas las solicitudes de asignación / desasignación de memoria se administran completamente por el proceso mismo. El sistema operativo solo conoce la ubicación y el tamaño del montón y atiende dos tipos de solicitudes del sistema de gestión de memoria dentro del proceso:

add memory page at virtual address X release memory page from virtual address X

El sistema de administración de memoria local solicita estos servicios cuando decide que no tiene suficiente memoria en el grupo de memoria del montón y cuando decide que tiene demasiada memoria en el grupo de memoria del montón. A pesar del hecho de que la asignación de memoria generalmente está diseñada de tal manera que minimiza la cantidad de llamadas del sistema, aún se trata de un orden más caro que la asignación de memoria en la pila. Esto se debe a que los algoritmos de asignación / desasignación de memoria del montón son mucho más complejos y costosos que el mismo de la pila.


Ver la gestión de memoria en capas en Win32.

La asignación de memoria es siempre una llamada del sistema, pero la asignación se realiza como páginas. Si hay espacio disponible en las páginas confirmadas, el administrador de memoria asignará el espacio solicitado sin cambiar el modo de kernel. Lo mejor de HeapAlloc es que proporciona un control preciso sobre la asignación donde Virtual Alloc redondea la asignación para una sola página. Puede resultar en un uso excesivo en la memoria.

Básicamente, el montón predeterminado y el privado se tratan igual, excepto que el tamaño del montón predeterminado se especifica durante el tiempo de enlace. El tamaño de pila predeterminado es 1 MB y crece según sea necesario.