Visión general Los sistemas operativos se pueden analizar desde diferentes perspectivas, estas pueden ser (entre otras): Enfocarse en los servicios que brinda. Analizarlo tomando en cuenta la interfaz que brinda a usuarios y programadores. Tomar en cuenta los componentes que lo conforman y la manera en que ellos interaccionan. Servicios Los servicios que brinda un sistema operativo dado pueden diferir de los ofertados por otros pero, en todos los casos, esos servicios deben proveer un medio cómodo para que los programadores y usuarios puedan usar la computadora de una forma eficiente y fácil. Servicios que ayudan a los usuarios Interfaz de ejecución Casi todos los SO poseen una interfaz que puede tener diferentes formas, dos muy populares son: o La interfaz de línea de comandos. o La interfaz gráfica tan popular hoy en día. Otra, no tan popular, es la interfaz que se brinda a través de lotes (batch) de tareas que se cargan en un archivo que contiene el conjunto de comandos u órdenes que deben ejecutarse. Ejecución de programas El sistema debe ser capaz de cargar los programas en memoria, ejecutarlos (transformándolos en procesos) y terminarlos normal o anormalmente. Operaciones de entrada-salida Cuando un proceso realiza sus tareas necesita, por lo general, leer y escribir datos desde y hacia archivos o equipos específicos con 1 características propias que exigen diferentes manipulaciones. Estas operaciones, usualmente, se realizan por el SO y no directamente por los procesos de usuarios. Manipulación de archivos Los procesos necesitan manipular archivos y directorios, creándolos, destruyéndolos, copiando información, etc. Comunicación Por muchas razones los procesos necesitan comunicarse entre sí e intercambiar información, la comunicación puede establecerse entre procesos que se ejecutan en la misma o en diferentes computadoras unidas por una red. La comunicación puede hacerse a través de mensajes o a través de una memoria compartida. Detección de errores Existen diferentes vías que producen errores y el sistema operativo es responsable de tomar la acción apropiada cada vez que ocurran. Servicios que proporcionan eficiencia al SO Asignación de recursos El hecho de que existan varios usuarios y múltiple procesos ejecutándose a la vez hace clara la necesidad de la existencia de mecanismos que controlen la asignación de los recursos. Contabilidad Estos servicios permiten conocer los tipos de recursos que usan los usuarios, durante qué tiempo, en qué cantidad, etc. Forma de brindar los servicios Todos los SO ofrecen servicios a través de: Programas de sistemas que pueden venir formando parte del propio SO o que se distribuyen como programas independientes que son cargados por órdenes expresas de los usuarios para hacer diversas tareas. 2 Llamadas al sistema. Son invocaciones a funciones propias del sistema operativo que normalmente residen en su núcleo. A manera de ejemplo se muestra la cadena de llamadas al sistema (se resaltan en negrita) que provoca la simple orden de copiar un archivo, supóngase que se hace de forma interactiva: 1) Para adquirir el nombre del archivo fuente. a. Escribir la petición en pantalla. b. Leer el nombre desde el tecleado. 2) Para adquirir el nombre del archivo destino. a. Escribir la petición en pantalla. b. Leer el nombre tecleado. 3) Abrir el archivo de entrada, si no existe abortar la operación. 4) Crear el archivo de salida. 5) Hasta que la lectura falle a. Leer la entrada b. Escribir lo leído hacia la salida 6) Cerrar ambos archivos. 7) Terminar normalmente. Los programadores, raras veces, ven tanto nivel de detalles o actúan con funciones que están a un nivel superior, pero los especialistas en Ciencia de la Computación sí deben saber todos esos detalles, ya que ellos son los que están preparados para hacer modificaciones al SO e incluso hacer nuevos sistemas. Algunas de las funciones que están a un nivel superior (no de un usuario cualquiera) se incluyen dentro del conjunto de funciones conocidas como API (application programming interface). Existen tres familias de API muy comunes: Win32 para sistemas operativos de la familia Windows. 3 POSIX para los sistemas basados en POSIX (casi todas las versiones de Linux, UNIX y MAC OS X). Las API de Java para la JVM. En todos estos casos, al usar una función incluida en la API se está haciendo una llamada al sistema que en realidad hace el trabajo, observe la figura 1. Puede apreciarse el cambio que hace el SO de modo usuario a modo kernel. Aplicación de usuario open( ) Modo usuario Interface de llamada al sistema Modo núcleo i . . . open( ) Implementación de la llamada al sistema open( ) . . . . . . return Figura 1. El SO manipula una llamada al sistema. Las llamadas al sistema también necesitan que se le pasen parámetros, la figura 2 muestra una visión general de cómo hacerlo. En ella se aprecia la relación que existe entre un programa de usuario, que usa la función de C estándar printf, y la llamada al sistema write, debe observarse de nuevo el cambio de modo del SO en el que se puede apreciar el concepto conocido como operación dual. 4 #include <stdio.h> int main ( ) { . . . printf ("Hola"); . . . return o; } Modo usuario Biblioteca estándar de C Modo núcleo write( ) Llamada al sistema write( ) Figura 2. Relación entre printf y write Estructura del SO Sistema de matrícula Registros de software Control de graduados Compiladores Enlazadores Intérprete de comandos Sistema Operativo Lenguaje de máquina Microprogramación Hardware Figura 3. Estructura de un sistema de cómputo 5 La figura 3 muestra la estructura de un sistema de cómputo, donde se puede apreciar el sitio que ocupa el SO. La parte inferior de las capas que se muestran es la que contiene el hardware (componentes eléctricos y mecánicos) que no es de interés de este sistema de enseñanza. La microprogramación está, generalmente, integrada a la memoria de solo lectura conocida como ROM. En esa capa se encuentra un software muy primitivo que controla, en forma directa, los dispositivos físicos que se encuentran en la capa de software (es un firmware). Algunas instrucciones de lenguaje de máquina (ADD, MOVE, JMP) se interpretan por el microprograma que la transforma en un conjunto de instrucciones básicas para después comunicarse con los dispositivos físicos y satisfacer la petición original. El conjunto de instrucciones que interpreta el microprograma define el lenguaje de máquina y, aunque no forma parte de la máquina en sí, muchos fabricantes lo consideran así y de ahí la confusión. En resumen todo lo mencionado hasta el momento (sería mejor quitar de ahí al lenguaje de máquina) conforma la máquina real tal y como cualquiera la puede comprar. Encima de la máquina real se sitúa el SO, transformando a la máquina real en una máquina virtual que tiene más potencialidades. Después del SO están los programas de sistemas (compiladores, enlazadores, el Shell, etc.) y por último se pueden apreciar las aplicaciones. 6 Programas de aplicación Programas del sistema residentes en memoria Manipuladores de equipos del SO Manipuladores de equipos de la ROM BIOS Figura 4. Estructura del SO MS-DOS La figura 4 muestra la estructura simple del SO MS-DOS. Este SO, es un ejemplo típico de un sistema que se diseñó sin tomar en cuenta la dimensión, más bien la popularidad que iba a alcanzar, por ese motivo no está bien estructurado en módulos con funciones específicas, las interfaces y los niveles de funcionalidad no están bien separadas y por eso es proclive a la intervención de programas maliciosos, aunque en justicia estaba limitado por las propias fronteras que imponía el procesador (8086-88) sobre el cual se implementó. La versión original de UNIX también tenía una estructura limitada que venía dada por las propias limitantes del hardware de la época. Estaba formado por dos partes separadas, el kernel y los programas de sistemas (figura 5). Esa estructura monolítica es muy difícil de mantener debido a que las partes son demasiado grandes y abarcan muchas funcionalidades que deberían estar separadas. 7 Usuarios Intérprete de comandos, comandos. Compiladores e intérpretes. Bibliotecas del sistema. Kernel Llamadas al sistema-sirve de interfaz para el núcleo (kernel) Manipuladores de señales y de terminales. Sistema de E/S de caracteres Sistema de archivo Sistema de intercambio (swapping ) y de E/S de bloques. Manipuladores de disco y cintas Manipulador de la CPU Sistema de memoria virtual paginado y segmentado Interfaz kernel-hardware Controladores de terminales Equipos controladores de disco y cinta Controladores de memoria física Figura 5. Estructura del SO UNIX (original) Una solución al problema anterior es migrar algunas de las funcionalidades del kernel de forma que tenga un kernel pequeño, conocido como microkernel, y adicionalmente formar capas con diferentes funcionalidades. Una idea más actual es que el sistema operativo se haga en forma modular y use las facilidades de las técnicas de programación orientada a objetos, la figura 6 presenta una idea de esta concepción. En este caso el kernel posee un conjunto de componentes que se enlazan dinámicamente a otros servicios durante el proceso de carga o de ejecución, lo cual es muy común en las versiones actuales de UNIX, por ejemplo Solaris, Linux y Mac OS. 8 Planificación Manipuladores de equipos y buses Sistema de archivos Núcleo Misceláneas Llamadas al sistema Torrentes Figura 6. Estructura del SO Solaris Máquinas virtuales La idea de las capas se toma en cuenta para definir el concepto de máquina virtual que no debe confundirse con la máquina virtual que crea el SO al agregar funcionalidades nuevas al hardware. La idea, en este caso, es abstraer el hardware de una computadora (todos sus componentes) en diferentes ambientes de ejecución para crear la ilusión de que cada ambiente se ejecuta sobre una computadora particular. La máquina virtual no ofrece nuevas funcionalidades sino que presenta una interface idéntica a la máquina simple que está debajo de ella. 9