domingo, 22 de mayo de 2011

Conceptos básicos de los sistemas operativos (Parte II)

Archivos

La información es almacenada por el ordenador en dispositivos, como por ejemplo los discos. Para que el usuario pueda ignorar la estructura física del disco, el sistema operativo debe presentar la información almacenada de una forma organizada, que permita acceder a ella de una manera lógica y sencilla.

En este contexto, se entenderá por archivo un conjunto de información relacionada (definida por el usuario o no). En él pueden estar contenidos datos o programas. Un sistema operativo debe gestionar los archivos de una forma eficiente; para ello son necesarias operaciones tales como la creación, modificación y borrado de archivos. El sistema operativo debe proporcionar estas operaciones, permitiendo al usuario referirse a los archivos mediante nombres simbólicos.

Al manipular los archivos, el computador puede acceder a ellos de dos modos, dependiendo del medio de almacenamiento en que reside el archivo, el acceso secuencial y el acceso directo.

  • Con acceso secuencial se recorren los elementos de un archivo uno tras otro, consecutivamente. Este método de acceso viene impuesto por ciertos medios de almacenamiento, tales como las cintas magnéticas, aunque también puede darse en otros dispositivos, como los discos magnéticos, cuando los archivos tienen esta organización. 
  • Con acceso directo, los diferentes elementos pueden localizarse directamente por su posición, sin necesidad de recorrer los anteriores para llegar hasta ellos. Éste es el modo de acceso típico de los discos magnéticos.

Cuando el número de archivos crece, resulta incómoda su localización y manipulación. Para facilitarla, el sistema operativo presenta al usuario la posibilidad de agruparlos en compartimentos, llamados directorios. El sistema operativo deberá manejar la organización de directorios, ocultando al usuario los detalles particulares de la localización física de los archivos y directorios, facilitándole en cambio operaciones para gestionar cómodamente el sistema de directorios.

La técnica más comúnmente utilizada es usar una estructura en árbol, en la que existe un directorio raíz que puede contener archivos y/o (sub)directorios; a su vez cada directorio puede contener más archivos y/o más (sub)directorios.

Una imagen visual bastante útil de un sistema de archivos con estructura de árbol se consigue al considerar un directorio como una carpeta que contiene un cierto número de documentos (los archivos). En principio nada nos impide que coloquemos una carpeta dentro de otra (salvo quizá la limitación de espacio).

Una operación fundamental en la gestión de un sistema de archivos es la búsqueda eficiente de un archivo determinado. Si el número de archivos es pequeño lo más simple y lo mejor es buscar secuencialmente archivo tras archivo, pero si el sistema contiene muchos archivos esta táctica llevará mucho tiempo y, como esto es lo habitual, se han ideado estrategias para hacer el acceso más eficiente.

Un sistema de archivos con estructura de árbol

La idea de directorio de trabajo permite agilizar la búsqueda de archivos en el sistema; para ello es fundamental la noción de camino (en inglés path) desde la raíz del árbol hasta una rama determinada; por ejemplo, en el árbol de directorios los juegos adictivos tienen el path \juegos\adictivos. Si el directorio de trabajo fuera \juegos entonces adictivos\tetris (camino relativo al directorio de trabajo) tiene el mismo significado que \juegos\adictivos\tetris (camino absoluto). Para la optimización de la búsqueda de archivos se suele buscar sólo en el directorio de trabajo y en algunos otros paths especificados por el usuario.

Otra prestación ofrecida por la mayoría de los grandes sistemas operativos es la protección de la información. Debido a la facilidad con que puede borrarse la información almacenada, los sistemas operativos ofrecen dos mecanismos principalmente para asegurar archivos y directorios contra los descuidos, propios o ajenos:

  • un sistema de copias de seguridad (backup), que se pone en marcha automáticamente ante cada modificación efectuada sobre cada archivo.
  • un sistema de atributos, que permite marcar los archivos que necesitan copia de seguridad, como imborrables, como no susceptibles de modificación, etc.

Otro aspecto de la protección, igualmente importante en sistemas multiusuario, consiste en permitir el acceso y garantizar que el trabajo de cada usuario es privado, ocultándolo a los demás. Este efecto se consigue por lo general mediante un sistema de marcas, que identifia al propietario de los distintos archivos y directorios, y de contraseñas, que permite reconocer el usuario concreto que se encuentra ante cada terminal.

Conceptos básicos de los sistemas operativos (Parte I)

Procesos

