thread que cooperative multithreading process definition

cooperative - multithreading que es



¿Qué es un "hilo"(realmente)? (12)

He estado tratando de encontrar una buena definición y entender lo que realmente es un hilo .

Parece que me falta algo obvio, pero cada vez que leo sobre lo que es un hilo, es casi una definición circular, a la "un hilo es un hilo de ejecución" o "una forma de dividir en tareas en ejecución". Uh uh. ¿Huh?

Por lo que he leído, parece que un hilo no es realmente algo concreto, como lo es un proceso. De hecho, es solo un concepto. Por lo que entiendo de la forma en que esto funciona, un procesador ejecuta algunos comandos para un programa (que se ha denominado subproceso de ejecución ), luego cuando necesita pasar a procesar un poco para otro programa, almacena el estado de el programa que se está ejecutando actualmente en algún lugar (Thread Local Storage) y luego comienza a ejecutar las instrucciones del otro programa. Y de ida y vuelta. Tal que, un hilo es realmente solo un concepto para "uno de los caminos de ejecución" de un programa que se está ejecutando actualmente.

A diferencia de un proceso, que realmente es algo, es un conglomerado de recursos, etc.

Como un ejemplo de una definición que realmente no me ayudó mucho. . .

De la Wikipedia :

"Un hilo en la ciencia de la computación es corto para un hilo de ejecución. Los hilos son una forma para que un programa se divida (denominado" dividir ") en dos o más tareas simultáneas (o seudo-simultáneas). Los hilos y procesos difieren de uno sistema operativo a otro pero, en general, un subproceso está contenido dentro de un proceso y diferentes subprocesos en el mismo proceso comparten los mismos recursos, mientras que los procesos diferentes en el mismo sistema operativo multitarea no lo hacen ".

Entonces estoy en lo cierto? ¿Incorrecto? ¿Qué es un hilo realmente?

Editar: Aparentemente, a un hilo también se le asigna su propia pila de llamadas, por lo que es algo concreto.


Esto fue tomado de una respuesta de Yahoo:

Un hilo es una construcción de codificación no efectiva por la arquitectura de una aplicación. Un solo proceso frecuentemente puede contener múltiples hilos. Los subprocesos también pueden comunicarse directamente entre ellos ya que comparten las mismas variables.

Los procesos son unidades de ejecución independientes con su propia información de estado. También usan sus propios espacios de direcciones y solo pueden interactuar con otros procesos a través de mecanismos de comunicación entre procesos.

Sin embargo, para poner en términos más simples, los hilos son como diferentes "tareas". Entonces piense en cuándo está haciendo algo, por ejemplo, está escribiendo una fórmula en un papel. Eso se puede considerar un hilo. Luego, otro hilo está escribiendo algo más en otra hoja de papel. Ahí es donde entra la multitarea.

Se dice que los procesadores Intel tienen "hyper-threading" (AMD también lo tiene) y se supone que pueden realizar múltiples "hilos" o realizar múltiples tareas mucho mejor.

No estoy seguro de la logística de cómo se maneja un hilo. Recuerdo haber escuchado sobre el procesador yendo y viniendo entre ellos, pero no estoy 100% seguro de esto y espero que alguien más pueda responder eso.


La respuesta varía enormemente entre diferentes sistemas y diferentes implementaciones, pero las partes más importantes son:

  1. Un hilo tiene un hilo de ejecución independiente (es decir, puede cambiar de contexto fuera de él y luego volver, y continuará ejecutándose donde estaba).
  2. Un hilo tiene una vida útil (puede ser creado por otro hilo y otro hilo puede esperar a que termine).
  3. Probablemente tiene menos equipaje adjunto que un "proceso".

Más allá de eso: los hilos podrían ser implementados en un único proceso por un lenguaje de tiempo de ejecución, los hilos podrían ser corutinas, los hilos podrían ser implementados en un único proceso por una biblioteca de hilos, o los hilos podrían ser una construcción de núcleo.

