Sistemas operativos modernos

Elementos por proceso Elementos por subproceso Espacio de direcciones Contador de programa Variables globales Registros Archivos abiertos Pila Procesos hijos Estado Alarmas pendientes Señales y manejadores de señales Información contable Figura 2-7. La primera columna es una lista de los elementos que comparten todos los subprocesos de un proceso. La segunda es una lista de elementos privados de ca­ da subproceso. estamos tratando de lograr con el concepto de subproceso es que múltiples subprocesos de eje­ cución puedan compartir un conjunto de recursos para que colaboren en forma estrecha en la realización de alguna tarea. Al igual que un proceso tradicional (o sea, con un solo subproceso), un subproceso puede estar en uno de varios estados: en ejecución, bloqueado, listo o terminado. Un subproceso en ejecución tiene la CPU y está activo. Uno bloqueado está esperando un suceso que lo desblo­ quee. Por ejemplo, cuando un subproceso emite una llamada al sistema para leer del teclado, se bloquea hasta que se teclea algo. Un subproceso puede bloquearse mientras espera que ocurra un suceso externo o que otro subproceso lo desbloquee. Un subproceso listo se calendariza pa­ ra ejecutarse y se ejecuta tan pronto como llegue su tumo. Las transiciones entre los estados de los subprocesos son las mismas que las de los procesos (vea la figura 2-2). Es importante tomar en cuenta que cada subproceso tiene su propia pila, como se muestra en la figura 2-8. La pila de cada subproceso contiene un marco por cada procedimiento invoca­ do del cual todavía no se ha regresado. Este marco contiene las variables locales del procedi­ miento y la dirección de retomo que se usará cuando la llamada al procedimiento termine. Por ejemplo, si el procedimiento X llama al procedimiento Y y éste llama al procedimiento Z, du­ rante la ejecución de Z los marcos de X, y y Z estarán en la pila. En general, cada subproceso in­ vocará procedimientos distintos y, por tanto, tendrá un historial de ejecución distinto. Por eso cada subproceso necesita su propia pila. Si hay múltiples suprocesos, los procesos generalmente empiezan con un solo subproceso. Éste puede crear subprocesos nuevos invocando a un procedimiento de biblioteca, por ejemplo, thread_create. Por lo regular, un parámetro de thread_create especifica el nombre de un proce­ dimiento que el nuevo subproceso ejecutará. No es necesario (ni posible siquiera) especificar algo acerca del espacio de direcciones del nuevo subproceso, pues éste se ejecuta en forma au­ tomática en el espacio de direcciones del subproceso que lo creó. A veces los subprocesos son jerárquicos, con una relación padre-hijo, pero es común que no exista tal relación y que todos sean iguales. Con o sin una relación jerárquica, por lo general al subproceso creador se le devuelve un identificador con el nombre del nuevo subproceso. Cuando un subproceso termina su labor, puede salir invocando a un procedimiento de bi­ blioteca, digamos thread_exit. Una vez hecho esto, desaparecerá y ya no podrá calendarizar-

RkJQdWJsaXNoZXIy MjI4NDcx