Es importante el concepto de proceso para entender cómo funcionan los sistemas operativos. Un proceso consiste, esencialmente, en una rutina de acciones del sistema que puede ser ejecutada independientemente de otro proceso e, incluso, en paralelo. Un programa de usuario en ejecución puede considerarse un proceso, aunque un proceso puede involucrar la ejecución de más de un programa y, recíprocamente, un programa o rutina de instrucciones puede estar involucrado en más de un proceso. Por esta razón es más útil el concepto de proceso que el de programa al referirnos al sistema operativo.

Todo proceso creado puede ser tratado como un seudorrecurso pues, al contrario que los recursos reales, los procesos son entidades efímeras que desaparecen una vez completada su misión. Podría argüirse que los procesos son consumidores de recursos en lugar de ser recursos por sí mismos; sin embargo, una vez que han entrado en el estado transitorio de ser procesos, pueden ser "manejados" por otros procesos.

La gestión de procesos es una tarea fundamental de los sistemas operativos; concretamente, la mayoría de los sistemas operativos deben soportar la ejecución concurrente de procesos y resolver los problemas que ésta plantea, ofreciendo medios para la sincronización de los procesos, controlando su exclusión mutua respecto de ciertos recursos, y evitando, en la medida de lo posible, las situaciones de bloqueo. Estos conceptos se explican a continuación.

Dos o más procesos se dicen concurrentes cuando se están ejecutando simultáneamente. Cuando existen más procesadores que procesos, cada proceso se ejecutará sin conflicto en un procesador (paralelismo); si, por el contrario, existen más procesos que procesadores puede obtenerse una "simultaneidad aparente" (concurrencia) haciendo que los procesadores alternen cortos períodos de tiempo de dedicación a los distintos procesos.

Si dos procesos concurrentes utilizan recursos distintos podrán convivir sin interferencias pero si, por el contrario, los procesos necesitan los mismos recursos puede surgir con°icto. Supóngase que ambos recursos pretenden acceder a una impresora: es absolutamente inviable conmutar la dedicación de la impresora entre ambos procesos ya que, en ese caso, el resultado sería caótico. Este es un caso típico de necesidad de exclusión mutua de dos procesos respecto a un recurso.

Dos procesos concurrentes pueden necesitar cooperar al realizar sus tareas; por ejemplo, un proceso que genera líneas de texto que envía a un bffer y otro que las consume, tomándolas del buffer de datos y enviándolas a la impresora. Cuando así ocurre, es necesario que exista una sincronización de ambos procesos. 

Por último, puede darse la circunstancia de que dos (o más) procesos en ejecución concurrente se bloqueen mutuamente, en el sentido de que cada uno de ellos necesita un recurso que el otro posee. Llegados a este punto la ejecución se detiene, ya que cada proceso espera que el otro libere la información (o el recurso) que necesita. Esta situación se llama bloqueo (en inglés deadlock).

Formas de trabajo de los sistemas operativos

Los sistemas operativos han evolucionado para cubrir las distintas necesidades de proceso sobre máquinas de tamaño y potencia muy diversos. Aparecen así diferentes formas de trabajo y sistemas operativos especializados en cada una de ellas. Una de las principales distinciones se da entre los sistemas operativos de propósito general y los dedicados.

Los primeros, que son los más utilizados, se diseñan con una intención de polivalencia, de forma que sobre ellos puedan ejecutarse programas diversos: editores, compiladores y aplicaciones de todo tipo. Dentro de los sistemas operativos de propósito general puede distinguirse entre monousuario y multiusuario, dependiendo de si pueden atender o no a más de un proceso al mismo tiempo. Claramente, los sistemas multiusuario son más complejos pues, además de desempeñar todas las funciones propias de uno monousuario, deben atender a otros aspectos, tales como el reparto del tiempo de trabajo del (los) procesador(es) entre los distintos usuarios, la separación entre los datos de los mismos, etc.

En los sistemas operativos de propósito general, hay dos formas de trabajo básicas: el modo interactivo y el proceso por lotes. En el primero, el usuario tiene acceso a los recursos del sistema a través de su terminal (local o remoto), estableciendo un diálogo con el computador, donde las órdenes y las respuestas tienen lugar de un modo casi inmediato.

En un proceso por lotes, los diferentes trabajos junto con sus datos se suceden entre sí, de forma que su ejecución se realice automáticamente, sin ningún tipo de comunicación entre el usuario y el sistema, hasta la finalización del trabajo.

