Proceso (programa) diseño del espacio de la memoria

Se puede inferir que te falta confianza en la victoria sobre sus rivales en el hecho de que son irritables contra ellos. -------- Si el enemigo te hace enojar, que no ha superado su alcance.

Recientemente leer un blog anterior, me siento un poco de sentido de la auto-dirigido y protagonizado, es sobre el conocimiento o demasiado aburrido rígido, negro va a añadir más tarde entiendo la idea de los procesos de memoria. Además, debido a que se trata de programadores a menudo y Inglés , al comienzo de cada blog se unirán a los módulos de Inglés pollo sopa. Aprender juntos y avanzar juntos. También existe la esperanza de que los amigos yardas exposiciones.

Título (programa) no es realmente exacto. De hecho, los programas en ejecución se deben escribir.
¿Qué es un proceso? ¿Cuál es el procedimiento?

  • Del sistema operativo tales definiciones: los programas en ejecución y sus recursos (CPU, memoria, recursos del sistema, etc.) se llama el proceso de ocupación . De pie en la perspectiva del programador, el archivo fuente de C se llama, pero la máquina no reconoce el origen hasta el punto de vista del programador, entonces tenemos que utilizar el compilador genera un programa ejecutable binario para la CPU puede ser identificado y almacenado en un medio de almacenamiento, a continuación, programa ejecutable compilado sólo puede ser llamado y no se llama proceso.
  • Una vez que el programa se pone en marcha, a continuación, ejecutar el programa y los recursos utilizados se llama un proceso. Este concepto es un proceso para el sistema, en lugar del usuario, el usuario, que se enfrentó con el concepto del programa. Claramente, un programa puede ser ejecutado varias veces, lo que significa que varios procesos pueden ejecutar el mismo programa.

1, la ilustrada

De hecho, la redacción de este blog es para sentar las bases de multi-proceso detrás de la programación.
objetos de gestión de memoria del proceso de Linux son la memoria virtual por proceso innata respectiva no interferencia en el espacio de memoria virtual de cada uno 0-4G, 0-3G aplicación de espacio de usuario propio código del usuario, 1 GB de espacio es un espacio del núcleo de alta ejecución Linu x llamada al sistema, dónde almacenar todo el código del núcleo y todo el módulo del núcleo, el usuario puede ver y están en contacto con la dirección virtual, no la dirección real de memoria física.

  • Linux bajo un datos de proceso de tres partes en la memoria, es el "segmento de código", "segmento de pila" y "segmento de datos".
    代码段: Como su nombre indica, se trata de almacenar los datos del código de programa, si hay varias máquinas el mismo proceso para ejecutar un programa más, entonces pueden utilizar el mismo código.
    堆栈段: El almacenamiento es una dirección de retorno de subrutina, parámetros y procedimientos de las variables locales de subrutinas y dirección de memoria de la aplicación dinámica malloc ().
    数据段: Las variables de procedimientos de almacenamiento global, las variables estáticas y constantes de espacio de memoria.
    Aquí Insertar imagen Descripción

  • Tenga en cuenta que las cifras de la zona sección no les importa, esto se basa en el nombre de cada persona para el hábito dependiente.

2, explicación detallada

La idea básica de la gestión de memoria de Linux sólo es accesible en la dirección real cuando se estableció un mapa físico de la dirección, el lenguaje distribución de Linux C / C ++ Hay 3 maneras.
(1) desde el área de almacenamiento estática asignada . Es el segmento de datos de asignación de memoria, esta memoria en el programa se ha asignado una buena etapa de compilación, allí durante toda la operación del programa, tales como variables globales, las variables estáticas.
(2) creado en la pila . Durante una función, la función de la unidad de almacenamiento puede crear una variable local en la pila, las células de memoria se liberan automáticamente al final de la ejecución de la función. Pila operación de asignación de memoria en el conjunto de instrucciones del procesador, la eficiencia es alta, pero la asignación de sistema finito memoria de pila, tales como gran variedad hará que el espacio de pila explotar
errores.
(3) de la asignación de montón , conocida como asignación de memoria dinámica. Programa en tiempo de ejecución para aplicar cualquier número de memoria usando malloc o nuevo, el programador es responsable cuando se utiliza la memoria libre o liberación de eliminación. Esta zona se llama asignación de memoria de asignación de memoria dinámica. La memoria dinámica se determina por el tiempo de vida de nosotros, muy flexibles, pero también muchos problemas, tales como el valor de un puntero a un bloque de memoria ha cambiado y ningún otro puntero a esta memoria, esta memoria no puede tener acceso, pérdida de memoria .