En varios sistemas Unix modernos, incluido Linux, con el que estoy más familiarizado, todo es subprocesos: un proceso es simplemente un tipo de subproceso que comparte relativamente pocas cosas con su progenitor (es decir, obtiene sus propias asignaciones de memoria, su propia tabla de archivos). y permisos, etc.) Leer man 2 clone , especialmente la lista de banderas, es realmente instructivo aquí.



Los procesos son como dos personas que usan dos computadoras diferentes, que usan la red para compartir datos cuando es necesario. Los hilos son como dos personas que usan la misma computadora, que no tienen que compartir datos explícitamente, pero deben turnarse cuidadosamente.

Conceptualmente, los hilos son solo varias abejas obreras zumbando en el mismo espacio de direcciones. Cada hilo tiene su propia pila, su propio contador de programa, etc., pero todos los hilos en un proceso comparten la misma memoria. Imagine dos programas que se ejecutan al mismo tiempo, pero ambos pueden acceder a los mismos objetos.

Contraste esto con los procesos. Los procesos tienen cada uno su propio espacio de direcciones, lo que significa que un puntero en un proceso no puede usarse para referirse a un objeto en otro (a menos que use memoria compartida).

Creo que las cosas clave para entender son:

  • Ambos procesos y subprocesos pueden "ejecutarse al mismo tiempo".
  • Los procesos no comparten memoria (de forma predeterminada), pero los subprocesos comparten toda su memoria con otros subprocesos en el mismo proceso.
  • Cada hilo en un proceso tiene su propia pila y su propio puntero de instrucción.

No estoy muy contento con ninguna de esas respuestas, así que voy a agregar la mía aquí :) Un hilo es una abstracción del kernel para programar el trabajo en el procesador, un hilo es lo que el núcleo le da para administrar el tiempo del procesador y compartir trabajo con otros


Para definir un hilo formalmente, primero debemos entender los límites de dónde opera un hilo.

Un programa de computadora se convierte en un proceso cuando se carga desde alguna tienda en la memoria de la computadora y comienza la ejecución. Un proceso o un conjunto de procesadores puede ejecutar un proceso. Una descripción del proceso en la memoria contiene información vital como el contador del programa que realiza un seguimiento de la posición actual en el programa (es decir, qué instrucción se está ejecutando actualmente), registros, almacenamientos de variables, manejadores de archivos, señales, etc.

Un hilo es una secuencia de tales instrucciones dentro de un programa que se puede ejecutar independientemente de otro código. La figura muestra el concepto:

Los subprocesos se encuentran dentro del mismo espacio de direcciones de proceso , por lo tanto, gran parte de la información presente en la descripción de la memoria del proceso se puede compartir entre subprocesos.

Parte de la información no se puede replicar, como la pila (puntero de pila en un área de memoria diferente por subproceso), registros y datos específicos de subprocesos. Esta información es suficiente para permitir que los hilos se programen independientemente del hilo principal del programa y posiblemente uno o más hilos dentro del programa.

Se requiere soporte explícito del sistema operativo para ejecutar programas multiproceso. Afortunadamente, la mayoría de los sistemas operativos modernos admiten subprocesos como Linux (a través de NPTL), variantes de BSD, Mac OS X, Windows, Solaris, AIX, HP-UX, etc. Los sistemas operativos pueden usar diferentes mecanismos para implementar el soporte de subprocesos múltiples.

Here puedes encontrar más información sobre el tema. Esa fue también mi fuente de información.


Permítanme explicar la diferencia entre el proceso y los hilos primero.

Un proceso puede tener {1..N} cantidad de hilos. Una pequeña explicación sobre la memoria virtual y el procesador virtual.

Memoria virtual

Se usa como un espacio de intercambio para que un proceso crea que está sentado en la memoria primaria para su ejecución.

Procesador virtual

El mismo concepto que la memoria virtual, excepto que se trata de un procesador. Para un proceso, verá que es lo único que está usando el procesador.

