2010-11-10 24 views
31

¿Puede alguien explicar la diferencia entre el modelo de roscado preventivo y el modelo de roscado no preventivo?Hilos preventivos Vs Hilos no preceptivos

Según mi entendimiento:

  • modelo de subprocesos no preventiva: Una vez que se inicia un hilo que no se puede detener o el control no puede ser transferido a otros hilos hasta que el mensaje ha completado su tarea.
  • Preemptive Threading Modelo: El tiempo de ejecución permite intervenir y controlar manualmente de un hilo a otro en cualquier momento. Los subprocesos de prioridad más alta tienen precedencia sobre los subprocesos de prioridad más baja.

Puede alguien por favor:

  1. Explicar si el entendimiento es correcto.
  2. Explique las ventajas y desventajas de ambos modelos.
  3. Un ejemplo de cuándo usar lo que será realmente útil.
  4. Si creo un hilo en Linux (sistema v o Pthread) sin mencionar ninguna opción (¿hay alguna?) De forma predeterminada, el modelo de subprocesamiento utilizado es el modelo de subprocesamiento preventivo?

Respuesta

27
  1. No, su comprensión no es del todo correcta. Los subprocesos no preferenciales (también conocidos como cooperativos) suelen ceder manualmente el control para permitir que otros subprocesos se ejecuten antes de que finalicen (aunque depende de ese hilo llamar al yield() (o lo que sea) para que eso suceda.
  2. El hilo de prioridad es más simple. tiene menos sobrecarga
  3. Normalmente, use preventivo. Si encuentra que su diseño tiene una gran cantidad de sobrecarga de cambio de hilo, los hilos cooperativos serían una optimización posible. En muchos (¿la mayoría?) situaciones, esta será una inversión bastante grande con una rentabilidad mínima.
  4. Sí, de manera predeterminada obtendría subprocesamiento, aunque si busca el paquete CThreads, admite el enhebrado cooperativo. Pocas personas suficientes (ahora) quieren hilos cooperativos que no estoy seguro de que ha sido actualizado en la última década, aunque ...
+2

Solo una nota sobre yield(): no la use en Linux porque tiene un rendimiento horrible. Un hilo entregado se coloca en la parte posterior del programa del hilo, por lo que el hilo no se programará hasta que * todo lo demás en el sistema completo haya tenido su oportunidad. –

+0

En mi comprensión, cuando el proceso principal crea dos hilos, se ejecutarán en paralelo. Entonces, ¿el modelo de subprocesamiento no prioritario hace que la ejecución sea similar a (final_hilo_1) -> (tema_almacenamiento_2) -> principal()? Es decir, después de que el hilo 1 finalizó por completo, el hilo 2 comenzará y luego de que se complete, el método main() llamará. ¿Es esto correcto? Si es así, ¿cuál es el uso de "hilos no preventivos"? – rakeshNS

+0

@rakeshNS: los subprocesos no preventivos (cooperativos) significan que un subproceso se ejecuta hasta que llama a alguna función que fuerza/permite un cambio a otro subproceso. En algunos casos, esa es una función explícita de 'rendimiento'. En otros, permitir que otros hilos se ejecuten está implícito en alguna otra función.Por ejemplo, en Windows de 16 bits, cuando llamabas a 'GetMessage', podían ejecutarse otros procesos/hilos (se consideraban procesos, pero todos compartían un espacio de direcciones ...) –

13

Los subprocesos no preventivos también se denominan subprocesos cooperativos. Un ejemplo de estos es POE (Perl). Otro ejemplo es el clásico Mac OS (antes de OS X). Los hilos cooperativos tienen uso exclusivo de la CPU hasta que lo abandonen. El planificador luego selecciona otro hilo para ejecutar.

Los subprocesos anticipados pueden renunciar voluntariamente a la CPU al igual que los cooperativos, pero cuando no lo hagan, se los quitará de ellos, y el planificador iniciará otra secuencia. POSIX & SysV hilos entran en esta categoría.

Las grandes ventajas de los hilos cooperativos son una mayor eficacia (en máquinas de un solo núcleo, al menos) y un manejo más fácil de la concurrencia: solo existe cuando cede el control, por lo que no es necesario bloquearlo.

Las grandes ventajas de los hilos preventivos son una mejor tolerancia a errores: un solo hilo que no ceda no detiene la ejecución de todos los demás hilos. También normalmente funciona mejor en máquinas multi-core, ya que varios hilos se ejecutan a la vez. Finalmente, no tienes que preocuparte por asegurarte de estar cediendo constantemente. Eso puede ser realmente molesto por dentro, por ejemplo, un gran bucle de crujido de números.

Puede mezclarlos, por supuesto. Un único hilo preventivo puede tener muchos hilos cooperativos ejecutándose dentro de él.

+0

Win16 también fue un enredo cooperativo. –

+1

@johnc He retrocedido su edición. "Existe" está destinado allí: la concurrencia (múltiples hilos que se ejecutan a la vez) existe solo cuando permite explícitamente que otro hilo se ejecute mediante yielding. "Salidas" no tiene sentido. Tampoco estoy seguro de por qué cambió * no es * a * no es * ... – derobert

+1

@derobet Eso está bien. Fue una edición sugerida que parecía tener sentido en ese momento, aunque debido a un error tipográfico en la sugerencia, la reedité. En ese momento, asocié la palabra "rendimiento" con la palabra "salir" en lugar de "existir". Para ser honesto, fue el error tipográfico; 'no es -> is'n not' (o similar) que me hizo aceptar y editar la sugerencia. Me disculpo porque mi obsesión por la ortografía correcta me llevó a estropear su respuesta – johnc

5

Si utiliza no preferente esto no significa que el proceso no hace el contexto cambia cuando el proceso está esperando E/S. El despachador elegirá otro proceso de acuerdo con el modelo de programación. En este modelo, debemos confiar en el proceso.

no preferente:

cambio de contexto 1.Less = menos sobre la cabeza que puede ser sensible en modelo no preferente

2.It más fácil de manejar, ya que puede ser manejado en procesador de un solo núcleo

preventivo:

Ventaja:

1.In este modelo tenemos la prioridad que nos puede ayudar a tener más control sobre el proceso de ejecución

2. Podemos ver el mejor concurrencia

3.we puede manejar un sistema de llaman sin bloquear todo el sistema

Desventaja:

1.We necesita complejo algoritmo para el bloqueo y tenemos un problema crítico que la sección debe ser manejado

2.Often una gran sobrecarga que debemos pagar