Dentro de los sistemas operativos dedicados, se suele distinguir entre los de control de procesos, de consulta de bases de datos y transaccionales. En el control de procesos, el computador recibe continuamente datos (realimentación) sobre el sistema bajo control, reaccionando en consecuencia. En la mayoría de estos procesos, la variable tiempo tiene una importancia relevante; por ejemplo, en un horno industrial, un retraso en la reducción de la temperatura puede tener funestas consecuencias.

En estos procesos, se dice que el sistema debe operar en tiempo real. Los sistemas de consulta deben permitir al usuario el acceso a una o varias bases de datos de una forma cómoda, sin tener que conocer los detalles internos de su organización y funcionamiento de su estructura. Se puede citar como ejemplo un sistema de consultas de historias clínicas en un hospital.

Por último, los sistemas transaccionales permiten la realización de operaciones sobre el contenido de bases de datos. Se han extendido enormemente en los últimos años. Por ejemplo, así se llevan a cabo los movimientos de cuentas en el sector bancario, la reserva y venta de billetes en agencias de viajes, etc.

Estos sistemas deben garantizar la opacidad de la información confidencial, actualizar rápidamente la base de datos y evitar ciertas operaciones simultáneas sobre los mismos datos (por ejemplo, dos personas que reservan el mismo asiento).

sábado, 21 de mayo de 2011

Funciones de los sistemas operativos

Si todo programador de aplicaciones tuviera que controlar "a mano" todos los componentes de la estructura interna del computador cuando hace sus programas, muy probablemente, no existirían tantos programas en el mercado. Por poner un ejemplo, emplear la instrucción escribir archivo es mucho ms simple que tener que preocuparse por mover las cabezas lectoras del disco hasta una posicion adecuada, esperar que se estabilicen, dirigir la información desde la memoria e ir escribiendo la información en el disco.

Conviene al programador de aplicaciones (o al mismo usuario) desentenderse de los complejos detalles del hardware. La idea fundamental para conseguirlo consiste en ocultar los escabrosos detalles del hardware puro con software (el sistema operativo) especialmente diseñado para permitir un uso más fácil y racional de todas las partes del sistema.

Del mismo modo, el sistema operativo presenta un interfaz simple entre el programador o usuario y otros aspectos del hardware, como son el manejo de interrupciones, relojes, gestión de memoria y otras características de bajo nivel.

Según este enfoque, el sistema operativo tiene la misión de presentar al usuario una máquina virtual que sea más fácil de programar que el hardware puro y, por lo tanto, aumente la efectividad del computador al evitar la necesidad de trabajar a bajo nivel. Por consiguiente, puede considerarse un sistema operativo como un interfaz adecuado entre el usuario y el hardware.

Un sistema operativo también tiene la función de controlar y administrar de forma ordenada el uso de todos los recursos del computador.

Esta función se hace especialmente necesaria cuando un computador está siendo compartido por varios usuarios simultáneamente; en este caso, la necesidad de distribuir convenientemente el tiempo de trabajo de la UCP, los espacios de memoria y los periféricos es evidente. Desde este punto de vista, la tarea del sistema operativo es llevar el control de quién está utilizando cada recurso y dirimir los posibles con°ictos entre varios procesos o usuarios que intenten acceder a la vez a un mismo recurso.

No existe acuerdo entre los diferentes textos al señalar cuáles son las funciones de un sistema operativo, ya que este concepto ha evolucionado con su desarrollo. En general, un sistema operativo debe poder desempeñar al menos las siguientes funciones:
  • Facilitar la comunicación hombre-máquina.
  • Gestionar los recursos: procesador(es), memoria(s) y periféricos, facilitando su manejo al usuario.
  • Gestionar la información (los archivos) contenida en los periféricos de almacenamiento y la organización de esa información (en directorios).
  • Controlar la ejecución de aplicaciones.

miércoles, 18 de mayo de 2011

Ejecución de una instrucción. Detalle

La ejecución de cada instrucción de máquina conlleva una serie de pasos elementales y transferencias de datos de unos órganos a otros de la UCP.

Estos pasos elementales se denominan microinstrucciones y son ejecutados por el secuenciador a partir del código de la instrucción de máquina.

La ejecución de una instrucción comienza cuando se actualiza el registro contador de programa. La UC envía esta dirección a los circuitos de selección de memoria a través del bus de direcciones y la señal de lectura a través del bus de control. La dirección queda almacenada en el registro de dirección de memoria y al recibir la señal de lectura, se lee la instrucción. La instrucción se envía a través del bus de datos y se recibe en el registro de instrucción de la UC. De esta forma, la UC tiene disponible la instrucción para ser decodificada y ejecutada.

