Sistemas operativos modernos

tenga su propio PID o comparta el de su padre. Esta característica es necesaria durante el arran­ que del sistema; los procesos de usuario tienen prohibido habilitarla. Este compartimiento tan detallado es posible porque Linux mantiene estructuras de datos individuales para los diversos elementos que enumeramos al principio de la sección 10.3.3 (pa­ rámetros de calendarización, imagen de memoria, etcétera). La tabla de procesos y la estructu­ ra de usuario tan sólo apuntan a esas estructuras de datos, así que es fácil crear una nueva entrada en la tabla de procesos para cada subproceso clonado y hacer que apunte a las estruc­ turas de datos de calendarización, memoria, etcétera, del subproceso anterior, o bien, a copias de dichas estructuras. No obstante, el hecho de que sea posible compartir en forma tan detalla­ da no quiere decir que sea útil, sobre todo en vista de que UNIX no ofrece esta funcionalidad. Por tanto, un programa Linux que aproveche esto no podrá trasladarse a UNIX. Calendarización en UNIX Examinemos ahora el algoritmo de calendarización de UNIX. Puesto que UNIX siempre ha sido un sistema multiprogramado, su algoritmo de calendarización se diseñó desde un principio de modo que respondiera bien a procesos interactivos. El algoritmo tiene dos niveles. El nivel bajo escoge, entre los procesos que están en la memoria y listos para ejecutarse, el proceso que se eje­ cutará a continuación. El algoritmo de nivel alto traslada procesos entre la memoria y el disco pa­ ra que todos tengan oportunidad de estar en la memoria y ejecutarse. Cada versión de UNIX tiene un algoritmo de calendarización de bajo nivel un poco distin­ to, pero casi todos ellos son cercanos al algoritmo genérico que describiremos a continuación. El algoritmo de nivel bajo utiliza múltiples colas. Cada cola está asociada con un intervalo de valores de prioridad que no se traslapan. Los procesos que se ejecutan en modo de usuario (la punta del iceberg) tienen valores positivos. Los procesos que se ejecutan en modo de kernel (que emiten llamadas al sistema) tienen valores negativos. Los valores negativos tienen la prio­ ridad más alta y los positivos grandes tienen la más baja, como se ilustra en la figura 10-11. En las colas sólo se colocan los procesos que están en la memoria y listos para ejecutar, pues la selección debe hacerse con base en este conjunto. Cuando se ejecuta el calendarizador (de bajo nivel), examina las colas comenzando por la de más alta prioridad (es decir, el valor más negativo) hasta hallar una cola ocupada. Entonces se escoge e inicia el primer proceso de esa cola, y se le permite ejecutarse durante no más de un cuanto, que por lo regular es de 100 ms, o hasta que se bloquee. Si un proceso consume su cuanto, se vuelve a colocar al final de su cola, y se ejecuta otra vez el algoritmo de calendari­ zación. Así pues, los procesos dentro del mismo intervalo de prioridad comparten la CPU em­ pleando un algoritmo por tumo circular (round-robin). Una vez por segundo, la prioridad de cada proceso se recalcula con una fórmula de tres componentes: prioridad = consumo_CPU + nice + base Con base en su nueva prioridad, cada proceso se pone al final de la cola apropiada de la figura 10 - 11 , por lo regular, dividiendo la prioridad entre una constante para obtener el número de co­ la. Examinemos en forma breve cada uno de los tres componentes de la fórmula de prioridad.

RkJQdWJsaXNoZXIy MjI4NDcx