El reparto de procesador

Cuando escribí el post sobre la secuencialidad, nunca pensé que terminaría escribiendo ésto. Sin embargo, creo que es una muestra más del enorme nivel de mis idolatrados lectores… en concreto, Ñita preguntaba:

Aun así, yo tengo una pregunta sobre ésto: ¿Cómo decide el procesador qué instrucción tiene que atender en cada momento, para que todos los programas que se están ejecutando tengan «su oportunidad de progresar en la vida»? xD
Es decir, ¿va rotando entre los programas que tiene abiertos..?

Nuestra lectora no va nada desencaminada, pero hay que aclarar que el procesador no decide nada: toda la responsabilidad para gestionar la multitarea recae sobre el sistema operativo (SO), quien asigna a los programas el tiempo de procesado con arreglo a unos parámetros.

Para entender ésto, tenemos que ver al procesador como un recurso: un bien limitado que todos los programas quieren utilizar y que sólo el sistema operativo gestiona, decidiendo qué programa se ejecutará y cuál no. Es como el director de orquesta.

Hasta hace unos años, los sistemas seguían un enfoque de «reparto no apropiativo», que consistía en que los programas utilizaban el procesador hasta que terminaban lo que hacían, o lo cedían voluntariamente a los demás. Sin embargo, este enfoque está basado en que la gente es buena, y por lo tanto no resultaba muy fiable… El enfoque de los sistemas operativos modernos se llama «reparto apropiativo», porque los programas no se quedan con el procesador por mucho que quieran, es el SO quien se encarga de arbitrar su uso. O sea, que es el SO quien se «apropia» del procesador cuando los procesos se ponen pesados… Ya sé que la intuición nos lleva a pensar que los nombres están al revés, pero se lo aseguro: están bien así.

De acuerdo con ésto, en la actualidad los programadores (me voy a incluir…) diseñamos las aplicaciones como si fuesen a ejecutarse ellas sólas en la máquina, aun sabiendo que no es cierto. Luego, será el sistema operativo quien de forma transparente, se encarga de pasar el turno a los programas.

Antes de seguir, cabe señalar que los programas cargados en el ordenador suelen denominarse procesos. Aquí lo vamos a usar como sinónimo de programa, aunque no sea muy correcto. También, muchas veces utilizamos CPU (Central Processing Unit, Unidad Central de Procesamiento) en vez de procesador.

Aquí un tema muy interesante del que se habrán dado cuenta los lectores más despiertos… Un sistema operativo no es más que un programa, así que… ¿qué pasa si un programa no «suelta» el procesador? Y es que para que el sistema pueda quitar de la ejecución a un programa, antes necesita ejecutarse él… ¿cómo lo logra? Digamos que el sistema operativo deja una «bomba de relojería» (una interrupción, que se llama) en el procesador. Cuando la bomba explota, el ordenador salta a ejecutar el código del planificador del sistema operativo, que se encarga de guardar los datos con los que estaba trabajando el programa y de seleccionar el siguiente «afortunado».

Visto de otra forma, es como si el sistema operativo permitiera a los programas usar su baño, y que la puerta del baño sólo puede abrirse desde dentro. Para asegurarse que nadie se queda a vivir, pondría un mecanismo en la puerta para que, transcurrido un tiempo, se abriera…

Una vez que el SO ha expulsado al programa que estaba ejecutando su código, hemos dicho que se pone a los mandos de la nave, y decide qué programa será el siguiente (normalmente habrá varios esperando). Esta decisión no es nada sencilla, y hay varias técnicas para decidir a quien se le deja el procesador… ahí van algunos, muy brevemente:

  • FCFS (First come, first served). Se ejecuta primero el que lleve más tiempo esperando.
  • RR (Round Robin). Consiste en un turno rotatorio. Se pone un tiempo máximo y se retira a los programas que lo exceden. Es el algoritmo que usa Windows…
  • SPN (Shortest Process Next). Se ejecuta primero el programa que se estima que va a durar menos… es como cuando te dejan pasar en la tienda porque sólo vas a llevar un pan.
  • SRT (Shortest Remaining Time). Ejecuta un programa que llegue a la «cola» si el tiempo que va a tardar es menor que lo que le queda al que está ejecutándose.
  • HRRN (Highest Response Ratio Next). Es algo más complicado, tiene en cuenta el tiempo que lleva esperando el programa y lo que estima que va a tardar para ser más justo.
  • Por Realimentación (no hay siglas :-P). Es también muy complicado, así que no lo voy a intentar explicar. Basta decir que es que usan los Unix (y por tanto, la mayoría de los Linux) y que funciona a las mil maravillas.

Hay algunos más, pero son realmente complicados. Aparte de lo dicho, los sistemas operativos suelen dejar que se asignen prioridades a los procesos (luego haremos un experimento con ésto) y otras técnicas.

