lunes, 23 de enero de 2017

PROCESOS


PROCESOS:
Un proceso es una secuencia de pasos dispuesta con algún tipo de lógica que se enfoca en lograr algún resultado específico. Los procesos son mecanismos de comportamiento que diseñan los hombres para mejorar la productividad de algo, para establecer un orden o eliminar algún tipo de problema. El concepto puede emplearse en una amplia variedad de contextos, como por ejemplo en el ámbito jurídico, en el de la informática o en el de la empresa. Es importante en este sentido hacer hincapié que los procesos son ante todo procedimientos diseñados para servicio del hombre en alguna medida, como una forma determinada de accionar.

En el contexto del derecho, un proceso hace alusión a los diversos pasos que den seguirse de modo obligatorio a la hora de llevar adelante un juicio. Este hecho da cuenta de que en ocasiones el término juicio y proceso se utilicen como sinónimos. Dicho proceso es conocido por los letrados como asimismo por los magistrados y debe respetarse en todo momento para que el juicio se desarrolle de forma legítima. En efecto, si existiesen faltas significativas en este sentido podría existir un fenómeno de invalidación que echarían todos los esfuerzos realizados por tierra. No obstante, a pesar de la aparente rigurosidad, estas formas de actuación son necesarias por la complejidad de la materia.

En informática es un término con múltiples usos, que aparecen en contextos muy diversos. En el ámbito de la informática, el concepto se refiere a la ejecución de diversas instrucciones por parte del microprocesador, de acuerdo a lo que indica un programa. Por otro lado, un proceso suele ser el nombre que recibe un programa que está siendo ejecutado en memoria. Si vemos el administrador de tareas de Windows, podremos tomar conciencia de muchos de estos programas. En este caso, el nombre de procesos deriva del hecho de que un programa por definición lleva una secuencia de pasos de forma lógica. Muchos de estos procesos son fundamentales para el mantenimiento del sistema operativo, circunstancia que hace que eliminar a alguno pueda tener consecuencias negativas.    

Finalmente, desde el punto de vista de una empresa, un proceso da cuenta de una serie de acciones que se toman en el aspecto productivo para que la eficiencia sea mayor. En efecto, las empresas buscan continuamente aumentar su rentabilidad produciendo más y bajando sus costos. Para ello diseñan sistemas de actuación que garantizan esta circunstancia luego de análisis pormenorizados. Un buen ejemplo de esta situación puede ofrecerlo el quiebre que significó la producción en serie con el fordismo considerando los tiempos inmediatamente anteriores; la misma posibilitó sacar al mercado autos en gran escala, haciendo que éstos pudiesen ser adquiridos por la población en general a un precio razonable.
 Estados de los procesos
Todo proceso en un sistema operativo presenta un estado que indica la situación de la ejecución en que se encuentra. El número de posibles estados varía de un sistema operativo a otro.
Diagrama de estados simplificado
Consideramos que todo proceso puede estar, como mínimo, en uno de los siguientes tres estados:
Activo: el proceso está empleando la CPU, por tanto, está ejecutándose. Pueden haber tantos procesos activos como procesadores haya disponibles. Por tanto, si el sistema dispone de un único procesador, únicamente puede haber un proceso activo a la vez.
Preparado: el proceso no está ejecutándose pero es candidato a pasar a estado activo. Es el planificador el que, en base a un criterio de planificación, decide qué proceso selecciona de la lista de procesos preparados para pasar a estado activo.
Bloqueado: el proceso está pendiente de un evento externo que le ha hecho bloquear, tales como una operación de lectura/escritura, la espera de finalización de un proceso hijo, una señal o una operación sobre un semáforo. El dispositivo/hecho externo "avisa" al S.O. cuando ha terminado la acción que realizaba mediante una INTERRUPCIÓN, dejando el S.O. lo que está haciendo para atender a esta última. Tras esto, el S.O. comprueba cuales son los procesos que fueron bloqueados por ese evento externo, cambiándolos al estado de preparado.
La transición de activo a preparado y viceversa depende de decisiones tomadas por el planificador del sistema operativo en base a un cierto criterio. La transición de activo a bloqueado, y de bloqueado a preparado puede inducirlas el programador mediante llamadas al sistema.
Diagrama de Estados Ampliado
En espera / Preparación: Estado por el que pasan los procesos antes de pasar a estar preparados por primera vez. Los procesos, cuando comienzan a existir, no están preparados para comenzar a ejecutar instrucciones hasta que el sistema no ha llevado a cabo una serie de actividades. Una vez que el proceso está completamente cargado, ya se puede producir la primera transición al estado preparado.
Terminado: La transición de activo a este estado ocurre cuando el proceso realiza una llamada al sistema solicitando su propia terminación. En estas circunstancias, hay estructuras de datos correspondientes al proceso que no pueden ser liberadas hasta que el proceso padre del que está terminando recoja el código de terminación del mismo. Hasta que esto ocurra, estas estructuras se mantendrán y el proceso seguirá existiendo en estado terminado.
Transición: cuando la operación que mantiene a un proceso en estado bloqueado termina, el proceso puede haber perdido parte de los recursos que necesita para proseguir su ejecución. Este es por ejemplo el caso de un sistema con memoria virtual, en el que parte de las páginas de memoria del proceso han sido descargadas a disco. En dicho caso, el proceso tendría que pasar por un estado intermedio transición mientras recupera dichos recursos, y una vez que todos sus recursos vuelven a estar disponibles, volvería al estado preparado.

Hay tres posibles situaciones en las que se ejecutará el planificador del sistema operativo:
El proceso que se encuentra en el estado activo hace una llamada al sistema que, por su naturaleza, resulta en una transición al estado bloqueado. Este es el caso de las llamadas read(), write(), wait(), pause(), entre muchas otras. Al pasar a estado bloqueado, se invoca al planificador para que decida que otro proceso se asignará al procesador.
Si el proceso que se encuentra en el estado activo excede el tiempo máximo de asignación, en caso de que lo hubiere.
Si el proceso que hasta ese momento se encontraba en estado activo termina de ejecutar su código.
Además, algunos sistemas operativos disponen de un estado terminado en el que los procesos pasan antes de terminar su ejecución.
En el caso del núcleo de Linux, existen tres tipos de estados bloqueados y dos estados terminados.