OS se encargará de asignar la memoria virtual y el procesador virtual a un proceso y realizar el intercambio entre los procesos y la ejecución.

Todos los hilos dentro de un proceso compartirán la misma memoria virtual. Sin embargo, cada subproceso tendrá asignado su procesador virtual individual para que puedan ejecutarse individualmente.

De este modo, se guarda la memoria y se utiliza la CPU a su potencial.


Si quieres una respuesta en inglés, aquí está lo que mi profesor me dijo cuando le pregunté:

"¿Sabes cómo cuando ejecutas un programa Java, ejecuta el programa desde arriba hacia abajo? Bueno, un hilo es básicamente una forma de evitarlo. Como abrir dos cuadros de texto a la vez o tener un temporizador funcionando al mismo tiempo. como un montón de otras cosas ".

Juro que es casi exactamente lo que dijo.


Un hilo es un conjunto independiente de valores para los registros del procesador (para un solo núcleo). Como esto incluye el Puntero de Instrucción (también conocido como Contador de Programa), controla qué se ejecuta en qué orden. También incluye el Stack Pointer, que mejor apunta a un área de memoria única para cada hilo o interferirán entre sí.

Los subprocesos son la unidad de software afectada por el flujo de control (llamada de función, bucle, goto), porque esas instrucciones operan en el puntero de instrucción, y eso pertenece a un hilo en particular. Los subprocesos a menudo se programan de acuerdo con algún esquema de priorización (aunque es posible diseñar un sistema con un subproceso por núcleo de procesador, en cuyo caso cada subproceso siempre se está ejecutando y no se necesita programación).

De hecho, el valor del puntero de instrucción y la instrucción almacenada en esa ubicación es suficiente para determinar un nuevo valor para el puntero de instrucción. Para la mayoría de las instrucciones, esto simplemente avanza la IP según el tamaño de la instrucción, pero las instrucciones de flujo de control cambian la IP de otras maneras predecibles. La secuencia de valores que toma el IP forma una ruta de ejecución que se extiende a través del código del programa, dando lugar al nombre "hilo".


Un hilo es un contexto de ejecución, que es toda la información que necesita una CPU para ejecutar una secuencia de instrucciones.

Supongamos que estás leyendo un libro y quieres tomar un descanso en este momento, pero quieres poder regresar y reanudar la lectura desde el punto exacto en el que te detuviste. Una forma de lograrlo es anotando el número de página, el número de línea y el número de palabra. Entonces, su contexto de ejecución para leer un libro son estos 3 números.

Si tienes un compañero de cuarto y usa la misma técnica, puede tomar el libro mientras no lo estés usando y reanudar la lectura desde donde se detuvo. Luego puedes recuperarlo y reanudarlo desde donde estabas.

Los hilos funcionan de la misma manera. Una CPU te da la ilusión de que está haciendo múltiples cálculos al mismo tiempo. Lo hace pasando un poco de tiempo en cada cómputo. Puede hacerlo porque tiene un contexto de ejecución para cada cálculo. Al igual que puede compartir un libro con su amigo, muchas tareas pueden compartir una CPU.

En un nivel más técnico, un contexto de ejecución (por lo tanto un hilo) consiste en los valores de los registros de la CPU.

Último: los hilos son diferentes de los procesos. Un hilo es un contexto de ejecución, mientras que un proceso es un conjunto de recursos asociados con un cálculo. Un proceso puede tener uno o muchos hilos.

Aclaración: los recursos asociados con un proceso incluyen páginas de memoria (todos los hilos en un proceso tienen la misma vista de la memoria), descriptores de archivos (por ejemplo, sockets abiertos) y credenciales de seguridad (por ejemplo, el ID del usuario que inició el proceso).


Un hilo no es más que un contexto de memoria (o cómo Tanenbaum lo pone mejor, agrupación de recursos) con reglas de ejecución. Es una construcción de software. La CPU no tiene idea de qué es un hilo (algunas excepciones aquí, algunos procesadores tienen hilos de hardware), simplemente ejecuta instrucciones.

