Proceso C ++, hilo

Enlace del gran Dios
https://www.cnblogs.com/eilearn/p/9414569.html
https://blog.csdn.net/zhouchunyue/article/details/79271869

proceso

Definición limitada : Un proceso es el proceso de ejecución de un programa.

Definición amplia : un proceso es una actividad en ejecución de un determinado conjunto de datos de un programa con una determinada función independiente. Es la unidad básica de ejecución dinámica del sistema operativo En el sistema operativo tradicional, el proceso es tanto la unidad básica de asignación como la unidad básica de ejecución.

Simplemente hablando, el concepto de proceso tiene dos puntos principales:

  • Primero, el proceso es una entidad. Cada proceso tiene su propio espacio de direcciones, en general, incluida la región de texto (región de texto), la región de datos (región de datos) y la pila (región de pila). El área de texto almacena el código ejecutado por el procesador; el área de datos almacena variables y la memoria asignada dinámicamente utilizada durante la ejecución del proceso; el área de pila almacena instrucciones y variables locales para llamadas a procedimientos activos.
  • En segundo lugar, el proceso es un "programa en curso". Un programa es una entidad inanimada, sólo cuando el procesador da vida al programa puede convertirse en una entidad activa, lo llamamos proceso.

Estado del proceso : listo, en ejecución y bloqueado. El estado listo en realidad significa que se han adquirido todos los recursos fuera de la CPU y se puede ejecutar de inmediato siempre que el procesador asigne recursos. Hay secuencias de cola en estado listo y el principio de cola no se repetirá. El estado de ejecución es obtener los recursos asignados por el procesador y el programa comienza a ejecutarse. Estado de bloqueo, cuando las condiciones del programa no son suficientes, debe esperar a que se cumplan las condiciones antes de la ejecución, como esperar la operación de E / S, el estado en este momento se llama estado de bloqueo.

programa

Hablando de procesos, hay que hablar de procedimientos.
Primero observe la definición: un programa es una colección ordenada de instrucciones y datos, que no tiene un significado operativo en sí mismo, y es un concepto estático. El proceso es un proceso de ejecución en el procesador y es un concepto dinámico. Esto no es difícil de entender, de hecho, el proceso contiene el programa y la ejecución del proceso no se puede separar del programa, el área de texto en el proceso es el área de código, es decir, el programa.

Hilo

Por lo general, un proceso puede contener varios subprocesos, por supuesto, hay al menos un subproceso en un proceso, de lo contrario, no tiene significado.
Los subprocesos pueden utilizar los recursos que son propiedad del proceso. En los sistemas operativos que introducen subprocesos, el proceso se utiliza generalmente como la unidad básica para asignar recursos, y el subproceso se utiliza como la unidad básica para la operación independiente y la programación independiente. Debido a que el subproceso es Más pequeño que el proceso, el básico Dado que no cuenta con recursos del sistema, el costo de programarlo será mucho menor, lo que puede mejorar de manera más eficiente el grado de ejecución concurrente de múltiples programas en el sistema.

Multihilo

En un programa, estos fragmentos de programa que se ejecutan de forma independiente se denominan "subprocesos", y el concepto de programación con ellos se denomina "subprocesos múltiples". Multi-threading es completar múltiples tareas simultáneamente, no para mejorar la eficiencia operativa, sino para mejorar la eficiencia del uso de recursos para mejorar la eficiencia del sistema. Los subprocesos se implementan cuando es necesario completar varias tareas al mismo tiempo.

La analogía más simple de multiproceso es como cada vagón de un tren, y el proceso es un tren. Un vagón no puede huir del tren y, de la misma manera, un tren no puede tener un solo vagón. La aparición de subprocesos múltiples tiene como objetivo mejorar la eficiencia.

La diferencia entre proceso e hilo