Bloqueo de control de los procesos:
Para llevar a cabo la gestión de un proceso, es necesario que el sistema operativo guarde cierta información necesaria. Para ello, existe un registro especial que se conoce como el bloque de control del proceso BCP, o PCB en inglés (Process Control Block).
El BCP es creado por el Sistema operativo cada vez que aparece un nuevo proceso. Los procesos son conocidos para el sistema operativo y por tanto elegible para competir por los recursos del sistema sólo cuando existe un BCP activo asociado a ellos. Cuando el programa termina, el BCP es eliminado para dejar espacio libre en el registro, y usarlo para almacenar otros BCP.
El bloque de control de procesos difiere mucho de un sistema a otros, pero existen contenidos comunes:
Identificador del proceso: Identificar de forma unívoca al proceso en el sistema, generalmente se emplea un entero sin signo que se denomina PID (Process IDentifier)
Estado del proceso para el planificador de procesos: preparado, activo o bloqueado.
Contexto de la ejecución: valor de los registros del procesador, bits de estados, etc. Esto es, cada vez que se ejecuta el planificador y se realiza una conmutación de procesos, la información sobre en qué lugar se encontraba la ejecución del proceso se encuentra guardada aquí, así como el lugar en el que se paró la ejecución del anterior proceso (cada una en su respectivo BCP).
Aspectos relacionados con la administración de memoria: tales como el espacio de direcciones y la cantidad de memoria asignada a un proceso.
Aspectos relacionados con la administración de ficheros: tales como los ficheros con los que el proceso está actualmente operando.
Los procesadores en los que el proceso puede ejecutarse: en caso de soportar el sistema multiprocesador.
En el caso de un sistema operativo tipo UNIX: el proceso padre de dicho proceso y la relación de procesos hijos.
Estadísticas temporales: Tiempo de lanzamiento del proceso, tiempo en estado activo,

Esta lista es simplemente indicativa, cada sistema operativo tiene su propio diseño de BCP, con el conjunto de metadatos necesarios para la administración. Puede medir desde 32 bits a 1024. Su denominación cambia según el sistema operativo, por ej.  En IBM se designa PSW por palabra de estado de proceso. Difiere significativamente entre los sistemas de procesamiento por lotes (BATCH) y los sistemas interactivos.
Algunos sistemas de multiprogramación incluyen información de mantenimiento con el propósito de facturar a los usuarios individuales el tiempo de procesador, el almacenamiento, las operaciones de E/S y otras utilizaciones de recursos.
Una vez creado, el BCP se rellena con los atributos definidos como parámetros que se hallan en la plantilla del proceso o que son especificados como parámetros de la llamada al sistema operativo crear proceso. En ese momento el sistema operativo suele asignar valores a otros campos. Por ejemplo, cuando se crea un proceso, los registros e indicadores hardware se fijan a los valores proporcionados por el cargador/enlazador. Cada vez que un proceso queda suspendido, el contenido de los registros del procesador es generalmente guardado en la pila, y el puntero al marco de la pila en cuestión se almacena en el BCP. De este modo los valores de los registros son restaurados cuando el proceso es seleccionado para ejecutarse nuevamente.
Operación sobre los procesos
Los sistemas operativos son responsables de la "gestión de procesos y memoria", por lo que están encargados de realizar una serie de actividades, tales como la planificación o itinerario de procesos, la operación sobre procesos y la comunicación entre procesos. Para operar sobre un proceso, los sistemas operativos actuales suministran ciertas funciones, que pueden ser ejecutadas ya sea desde el mismo proceso o desde el intérprete de comandos, si es un usuario el que solicita algún servicio de dicho sistema.
Entre las operaciones sobre procesos que con mayor frecuencia ofrecen los sistemas operativos se encuentran la creación, terminación o destrucción, suspensión y reanudación de procesos. Actualmente, en la mayoría de los S.O., los procesos pueden ejecutarse de forma concurrente, pudiéndose crear y eliminar de forma dinámica, por lo que es necesario que estos sistemas brinden un mecanismo para la creación y terminación de procesos.
Durante la ejecución de un proceso, éste puede crear otros procesos. Si lo hace, el proceso creador es llamado proceso padre, y el creado, proceso hijo. Estos últimos pueden, a su vez, crear otros procesos, construyendo así un árbol de procesos.
Hay 4 eventos comunes que conducen a la creación de procesos:
§  En un ambiente batch, un proceso es creado en respuesta al sometimiento a ejecución de un trabajo (job). El S.O. tomará el próximo trabajo a ser ejecutado y creará el respectivo proceso.
§  En un ambiente interactivo, un proceso es creado cuando un nuevo usuario entra al sistema (log on). El S.O crea un proceso shell que espera las órdenes del usuario.
§  El S.O. puede crear un proceso para que realice una función en respuesta a una petición de un programa usuario, sin que el usuario tenga que esperar. Por ejemplo, si un usuario quiere que se imprima un archivo, el S.O. puede crear un proceso que maneje esta impresión, mientras que el proceso que realizó la petición puede continuar independientemente del tiempo requerido para completar la impresión.
§  Para procesos de modularidad o para explotar paralelismo, donde un programa usuario ya existente puede crear un conjunto de procesos hijos.
Además, crear un proceso implica varias operaciones, entre ellas:
§  Buscarle un identificador: la mayoría de los sistemas operativos, incluyendo los UNIX y Windows, identifican los procesos mediante un identificador unívoco que normalmente es un número entero, es decir, cada proceso (padre e hijo) es identificado por un id o PID (process identifier) distinto para cada uno.
§  Determinar la prioridad inicial del proceso.
§  Crear el PCB: el S.O. busca un hueco libre en la lista de PCB, y cuando lo encuentra crea el PCB del proceso.
§  Asignar recursos iniciales al proceso: por ejemplo, establecer su contexto de memoria (espacio de direcciones) y de CPU (registros), los archivos a usar y los dispositivos de E/S.
§  Insertarlo en la cola de procesos.

 

