pthread_create pthread linux multithreading unix programming-languages fork

linux - pthread_create - pthread c



Bifurcación vs roscado (3)

He utilizado threading antes en mis aplicaciones y conozco bien sus conceptos, pero recientemente, en mi lección de sistema operativo, me encontré con fork (). Que es algo similar a enhebrar.

Investigué en google la diferencia entre ellos y llegué a saber que:

  1. Fork no es más que un nuevo proceso que se ve exactamente como el proceso antiguo o el proceso principal, pero aún así es un proceso diferente con ID de proceso diferente y con su propia memoria.
  2. Los hilos son procesos livianos que tienen menos sobrecarga

Pero, todavía hay algunas preguntas en mi mente.

  1. ¿Cuándo deberías preferir fork () sobre threading y viceversa?
  2. Si quiero llamar a una aplicación externa como un niño, ¿debería usar fork () o hilos para hacerlo?
  3. Al hacer una búsqueda en google, encontré personas que decían que era malo llamar a un fork () dentro de un hilo. ¿Por qué la gente quiere llamar a un tenedor () dentro de un hilo cuando hacen cosas similares?
  4. ¿Es cierto que fork () no puede aprovechar el sistema multiprocesador porque el proceso principal y el secundario no se ejecutan simultáneamente?

La principal diferencia entre los enfoques de bifurcación y de enhebrado es la arquitectura del sistema operativo. Ya en los días en que se diseñó Unix, el bifurcación era un sistema simple y sencillo que respondía mejor a los requisitos de mainframe y tipo de servidor, por lo que se popularizó en los sistemas Unix. Cuando Microsoft rediseñó el núcleo NT desde cero, se centró más en el modelo de subprocesamiento. Como tal, todavía hay una diferencia notable con los sistemas Unix que son eficientes con bifurcaciones y Windows más eficiente con los hilos. En particular, puede ver esto en Apache, que utiliza la estrategia prefork en Unix y la agrupación de subprocesos en Windows.

Específicamente a tus preguntas:

¿Cuándo deberías preferir fork () sobre threading y viceversa?

En un sistema Unix en el que se realiza una tarea mucho más compleja que solo crear instancias de un trabajador, o se desea el aislamiento de seguridad implícito de procesos separados.

Si quiero llamar a una aplicación externa como un niño, ¿debería usar fork () o hilos para hacerlo?

Si el niño hará una tarea idéntica a la del padre, con un código idéntico, use el tenedor. Para subtareas más pequeñas, use subprocesos. Para procesos externos independientes, no use ninguno, simplemente llámelos con las llamadas API apropiadas.

Al hacer una búsqueda en google, encontré personas que decían que era malo llamar a un fork () dentro de un hilo. ¿Por qué la gente quiere llamar a un tenedor () dentro de un hilo cuando hacen cosas similares?

No estoy del todo seguro, pero creo que es computacionalmente caro duplicar un proceso y muchos subprocesos.

¿Es cierto que fork () no puede aprovechar el sistema multiprocesador porque el proceso principal y el secundario no se ejecutan simultáneamente?

Esto es falso, fork crea un nuevo proceso que luego aprovecha todas las funciones disponibles para los procesos en el programador de tareas del sistema operativo.


Un proceso bifurcado se denomina proceso de gran peso, mientras que un proceso con rosca se denomina proceso de peso ligero.

La siguiente es la diferencia entre ellos:

  1. Un proceso bifurcado se considera un proceso secundario mientras que un proceso con subprocesamiento se denomina un hermano.
  2. El proceso bifurcado no comparte recursos como el código, los datos, la pila, etc., con el proceso principal, mientras que un proceso enhebrado puede compartir código pero tiene su propia pila.
  3. La conmutación de procesos requiere la ayuda de un sistema operativo, pero no es necesario el cambio de subprocesos
  4. La creación de múltiples procesos es una tarea de uso intensivo de recursos, mientras que la creación de múltiples hilos requiere menos recursos.
  5. Cada proceso puede ejecutarse independientemente, mientras que un hilo puede leer / escribir otros hilos de datos. Enhebrar y procesar la lecture

fork() genera una nueva copia del proceso, como ha notado. Lo que no se menciona arriba es la llamada de exec() que a menudo sigue. Esto reemplaza el proceso existente con un nuevo proceso (un nuevo ejecutable) y, como tal, fork() / exec() es el medio estándar para generar un nuevo proceso a partir de uno anterior.

por ejemplo, así es como su shell invocará un proceso desde la línea de comando. Usted especifica su proceso ( ls , por ejemplo) y las bifurcaciones de cubierta y luego ls ejecutivos.

Tenga en cuenta que esto opera a un nivel muy diferente del de enhebrado. Threading ejecuta varias líneas de ejecución dentro del proceso. La bifurcación es un medio para crear nuevos procesos.