Go to content Go to navigation Go to search

Sistemas Operativos – Manejador de procesos – Parte 2 – Procesos

January 14th, 2009 by JuanK

En el post de Manejador de Procesos 1 – Fundamentos  vimos, entre otros temas, que un proceso es un conjunto de instrucciones que se ejecutan con un objetivo determinado, y pudimos ver de manera superficial de que se compone un proceso.

Estos son los otros dos artículos de la serie:

 

Parte 1 : Manejador de Procesos – Fundamentos

Parte 3 : Manejador de Procesos – Threads

 

Como parte del tema de procesos profundizaremos un poco más al respecto de ellos.

 

El Proceso

Un proceso esta básicamente compuesto por un conjunto de instrucciones, pero hasta allí nada lo diferencia de lo que es un programa guardado en disco, el proceso se define por estar en ejecución – o al menos esperando para ejecución- sino esta en ejecución no hay proceso.

Un proceso en ejecución entonces tiene, además de sus instrucciones, características propias que lo describen y que definen su estado mientras este se ejecuta, estas características son:

 

  • El estado del proceso: el valor de cada uno de los registros el procesador y las las banderas establecidas
  • El conjunto de instrucciones
  • La pila (es decir el Stack)
  • Memoria de trabajo > Espacio de memoria reservado en el heap (es decir el montón de memoria) y sus contenidos

 

Las describiremos con mayor detalle.

 

El Estado Del Proceso

En cada ciclo de reloj, comprendido desde que se envía una instrucción -del conjunto de instrucciones del procesador- hasta que se obtiene una respuesta, existe un estado diferente de cada proceso.

 

Una forma fácil de ver que es el estado de un proceso es imaginar un proceso en ejecución como una película, compuestas por muchos cuadros independientes, si tomamos uno de los cuadros tenemos una fotografía de un único instante en el tiempo de ejecución, esa fotografía es el estado del proceso.

 

En ese estado podemos identificar que datos tenia el procesador en cada uno de sus registros en ese momento, así como las banderas que se encontraban activadas.

Esto permite, por ejemplo y como lo vimos en el post anterior, suspender un proceso de repente y volverlo a activar posteriormente justo donde se encontraba, simplemente tomando su estado para y en otro momento restableciéndolo el proceso podrá seguir con la ejecución justo donde estaba.

 

El Conjunto de Instrucciones

No se como explicar esto… pues el conjunto de instrucciones que componen el proceso… jajajaja

Rabbid

 

La Pila – El Stack

A bajo nivel la mayoría del trabajo no se hace accediendo directamente a los objetos sino a los registros y a una útil herramienta llamada stack, como su nombre lo indica el stack es una pila donde los elementos se colocan uno sobre otro y solo es accesible de manera inmediata el elemento que esta en la cima de la pila. Allí es donde los objetos se almacenan de manera temporal previo a su utilización.

 

La porción de memoria donde se localiza el stack (stack segment) esta alineada con la porción de memoria donde están las instrucciones de un programa (code segment)

 

Su funcionamiento es muy sencillo y consta de dos instrucciones principales: POP y PUSH.

 

POP quita un elemento de la cima de la pila y lo coloca en uno de los registros: image

 

PUSH coloca un elemento de uno de los registros en la cima de la pila:

image 

Un stack solo pertenece a un único proceso,  el stack se crea en el momento que el programa se carga en memoria.

 

A quien desee una explicación más detallada al respecto nuevamente le recomiendo que estudie el Tutorial de Assembler.

 

Memoria de Trabajo

De manera habitual los tipos valor (como enteros, caracteres sencillos, flotantes etc. y algunas estructuras más complejas) son guardados en el stack, mientras que los tipos referencia son guardados en la memoria de trabajo.

 

Cuando en programación se usa un objeto por referencia realmente sucede que en el stack se guarda una dirección que apunta a la memoria de trabajo, exactamente a donde se encuentra el objeto referenciado.

image De esta forma un objeto puede tener referenciadas varias porciones de memoria como parte de su memoria de trabajo, y es el sistema operativo quien lleva un inventario de que páginas de memoria han sido asignadas a un proceso determinado, y a la vez lleva un inventario de que porciones de esa página se están usando desde los objetos del proceso.

 