La principal diferencia entre procesos y subprocesos es que son diferentes métodos de gestión de recursos del sistema operativo.
Un proceso tiene un espacio de direcciones independiente. Después de que un proceso falla, no afectará a otros procesos en el modo protegido, y un hilo es simplemente una ruta de ejecución diferente en un proceso.
Los subprocesos tienen sus propias pilas y variables locales, pero no hay un espacio de direcciones separado entre subprocesos. La muerte de un subproceso significa la muerte de todo el proceso. Por lo tanto, un programa multiproceso es más robusto que un programa multiproceso, pero Cuesta más al cambiar de proceso, los recursos son mayores y la eficiencia es peor. Pero para algunas operaciones concurrentes que requieren ejecución simultánea y comparten ciertas variables, solo se pueden usar subprocesos, no procesos.

  1. En resumen, un programa tiene al menos un proceso y un proceso tiene al menos un hilo.
  2. La escala de división de los subprocesos es más pequeña que la de los procesos, lo que hace que los programas multiproceso tengan una alta concurrencia.
  3. Además, el proceso tiene una unidad de memoria independiente durante la ejecución y varios subprocesos comparten memoria, lo que mejora en gran medida la eficiencia del programa.
  4. Los subprocesos siguen siendo diferentes de los procesos en el proceso de ejecución. Cada subproceso independiente tiene una entrada de programa, una secuencia de ejecución secuencial y una salida de programa. Sin embargo, los subprocesos no se pueden ejecutar de forma independiente y deben almacenarse en el programa de aplicación, y el programa de aplicación proporciona control de ejecución de múltiples subprocesos.
  5. Desde un punto de vista lógico, el significado de multiproceso es que en una aplicación, se pueden ejecutar múltiples partes de ejecución al mismo tiempo. Sin embargo, el sistema operativo no considera múltiples subprocesos como múltiples aplicaciones independientes para implementar la programación y administración de procesos y la asignación de recursos. Ésta es una diferencia importante entre procesos e hilos.

Selección de proceso e hilo

Por lo general, usamos más subprocesos cuando escribimos código, como los que deben crearse y destruirse con frecuencia, necesitan procesar una gran cantidad de cálculos y datos, y tenemos una buena interfaz de visualización y una respuesta oportuna a los mensajes. Se prefiere el subproceso múltiple debido a estas operaciones Consumirán una gran cantidad de CPU, procesamiento de algoritmos comunes y procesamiento de imágenes. También hay algunas operaciones que permiten la simultaneidad y pueden bloquear, y también se recomienda el multihilo. Por ejemplo, SOCKET, operaciones de disco, etc.
El proceso es generalmente más estable y está aislado de memoria. La excepción de un solo proceso no hará que toda la aplicación se bloquee, lo cual es conveniente para la depuración. Como muchos servidores, el modo de proceso se usa por defecto.

Comunicación entre hilos

Uno es usar variables globales para la comunicación y el otro es usar un mecanismo de mensaje personalizado para transferir información.
De hecho, debido a que cada hilo comparte los recursos del proceso, no tiene un método de comunicación para el intercambio de datos como en la comunicación del proceso. El propósito principal de la comunicación es la sincronización del hilo, por lo que es como algunos mutex y secciones críticas. Ah CEvent El objeto de evento y el objeto de semáforo pueden realizar la comunicación y sincronización de subprocesos.

Comunicación entre procesos

Los métodos de comunicación entre procesos incluyen tuberías PIPE, semáforos, colas de mensajes, memoria compartida y comunicación a través de sockets. Según la cantidad de información, se puede dividir en comunicación de bajo nivel y comunicación de alto nivel, en términos de elección, si el usuario transmite menos información. O es necesario desencadenar ciertos comportamientos a través de señales, que generalmente pueden resolverse mediante el mecanismo de señales. Si la cantidad de información requerida para ser transmitida entre procesos es relativamente grande o existe la necesidad de intercambiar datos, entonces los métodos de comunicación como los compartidos Se deben utilizar memoria y sockets.

Explicación del término :

  • Una tubería es en realidad un archivo especial que existe en la memoria. No pertenece al sistema de archivos y tiene su propia estructura de datos. Según el alcance de uso, se puede dividir en tuberías sin nombre y tuberías con nombre.
  • La memoria compartida se realiza adjuntando directamente el búfer de memoria compartida al espacio de direcciones virtuales del proceso. Utiliza el búfer de memoria para intercambiar información directamente sin copiar. Es rápido y tiene una gran cantidad de información.
  • El almacenamiento en búfer de la cola de mensajes es una función llamada por el sistema para realizar la sincronización entre el envío y la recepción de mensajes y permite que cualquier proceso realice una comunicación entre procesos compartiendo la cola de mensajes. Sin embargo, la copia de información requiere mucha CPU, por lo que no es adecuada para ocasiones con gran cantidad de información o operaciones frecuentes.

