Categoría: Varios

Sistemas operativos – Estados de los procesos

Para que un programa se ejecute, se debe crear un proceso para dicho programa. Desde el punto de vista del procesador, él ejecuta instrucciones de su repertorio de instrucciones en una secuencia dictada por el cambio de los valores del registro contador de programa. A lo largo del tiempo, el contador de programa puede apuntar al código de diferentes programas que son parte de diferentes procesos. Desde el punto de vista de un programa individual, su ejecución implica una secuencia de instrucciones dentro de dicho programa.

Se puede caracterizar el comportamiento de un determinado proceso, listando la secuencia de instrucciones que se ejecutan para dicho proceso. Esta lista se llama traza de proceso. Se puede caracterizar el comportamiento de un procesador mostrando como las trazas de varios procesos se entrelazan.

Por ejemplo, imaginemos el despliegue en memoria de tres procesos. Para simplificar la exposición, se asume que dichos procesos no usan memoria virtual; por tanto, los tres procesos están representados por programas que residen en memoria principal. De manera adicional, existe un pequeño programa activador (dispatcher) que intercambia el procesador de un proceso a otro.

Continuar leyendo

Sistemas operativos – Llamadas al sistema

Los sistemas operativos tienen dos funciones principales: Proveer de abstracciones a los programas de usuario mediante la máquina virtual multinivel y administrar los recursos de la computadora. La interacción entre los programas de usuario y el sistema operativo se relaciona con la primera función a través de llamadas al sistema. Las llamadas al sistema disponibles entre los programas de usuario y el sistema operativo varían de un sistema operativo a otro. En el caso de UNIX, programado en C, encontramos muchas de esas llamadas al sistema en la librería estándar de C llamada glibc. Esta librería nos proporciona llamadas directamente podemos usar desde un programa escrito en C. Muchas de las llamadas al sistema son complejas de utilizar incluso por un programador, por lo que glibc también hace abstracciones a nivel superior de las propias llamadas al sistema incluso de conjuntos de ellas para podamos utilizarlas al programar y así realizar una determinada acción de manera relativamente sencilla. Es el sistema operativo el que en última instancia lleva a cabo las llamadas al sistema.