Supongamos que la instrucción para ejecutar sea:
equivalente binario a:
La UC separa el código de operación (0100) de la dirección del operando (001111101000) y, a partir del código, genera las señales de control para enviar la dirección, a través del bus de direcciones, al registro de dirección de la MP, efectuar la operación de lectura y, finalmente, enviar el contenido de la dirección 1000 a un registro operativo de la UAL, a través del bus de datos.

A continuación se envía la señal de control correspondiente a la suma a la UAL, quien suma al contenido del acumulador el valor del registro operativo, quedando el resultado almacenado en el acumulador.

Ejemplo de un juego de instrucciones de máquina de una dirección

Maquina de una dirección simplificado. La notación M[d] representa el contenido de la dirección d de la memoria. La instrucción CARgar d deposita el contenido de la posición de memoria d en el  cumulador.

La instrucción ALMacenar d realiza el proceso contrario: guarda el contenido del acumulador en la dirección de memoria d. Las instrucciones IN d y OUT d se utilizan para E/S. La primera lee un dato de una posición de memoria destinada a un dispositivo externo y lo almacena en la dirección de memoria d; la segunda toma el contenido de la posición de memoria d y lo envía a la dirección de memoria destinada al dispositivo externo.


Las instrucciones SUMar d y REStar d, toman el contenido de la dirección de memoria d y lo suman y restan respectivamente con el contenido del acumulador, almacenando el resultado en dicho registro. El mismo proceso pero aplicando la multiplicación o la división es realizado por MULtiplicar d y DIVidir d

Las instrucciones OPuesto { y NOT { producen el cambio de signo (complemento a dos) o la complementación del contenido del acumulador. La dirección a la que se aplican no se utiliza.

Las instrucciones lógicas AND d y OR d toman el contenido de la dirección de memoria d y del acumulador, efectúan la operación and u or entre ambos operandos y almacenan el resultado en el acumulador. 

La instrucción GOTO d da un salto incondicional y actúa con independencia del valor del acumulador.

La instrucción CONDición d, toma el valor del acumulador, comprueba si es mayor que cero, y en caso afirmativo carga en el registro contador de programa la dirección d. En consecuencia, la siguiente instrucción que ejecutará el procesador será la contenida en la dirección d, produciéndose una ruptura de la secuencia de ejecución. Si no se cumple la condición prosigue la ejecución secuencial.

Por último, la instrucción END señala el final del programa.

Tipos de Instrucciones

Las instrucciones del juego de un procesador pueden ser divididas según su cometido en los siguientes grupos:

  1. De movimiento de datos. Este tipo de instrucciones transfieren datos entre la memoria principal y los registros. Combinando las distintas procedencias con los distintos destinos posibles obtenemos bastantes tipos de instrucciones de movimiento de datos. Puede tratarse de datos aislados, de bloques de datos o de cadenas de caracteres.
  2. Operaciones binarias. Estas instrucciones, aritméticas y lógicas, realizan una operación con dos argumentos como, por ejemplo, las operaciones aritméticas elementales y algunas operaciones lógicasbinarias tales como AND, OR y XOR.
  3. Operaciones monarias. Entre estas instrucciones podemos encontrar las que desplazan o rotan los bits de una palabra. Algunas operaciones binarias ocurren tan a menudo con un mismo argumento que, a veces, son incluidas como instrucciones de una sola dirección. Por ejemplo, tenemos la instrucción de borrar el contenido de una palabra de memoria, que es un caso particular de \mover una palabra formada por ceros a la dirección suministrada".
  4. Instrucciones de salto. Sirven para alterar el orden de ejecución de las instrucciones. Dentro de este grupo encontramos las instrucciones de salto condicional y las de salto incondicional: La ejecución de una instrucción de salto incondicional obliga al computador a "altarse" el orden secuencial para ejecutar la instrucción contenida en la dirección determinada por el argumento de la instrucción de salto, y el orden de ejecución sigue a partir de la instrucción sobre la que se saltó. Una instrucción de salto condicional necesita de instrucciones de comparación ya que es necesario realizar una o varias comparaciones para comprobar la condición. 
  5. Llamada a un subprograma. Un subprograma no es más que un grupo de  instrucciones que realiza operaciones útiles y necesarias en distintos puntos de un programa. Si, al ejecutar un programa, se encuentra una instrucción de llamada a subprograma, se ejecutan todas las instrucciones del subprograma y posteriormente se pasa a la siguiente instrucción del programa.
  6. Entrada y salida de datos. Es el tipo de instrucción que más cambia de un procesador a otro. Sirven para gestionar el intercambio de información entre el computador y el exterior.