malloc /libre aplicación
Chunk
unidades de gestión de biblioteca montón estándar
C en la asignación básica está fuera trozo, trozo es un concepto lógico, su estructura de datos es como sigue:
struct {malloc_chunk
size_t prev_size;
size_t tamaño;
struct malloc_chunk * fd;
struct malloc_chunk * bk;
struct malloc_chunk * fd_nextsize;
struct malloc_chunk * bk_nextsize;
};
Si una parte es un estado libre, que constituye el fd y bk un par de lista enlazada, los registros que se han de memoria libre para el usuario, de modo que más tarde puede ser asignado o se fusionaron en un gran bloque libre de aquí directamente después de la redistribución. Si una parte ha sido alloc, a continuación, esta vez de después de que el tamaño no es datos de usuario significativas, es decir, fd, libro, etc., esto es fácil de ver en los comentarios.
Cuando una parte se asigna a cabo, el tamaño registrado en este trozo de hecho asigna al tamaño de la memoria del programa de usuario, es decir, los valores de los parámetros cuando llamamos malloc y prev_size registro es adyacente a la porción actual el tamaño de un trozo. La razón de este diseño es rápidamente localizar /fusión ejemplo trozo adyacente, si la dirección de la porción corriente char * p, entonces las flechas arriba /abajo, respectivamente, de un trozo de direcciones es PP- >. Prev_size y p + p > tamaño . análisis de los siguientes dos macros simples se convierte en claro:
(1) para dar al usuario un puntero (es decir, donde SIZE_SZ sizeof (size_t))
#define chunk2mem (p) de la porción (( void_t *) ((char *) (p) + 2 * SIZE_SZ))
(2) la dirección del trozo obtenido
#define mem2chunk (MEM) ((mchunkptr puntero desde el usuario) (( char *) (MEM) - 2 * SIZE_SZ))
cuando la asignación de memoria, la unidad que es 8Byte trozo, los tres inferiores bits son 0 en este tamaño, que puede ser utilizado para otros fines. Tiene dos definiciones en el glibc:
#define PREV_INUSE 0x1
#define IS_MMAPPED 0x2
Aquí PREV_INUSE registrada de si se utiliza un trozo (si se ha asignado era 1), e identificar el fragmento actual IS_MMAPPED si obtenido por distribución MMAP. Los siguientes macros pueden profundizar nuestra comprensión de la parte de:
//Obtener el trozo actual (p) de la siguiente parte
#define next_chunk (p) ((mchunkptr) (((char * ) (p)) + ((p) - > tamaño de &~ PREV_INUSE)))
//obtener el trozo actual (p) en un trozo
#define prev_chunk (p ) ((mchunkptr) (((char *) (p)) - ((p) - > prev_size)))
//determina si el trozo actual (p) se utiliza o no, nota: p es inuse el siguiente bit de información adyacente almacenado en el tamaño del fragmento en
#define inuse (p) ((((mchunkptr) (((char *) (p)) + ((p) - > size &~ PREV_INUSE))) - > tamaño) &PREV_INUSE)
//trozo actual (P) dispuestos para ser utilizado, es decir, el bit menos significativo de la siguiente adyacente al tamaño de fragmento es 1
set_inuse #define (p) ((mchunkptr) (((char *) (p)) + ((p) - > tamaño de &~ PREV_INUSE))) - > tamaño
Explique la salida del comando free en Linux. El siguiente es el resultado de la ejecución l
Comprenda el proceso:? PID, PPID? Estado del proceso actual? Asignación de memoria? CPU y ti
Cómo crear y descomprimir archivos zip, tar, tar.gz y tar.bz2 en Linux
La copia de la máquina virtual de Linux no puede acceder a Internet
Tecnología de computadora: conexión de escritorio remoto de Linux
Proceso de aprendizaje de Linux, hilos y programas
configuración de NIC Linux detallada
El archivo de configuración de la variable de entorno de Ubuntu
Uso de git y github tutorial en Linux VM
[Notas de estudio de Linux] intercambiar memoria virtual agregar y eliminar configuración
Recuperar remotamente cualquier archivo de la computadora Win7
Cómo configurar la ventana del sistema Windows 7 para hacerlo más flexible
Cómo convertir la computadora Windows7 /win7 en un enrutador inalámbrico
La última versión preliminar de Win10 10061 se lanzó. No compatible. Actualización
El sistema Win10 siempre solicita encontrar la aplicación en la tienda. Cómo cerrarla
Pasos detallados para instalar sistemas Win10 simples y duales en el disco duro
Las mejoras de Windows Vista SP1 están totalmente introducidas