Relación entre procesos padres e hijos



Hay varias formas y criterios por lo que los hijos se relacionan con sus padres, estos son:

Jerarquía

Puede ser de dos tipos:
1.    Estructura jerárquica: cada proceso que se crea es hijo del proceso creador, y hereda el entorno de ejecución de su padre, estableciéndose un árbol de procesos como se mencionó anteriormente, donde cada hijo tiene sólo un padre, pero un padre puede tener más de un hijo. La estructura jerárquica se llevará a cabo por medio de la información adecuada insertada en el PCB del proceso padre.
2.    Estructura no jerárquica: consiste en que cada proceso creado por otro se ejecute independientemente de su creados, con un entorno totalmente diferente.

Recursos

Los recursos físicos y lógicos asignados a los procesos pueden venir de parte del sistema operativo o bien se limitan recibiendo una serie de recursos del padre (ficheros, dispositivos, memoria compartida,...), lo cual ayuda para no sobrecargar el sistema creando procesos hijos. Por lo tanto la relación puede ser:
1.    Padre e hijo comparten todos sus recursos
2.    El padre le comparte un subconjunto de sus recursos a sus hijos.
3.    Padre e hijo no comparten recursos.

Ejecución

El proceso padre puede entregarle, además de sus recursos a sus procesos hijos, parámetros iníciales para ayudarlo a completar tareas. Por lo cual existen dos escenarios en la ejecución:
1.    El proceso padre se ejecuta de forma simultánea o concurrente con su proceso hijo, o bien
2.    Espera que sus hijos (o parte de ellos) se terminen para poder continuar.

Espacio Direccionable

Con respecto al padre, el hijo puede ser:
1.    Una réplica, clon o duplicado de su padre: se copia el espacio del creador para el creado, compartiendo el mismo código, datos, etc., o
2.    Un nuevo programa: el proceso creado inicia un programa diferente al del creador, es decir, tiene su propio programa cargado.

Funciones para la creación de procesos

Existen varias llamadas al sistema utilizadas para la creación de procesos. En el caso de los sistemas UNIX, entre las más conocidas se encuentran:

http://wiki.inf.utfsm.cl/skins/common/images/magnify-clip.png
§  fork( ): llamada a sistema para la creación de procesos, donde el hijo es una copia exacta del padre, salvo por el PID y la memoria que ocupan (las variables son independientes. Ésta permite que el proceso hijo copie el espacio de direcciones de su padre, por lo que tienen las mismas variables y ficheros abiertos. Esta llamada al sistema retorna 0 si el proceso es un hijo, al padre le retorna un entero positivo (que representa el PID del hijo) o un entero negativo que indica un error en la creación del proceso.
§  exec( ): produce la sustitución del programa invocados por el nuevo programa invocado, cambia el espacio de memoria del proceso por un nuevo programa. Sustituye todos los elementos del proceso: código del programa, datos, etc.). La combinación de las llamadas fork y exec es el mecanismo que ofrece UNIX para crear un nuevo proceso (fork) que ejecute un programa determinado (exec).
§  wait( ): sirve para que el padre se ponga en espera hasta que su o sus procesos hijos finalicen sus tareas, permitiendo la sincronización del padre con el hijo.
§  clone(): llamada similar a fork(), pero mucho más genérica y flexible, ya que permite definir qué van a compartir los procesos padre e hijo.
Para el caso de los sistemas Windows, la creación de procesos se hace a través de la función CreateProcess(), que es similar a fork() en el sentido de que un padre crea un nuevo proceso hijo, con la diferencia que con fork() el proceso hijo hereda el espacio de direcciones de su padre y con CreateProcess() se necesita cargar un programa específico en el espacio de las direcciones del proceso hijo durante su creación.
Terminación de procesos
Un proceso acaba cuando termina de ejecutar su último enunciado y le pide al S.O. que lo elimine. Destruir o terminar un proceso implica eliminarlo del sistema: se le borra de las tablas o listas de procesos, sus recursos reutilizables se devuelven al sistema y su PCB se borra, es decir, el espacio de memoria ocupado por su PCB se devuelve al espacio de memoria disponible. Como es de esperar, el término de un proceso es más difícil cuando éste ha creado otros procesos. En algunos sistemas un proceso hijo se destruye automáticamente cuando su padre ha terminado, creando terminaciones en cascada, que son iniciadas normalmente por el sistema operativo. En otros sistemas, los procesos creados son independientes de sus padres, por lo que la destrucción de éste no afecta sobre sus hijos.
En un sistema UNIX, un proceso se termina con la llamada al sistema exit( ) (ExitProcess() en Windows), proveniente del proceso mismo o de su padre, que permite que se liberen todos los recursos asignados previamente. En el momento en que se hace esta llamada, el proceso puede devolver un valor de estado a su proceso padre (un entero normalmente) a través de la llamada al sistema wait(). El S.O. libera la asignación de todos los recursos del proceso, incluyendo las memorias física, virtual, los archivos abiertos y los búfer de E/S.
Al llamar a la función exit () un proceso padre puede esperar a la terminación de sus procesos hijos usando la llamada al sistema wait(), que devuelve el identificador de un proceso hijo completado, con el fin de que el padre sepa cuál de sus hijos ha terminado. Sin embargo, si el proceso padre ha terminado, a todos sus procesos hijos se les asigna un proceso init como nuevo padre, evitando la eliminación en cascada.
Algunas de las razones por la que se termina un proceso son:
§  Un proceso hijo sobrepasa el límite de recursos que le fueron asignados.
§  Las tareas de un proceso ya no son necesarias.
§  El padre finaliza, por lo que su hijo también.
§  La ocurrencia de un error irrecuperable o no controlado.
§  Excede el tiempo límite.
§  Errores aritméticos.
§  Fallas de E/S.
§  Instrucciones inválidas.
Suspensión y reanudación de procesos
Un proceso suspendido o bloqueado no puede proseguir sino hasta ser reanudado por otro proceso. Generalmente, es el S.O. el que se encarga de eliminar temporalmente ciertos procesos con el fin de reducir la carga del sistema durante una situación crítica. Normalmente, los procesos son suspendidos durante periodos pequeños para disminuir la exigencia al sistema, pero también hay casos en que ocurren suspensiones más largas, en las que es posible liberar los recursos del proceso para poder utilizarlos durante ésta. Según la naturaleza del recurso, se toma la decisión de liberarlo o no: la memoria principal debe ser liberada de inmediato cuando se suspenda un proceso; una unidad de cinta puede ser retenida brevemente por un proceso suspendido, pero debe ser liberada si el proceso se suspende por un periodo largo o indefinido. Reanudar (o activar) un proceso implica reiniciarlo a partir del punto en el que se suspendió.
La suspensión y reanudación de procesos son importantes y han sido puestas en práctica en diferentes sistemas. Estas operaciones pueden ser de gran necesidad en casos como:
§  Si un sistema está funcionando mal, y es probable que falle, se puede suspender los procesos activos para reanudarlos cuando se haya corregido el problema.
§  Un usuario que desconfíe de los resultados parciales de un proceso puede suspenderlo (en lugar de abortarlo) hasta que verifique si el proceso funciona correctamente o no.
§  Algunos procesos se pueden suspender como respuesta a las fluctuaciones a corto plazo de la carga del sistema, y reanudarse cuando las cargas vuelvan a niveles normales.
Ejemplo
Código
Ejemplo Creación de Procesos en UNIX
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    int main (int argc, char argv[]){
         int num;
         pid_t pid;
         for(num = 0; num < 3; num++) 
         {
              pid= fork(); //Crea el proceso hijo
              printf("Soy el proceso de PID %d y mi padre tiene%d de PID.\n",getpid(), getppid());
              if(pid != 0) //ve si el proceso hijo termino de ejecutarse
              break; 
              srandom(getpid());
              sleep(random() %3);
         }
         if(pid!= 0)
         printf ("Fin del proceso de PID %d.\n", wait (NULL));
         return 0;
    }