Las llamadas al sistema son necesarias ya que un usuario no puede acceder o no tiene privilegios directos sobre los recursos que gestiona el sistema operativo y se pueden utilizar para solicitar al núcleo del sistema el uso de los mismos. Lo que ocurre cuando se invoca a una llamada del sistema desde un proceso en ejecución o desde una rutina de interrupción de E/S es lo siguiente:

  1. El programador o usuario realiza la llamada al sistema de forma normal. La llamada junto con los parámetros asociados a la misma se cargarían en la pila.
  2. La llamada al sistema invocada ejecuta una instrucción de interrupción especial del sistema operativo que se llama trap, implementada a nivel de lenguaje ensamblador dentro de la propia llamada, y que conlleva un cambio de modo. Al ejecutarse la instrucción trap se carga un programa que pasa el sistema operativo de modo usuario a modo núcleo y se busca el lugar del núcleo donde está cargada la rutina a ejecutar (normalmente será un conjunto de instrucciones de máquina cargadas en memoria principal que el procesador tiene que ejecutar y que al usuario se le prohíbe utilizar directamente por seguridad. La ejecución de una instrucción trap lleva consigo la necesidad de salvar el contexto del proceso que realizó la llamada, pero esto no conlleva un salvado y cambio de contexto completo como ocurre con las interrupciones. Un cambio de modo puede ocurrir sin que se cambie el estado del proceso actualmente en estado “ejecutando”. Si el proceso que está en ejecución se va a mover a cualquier otro estado (listo, bloqueado, etc), el sistema operativo debe hacer cambios sustanciales en su entorno y se lleva a cabo un cambio de contexto completo, al igual que ocurre con las interrupciones.
  3. Supongamos que no es necesario cambiar el estado del proceso actual. El programa cargado a partir de la instrucción trap, tras identificar que existe una rutina para la llamada realizada y que los parámetros son correctos, procede a ejecutarla.
  4. Posteriormente el programa trap solicita un código de estado almacenado en un registro, este registro señala si la llamada tuvo éxito o no y ejecuta una instrucción de tipo RETURN FROM TRAP (a nivel de núcleo) para regresar el control a la rutina de la biblioteca (modo usuario), devolviendo un determinado resultado en el caso de que se tenga que devolver algo, y el éxito o fracaso de la llamada al sistema.
  5. Cuando finalizan esas acciones, la rutina de biblioteca a nivel de usuario descarga la pila y comprueba el resultado de la ejecución de la petición al sistema, se lo devuelve al usuario y se continua por la siguiente línea de código del programa.

No debemos confundir una interrupción de E/S con una interrupción trap. La interrupción trap ocurre siempre que se realiza una llamada al sistema, es decir, cuando necesita ejecutar una rutina propia del sistema operativo. La ejecución de trap puede dar lugar a continuar con el mismo proceso o que se cambie a otro diferente. Cuando ocurre una interrupción trap en una llamada al sistema, el procesador se pone en modo núcleo y el control se pasa al sistema operativo. Cuando el sistema operativo está manejando en un momento determinado n imágenes de procesos, cada imagen no sólo incluye el programa, datos, pila y BCP, sino que además incluye o hace referencia a áreas de programa, datos y pila para los programas del núcleo. Se usa una pila de núcleo separada de los procesos de usuario para manejar llamadas/retornos cuando un proceso está en modo núcleo (trap). El código del sistema operativo y sus datos están en el espacio de direcciones compartidas y se comparten entre todos los procesos, es decir, cualquier proceso de usuario puede hacer referencia o llamar a rutinas en modo núcleo.

Sistemas operativos – Modo usuario y modo núcleo

Es necesario distinguir entre los modos de ejecución del procesador, normalmente asociados con el sistema operativo (modo núcleo) y con los programas de usuario (modo usuario).

Imaginemos que un usuario pudiera hacer cambios en tiempo real de las instrucciones que rigen el funcionamiento del sistema operativo y que interactúan con el hardware, que pudiera cambiar el manejador de interrupciones de reloj, la forma en la que se produce la comunicación entre un dispositivo E/S, es decir, que pudiera cambiar la codificación del sistema operativo o acceder a ella para controlarla a su manera. Si esto sucediera, se podría hacer un uso indebido del sistema operativo y del hardware, produciendo comportamientos inesperados y pudiendo corromper su funcionamiento. Por eso, es necesario que determinadas instrucciones del sistema operativo sólo puedan ser ejecutadas en modos privilegiados. Éstas serían lectura y modificación de los registros de control, instrucciones primitivas de E/S, instrucciones relacionadas con la memoria, instrucciones sobre señales, planificación, interrupciones, controladores de dispositivos, etc.

Continuar leyendo

Sistemas operativos – Control de procedimientos (PILA)

Una técnica habitual para controlar la ejecución de llamadas a procedimientos y los retornos de éstos, es utilizar una pila. Una pila es un conjunto ordenado de elementos, de forma que en cada momento sólo se puede acceder a uno de ellos, que correspondería al último elemento añadido (imaginemos una pila de libros). El punto de acceso a la pila se denomina cima. El número de elementos en la pila, o la longitud, puede ser variable. Una pila no es más que una lista de apilamiento donde el último elemento que llega a ella es el primero que sale (Last-In First-Out o LIFO).

Continuar leyendo

Sistemas operativos – Multiprogramación

El concepto de multiprogramación está muy ligado a las interrupciones, ya que mediante la multiprogramación se consigue aprovechar el uso de la CPU. Al producirse una interrupción, el procesador salva el contexto del proceso que se encuentra en ese momento en ejecución y otorga la CPU al siguiente proceso en cola en base a una planificación establecida. Si el procesador quedase a la espera de que la interrupción completase la operación, se malgastaría mucho tiempo de procesamiento que puede ser empleado en otras tareas. A esto se le conoce como monoprogramación, y es un concepto desaparecido hoy día.

Continuar leyendo

Sistemas operativos – Técnicas de comunicación de E/S

Existen tres técnicas para llevar a cabo las operaciones de E/S:

  • E/S programada
  • E/S dirigida por interrupciones
  • Acceso directo a memoria (Direct memory access o DMA)

E/S programada

Cuando el procesador ejecuta un programa y encuentra una instrucción relacionada con la E/S (leer, escribir o comprobar el estado de un dispositivo), ejecuta esa instrucción generando uno o varios mandatos al módulo de E/S apropiado. En el caso de la E/S programada, el módulo de E/S realiza la acción solicitada pero no realiza ninguna acción para avisar al procesador. Por tanto, después de invocar la instrucción E/S, el procesador debe tomar un papel activo para determinar cuándo se completa la instrucción. El procesador comprueba periódicamente el estado del módulo E/S hasta que se completa la operación. Aquí no se ha producido ninguna interrupción, sin embargo, el procesador ha colaborado con el módulo E/S para comunicarse en dirección al dispositivo externo y no al revés.

Continuar leyendo

Sistemas operativos – Sistema de Entrada-Salida (E/S)

Los ordenadores actuales están basados en la arquitectura de Von Neumann. Esta arquitectura consta de tres partes claramente diferenciadas: El procesador, la memoria y uno o varios dispositivos de E/S. Para conectar estas partes, se usan tres tipos básicos de buses:

  • Bus de datos: Puede ser de 8, 16, 32 o 64 bits, dependiendo del modelo de procesador.
  • Bus de direcciones: Se usa para poder conectar la CPU con la memoria y con dispositivos de E/S.
  • Bus de control: Se usa para enviar señales que determinan cómo se comunica la CPU con el resto del sistema.

Con esta arquitectura, debe haber un sistema que se encargue de comunicar y gestionar los dispositivos de E/S con el procesador, reduciendo la carga de trabajo en la CPU tanto como sea posible. Esto es el módulo de E/S.

Continuar leyendo

Sistemas operativos – Interrupciones

Prácticamente todos los computadores proporcionan un mecanismo para mejorar el uso del procesador y por el cual, módulos como los de E/S pueden interrumpir el secuenciamiento normal del mismo. A continuación se describirán los cuatro tipos de interrupciones más comunes. Los dos primeros tipos corresponden a interrupciones de software, y los dos últimos a interrupciones de hardware:

  • De programa: Generada por alguna condición que se produce como resultado de la ejecución de una instrucción, como por ejemplo un desbordamiento aritmético, una división entre cero, un intento de ejecutar una instrucción ilegal o una referencia errónea a memoria.
  • Por temporizador: Generada por un temporizador del procesador. Permite al sistema operativo realizar funciones de forma regular.
  • De E/S: Generada por un controlador de E/S para señalar la conclusión normal de una operación, o para indicar diversas condiciones de error.
  • Por fallo de hardware: Generada por un fallo, como un fallo de energía, o un error de paridad en la memoria.

Continuar leyendo