Sistemas Operativos – Manejador de procesos – Parte 1 – Fundamentos
April 18th, 2010 by JuanK
Esta es una serie 2 post introductorios acerca de lo que es el manejador de procesos, la idea es tener un concepto muy general de lo que hace esta parte de todo sistema operativo, sin embargo es un tema muy extenso y que puede llegar a ser bastante complejo, por lo cual cabe aclarar que por el momento solo trataremos los conceptos de manera muy superficial.
Estos son los otros dos artículos de la serie:
Parte 2 : Manejador de Procesos – Procesos
Parte 3 : Manejador de Procesos – Threads
El manejador de procesos (también llamado planificador, scheduler, calendarizador etc.) es la parte fundamental de todo sistema operativo, de hecho se puede decir que para crear un sistema operativo básico basta con crear cuatro componentes fundamentales:
- Planificador de procesos
- Administrador de memoria
- Manejador de E/S (como mínimo con controladores para video, teclado y disco)
- Sistema de archivos
El manejador de procesos es el encargado, como su nombre lo indica, de permitir le ejecución de los diferentes procesos en una o varias CPU. A simple vista esta tarea es sencilla, pero esta lejos de serlo.
El procesador es un dispositivo que ejecuta un conjunto de instrucciones y devuelve un resultado, así que desde el punto de vista del procesador el concepto de proceso no existe más allá de ejecutar una instrucción en cada ciclo de procesamiento; es el sistema operativo quien determina que es un proceso en si: un conjunto de instrucciones agrupadas con un(os) objetivo(s) especifico(s).
Cuando estamos utilizando un sistema operativo como Windows siempre tenemos la percepción de que hay múltiples programas ejecutándose al mismo tiempo, podemos ver varias ventanas abiertas mientras escuchamos música, navegamos por internet y diligenciamos una hoja de cálculo de excel, pero esto no es más que una ilusión.
Para simplificar un poco el trabajo examinaremos la situación cuando solo hay presente un procesador de un único núcleo.
Funcionamiento básico de una CPU
La CPU, como ya lo mencionamos, solo puede ejecutar una instrucción a la vez, pero como es esto?
Bueno la forma mas sencilla de explicarlo es con un ejemplo: digamos que queremos sumar los valores 2+3 utilizando la CPU, la CPU tiene una especie de ‘ranuras’ llamadas registros algunas de estas ranuras reciben los nombres de Ax, Bx, Cx (pero hay varias más.) y son utilizados por la CPU como fuente de entrada y salida de información.
Lo que se hace entonces para la suma es colocar los valores a sumar en los registros, esto es un mini ejemplo en lenguaje ensamblador:
mov AX, 2 ; poner el número 2 en el registro AX
add AX, 3 ;sumar al contenido de AX el valor 3, la respuesta queda en AX
veamos estos dos pasos en el siguiente gráfico (lo he expandido a 4 pasos para mayor claridad)
El procesador posee un registro que es un apuntador que le permite saber en que instrucción del programa se encuentra de tal manera que cada vez que ejecuta una instrucción el mueve al apuntador a la siguiente instrucción a ser ejecutada.
Cualquier instrucción ejecutada por la CPU funciona de manera similar, utilizando los registros como ranuras de intercambio de datos.
Cómo se ejecutan varios procesos?
De acuerdo al tema tratado anteriormente pudimos ver que una CPU solo puede ejecutar una instrucción a la vez, y como es de suponerse dicha instrucción pertenece a un proceso determinado.
Hay varias maneras de llevar a cabo la ejecución de procesos
Sistemas Operativos Monotarea
La CPU por si sola no puede iniciar la ejecución de otro proceso, es el sistema operativo es quien le dice a la CPU cuando comenzar a ejecutar un conjunto de instrucciones determinado, sin embargo la CPU ejecutaría todas las instrucciones de un proceso hasta finalizar y en ese momento continuaría la ejecución del sistema operativo (que en si es otro proceso) el cual seleccionaría el siguiente proceso a ejecutar suspendiéndose a si mismo hasta que el proceso finalice, luego nuevamente volvería a seleccionar un nuevo proceso y así sucesivamente hasta que no hubiesen procesos por ejecutar.
Algunos dirán y como es que se vuelve a ejecutar el sistema operativo cuando acaba de terminar un proceso?, bueno el truco es sencillo, devolvámonos a algunos sistemas mono tarea tipo DOS en sus primeras versiones, si hacíamos un programa en C este al final del main siempre tenia la instrucción return, pues bien el compilador al compilar código convertía esa expresión return en instrucciones de maquina que hacían que la siguiente ‘línea’ de código a ejecutar fuera… el sistema operativo, así que básicamente todo programa hecho finaliza con una instrucción para devolver el control al sistema operativo.
Este tipo de comportamiento es el habitual en sistemas operativos mono-proceso , es decir que solo pueden ejecutar un proceso a la vez de tal forma que todos los procesos deben esperar su turno en una larga fila de procesos pendientes: esto también es conocido como: planificación por lotes.