Ejemplo Eliminacion de Procesos en UNIX

    #include <sys/types.h>
    #include <stdio.h>
    main() 
    {
         int pid;
         if(fork()==0){            /* hijo */
              fprintf(stdout, "hijo %d\n", getpid());
              sleep(3);
              edit.(0);                   /* termina el proceso*/
              }else{                        /* padre */
              fprintf(stdout, "padre %d\n", getpid());
              pid = wait(NULL);            /* espera que finalice cualquier hijo */
              fprintf(stdout, "fin del hijo %d\n", pid);
              }
         exit (0);                                   
    }

Tipo certamen

Certamen 1, segundo semestre 2009, profesor Javier Cañas:
¿Cuántos procesos crea el siguiente programa?

    #include <stdio.h>
    #include <unistd.h>
    
    int main()
    {
         fork();   /*F1*/
         fork();   /*F2*/
         fork();   /*F3*/
         fork();   /*F4*/
         return 0; 
    }

Respuesta:
 15.....

Solución método 1


El padre (P1) crea 4 procesos (fork F1, F2, F3 y F4).
El primer hijo (P2) crea 3 procesos (fork F2, F3 y F4).
Su primer hijo (P6) crea 2 procesos (fork F3 y F4).
Su hijo (P12) crea 1 proceso (fork F4).
Su hijo (P16) no crea proceso alguno.
Su otro hijo(P13) no crea proceso alguno.
Su segundo hijo (P7) crea 1 proceso (fork F4).
Su hijo (P14) no crea proceso alguno.
Su tercer hijo (P8) no crea proceso alguno.
El segundo hijo (P3) crea 2 procesos (fork F3 y F4).
Su hijo (P9) crea 1 proceso (fork F4).
Su hijo (P15) no crea proceso alguno.
Su otro hijo (P10) no crea proceso alguno.
Su tercer hijo (P4) crea 1 proceso (fork F4).
Su hijo (P11) no crea proceso alguno.
Su cuarto hijo (P5) no crea proceso alguno.
Por lo tanto, se han creado 15 procesos.
En general, se crean 2n − 1 procesos nuevos, donde n es el número de llamadas fork( ) que están presentes.

Solución método 2

Otra forma, es entendiendo cómo funciona la función fork(): cuando un proceso hace la llamada, éste se "divide" en dos sub procesos: en "él mismo" y en un hijo idéntico a él (como se ve en la representación gráfica más arriba). Así, con cada llamada fork() el proceso se separa en el mismo padre (nodos blancos) y un hijo (nodos negros). Todos los procesos en negro son los que se han creado con la llamada al sistema, y, al contarlos, se ve que son 15.
Este método sirve para ver también el nivel de profundidad n (veces que se ha aplicado el fork) en el que estamos, ya que cada piso del árbol, representa una nueva llamada.
Planificación de procesos en Sistemas Operativos. Conjunto de políticas y mecanismos incorporados al sistema operativo, a través de un módulo denominado planificador, que debe decidir cuál de los procesos en condiciones de ser ejecutado conviene ser despachado primero y qué orden de ejecución debe seguirse. Esto debe realizarse sin perder de vista su principal objetivo que consiste en el máximo aprovechamiento del sistema, lo que implica proveer un buen servicio a los procesos existentes en un momento dado.
Objetivos de la Planificación de procesos
La Planificación de procesos tiene como principales objetivos la equidad, la eficacia, el tiempo de respuesta, el tiempo de regreso y el rendimiento.
Equidad: Todos los procesos deben ser atendidos.
Eficacia: El procesador debe estar ocupado el 100% del tiempo.
Tiempo de respuesta: El tiempo empleado en dar respuesta a las solicitudes del usuario debe ser el menor posible.
Tiempo de regreso: Reducir al mínimo el tiempo de espera de los resultados esperados por los usuarios por lotes.
Rendimiento: Maximizar el número de tareas que se procesan por cada hora.
Tipos de Planificación de Procesos
Planificación a Plazo Fijo
Ciertos trabajos se planifican para ser terminados en un tiempo específico o plazo fijo. Es una planificación compleja debido a los siguientes factores: 
El usuario debe suministrar anticipadamente una lista precisa de recursos necesarios para el proceso, pero generalmente no se dispone de dicha información.
La ejecución del trabajo de plazo fijo no debe producir una grave degradación del servicio a otros usuarios.
El sistema debe planificar cuidadosamente sus necesidades de recursos hasta el plazo fijo, lo que se puede complicar con las demandas de recursos de nuevos procesos que ingresen al sistema.
La concurrencia de varios procesos de plazo fijo (activos a la vez) puede requerir métodos sofisticados de optimización.
La administración intensiva de recursos puede generar una considerable sobrecarga adicional.
Planificación Garantizada 
Se establecen compromisos de desempeño con el proceso del usuario, por ejemplo, si existen “n”procesos en el sistema, el proceso del  usuario recibirá cerca del “1 / n” de la potencia de la CPU.
El sistema debe tener un registro del tiempo de cpu que cada proceso ha tenido desde su entrada al sistema y del tiempo transcurrido desde esa entrada.
Con los datos anteriores y el registro de procesos en curso de ejecución, el sistema calcula y determina qué procesos están más alejados por defecto de la relación “1 / n” prometida y prioriza los procesos que han recibido menos CPU de la prometida.

