Comprenda el proceso, cree un proceso llamando a la función de bifurcación

1. Comprender el proceso

Proceso (Process), que se define de la siguiente manera: "un programa en ejecución que ocupa espacio en la memoria".

Suponga que descargó el juego LBreakout de Internet y lo instaló en su disco duro. El juego en este momento no es un proceso, sino un programa. Porque el juego no está en estado de ejecución. Comience a ejecutar el programa a continuación. En este momento, el juego se carga en la memoria principal y entra en el estado de ejecución, y solo entonces puede llamarse proceso. Si se ejecutan varios programas LBreakout al mismo tiempo, se generará una cantidad correspondiente de procesos y se ocupará el espacio de memoria de la cantidad correspondiente de procesos.

Otro ejemplo. Suponiendo que necesita realizar operaciones relacionadas con documentos, debe abrir el software de edición de documentos en este momento. Si desea escuchar música mientras trabaja, debe encender su reproductor de MP3. Además, para chatear con amigos, abra el software MSN. En este momento se crearon un total de 3 33 procesos. Desde la perspectiva del sistema operativo, un proceso es la unidad básica del flujo del programa.Si se crean múltiples procesos, el sistema operativo se ejecutará simultáneamente. A veces se generan múltiples procesos durante la ejecución de un programa. El servidor multiproceso que se creará a continuación es un representante de ellos.

1.1 Número de núcleos de CPU y número de procesos

propio 2 2La CPU de 2 dispositivos informáticos se denomina CPU de doble núcleo (Daul), con4 4Una CPU con 4 unidades aritméticas se denomina CPU de cuatro núcleos (Quad). es decir,1 1Una CPU puede contener varios dispositivos informáticos (núcleos). La cantidad de núcleos es la misma que la cantidad de procesos que pueden ejecutarse simultáneamente. Por el contrario, si la cantidad de procesos excede la cantidad de núcleos, los procesos usarán recursos de CPU en tiempo compartido. Pero debido a que la CPU se ejecuta tan rápido, parece que todos los procesos se ejecutan al mismo tiempo. Por supuesto, cuantos más núcleos haya, más evidente será esta sensación.

1.2 Identificación del proceso

A todos los procesos se les asigna una ID del sistema operativo, sin importar cómo se creó el proceso. Este ID se denomina "ID de proceso" y tiene un valor superior a 2 2Entero de 2 . 1 11 se asigna al primer proceso después de que se inicia el sistema operativo (utilizado para ayudar al sistema operativo), por lo que el proceso de usuario no puede obtener el valor de ID1 11 _

Observe los procesos en ejecución en Linux:

ps au

inserte la descripción de la imagen aquí

Se puede ver que todos los procesos que se están ejecutando actualmente se pueden ver a través psdel comando . En particular, tenga en cuenta que el comando también enumera el PID (ID de proceso). Además, el ejemplo anterior enumera todos los detalles del proceso especificando los parámetros ay .u

El comando para ver el estado del proceso es el siguiente:

ps -eo pid,ppid,sid,tty,pgrp,comm,stat | grep -E 'bash|PID|test'

inserte la descripción de la imagen aquí

Mostrado en estilo BSD:

ps aux | grep -E 'bash|PID|test'

inserte la descripción de la imagen aquí

Acerca de los indicadores de estado psde los comandos y procesos: https://wker.com/linux-command/ps.html

2. Crea un proceso llamando a la función de bifurcación

#include <unistd.h>

pid_t fork(void);

// 成功时返回进程ID,失败时返回-1

La función de bifurcación creará una copia del proceso de llamada. Es decir, en lugar de crear un proceso a partir de un programa completamente diferente, se realiza una copia del proceso en ejecución que llama a la función de bifurcación. Además, ambos procesos ejecutarán las declaraciones después de la llamada a la función de bifurcación (precisamente después de que regrese la función de bifurcación). Sin embargo, debido a que se usa el mismo proceso para copiar el mismo espacio de memoria, el flujo de programa subsiguiente debe distinguirse de acuerdo con el valor de retorno de la función de bifurcación, es decir, las siguientes características de la función de bifurcación se usan para distinguir el flujo de ejecución del programa :

  • Proceso principal: la función de bifurcación devuelve el ID del proceso secundario.
  • Proceso hijo: la función fork devuelve 0 00 _

Aquí, el proceso principal (Proceso principal) se refiere al proceso original, es decir, el cuerpo principal que llama a la función de bifurcación, y el proceso secundario (Proceso secundario) es el proceso copiado por el proceso principal que llama a la función de bifurcación.

A continuación, explique el proceso de ejecución del programa después de llamar a la función de bifurcación, como se muestra en la figura a continuación.

inserte la descripción de la imagen aquí

Como se puede ver en la figura anterior, cuando el proceso principal llama a la función de bifurcación, el proceso secundario se copia y se obtiene el valor de retorno de la función de bifurcación, respectivamente. Pero antes de copiar, el proceso padre gvalaumenta 11 1111 , aumentando el valor lvalde25 2525 , por lo que la replicación del proceso se realiza en este estado. Una vez completada la copia, los procesos padre e hijo se distinguen según el tipo de devolución de la función de bifurcación. El lvalproceso1 al valor de 11 , pero esto no afecta el lvalvalorDe manera similar, el gvalproceso1 al valor de 11 no afectará al proceso padregval. Porque después de llamar a la función de bifurcación, se divide en procesos completamente diferentes, pero los dos comparten el mismo código.

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int gval = 10;

int main(int argc, char *argv[])
{
    
    
	pid_t pid;
	int lval = 20;
	gval++;
	lval += 5;
	
	// 创建子进程。对于父进程来说,fork函数返回子进程ID;对于子进程来说,fork函数返回0。
	pid = fork();

	if (pid == 0)    // if Child Process
	{
    
    
		gval += 2;
		lval += 2;
	}
	else    // if Parent Process
	{
    
    
		gval -= 2;
		lval -= 2;
	}
	
	if (pid == 0)
		printf("Child Proc: [%d, %d]\n", gval, lval);
	else
		printf("Parent Proc: [%d, %d]\n", gval, lval);

	return 0;
}

Compilar y ejecutar:

gcc fork.c -o fork
./fork

Resultado de salida:

Parent Proc: [9, 23]
Child Proc: [13, 27]

Se puede ver a partir de los resultados de ejecución que después de llamar a la función de bifurcación, los procesos padre e hijo tienen estructuras de memoria completamente independientes.

Supongo que te gusta

Origin blog.csdn.net/qq_42815188/article/details/129376963
Recomendado
Clasificación