Sincronización de subprocesos y asincronía de subprocesos

La sincronización significa que un subproceso espera a que otro subproceso termine de ejecutarse antes de comenzar a ejecutar el subproceso actual.
Asincrónico significa que un hilo se ejecuta y el siguiente hilo no tiene que esperar a que termine de ejecutarse antes de iniciar la ejecución.

Por lo general, la relación entre varios subprocesos no relacionados iniciados por un proceso es asincrónica. Por ejemplo, el juego tiene imágenes y música de fondo. El reproductor opera la imagen y el sistema reproduce la música de fondo en un bucle. No hay nada entre Los dos subprocesos. Cada uno tiene su propia relación, y esto es asincronía de subprocesos. En cuanto a la sincronización, se refiere a varios subprocesos que operan un dato al mismo tiempo. En este momento, debe agregar protección a los datos. Esta protección es la sincronización de subprocesos.
Escenarios de uso de sincronización : cuando varios subprocesos acceden a un fragmento de datos al mismo tiempo, se debe utilizar la sincronización, de lo contrario puede ocurrir situaciones de inseguridad, hay una situación que no requiere tecnología de sincronización, es decir, operaciones atómicas, es decir, el sistema operativo garantiza en la parte inferior que las operaciones son ya sea todo hecho o no hecho.
Escenario de uso asincrónico : cuando solo un hilo accede a los datos actuales. Por ejemplo, el modo de observador no tiene un área compartida. Después de que el tema cambia, se notifica al observador que se actualice y el tema continúa haciendo lo suyo, sin esperar a que el observador se actualice antes de trabajar.

Hay varias formas de lograr la sincronización de múltiples subprocesos y la exclusión mutua

Si los hilos están sincronizados, hay secciones críticas, mutex, semáforos y eventos.

La sección crítica es adecuada para su uso cuando varios subprocesos de un proceso acceden a áreas comunes o segmentos de código.

Se puede nombrar Mutex, lo que significa que se puede usar cuando varios subprocesos en diferentes procesos acceden a recursos comunes. Por lo tanto, si se usa dentro del proceso en términos de selección, usar una sección crítica traerá ventajas de velocidad y reducirá el uso de recursos.

El semáforo es diferente de la sección crítica y el mutex. Permite que varios subprocesos accedan a recursos comunes al mismo tiempo. Es equivalente a la operación PV del sistema operativo. Establece un número máximo de subprocesos por adelantado. Si el número de subprocesos alcanza el máximo, entonces Otros subprocesos ya no pueden entrar. Si algunos subprocesos liberan recursos, entonces otros subprocesos pueden entrar y acceder a los recursos.

El evento es mantener los hilos sincronizados mediante operaciones de notificación.

Nota: Mutex, evento y semáforo son todos objetos del kernel y se pueden usar en todos los procesos.

Punto muerto

Concepto: Bloqueo permanente provocado por la comunicación entre procesos o la competencia por los recursos del sistema, si no hay fuerza externa, siempre estará en un estado de punto muerto.

causa:

  1. Recursos del sistema insuficientes;
  2. Los diferentes procesos y velocidades también pueden conducir a puntos muertos;
  3. Mala asignación de recursos;

Cuatro condiciones necesarias para el interbloqueo:

  1. Condiciones mutuamente excluyentes: es decir, un recurso solo puede ser utilizado por un proceso a la vez.
  2. Condiciones de solicitud y retención: cuando un proceso se bloquea al solicitar otros recursos, sigue reteniendo los recursos que ya obtuvo.
  3. Condiciones de no privación: Los recursos que ha adquirido el proceso no pueden ser privados por la fuerza antes de que se agoten.
  4. Condición de espera circular: se forma una especie de relación de recurso de espera circular entre varios procesos.

Métodos para prevenir y evitar interbloqueos: en el diseño del sistema y la programación de procesos, prestar atención a las cuatro condiciones necesarias para no permitir que se establezcan interbloqueos, determinar un algoritmo de asignación razonable de recursos, evitar procesos que ocupen recursos del sistema para siempre y asignar recursos de manera razonable Planificación.

Supongo que te gusta

Origin blog.csdn.net/qq_24649627/article/details/112237395
Recomendado
Clasificación