Planificación del Primero en Entrar Primero en Salir (FIFO)
Es muy simple, los procesos se despachan de acuerdo con su tiempo de llegada a la cola de listos.
Una vez que el proceso obtiene la CPU, se ejecuta hasta terminar, ya que es una disciplina “no apreciativa”.
Puede ocasionar que procesos largos hagan esperar a procesos cortos y que procesos no importantes hagan esperar a procesos importantes.
Es más predecible que otros esquemas.
No puede garantizar buenos tiempos de respuesta interactivos.
Suele utilizarse integrado a otros esquemas, por ejemplo, de la siguiente manera: 
Los procesos se despachan con algún esquema de prioridad.
Los procesos con igual prioridad se despachan “FIFO”.
Planificación de Asignación en Rueda (RR: Round Robín)
Los procesos se despachan en “FIFO” y disponen de una cantidad limitada de tiempo de cpu, llamada “división de tiempo” o “cuanto”.
Si un proceso no termina antes de expirar su tiempo de cpu ocurren las siguientes acciones: 
La cpu es apropiada.
La cpu es otorgada al siguiente proceso en espera.
El proceso apropiado es situado al final de la lista de listos.
Es efectiva en ambientes de tiempo compartido. La sobrecarga de la apropiación se mantiene baja mediante mecanismos eficientes de intercambio de contexto y con suficiente memoria principal para los procesos.

Tamaño del Cuanto o Quantum
La determinación del tamaño del cuanto es decisiva para la operación efectiva de un sistema computacional
Los interrogantes son: ¿cuánto pequeño o grande?, ¿cuánto fijo o variable? y ¿cuánto igual para todos los procesos de usuarios o determinado por separado para cada uno de ellos?.
Si el cuanto se hace muy grande, cada proceso recibe todo el tiempo necesario para llegar a su terminación, por lo cual la asignación en rueda (“RR”) degenera en “FIFO”.
Si el cuanto se hace muy pequeño, la sobrecarga del intercambio de contexto se convierte en un factor dominante y el rendimiento del sistema se degrada, puesto que la mayor parte del tiempo de cpu se invierte en el intercambio del procesador (cambio de contexto) y los procesos de usuario disponen de muy poco tiempo de cpu.
El cuanto debe ser lo suficientemente grande como para permitir que la gran mayoría de las peticiones interactivas requieran de menos tiempo que la duración del cuanto, es decir que el tiempo transcurrido desde el otorgamiento de la cpu a un proceso hasta que genera una petición de Entrada / Salida debe ser menor que el cuanto establecido, de esta forma, ocurrida la petición la cpu pasa a otro proceso y como el cuanto es mayor que el tiempo transcurrido hasta la petición de Entrada / Salida, los procesos trabajan al máximo de velocidad, se minimiza la sobrecarga de apropiación y se maximiza la utilización de la
Entrada / Salida.
El cuanto óptimo varía de un sistema a otro y con la carga, siendo un valor de referencia 100 mseg (cien milisegundos).

Planificación del Trabajo Más Corto Primero (SJF)
Es una disciplina no apropiativa y por lo tanto no recomendable en ambientes de tiempo compartido.
El proceso en espera con el menor tiempo estimado de ejecución hasta su terminación es el siguiente en ejecutarse.
Los tiempos promedio de espera son menores que con “FIFO”.
Los tiempos de espera son menos predecibles que en “FIFO”.
Favorece a los procesos cortos en detrimento de los largos.
Tiende a reducir el número de procesos en espera y el número de procesos que esperan detrás de procesos largos.
Requiere un conocimiento preciso del tiempo de ejecución de un proceso, lo que generalmente se desconoce.
Se pueden estimar los tiempos en base a series de valores anteriores.

Planificación del Tiempo Restante Más Corto (SRT)
Es la contraparte apropiativa del SJF.
Es útil en sistemas de tiempo compartido.
El proceso con el tiempo estimado de ejecución menor para…analizar es el siguiente en ser ejecutado.
Un proceso en ejecución puede ser apropiado por un nuevo proceso con un tiempo estimado de ejecución menor.
Tiene mayor sobrecarga que la planificación SJF.
Debe mantener un registro del tiempo de servicio transcurrido del proceso en ejecución, lo que aumenta la sobrecarga.
Los trabajos largos tienen un promedio y una varianza de los tiempos de espera aún mayor que en SJF.
La apropiación de un proceso a punto de terminar por otro de menor duración recién llegado podría significar un mayor tiempo de cambio de contexto (administración del procesador) que el tiempo de finalización del primero.
Al diseñarse los Sistemas Operativos se debe considerar cuidadosamente la sobrecarga de los mecanismos de administración de recursos comparándola con los beneficios esperados.