El kernel introduce el concepto de subprocesos y procesos para administrar el orden de las memorias y las instrucciones de una manera significativa.


Voy a utilizar mucho texto del libro Conceptos de sistemas operativos de ABRAHAM SILBERSCHATZ, PETER BAER GALVIN y GREG GAGNE junto con mi propia comprensión de las cosas.

Proceso

Cualquier aplicación reside en la computadora en forma de texto (o código).

Hacemos hincapié en que un programa en sí mismo no es un proceso. Un programa es una entidad pasiva, como un archivo que contiene una lista de instrucciones almacenadas en el disco (a menudo llamado archivo ejecutable).

Cuando iniciamos una aplicación, creamos una instancia de ejecución. Esta instancia de ejecución se llama proceso. EDITAR: (Según mi interpretación, análoga a una clase y una instancia de una clase, la instancia de una clase es un proceso).

Un ejemplo de procesos es el de Google Chrome. Cuando comenzamos Google Chrome, se generan 3 procesos:

• El proceso del navegador es responsable de administrar la interfaz del usuario, así como la E / S del disco y la red. Se crea un nuevo proceso de navegador cuando se inicia Chrome. Solo se crea un proceso de navegador.

• Procesos de renderizado contienen lógica para renderizar páginas web. Por lo tanto, contienen la lógica para manejar HTML, Javascript, imágenes, etc. Como regla general, se crea un nuevo proceso de representación para cada sitio web abierto en una nueva pestaña, por lo que varios procesos de representación pueden estar activos al mismo tiempo.

• Se crea un proceso de plug-in para cada tipo de complemento (como Flash o QuickTime) en uso. Los procesos de complemento contienen el código del complemento, así como un código adicional que permite que el complemento se comunique con los procesos de representación asociados y el proceso del navegador.

Hilo

Para responder a esto, creo que primero debes saber qué es un procesador. Un procesador es la pieza de hardware que realmente realiza los cálculos. EDITAR: (Computaciones como sumar dos números, ordenar una matriz, básicamente, ejecutar el código que se ha escrito)

Ahora pasar a la definición de un hilo.

Un hilo es una unidad básica de utilización de CPU ; comprende una identificación de hilo, un contador de programa, un conjunto de registro y una pila.

EDITAR: Definición de un hilo del sitio web de Intel:

Un subproceso, o subproceso de ejecución, es un término de software para la secuencia ordenada básica de instrucciones que puede pasarse o procesarse por un único núcleo de CPU.

Por lo tanto, si el proceso Renderer de la aplicación Chrome ordena una matriz de números, la clasificación se realizará en un subproceso / subproceso de ejecución. (La gramática con respecto a los hilos me parece confusa)

Mi interpretación de las cosas

Un proceso es una instancia de ejecución. Los hilos son los trabajadores reales que realizan los cálculos a través del acceso a la CPU. Cuando hay varios subprocesos ejecutándose para un proceso, el proceso proporciona memoria común.

EDITAR: Otra información que encontré útil para dar más contexto

Todas las computadoras modernas tienen más de un hilo. La cantidad de hilos en una computadora depende de la cantidad de núcleos en una computadora.

Computación concurrente :

De la Wikipedia:

La computación simultánea es una forma de computación en la que se ejecutan varios cálculos durante períodos de tiempo superpuestos (concurrentemente) en lugar de ejecutarse secuencialmente (uno que se completa antes de los siguientes comienzos). Esta es una propiedad de un sistema, puede ser un programa individual, una computadora o una red, y existe un punto de ejecución por separado o "hilo de control" para cada cálculo ("proceso").

Entonces, podría escribir un programa que calcula la suma de 4 números:

(1 + 3) + (4 + 5)

En el programa para calcular esta suma (que será un proceso que se ejecuta en un hilo de ejecución) puedo bifurcar otro proceso que puede ejecutarse en un hilo diferente para calcular (4 + 5) y devolver el resultado al proceso original, mientras que el el proceso original calcula la suma de (1 + 3).