Si Windows funcionara de esta manera no podríamos hacer nada con el pues no podríamos tener sino un programa a la vez y esto excluye de manea inevitable los propios servicios que el sistema operativo corre en segundo plano, incluso si mandaras un trabajo de impresión no podrías hacer absolutamente nada más hasta que el trabajo de impresión finalice.
Esto esta muy lejos de ser el comportamiento que estamos habituados a ver, es decir un sistema con decenas de procesos ejecutándose ‘al tiempo’, entonces como funciona esto? bueno todo se resuelve con un truco que realiza el sistema operativo.
Sistemas Operativos Multitarea
Como su nombre lo indica ‘multitarea’ se refiere a que puede realizar varias tareas a la vez, al menos eso es lo que parece.
Realmente lo que sucede es que el sistema operativo esta hecho para tomar la sabia decisión de no permitirle a un programa ejecutarse sino por una fracción de tiempo (muy pequeña), de tal forma que en un solo segundo muchos programas han tenido tiempo de procesamiento, es decir muchos programas se han ejecutado en lapsos de pequeñas fracciones de tiempo. En esencia el concepto es sencillo, implementarlo suele ser más complicado pues hay muchos más aspectos involucrados, estudiaremos algunos.
Interrupción de la Ejecución de un Proceso
Al ejecutarse un proceso en un sistema multitarea, este tiene la oportunidad de realizar un conjunto indeterminado de instrucciones, lo que alcance a hacer en un tiempo limitado, una vez ese tiempo se ha cumplido el sistema operativo debe decidir que proceso debe continuar su ejecución ( bien sean procesos de usuario o procesos de sistema ), esto lo hace teniendo en cuenta una lista de procesos y unas listas por prioridades de procesos, donde algunos procesos tienen más tiempo de ejecución que otros y tienen una prioridad mayor que les permite ‘avanzar más rápido en la fila’.
El sistema operativo sabe que se ha cumplido el tiempo de ejecución de un proceso cuando recibe una señal de interrupción por parte del procesador, esta señal se activa solo cada determinado tiempo (este lapso de tiempo es llamado Quantum), básicamente existe un microprograma que en ese momento le permite al procesador suspender la ejecución y enviar el control (es decir ejecutar) al sistema operativo para que lleve a cabo la planificación necesaria .
Sin embargo hay otros mecanismos que pueden generar interrupciones como por ejemplo:
- Una Señal enviada desde un dispositivo de hardware
- Un proceso puede optar por suspenderse a si mismo
Hay muchas situaciones donde las dos condiciones anteriores puede ocurrir, este es un ejemplo típico:
El proceso P1 se encuentra en ejecución y en un momento determinado espera respuesta desde un dispositivo de E/S(por ejemplo una tarjeta de red), pero no sabe en que momento se recibirá dicha respuesta, así que el proceso se encuentra en espera y suspende su ejecución. El sistema operativo coloca al proceso P2 en ejecución y este comienza a ejecutarse durante su Quantum, seguidamente termina su tiempo de ejecución y siguen en ejecución otros procesos P3…Pn.
En un momento determinado el proceso P5 se encontraba en ejecución cuando el dispositivo de red envió la respuesta que estaba esperando P1, el procesador conoce de esa respuesta y genera una nueva interrupción (es decir devuelve el control otra vez al sistema operativo) suspendiendo inmediatamente el proceso en ejecución. El sistema operativo revisa los buffer de los dispositivos de entrada, encuentra la respuesta que esperaba P1 y activa inmediatamente P1 para que este continúe con su ejecución por un nuevo Quantum de tiempo o en tanto no se genere una nueva interrupción cualquiera que sea su origen.
Tenemos entonces tres maneras que permiten que un proceso suspenda su ejecución para que otros se ejecuten:
- Interrupción por el reloj del procesador (Quantum de tiempo)
- Interrupción por dispositivos de E/S
- Auto suspensión del proceso o finalización del proceso.
Estado De La Ejecución De Un Proceso
Ya hemos visto como es que el sistema operativo alterna entre varios procesos para dar la impresión de que esta haciendo varias cosas a la vez, pero puede que alguno de ustedes ya les haya surgido la pregunta: ¿Cómo sabe el sistema en que iba mi proceso justo antes de suspenderlo? veamos el caso anterior (el de 2 +3) en un entorno multitarea:

En la gráfica vemos al proceso P1 justo terminando de finalizar su primera instrucción, así que como respuesta a esta instrucción el procesador dejó el valor 2 en el registro AX, luego viene los demás procesos cada uno utilizando los registros según sus necesidades como se ve en la gráfica:

hasta que por alguna razón le vuelve a tocar el turno de ejecución al proceso P1 y ooops!!! P1 estaba esperando que en AX estuviera el valor 2 para que así su suma sea 2+3, pero en este momento ya el proceso P1 no tendría en los registros los mismos valores que tenia justo antes de suspenderse!!!
Por otro lado el sistema operativo también necesita saber en que instrucción estaba la ejecución de P1 para continuar justo donde estaba antes de suspender su ejecución, y algunos otros datos más, entonces como hace para que todo pueda continuar normal?
Como lo dije anteriormente cuando un proceso se suspende básicamente se devuelve la ejecución al sistema operativo, allí el sistema lleva a acabo la planificación de procesos y otras tareas, pero que hace realmente?
El sistema lo primero que hace es guardar el estado del proceso en algún sitio, el estado del proceso es una estructura en memoria que guarda los valores de TODOS los registros y banderas del procesador (las banderas son un registro utilizado por el procesador para indicar situaciones como división por cero, overflow, signo negativo etc.) es decir esto incluye el registro IP(Instruction Pointer) que es un registro que contiene un apuntador que indica al procesador en que instrucción de código va la ejecución, y los registros Ax, Bx, Cx, etc.
Una vez ese dato queda guardado el sistema verifica cual es el siguiente proceso que debe tener un Quantum de ejecución, digamos el proceso P2, así que el sistema operativo lee el estado del proceso P2 y comienza a dejar las cosas en su lugar, es decir lee los valores que deberían tener cada uno de los registros , las banderas,etc. y establece esos valores en el procesador, una vez todos los valores están establecidos los últimos valores que establece el sistema son los de los registros de segmento y el registro IP, una vez realizada esta labor inicia la ejecución de P2 hasta que sea interrumpido y se continúe con la labor de planificación una y otra vez.
Si desean más información acerca de los registros los invito a consultar este Tutorial de Assembler.
Esto es todo por el momento, los más conocedores me perdonaran por todas las cosas que he podido pasar por alto pero recuerden que esto es solo un post introductorio y no pretendo detallar las cosas más allá de los conocimientos generales, de igual forma cualquier duda o corrección que tengan es bienvenida.
Saludos.
Estos son los otros dos artículos de la serie:
Parte 2 : Manejador de Procesos – Procesos
Parte 3 : Manejador de Procesos – Threads
- 10 Comentarios »
- Publicado en la categoría 'Sistemas Operativos'