Planificación el Siguiente con Relación de Respuesta Máxima (HRN
)
Corrige algunas de las debilidades del SJF, tales como el exceso de perjuicio hacia los procesos (trabajos) largos y el exceso de favoritismo hacia los nuevos trabajos cortos.
Es una disciplina no apropiativa.
La prioridad de cada proceso está en función no sólo del tiempo de servicio del trabajo, sino que también influye la cantidad de tiempo que el trabajo ha estado esperando ser servido.
Cuando un proceso ha obtenido la cpu, corre hasta terminar.
Las prioridades, que son dinámicas, se calculan según la siguiente fórmula, donde prs la “prioridad”, tees el “tiempo de espera” y ts es el “tiempo de servicio”: 

 Planificación por Prioridad
Considera factores externos al proceso.
Las ideas centrales son que cada proceso tiene asociada una prioridad y que el proceso ejecutable con máxima prioridad es el que tiene el permiso de ejecución.
Los procesos de alta prioridad podrían ejecutar indefinidamente, ya que el planificador del sistema puede disminuir la prioridad del proceso en ejecución en cada interrupción del reloj.
Las prioridades también pueden ser asignadas dinámicamente por el sistema para lograr ciertas metas relacionadas con el procesador o la Entrada / Salida.
Los procesos limitados por la Entrada / Salida (requerimientos intensivos de Entrada / Salida) ocupan mucho de su tiempo en espera de operaciones de Entrada / Salida, por lo tanto: 
Deben tener prioridad para usar la cpu y efectuar la siguiente petición de Entrada / Salida, ya que se ejecutará (la operación de Entrada / Salida) en paralelo con otro proceso que utilice la cpu.
Si deben esperar mucho tiempo a la cpu estarán ocupando memoria por un tiempo innecesario.
Un algoritmo sencillo consiste en establecer que la prioridad sea “1 / f”, donde “f” es la fracción del último cuanto utilizado por el proceso. Un proceso que utilice 2 mseg (dos milisegundos) de su cuanto de 100 mseg (cien milisegundos) tendrá prioridad 50 (cincuenta).
Un proceso que se ejecutó 50 mseg antes del bloqueo tendrá prioridad 2.
Un proceso que utilizó todo el cuanto tendrá prioridad 1.
Frecuentemente los procesos se agrupan en “Clases de Prioridad”, en cuyo caso se utiliza la Planificación con Prioridades entre las clases y con Round Robín (RR) dentro de cada clase. Si las prioridades no se reajustan en algún momento, los procesos de las clases de prioridad mínima podrían demorarse indefinidamente.

Colas de Retro alimentación de Niveles Múltiples
Proporcionan una estructura para lograr los siguientes objetivos: 
Favorecer trabajos cortos.
Favorecer trabajos limitados por la Entrada / Salida para optimizar el uso de los dispositivos de Entrada / Salida.
Determinar la naturaleza de un trabajo lo más rápido posible y planificar el trabajo (proceso) en consecuencia.
Un nuevo proceso entra en la red de línea de espera al final de la cola superior. Se mueve por esta cola “FIFO” hasta obtener la cpu.
Si el trabajo termina o abandona la cpu para esperar por la terminación de una operación de Entrada / Salida o la terminación de algún otro suceso, el trabajo abandona la red de línea de espera.
Si su cuanto expira antes de abandonar la cpu voluntariamente, el proceso se coloca en la parte trasera de la cola del siguiente nivel inferior.
El trabajo recibe servicio al llegar a la cabeza de esta cola si la primera está vacía.
Mientras el proceso continúe consumiendo totalmente su cuanto en cada nivel, continuará moviéndose hacia el final de las colas inferiores.
Generalmente hay una cola en la parte más profunda a través de la cual el proceso circula en asignación de rueda hasta que termina.
Existen esquemas en los que el cuanto otorgado al proceso aumenta a medida que el proceso se mueve hacia las colas de los niveles inferiores, en tal caso, cuanto más tiempo haya estado el proceso en la red de línea de espera, mayor será su cuanto cada vez que obtiene la cpu y no podrá obtener la cpu muy a menudo debido a la mayor prioridad de los procesos de las colas superiores.
Un proceso situado en una cola dada no podrá ser ejecutado hasta que las colas de los niveles superiores estén vacías.
Un proceso en ejecución es apropiado por un proceso que llegue a una cola superior.
Es un mecanismo adaptable, es decir que se adapta a cargas variables.
A los efectos de una revisión gráfica de lo enunciado precedentemente.

Política Versus Mecanismo de Planificación
Puede ocurrir que haya procesos con muchos procesos hijos ejecutándose bajo su control, por ejemplo, un proceso en un DBMS con procesos hijos atendiendo funciones específicas, tales como, análisis de interrogantes, acceso a discos, etc.
Es posible que el proceso principal (padre) pueda identificar la importancia (o criticidad) de sus procesos hijos, pero los planificadores analizados no aceptan datos de los procesos de usuario relativos a decisiones de planificación.
La solución es separar el mecanismo de planificación de la política de planificación, para ello se parametriza el algoritmo de planificación y los parámetros pueden ser determinados por medio de procesos del usuario; así el mecanismo está en el núcleo del Sistema Operativo pero la política queda establecida por un proceso del usuario.

Planificación de Dos Niveles
Los esquemas analizados hasta ahora suponen que todos los procesos ejecutables están en la memoria principal.
Si la memoria principal es insuficiente, ocurrirá lo siguiente: 
Habrá procesos ejecutables que se mantengan en disco.
Habrá importantes implicaciones para la planificación, tales como las siguientes:
El tiempo de alternancia entre procesos para traer y procesar un proceso del disco es considerablemente mayor que el tiempo para un proceso que ya está en la memoria principal.
Es más eficiente el intercambio de los procesos con un planificador de dos niveles.


 Sincronización y comunicación entre procesos:

Los procesos que ejecutan de forma concurrente en un sistema se pueden clasificar como procesos independientes o cooperantes. Un proceso independiente es aquel que ejecuta sin requerir la ayuda o cooperación de otros procesos. Un claro ejemplo de procesos independientes son los diferentes intérpretes de mandatos que se ejecutan de forma simultánea en un sistema. Los procesos son cooperantes cuando están diseñados para trabajar conjuntamente en alguna actividad, para lo que deben ser capaces de comunicarse e interactuar entre ellos.
Tanto si los procesos son independientes como cooperantes, pueden producirse una serie de interacciones entre ellos. Estas interacciones pueden ser de dos tipos:


Interacciones motivadas porque los procesos comparten o compiten por el acceso a recursos físicos o lógicos. Esta situación aparece en los distintos tipos de procesos anteriormente comentados. Por ejemplo, dos procesos totalmente independientes pueden competir por el acceso a disco. En este caso, el sistema operativo deberá encargarse de que los dos procesos accedan ordenadamente sin que se cree ningún conflicto. Esta situación también aparece cuando varios procesos desean modificar el contenido de un registro de una base de datos. Aquí es el gestor de la base de datos el que se tendrá que encargar de ordenar los distintos accesos al registro.


Interacción motivada porque los procesos se comunican y sincronizan entre sí para alcanzar un objetivo común. Por ejemplo, un compilador se puede construir mediante dos procesos: el compilador propiamente dicho, que se encarga de generar código ensamblador, y el proceso ensamblador, que obtiene código en lenguaje máquina a partir del ensamblador. En este ejemplo puede apreciarse la necesidad de comunicar y sincronizar a los dos procesos.

Estos dos tipos de interacciones obligan al sistema operativo a incluir mecanismo y servicios que permitan la comunicación y la sincronización entre procesos