capas Descripción específica
área de pila memoria de pila para completar el programa por el compilador en la fase de compilación, el proceso de espacio de pila en el proceso de la parte superior del espacio de usuario y el crecimiento es hacia abajo, cada llamada estará abierta cada función en su propio espacio de pila espacio de pila, parámetros de función, las variables locales la función devuelve la dirección, etc. son las de una función de primer orden a presión en la parte superior de la pila en la pila, la función devuelve desaparece espacio de pila función, la función devuelve la dirección de una variable local es ilegal.
montón memoria de almacenamiento dinámico se asigna durante la ejecución del programa, el proceso para el almacenamiento de variables de funcionamiento se asignan dinámicamente, el tamaño no es fijo, está colocado entre la pila y el segmento de datos de inicialización no pila, y el proceso se utiliza para cerrar el espacio de pila . Cuando el proceso de llamar a las funciones malloc tales como la asignación de memoria, la memoria marco de pila no es la función de la recién asignado, sino que se añade de forma dinámica a la pila, a continuación, la pila en la expansión a alta dirección; cuando se utiliza el libre tiempo para liberar la memoria y otras funciones, la memoria liberada se echado del montón, se reducirá el montón. Porque la memoria asignada dinámicamente no está en el marco de pila función, por lo que incluso si la función devuelve esta memoria no va a desaparecer.
segmento de datos sin inicializar (BSS segmento) Se utiliza para almacenar sin inicializar de variables globales y variables estáticas estático . Y antes de que el programa comienza su ejecución, es decir, antes de que el principal (), los datos del núcleo en este segmento se inicializan a cero o puntero nulo . recursos variables estáticas liberan automáticamente por el sistema después del final del programa. la asignación estática
segmento de datos inicializados (.data) en algunos lugares se llamará directamente en segmentos También una asignación de memoria estática, para proteger inicializado las variables globales y variables estáticas estático , de sólo lectura área de memoria pertenece.
segmento literales (.rodata) Figura suposición
segmento de texto Esto es parte de las instrucciones de máquina ejecutables ejecutados por la CPU. A menudo, el segmento de texto es de sólo lectura para evitar accidentes debido a modificar el programa de su propia ejecución.
  • Los siguientes puntos deben tenerse en cuenta

  • El programa no se ejecuta esencialmente por los segmentos del SRS, segmentos de datos, texto compone de tres segmentos.

  • segmento BSS no toma el tamaño del archivo ejecutable, que es conseguir la memoria por el enlazador.

  • contenido de segmento bss (datos no inicializados) no se almacena en un archivo en el disco. La razón es que el núcleo antes de que el programa se pone en marcha que se establecen en 0.

  • Necesidad de ser almacenada en el archivo de programa, sólo el segmento de texto y el segmento de datos de inicialización.

  • BSS tamaño de segmento obtiene a partir del archivo ejecutable, a continuación, el enlazador para obtener este bloque de memoria tamaño, el segmento de datos inmediatamente detrás. Cuando este programa en el espacio de direcciones de memoria borra.

  • Pila Área: área de pila de la alta a los bits de dirección bajos del crecimiento bits de dirección, es un área contigua de memoria asignada tamaño del área de pila es generalmente pequeña.

  • Montón: para memoria dinámica de asignación, liberación y aplicaciones asignado por el programador. Fue una pila crece de menor a bits de direcciones más altas, utilizando una estructura de almacenamiento de cadena. malloc frecuentes / espacio libre de memoria causada por la discontinuidad, fragmentación. Cuando las funciones de la biblioteca espacio Pila de aplicación tiene un montón de espacio disponible según cierto algoritmo de búsqueda. Así montón de eficiencia a ser mucho más baja que la pila.

3, la verificación de código

C Utilice el siguiente espacio de memoria proceso de verificación de código anterior es correcta.

#include <stdio.h>
#include <stdlib.h>


int   global_bss_var;     // 未初始化的全局变量,存放在数据段的BSS区,其值默认为0;
int   global_data_var = 5;  // 初始化了的全局变量,存放在数据段的DATA区,其值为初始化值20;


int main(int argc, char **argv) //argv里存放的是命令行参数,他存放在命令行参数区
{ 
    static int   local_bss_var;     // 未初始化的静态变量,存放在数据段的BSS区,其值默认为0;  
    


    static int   local_data_var = 10;  // 初始化了的静态变量,存放在数据段的DATA区,其值为初始化值10;
    


    char        *str="Hello";
    // str是初始化了的局部变量,存放在栈(STACK)中,其值是"Hello"这个字符串常量存放 在DATA段里RODATA区中的地址    
   

    char        *ptr;   
    // ptr是未初始化了的局部变量,存放在栈(STACK)中;其值为随机值,这时候的ptr称 为“野指针(为初始化的指针)”
   

    ptr = malloc(100);
    // malloc()会从堆(HEAP)中分配100个字节的内存空间,并将该内存空间的首地址返回给ptr存 放;
      

    printf("[cmd args]:  argv address: %p\n", argv);     
    printf("--------\n");
     
    printf("[ Stack]:     str address: %p\n", &str);   

    printf("[ Stack]:     ptr address: %p\n", &ptr); 
    printf("--------\n");
    
    printf("[ Heap ]:  malloc address: %p\n", ptr);      
    printf("--------\n");
    
    printf("[  bss ]:  local_bss_var address: %p value: %d\n", &local_bss_var, local_bss_var);      

    printf("[  bss ]:  global_bss_var address: %p value: %d\n", &global_bss_var, global_bss_var);
    

    printf("[ data ]:  local_data_var address: %p value: %d\n", &local_data_var, local_data_var);
   
    printf("[ data ]:  global_data_var address: %p value: %d\n", &global_data_var, global_data_var);       
    
    printf("[rodata]: \"%s\" address: %p \n", str, str);   
    printf("--------\n");
    
    printf("[ text ]:  main() address: %p\n", main); 
    printf("--------\n");
    
    return 0;

}

Aquí Insertar imagen Descripción

Publicado 29 artículos originales · alabanza won 65 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/weixin_46027505/article/details/105076010
Recomendado
Clasificación