Con la información que hemos revisado hasta el momento ya podemos meternos en temas u poco más complejos, pero no se preocupen que mantendré el estilo que he usado hasta ahora, veremos solo la información necesaria para entender de que se trata el asunto y dejaremos los altos tecnicismos para los libros o para otras web dedicadas al tema.

Estos son los otros dos artículos de la serie:

Parte 1 : Manejador de Procesos – Fundamentos

Parte 3 : Manejador de Procesos – Threads

 

Bookmark and Share

Sistemas Operativos – Manejador de procesos – Parte 1 – Fundamentos

January 10th, 2009 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)

image 

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.

 

image

 

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:

  1. Interrupción por el reloj del procesador (Quantum de tiempo)
  2. Interrupción por dispositivos de E/S
  3. 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:

 

image

 

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:

image

 

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

 

Bookmark and Share

Cambios 2009

January 1st, 2009 by JuanK

Hola,

un feliz año para todos.

 

Como algunos ya lo habrán notado ha habido un ‘leve’ cambio de look en mi blog, y bueno en realidad ha sido un poco más que eso.

He cambiado el tema de manera radical principalmente porque ya ha pasado un buen tiempo desde que se creó ‘Blog de JuanK’  y desde ese entonces han sido muchas las cosas que se han hecho tanto planeadas como no planeadas, pero como todo en la vida también han habido muchas cosas que no se hicieron. Por ello el blog ha tenido todos estos cambios, algunos se han impactado al ver el cambio de interfaz y todo esto, pero realmente es algo perfectamente justificado y que esta de acorde a lo que quiero del blog.

 

Ya no hay más ‘Blog de JuanK’…

No quise seguir llamando al blog de esta forma porque realmente no es un blog de JuanK, es decir en el blog poco o nada hablo de mi mismo o de mi vida o nada por el estilo.

Ahora el blog se llama: Ideas de un Conejo

Bueno, bien habría podido ser Ideas de JuanK, pero ya se esta volviendo habitual que muchas personas me digan conejo -por diferentes motivos- así  que me pareció oportuno; de paso el conejo del blog es uno de los Rabbid del videojuego de Rayman para Wii, que como algunos sabrán no son conejos comunes y corrientes y están un poco ‘locos’ , y quiero que este blog sea un poco diferente, no tocar los mismos temas de los otros blog ‘parecidos’ y no vincularlo a los sistemas de información porque realmente no soy un experto haciendo sistemas de información con .net framework y es aquí donde se enlaza el nombre del blog con los cambios o mejor ajustes de fondo.

image

 

El subtitulo es claro, me dedicare a esos temas que son los que más me apasionan y me gustan, excepcionalmente se colaran algunos otros pero el foco principal del blog es ese. ¿Porqué “más allá  de los sistemas de información“? bueno eso es una historia que les compartiré a los que aún no lo saben.

 

Historia de ¿Porqué “más allá  de los sistemas de información“?

Nunca he trabajado a nivel empresarial con desarrollo ‘.net’ , siempre me he desempeñado en mi trabajo utilizando tecnologías Oracle y eventualmente utilizo .net framework para hacer alguna que otra tool en particular, pero eso es muy eventualmente.

Todo lo que he hecho y todo lo que he aprendido de desarrollo con CLR, C#, .net framework etc.. lo he logrado con mis proyectos personales, unos grandes , otros pequeños pero siempre han sido las cosas que yo he querido hacer para divertirme y para aprender…

adivinen:

Pues nunca he querido divertirme haciendo páginas web ni portales de internet ni sistemas de información para empresas ni nada de esas cosas, yo me divierto con cosas como desarrollo videojuegos, aplicaciones multimedia, cosas a ‘bajo nivel’, optimización de procesos etc.. eso es mi hobbie y teniendo en cuenta eso pues este blog se define como una extensión de mi hobbie.

Ok, espero que ya haya sido suficiente explicación, espero el blog les siga siendo de provecho.

 

Este post lo resumo con una sola frase:

 

hago esto para divertirme :)

 

 

Saludos.

Bookmark and Share