¿Qué recursos se comparten entre hilos?
Recientemente, en una entrevista me hicieron una pregunta sobre cuál es la diferencia entre un proceso y un hilo. Realmente no sabía la respuesta. Pensé por un minuto y di una respuesta muy extraña.
Los hilos comparten la misma memoria, los procesos no. Después de responder esto, el entrevistador me dio una sonrisa malvada y me lanzó las siguientes preguntas:
P. ¿ Conoce los segmentos en los que se divide un programa?
Mi respuesta: sí (pensé que era fácil) Pila, Datos, Código, Montón
P. Entonces, dígame: ¿qué segmentos comparten los hilos?
No pude responder a esto y terminé diciendo todas.
Por favor, ¿alguien puede presentar las respuestas correctas e impresionantes a la diferencia entre un proceso y un hilo?
Tienes bastante razón, pero los subprocesos comparten todos los segmentos excepto la pila. Los subprocesos tienen pilas de llamadas independientes, sin embargo, la memoria en otras pilas de subprocesos aún es accesible y, en teoría, podría mantener un puntero a la memoria en el marco de la pila local de algún otro subproceso (aunque probablemente debería encontrar un lugar mejor para colocar esa memoria).
Algo que realmente es necesario señalar es que en realidad hay dos aspectos de esta pregunta: el aspecto teórico y el aspecto de implementación.
Primero, veamos el aspecto teórico. Es necesario comprender qué es conceptualmente un proceso para comprender la diferencia entre un proceso y un hilo y lo que comparten entre ellos.
Tenemos lo siguiente de la sección 2.2.2 El modelo de subprocesos clásico en sistemas operativos modernos 3e de Tanenbaum:
El modelo de proceso se basa en dos conceptos independientes: agrupación de recursos y ejecución. A veces resulta útil separarlos; aquí es donde entran los hilos....
Él continúa:
Una forma de ver un proceso es que es una forma de agrupar recursos relacionados. Un proceso tiene un espacio de direcciones que contiene texto y datos del programa, así como otros recursos. Estos recursos pueden incluir archivos abiertos, procesos secundarios, alarmas pendientes, manejadores de señales, información contable y más. Al reunirlos en forma de proceso, se pueden gestionar más fácilmente. El otro concepto que tiene un proceso es un hilo de ejecución, generalmente abreviado como simplemente hilo. El hilo tiene un contador de programa que realiza un seguimiento de qué instrucción ejecutar a continuación. Tiene registros que contienen sus variables de trabajo actuales. Tiene una pila, que contiene el historial de ejecución, con un marco para cada procedimiento llamado pero del que aún no se ha devuelto. Aunque un hilo debe ejecutarse en algún proceso, el hilo y su proceso son conceptos diferentes y pueden tratarse por separado. Los procesos se utilizan para agrupar recursos; Los subprocesos son las entidades programadas para su ejecución en la CPU.
Más abajo proporciona la siguiente tabla:
Per process items | Per thread items
------------------------------|-----------------
Address space | Program counter
Global variables | Registers
Open files | Stack
Child processes | State
Pending alarms |
Signals and signal handlers |
Accounting information |
Lo anterior es lo que necesita para que los subprocesos funcionen. Como otros han señalado, cosas como los segmentos son detalles de implementación que dependen del sistema operativo.
De Wikipedia (creo que sería una muy buena respuesta para el entrevistador: P)
Los subprocesos se diferencian de los procesos tradicionales del sistema operativo multitarea en que:
- Los procesos suelen ser independientes, mientras que los subprocesos existen como subconjuntos de un proceso.
- Los procesos transportan información de estado considerable, mientras que múltiples subprocesos dentro de un proceso comparten el estado, así como la memoria y otros recursos.
- Los procesos tienen espacios de direcciones separados, mientras que los hilos comparten su espacio de direcciones.
- Los procesos interactúan sólo a través de mecanismos de comunicación entre procesos proporcionados por el sistema.
- El cambio de contexto entre subprocesos en el mismo proceso suele ser más rápido que el cambio de contexto entre procesos.
Dígale al entrevistador que depende completamente de la implementación del sistema operativo.
Tomemos como ejemplo Windows x86. Solo hay 2 segmentos [1], Código y Datos. Y ambos están asignados a todo el espacio de direcciones de 2 GB (lineal, de usuario). Base=0, Límite=2GB. Habrían creado uno, pero x86 no permite que un segmento sea tanto de lectura/escritura como de ejecución. Entonces hicieron dos y configuraron CS para que apunte al descriptor de código y el resto (DS, ES, SS, etc.) para que apunte al otro [2]. ¡Pero ambos apuntan a lo mismo!
La persona que lo entrevistó había hecho una suposición oculta que no declaró, y ese es un truco estúpido.
Entonces con respecto a
P. Entonces, ¿dime qué segmento del hilo comparte?
Los segmentos son irrelevantes para la pregunta, al menos en Windows. Los hilos comparten todo el espacio de direcciones. Solo hay 1 segmento de pila, SS, y apunta exactamente a lo mismo que hacen DS, ES y CS [2]. Es decir, todo el maldito espacio de usuario . 0-2 GB. Por supuesto, eso no significa que los subprocesos solo tengan 1 pila. Naturalmente, cada uno tiene su propia pila, pero los segmentos x86 no se utilizan para este propósito.
Quizás *nix haga algo diferente. Quién sabe. La premisa en la que se basó la pregunta se rompió.
- Al menos para el espacio de usuario.
- De
ntsd notepad
:cs=001b ss=0023 ds=0023 es=0023