Procesos concurrentes:
Dos o más procesos decimos que son concurrentes, paralelos, o que se ejecutan concurrentemente, cuando son procesados al mismo tiempo, es decir, que para ejecutar uno de ellos, no hace falta que se haya ejecutado otro.
En sistemas multiprocesador, esta ejecución simultánea podría conseguirse completamente, puesto que podremos asignarle, por ejemplo, un proceso A al procesador A y un proceso B al procesador B y cada procesador realizaran la ejecución de su proceso.
Cuando tenemos un solo procesador se producirá un intercalado delas instrucciones de ambos procesos, de tal forma que tendremos la sensación de que hay un paralelismo en el sistema (concurrencia, ejecución simultánea de más de un proceso).
Ahora bien, está claro que en esto tenemos que tener en cuenta que mientras un proceso está escribiendo un valor en una variable determinada, puede darse el caso que otro proceso que es concurrente al primero vaya  a leer o escribir en esa misma variable, entonces habrá que estudiar el caso en el que un proceso haga una operación sobre una variable (o recurso en general) y otro proceso concurrente a él realice otra operación de tal forma que no se realice correctamente. Para estudiar esto, y determinar el tipo de operaciones que se pueden realizar sobre recursos compartidos utilizaremos las condiciones de Bernstein.
Tipos de procesos concurrentes:
Los procesos que ejecutan de forma concurrente en un sistema se pueden clasificar como procesos independientes y cooperantes.
Un proceso independiente es aquel que ejecuta sin requerir la ayuda o cooperación de otros procesos. Un claro ejemplo de procesos independientes son los diferentes intérpretes de mandatos que se ejecutan de forma simultánea en un sistema.
Los procesos cooperantes, cuando están diseñados para trabajar conjuntamente en alguna actividad, para lo que deben ser capaces de comunicarse e interactuar entre ellos en el ejemplo del compilador que se vio anteriormente, los dos procesos que lo conforman son procesos cooperantes.
Tanto si los procesos son cooperantes como independientes, puede producirse una serie de interacciones entre ellos. Estas interacciones pueden ser de dos tipos:
– Interacción motivada porque los procesos comparten o compiten por el acceso a recursos físicos o lógicos. Esta situación aparece en los distintos tipos de procesos anteriormente comentados. Por ejemplo, dos procesos totalmente independientes pueden competir por el acceso al disco. En este caso el sistema operativo deberá encargarse de que los dos procesos accedan ordenadamente sin que se cree ningún conflicto.
Esta situación también aparece cuando varios procesos desean modificar el contenido de un registro de una base de datos. Aquí es el gestor de la base de datos el que se tendrá que encargar de ordenar los distintos accesos al registro.
– Interacción motivada porque los procesos se comunican y sincronizan entre sí para alcanzar un objetivo común. Por ejemplo, los procesos compilador y ensamblador descritos anteriormente son dos procesos que deben comunicarse y sincronizarse entre ellos con el fin de producir código en lenguaje máquina.
Virtualmente todos los sistemas de tiempo-real son inherentemente concurrentes (los dispositivos operan en paralelo en el mundo real).
Definición de interrupción:
Una interrupción es una suspensión temporal de la ejecución de un proceso, para pasar a ejecutar una subrutina de servicio de interrupción, la cual, por lo general, no forma parte del programa, sino que pertenece al sistema operativo o al BIOS. Una vez finalizada dicha subrutina, se reanuda la ejecución del programa.
Las interrupciones son generadas por los dispositivos periféricos habilitando una señal del CPU (llamada IRQ del inglés "interrupt request") para solicitar atención del mismo. Por ejemplo. Cuando un disco duro completa una lectura solicita atención al igual que cada vez que se presiona una tecla o se mueve el ratón.
La primera técnica que se empleó para esto fue el polling, que consistía en que el propio procesador se encargara de sondear los dispositivos periféricos cada cierto tiempo para averiguar si tenía pendiente alguna comunicación para él. Este método presentaba el inconveniente de ser muy ineficiente, ya que el procesador consumía constantemente tiempo y recursos en realizar estas instrucciones de sondeo.
El mecanismo de interrupciones fue la solución que permitió al procesador desentenderse de esta problemática, y delegar en el dispositivo periférico la responsabilidad de comunicarse con él cuando lo necesitara. El procesador, en este caso, no sondea a ningún dispositivo, sino que queda a la espera de que estos le avisen (le "interrumpan") cuando tengan algo que comunicarle (ya sea un evento, una transferencia de información, una condición de error.
Función  del mecanismo de una interrupción:
Todos los dispositivos que deseen comunicarse con el procesador por medio de interrupciones deben tener asignada una línea única capaz de avisar al CPU cuando le requiere para realizar una operación. Esta línea se denomina IRQ.
Las IRQ son líneas que llegan al controlador de interrupciones, un componente de hardware dedicado a la gestión de las interrupciones, y que puede estar integrado en el procesador principal o ser un circuito separado conectado al mismo. El controlador de interrupciones debe ser capaz de habilitar o inhibir las líneas de interrupción y establecer prioridades entre las mismas. Cuando varias líneas de petición de interrupción se activan a la vez, el controlador de interrupciones utilizará estas prioridades para escoger la interrupción sobre la que informará al procesador principal. También puede darse el caso de que una rutina de tratamiento de interrupción sea interrumpida para realizar otra rutina de tratamiento de una interrupción de mayor prioridad a la que se estaba ejecutando; aunque hay interrupciones que no se pueden deshabilitar (conocidas como interrupciones no enmascarables o NMI).
Un procesador principal que no tenga un controlador de interrupciones integrado, suele tener una única línea de interrupción llamada habitualmente INT. Esta línea es activada por el controlador de interrupciones cuando tiene una interrupción que servir. Al activarse esta línea, el procesador consulta los registros del controlador de interrupciones para averiguar cual IRQ hay que atender. A partir del número del IRQ busca en la tabla de vectores de interrupción la dirección de la rutina a la que debe llamar para atender la petición del dispositivo asociado a dicha IRQ.
Procesamiento de una interrupción:
Terminar la ejecución de la instrucción máquina en curso.
Salvar el estado del procesador (valores de registros y flags) y el valor del contador de programa, IP, en la pila, de manera que en la CPU, al terminar el proceso de interrupción, pueda seguir ejecutando el programa a partir de la última instrucción.
La CPU salta a la dirección donde está almacenada la rutina de servicio de interrupción (Interrupt Service Routine, o abreviado ISR) y ejecuta esa rutina que tiene como objetivo atender al dispositivo que generó la interrupción.
Una vez que la rutina de la interrupción termina, el procesador restaura el estado que había guardado en la pila en el paso 2 y retorna al programa que se estaba usando anteriormente.
Tipos de interrupciones:
Atendiendo a la fuente que las produce, las interrupciones pueden clasificarse de la siguiente forma:
Interrupciones de hardware. Estas son asíncronas a la ejecución del procesador, es decir, se pueden producir en cualquier momento independientemente de lo que esté haciendo el CPU en ese momento. Las causas que las producen son externas al procesador y a menudo suelen estar ligadas con los distintos dispositivos de entrada o salida.
Excepciones. Son aquellas que se producen de forma síncrona a la ejecución del procesador y por tanto podrían predecirse si se analiza con detenimiento la traza del programa que en ese momento estaba siendo ejecutado en la CPU. Normalmente son causadas al realizarse operaciones no permitidas tales como la división entre 0, el desbordamiento, el acceso a una posición de memoria no permitida,.
Interrupciones por software:
 Las interrupciones por software son aquellas generadas por un programa en ejecución. Para generarlas, existen distintas instrucciones en el código máquina que permiten al programador producir una interrupción, las cuales suelen tener nemotécnicos tales como INT (por ejemplo, en DOS se realiza la instrucción INT 0x21 y en Unix se utiliza INT 0x80 para hacer llamadas de sistema).
Interrupciones de hardware:
Las interrupciones de hardware son aquellas interrupciones que se producen como resultado de, por lo general, una operación de E/S. No son producidas por ninguna instrucción de un programa sino por las señales que emiten los dispositivos periféricos para indicarle al procesador que necesitan ser atendidos.
Cuando el microprocesador accede a un periférico (disco duro, puerto de comunicación...), puede transcurrir algún tiempo antes de que los datos sean obtenidos o transmitidos. La solución más simple es esperar hasta recibir los datos o hasta que se haya efectuado la transmisión (polling), pero esta solución bloquea todos los programas en ejecución, y eso no puede admitirse en un sistema multitarea. Por ello, en los sistemas modernos se prefiere un funcionamiento mediante interrupciones, ya que éstas permiten mejorar la productividad del procesador, de forma que este último puede ordenar una operación de entrada o salida y, en lugar de tener que realizar una espera activa, se puede dedicar a atender a otro proceso o aplicación hasta que el dispositivo esté de nuevo disponible, siendo dicho dispositivo el encargado de notificar al procesador mediante la línea de interrupción que ya está preparado para continuar o terminar la operación de entrada o salida.
Excepciones
Las excepciones son un tipo de interrupción sincrónica típicamente causada por una condición de error en un programa, como por ejemplo una división entre 0 o un acceso inválido a memoria en un proceso de usuario. Normalmente genera un cambio de contexto a modo supervisor para que el sistema operativo atienda el error. Así pues, las excepciones son un mecanismo de protección que permite garantizar la integridad de los datos almacenados tanto en el espacio de usuario como en el espacio kernel. Cuando el Sistema Operativo detecta una excepción intenta solucionarla, pero en caso de no poder simplemente notificará la condición de error a la aplicación/usuario y abortará la misma.
Interrupciones por software:

Las interrupciones por software, también denominadas llamadas al sistema, son aquellas generadas por un programa mientras este está ejecutándose. En general, actúan de la siguiente manera: Un programa en ejecución llega a una instrucción que requiere del sistema operativo para alguna tarea, por ejemplo para leer un archivo en el disco duro (cuando un programa necesita un dato exterior, se detiene y pasa a cumplir con las tareas de recoger ese dato). En ese momento por tanto llama al sistema y se interrumpe virtualmente hasta recibir respuesta, en el ejemplo anterior hasta que no se haya leído el disco y el archivo esté en memoria principal. Durante esa espera las instrucciones que se ejecutarán no serán del programa, sino del sistema operativo. Una vez éste termine su rutina ordenará reanudar la ejecución del programa auto interrumpido en espera. Por último la ejecución del programa se reanuda.