El problema es que se nos puede ocurrir un algoritmo fantástico y muy justo, pero si es muy complicado gastaremos más recursos en calcular qué programa es el siguiente que en la ejecución de los procesos propiamente dicha… así que hay que encontrar un equilibrio entre complejidad y efectividad.

Bien, ¿Hacemos una prueba? Botón derecho sobre la barra de herramientas, así:

Ahora nos vamos a ir a la ficha «Procesos». Cuántas cosas… Menú «Ver – Seleccionar columnas…». Ahora marque éstas opciones:

Bien, ahora tiene ante usted una lista como la que se muestra debajo, donde tiene el nombre del programa que se está ejecutando, el tiempo que ha durado la ejecución de su código hasta el momento (vea qué poco necesitan en general). El otro parámetro cuantifica el uso de CPU, y el último nos dice qué prioridad tiene asignada el proceso.

Según esos valores los procesos de su equipo irán recibiendo más o menos CPU ¿No se lo cree? Cambie la prioridad de algún programa… Windows le dirá que se ande con cuidado, que la puede usted liar… no crea, no es para tanto, aunque por si acaso, guarde lo que esté haciendo…

Y ahora póngase a cambiar las prioridades de todo, súbasela a los programas que quiere que acaben antes. Después, intente dejarlo todo más o menos como estaba, o simplemente reinicie el sistema… esas cosas se le siguen atragantando al amigo… :-)

Si ha llegado hasta aquí, un premio: los programas que sirven para controlar a los dispositivos, como el ratón, tienen prioridades muy altas… ¿Se ha fijado que a veces en Windows no funciona nada y sin embargo puede seguir moviendo el ratón? Bien, es por ese motivo. Así que cuando piense que su ordenador va a bloquearse, en vez de teclear y mover el ratón compulsivamente, aleje sus manos y espere. En la mayoría de los casos se arreglará, pero lo último que necesita su equipo es que lo cargue más…

  1. Un gran post, pero me gustaría un estudio de cómo van los procesos en Linux… era el más interesante ^^

  2. He llegado hasta el final y creo que lo he entendido! (La verdad es que no me lo esperaba). Se agradece el ejemplo del baño, muy aclarador ;-D. Y ahora comprendo mejor eso de las diferentes escalas de tiempo humano/procesador. Brutal!

  3. Yo ya lo sabia, bwahah! bwahah!
    excepto que la realimentacion era la técnica de unix =P
    El anónimo tiene razon, me he quedado con las ganas XDDD

  4. vaya…con ejemplos asi de buenos es dificil no enterarse :)
    Me ha quedado todo clarísimo. Muchas gracias.

  5. :-) Gracias a todos
    Los procesos en Unix siguen un esquema MUY friki, creo que estoy obligado a explicarlo… pero no será apto para mentes sensibles: hay procesos muertos y zombies que son matados… muy gore todo…

    ¡Saludos!

  6. Mmm, interesante. Lo he tenido que leer dos veces, pero no es por falta de claridad del post, es falta de claridad del lector (que malo es trasnochar).

  7. Dices que es mejor que cuando el ordenador se traba dejarlo andar y no «agobiarlo» más… ¿entonces es bueno o no abrir el Administrador de Tareas para parar procesos?

  8. Hola Sxim:
    Es una pregunta muy interesante: la cuestión es que si el ordenador está rindiendo mal y abrimos el administrador de tareas, el rendimiento va a verse afectado.

    No obstante, en Windows no hay muchas más formas de matar un proceso si éste no responde, así que tenemos que asumir esta sobrecarga si queremos solucionar el problema.

    Desde mi punto de vista, todo depende de la gravedad de la situación: si veo que la cosa marcha mal espero un poquito (sobre todo si tengo trabajo sin guardar). Si la cosa se pone verdaderamente fea, lanzo el administrador y ya cierro los programas que sean… Espero poder aclarar algo :-)

    ¡Saludos!

  9. «Pau dijo…
    :-) Gracias a todos
    Los procesos en Unix siguen un esquema MUY friki, creo que estoy obligado a explicarlo… pero no será apto para mentes sensibles: hay procesos muertos y zombies que son matados… muy gore todo…

    ¡Saludos!
    »

    Por no hablar que todas esas muertes y zombies se hacen entre padres e hijos. Estos de Unix tenían tendencias fraticidas o un principio de Complejo de Edipo :P

  10. Me surgió otra duda… según todo esto que has explicado… ¿qué decimos técnicamente cuando decimos que «un programa/el ordenador se ha trabado»?

    PD: perdona las molestias pero es que soy bastante inculto informáticamente hablando :-$

  11. Sxim: no es molestia responderte, de hecho me encanta :-) Creo que le dedicaré un post al asuntillo. Tendrás que esperar un poquillo, pero así podré responderte mejor…

    ¡Saludos!

Los comentarios están desactivados.