Wordpress
10 comentarios to “Sistemas Operativos – Manejador de procesos – Parte 1 – Fundamentos ”
January 10th, 2009 at 4:45 pm
super super bien , mi vida hermosa , te amo conejito bb .
January 13th, 2009 at 9:57 am
Gracias mi conejito hermoso (jajaja) sin ofender es joda, queda para la próxima entrega de CL.
Gracias JuanK
January 17th, 2009 at 8:31 pm
[...] el post de Manejador de Procesos 1 – Fundamentos vimos, entre otros temas, que un proceso es un conjunto de instrucciones que se ejecutan con [...]
February 15th, 2009 at 9:59 pm
Te saluda José Díaz, estudiante de Ing. de Sistemas y me han dejado una tarea sobre los procesos del sistema operativo que acá describo:
Realice graficamente o explique la relación en el momento que se utilizan: un procesador de textos, un navegador web, y un programa de mensajeria como por ejemplo msn y su relación con los procesos propios del sistema.
podrías hecharme una mano en eso pues no encuentro nada sobre esto.
Te agradeszco por adelantado la atención
gracias
February 16th, 2009 at 1:48 pm
funciona exactamente igual.
por ejemplo poner una letra en pantalla implica dibujarla, y dibujarla no es mas que poner la letra en alguna región de la memoria de video.
lo que pasa es que a nivel macro eso no es tan claro porque por debajo hay varias capas de procesamiento que pueden hacer que cosas tan sencillas como colocar un carácter en pantalla se desenvuelva realmente en decenas de operaciones de maquina e incluso mas.
si va a internet, por el browser : desde el momento que tienes la direccion escrita y das enter pasan centeneras de cosas:
se procesa el enter y hace llamadoa las librerias del browser para navegar, las cuales a su vez necesitan del dispositivo de red el cual funciona con librerias del sistema operativo, pero a la vez esta conexion temporal se hace por http que esta soportado sobre tcp/ip entonces antes de cualquier cosa la peticion se vuelve http, luego el sistema tiene librerias para enviar esos dadtos en formato tcp/ip pero para hacerlo debe contactar al driver de la tarjeta de red para que enviando de byte en byte pueda crar un pack tcp (o muchos, los que se necesiten)… y alli enviar las tramas http con el request del browser etc etc
entonces si te fijas ahi muy por encima ya pueden haber pasado miles de instrucciones de cpu para contactar el dispositivo para crear tramas tcp/ip para enviar el http sobre ese tcp/ip para procesar el enter, capturar los datos etc etc…
imaginate word: tiene donde escribir, tiene botones usa el mouse etc etc…
concentremonos en el boton guardar y lo que sucede (muy por encima):
tiene una figura al presionarse
otra al no estar presionado
procesa eventos como click, mouse encima , mouse sale etc. etc.
y tiene codigo asociado para guardar lo cual implica otros miles de cosas para guardar… etc etc…
pero concentremonos en lo mas facil, en como se dibuja cuando esta normal…
para dibujarse debe tener código que abre el archivo de la imagen que del botón (un diquete tradicionalmente), o bien código que sabe donde esta esa imagen en memoria, una vez accede a esa informacion la puede obtener para dibujarse..
tambien tiene codigo para dibujar un cuadro y otras series de lineas que son las que componen un cuadro con efecto 3D ( como lo son los de word ),
hay codigo para redibujarse despues de que el mouse le pase encima etc etc etc
pero concentremonos ahora en una sola linea de ese boton…
para dibujar una linea se necesita saber el color de la linea, el grueso y el tipo de puntas…
pero entonces miremos mas alla… una linea se forma por una ecuacion que determina donde va cada punto, pues a la final se dibujan son los puntos,
por lo cual para dibujar un solo punto de esa linea de ese boton de word se requiere
codigo de maquina capaz de poner esa informacion en la memoria de video
sinos imaginamos eso de manera simplista seria como
color = 0x00FF0000 (rojo)
mov [direccion memoria de video], rojo
entonces alli se acaba de poner el color rojo en un punto de la memoria de video ( ese punto de la memoria de video representa una posicion en la pantalla visible)
el proceso es mucho mas complejo de lo que describi, incluso por simplificar las cosas puede que no sea el orden correcto y me estoy saltando muchos pasos relacionados con los llamados a procedimientos saltos a modo kernel etc etc…
pero superficialmente asi es como funciona.
Espero te haya quedado claro.
saludos
October 18th, 2009 at 1:04 pm
[...] Parte 1 : Manejador de Procesos – Fundamentos [...]
October 18th, 2009 at 1:28 pm
[...] Parte 1 : Manejador de Procesos – Fundamentos [...]
March 2nd, 2011 at 7:31 am
Una pregunta la bibliografia o articulos desde donde sacas todo esto la puedes citar,ya que estoy haciedno mi tesis en esta area y me es susmamente importante corroborar la informacion y citarla te lo agradeceria..
att Eduardo Kano
Cartagena -Colombia
March 2nd, 2011 at 8:51 am
La bibliografía soy yo el articulo como veras es 100% mio. Que de donde lo saque?
e mi experiencia personal como desarrollador y de decenas de libros de sistemas opertativos leidos durante mi trayectoria profesional.
December 28th, 2011 at 2:15 pm
Hola, disculpa si el comentario deberia ir en otro sitio, pero queria saber si tienes algun ejemplo sencillo del uso en C# del protocolo UDP, he visitado infinidad de sitios y probado ejemplos pero todos estan orientados a que las app clientes envien msj al servidor y lo que estoy tratando de hacer es que el servidor les envie el mismo msj a todos los clientes, se que no debe ser dificil pero estoy iniciando en C#, familiarizandome con su API y las apps distribuidas. y no se si se puede hacer lo que planteo.
Gracias por tu tiempo, Saludos.