Historia de los sistemas Operativos La evolución de los sistemas operativos (SO) es paralela a la evolución de las computadoras debido a que una de sus funciones principales es controlar los recursos (de software y hardware) asociados a ella. Las primeras computadoras eran muy costosas de ahí que la principal función de los SO de esa época era “controlar eficientemente los recursos del sistema”. Resulta comprensible que tener equipos tan costosos inactivos o usados de forma ineficiente representaba un costo económico demasiado alto. A ese objetivo inicial, aún vigente, se han incorporando otros que, en algunos casos, han pasado a ser mas importantes en dependencia del propósito del SO. Entre ellos cabe destacar el de “brindar una interfaz cómoda para el uso eficiente de los recursos”, que es un objetivo importante para cualquier SO destinado a computadoras personales que en muchos casos la usan personas que no son especialistas en Computación. Cuando el SO trata de controlar los recursos, surgen conflictos que deberá resolver y por eso “resolver conflictos”, es también una de sus funciones principales. Seguidamente se hace una apretada síntesis de la evolución de los SO a través del tiempo. Década del 40 Los primeros sistemas de cómputo no tenían SO, las computadoras se controlaban actuando directamente con el hardware, de ahí que su explotación estuviera asignada a personas muy especializadas. En realidad el programador era el propio operador por lo que tenía que dominar los detalles del hardware y la forma de explotarlo. Figura 1. Tubo al vacío Los trabajos de esta era incipiente de la computación estaban limitados a aplicaciones científicas o militares, corría el tiempo de las grandes computadoras de tubos al vacío (bulbos) que ocupaban salones enormes y la computación estaba muy lejos de convertirse en algo de uso masivo como lo es hoy en día. Un programa estaba formado por todo el conjunto de instrucciones que la computadora necesitaba para llevar a cabo sus funciones, por ejemplo instruía a la CPU acerca de detalles, tales como: dónde y cuándo almacenar las instrucciones de memoria, qué calcular, dónde encontrar los datos, dónde enviar la salida, etc. Los especialistas sólo conocían el tipo específico de computadora en la que trabajaban y resultaba muy difícil expandir sus resultados a medios diferentes a esos. Al pasar el tiempo, el hardware y el software se hicieron más estándares y la ejecución de los programas requería menos pasos. Se desarrollaron lenguajes que expresaban, en un código más cercano al lenguaje humano, las instrucciones a ejecutar, surgieron los compiladores y ensambladores para traducir a código binario esos lenguajes de nivel más alto. Se pensó que era mejor escribir el código para el manejo de cada tipo de equipo y tenerlo listo para ejecutarlo cuando se necesitara manipular algo hacia o desde él, desechando la vieja idea de escribir (una y otra vez) el código para el manejo del equipo en la propia aplicación. Se hicieron bibliotecas de funciones que hicieran esas tareas, surgiendo, de esta forma, los primeros manipuladores de equipos (device drivers). Al final de esta época comenzaron a tomar vida los sistemas operativos más rudimentarios en la forma de creación de macros, subrutinas estándar, programas utilitarios y manejadores de equipos. La figura 2, muestra una computadora de esa época, la Z4 diseñada por el científico alemán Konrad Suze. Figura 2. La Z4 de Konrad Suze (1942-1945) Década del 50 En esta época las computadoras seguían siendo muy caras y por esa razón se sentía la necesidad de hacer que trabajaran lo más eficientemente posible. Una forma para vencer la barrera de los costos era tratar de mantener la computadora ocupada el mayor tiempo posible. La solución tomó dos caminos principales, el primero se reflejó en dos trabajos distintos: • uno con relación a la eficiencia de la persona que trabajaba con la computadora hizo surgir el nuevo trabajo de “operador de computadora” el cual tenía la responsabilidad de mantenerla ocupada todo el tiempo, disminuyendo los tiempos en que debían permanecer sus componentes inactivos (principalmente la CPU), • el segundo con respecto a la tarea de programar hizo más específica la labor de este especialista que, a partir de ese momento y por mucho tiempo, no tendría que interactuar más con la máquina. El segundo camino hizo surgir el concepto de lote de tareas que consiste en agrupar un conjunto de tareas con requisitos afines, en una sola tarea. El operador sometía la tarea (como un todo) al equipo de cómputo y las salidas se clasificaban para enviarla al destino apropiado. Un ejemplo típico de un lote de trabajo consiste en la compilación de varios programas con el mismo compilador (Fortran, por ejemplo). Esta solución no resolvía el problema totalmente, por ejemplo si un trabajo se detenía el operador debía darse cuenta de eso (observando la consola) determinar si la terminación era normal o anormal, hacer un vaciado de memoria (si era necesario) para después cargar el lector con el próximo trabajo y restaurar la computadora. Durante todo ese tiempo, la CPU estaba inactiva y ese era un tiempo muy grande para el costo de las computadoras de esa época. Para paliar la situación anterior se introdujo el concepto de secuencia automática de trabajo y en ese instante surgió, realmente, el primer SO rudimentario. La solución consistía en tener cargado un pequeño programa llamado monitor residente (porque siempre estaba en memoria) que se encargara de transferir el control de un trabajo a otro en forma automática. Este SO rudimentario tomaba el control cuando la computadora se encendía y se lo transfería a un programa, el cual debía devolver el control al SO al terminar para que de nuevo el SO le transfiriera el control a otro programa y así hasta terminar. Para hacer esas tareas surgió un lenguaje de control de tareas o JCB por sus siglas en inglés (Job Control Language) que permitía establecer la secuencia de trabajos que debía seguir el SO. La secuencia era el conjunto de órdenes al SO que se daban a través de tarjetas perforadas que se ponían antes de las tarjetas que contenían el programa. El problema que debían resolver los SO de tratamientos por lotes está relacionado con el logro de una mejor eficiencia reduciendo al máximo el tiempo de espera que provoca el cambio manual de tareas, para lo cual se instrumentó el monitor residente. Aún así quedaba un problema que se relaciona con la reducida velocidad de los equipos periféricos con relación a la CPU, para lo cual se buscó una alternativa que pudiera disminuir el tiempo que debía esperar la CPU cada vez que tenía la necesidad de hacer una entrada o salida. Figura 3.UNIVAC (UNIVersal Automatic Computer) 1951 La figura 3 muestra la computadora UNIVAC, obsérvese (en primer plano) la consola del operador y en segundo plano las torres de banda magnética. La UNIVAC fue la primera computadora que se construyó con un propósito no militar, su costo estaba entre el millón o millón y medio de dólares (el dólar de aquellos tiempos tenía más valor), pesaba 7257 kg, estaba compuesta por 5000 tubos de vacío y podía ejecutar unos 1000 cálculos por segundo. Fue la primera computadora comercial de EE.UU. La UNIVAC se utilizó para predecir los resultados de las elecciones presidenciales entre Eisenhower y Stevenson y acertó pero la prensa lo atribuyó a que formaba parte de la campaña política, la máquina original está en el museo Smithsonian (se hicieron alrededor de 46 similares a ella). Inicio de la década del 60 Operación fuera de línea Aunque los periféricos incrementaron su velocidad (y aún hoy la siguen incrementando) nunca lograron alcanzar (ni parece razonable que la alcancen) la velocidad de la CPU que también se fue incrementando con el tiempo. Una solución fue la de sustituir los lentos equipos de entrada salida por otros equipos más rápidos, por ejemplo los lectores de tarjetas dejaron de conectarse directamente a la CPU y su lugar fue tomado por lectores de banda magnética (considerablemente más rápidos). La idea principal consistía en llenar la cinta en otro equipo (fuera de línea) y llevarla al equipo conectado a la computadora una vez llenada (el operador hacía esa función). Esta solución tuvo dos alternativas: • La primera fue la de especializar equipos de entrada y salida para conectarse directamente con los equipos de bandas magnéticas para el llenado de las cintas. • La segunda fue especializar pequeñas computadoras satélites (no conectadas a la computadora principal) para que cumplieran la misión del llenado de las cintas. Cabe señalar que este es el antecedente más remoto de la multicomputadora. Esta idea permite que una tarea corra sin tomar en cuenta si la entrada o la salida se origina o envía a un equipo u otro, el programador no necesita decir hacia donde va a escribir o desde donde va a leer para lo cual debe haber algún agente (una parte del SO) que se encargue de manejar el problema. Esta concepción de programar usando equipos lógicos (no físicos o reales) se conoce como independencia del equipo. Spooling La operación fuera de línea no duró mucho tiempo, los sistemas con discos se hicieron dueños del panorama rápidamente, la velocidad de estos periféricos con relación a todos sus antecesores era muy grande, por otra parte los discos eliminaban el principal defecto de la cinta que consistía en la forma secuencial de acceder a los datos y permitía que varios juegos de tarjetas (de trabajos diferentes) fueron almacenados en áreas distintas del disco que podían accederse en el momento deseado con solo mover el cabezal de lectura/escritura. En estos sistemas las tarjetas se leían directamente desde el lector de entrada y se almacenaban en áreas diferentes del disco, manteniendo una cierta tabla que describía los lugares donde las imágenes de entrada residían. Esta forma de trabajo recibió el nombre de SPOOL (simultaneous peripherical operating on line) por el significado de sus siglas en inglés, y la idea principal es que las entradas (o salidas) de un trabajo vayan a parar a un lugar del disco desde el que son tomadas o hacia el cual son escritas cuando se necesitan. Queda claro que en este esquema se logra que un equipo físico se transforme en varios equipos virtuales. Los sistemas spool forman parte de la mayoría de los SO modernos ya que sus ideas (modernizadas) aún son válidas y seguramente los lectores han podido ver esa tarea reportada por el administrador de tareas de los SO de la familia Windows. La figura 4, muestra una idea esquematizada de los sistemas de spool. Disco E- Entrada Salida CPU Figura 4. Idea esquematizada de un sistema de spool Mediados del 60 A mediados de los años 60 surgieron las computadoras de tercera generación que eran muy veloces al compararlas con sus antecesores y provocaban problemas cuando interactuaban con dispositivos relativamente lentos, la solución a este problema hizo surgir la multiprogramación que no es más que cargar varios trabajos en memoria y compartir el uso de la CPU. El SO escoge uno de los trabajos que están listos y comienza a ejecutarlo, puede que dicho trabajo tenga que esperar por algún evento externo (una entrada, una salida, etc.), el sistema operativo, en lugar de quedarse inactivo mientras espera que se satisfaga la demanda del trabajo, se cambia hacia otro trabajo y lo ejecuta. El principal problema de esta concepción es que si un trabajo está acotado a CPU (usa más CPU que entrada salida, por ejemplo los programas de cálculo científico), no da oportunidad para que otros se ejecuten. Por ese motivo surgieron los sistemas de tiempo compartido (no es más que una variante de la multiprogramación) en los cuales el procesador no se abandona en forma voluntaria, en lugar de eso el SO asigna espacios de tiempo conocidos como quantum para cada proceso y una vez vencidos los quantum asignados, le quita el procesador y lo transfiere a otro trabajo. La figura 5 presenta una computadora de la familia IBM, muy popular en la época, que se fabricó por primera vez en 1964 y se comercializó entre ese año y 1978. Para explotar estas computadoras se desarrolló el sistema operativo Operating System/360 (OS/360) que podía trabajar sobre las grandes computadoras de la IBM y también se desarrolló el Basic Operating System/360 (BOS/360) para las máquinas medianas. Figura 5. IBM 360 1964 Década de los 70 A fines de los 70 las computadoras tenían CPU más rápidas y se hizo mayor el distanciamiento entre éstas y los equipos de entrada/salida, los esquemas de multiprogramación estaban limitados por el tamaño de la memoria que no permitía cargar más trabajos. Surgió la idea de la memoria virtual, la cual consiste, en esencia, en usar la memoria secundaria o externa (de forma transparente a los usuarios) como una expansión de la memoria principal, los trabajos se dividen en unidades lógicas que solo se cargan cuando se necesitan lo que permite trabajar con más tareas “a la vez”. En esta época se le prestó mayor atención a la conservación de los recursos de datos, el software de administración de bases de datos se convirtió en una herramienta popular. Los programas se distanciaron más y más de las especificaciones de hardware o de software de “bajo nivel” y se convirtieron en juegos de palabras más cercanos a los lenguajes humanos o naturales. En el año 1971 Intel introduce el primer microprocesador (el Intel 4004) lo que daría comienzo posteriormente a la época de las microcomputadoras y a la expansión de estos importantes equipos a todas las esferas incluido los hogares. Existe mucha discusión acerca de cuál fue la primera computadora personal, incluso, algunos autores se remiten a épocas tan remotas como la década del 50 para lo cual se basan en varios aspectos (entre ellos el costo), sin embargo no hay duda alguna de que el surgimiento del microprocesador fue el que denotó la explosión que dio inicio a la proliferación de estas máquinas. Década de los 80 Se mejoró, notablemente, la relación costo/rendimiento de las computadoras, el hardware se hizo más flexible con tarjetas de fácil reemplazo que incorporaban funciones lógicas, más y más funciones del SO pasaron del software al hardware, lo que acuñó el nuevo término de firmware. La industria pasó al multiprocesamiento (uso de más de un procesador) y se elaboraron lenguajes que permitieran el manejo de los distintos procesadores que formaban parte de las máquinas. Por supuesto que los sistemas operativos de esta época, debieron asimilar estos avances del hardware. Las computadoras personales y las comunicaciones de alta velocidad llevaron al procesamiento distribuido y a las redes de computadoras. Década de los 90 A mediados de los 90 la demanda generalizada de capacidades de Internet originó la proliferación de la redes, hoy la accesibilidad a Web y el intercambio de correo electrónico son características comunes a los sistemas operativos. Durante esta década se incrementaron las aplicaciones multimedias que demandaron del SO potencia y flexibilidad para manejar diferentes equipos. Con estas nuevas técnicas se hace mas necesario administrar muy eficientemente la memoria que ha crecido enormemente, pero que a la vez se hace más escasa ya que las aplicaciones son más gastadoras de recursos. Actualidad Cada día que pasa el ser humano descubre más y más cosas, la computadora se ha convertido en su medio auxiliar inseparable para la cual mira cada vez que necesita resolver un problema. La solución de ese problema, a menudo, hace que se fabriquen nuevos medios que se pueden conectar a la máquina o que pueden incorporarse dentro de ella, cada nuevo componente necesita ser manipulado de una forma cómoda (como hacemos con el ratón o mouse) aislando al usuario (en el sentido amplio, persona u otro software) de sus interioridades. En todas esas nuevas soluciones deberá estar el SO como intermediario ideal y la tendencia es que esos nuevos medios se instalen de manera automática lo que se ha denominado tecnología plug and play.