- No, tu interpretación no es del todo correcta. Los subprocesos no preventivos (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 subproceso llamar a
yield()
(o lo que sea) para que eso suceda. - Apropiarse de subprocesos es más simple. Los subprocesos cooperativos tienen menos gastos generales.
- Normalmente se usa el preventivo. Si encuentra que su diseño tiene mucha sobrecarga de cambio de subprocesos, los subprocesos cooperativos serían una posible optimización. Sin embargo, en muchas (¿la mayoría?) situaciones, esta será una inversión bastante grande con una recompensa mínima.
- Sí, de forma predeterminada, obtendría subprocesos preventivos, aunque si busca el paquete CThreads, es compatible con subprocesos cooperativos. Pocas personas (ahora) quieren hilos cooperativos que, aunque no estoy seguro de que se hayan actualizado en la última década...
Los subprocesos no preventivos también se denominan subprocesos cooperativos. Un ejemplo de estos es POE (Perl). Otro ejemplo es el Mac OS clásico (antes de OS X). Los subprocesos cooperativos tienen uso exclusivo de la CPU hasta que la abandonan. Luego, el planificador elige otro subproceso para ejecutar.
Los subprocesos preventivos pueden renunciar voluntariamente a la CPU al igual que los cooperativos, pero cuando no lo hacen, se les quitará y el programador iniciará otro subproceso. Los subprocesos POSIX y SysV entran en esta categoría.
Las grandes ventajas de los subprocesos cooperativos son una mayor eficiencia (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 se requiere bloqueo.
Las grandes ventajas de los subprocesos preventivos son una mejor tolerancia a fallas:un solo subproceso que falla en el rendimiento no detiene la ejecución de todos los demás subprocesos. También normalmente funciona mejor en máquinas de varios núcleos, ya que se ejecutan varios subprocesos a la vez. Finalmente, no tienes que preocuparte por asegurarte de estar cediendo constantemente. Eso puede ser realmente molesto en el interior, por ejemplo, un ciclo de procesamiento de números pesados.
Puedes mezclarlos, por supuesto. Un solo subproceso preventivo puede tener muchos subprocesos cooperativos ejecutándose dentro de él.
Si usa no preventivo no significa que el proceso no realice el cambio de contexto cuando el proceso está esperando E/S. El despachador elegirá otro proceso de acuerdo al modelo de programación. Tenemos que confiar en el proceso.
no preventivo:
-
menos cambio de contexto, menos sobrecarga eso puede ser sensato en el modelo no preventivo
-
Más fácil de manejar ya que se puede manejar en un procesador de un solo núcleo
preventivo :
Ventaja:
-
En este modelo, tenemos una prioridad que nos ayuda a tener más control sobre el proceso en ejecución
-
Mejor concurrencia es un rebote
-
Manejo de llamadas al sistema sin bloquear todo el sistema
Desventaja:
-
Requiere algoritmos más complejos para la sincronización y el manejo de secciones críticas es inevitable.
-
Los gastos generales que conlleva