martes, 24 de julio de 2012

METODOLOGIA DE DISEÑO DE LOS SISTEMAS OPERATIVOS


TEORIA DE SISTEMAS OPERATIVOS
EXPOSICION DE METODOLOGIA DE DISEÑO DE SISTEMAS
LIC. GERMAN RABANALES VAZQUEZ
MICHELL DIAZ HDEZ
INDICE
}  El problema del diseño
}  Metas
}  ¿Por qué es difícil diseñar sistemas operativos?
}  Diseño de interfaces
}  Principios para el diseño de interfaces
}  Paradigmas o modelos
}  La interfaz de llamadas al sistema
}  Implementación
}  Estructura del sistema operativo
}  Mecanismos y políticas
}  Ortogonalidad
}  Asignación de nombres
}  Estructuras estáticas y dinámicas
}  Diversas técnicas útiles
METAS
}  Es importante tener una idea clara de lo que se quiere!
}  Principales objetivos que se suelen perseguir:
}  Denir abstracciones: procesos, cheros, hilos, . . .
}  Proporcionar operaciones primitivas para manejar las abstracciones denidas
}  Garantizar el aislamiento:
* los usuarios solo puede ejecutar operaciones autorizadas con datos autorizados
* aislar fallos
}  Administrar el hardware
}  ¡No hay una solución única!
¿Por qué es difícil diseñar sistemas operativos?
}  Los SO son programas extremadamente grandes
}  Los SO tienen que manejar concurrencia
}  Los SO tienen que enfrentarse a usuarios hostiles en potencia
}  Los SO deben permitir a los usuarios compartir
}  información y recursos con otros usuarios seleccionados
}  Los SO deben ser exibles para poder adaptarse a posibles
}  cambios futuros en el Hardware y en el Software
}  Los SO deben ser generales para poder ser usados de muchas formas distintas
}  Los SO deben ser (trans) portables
}  Muchos SO deben ser compatibles con algún SO anterior
Diseño de interfaces
Principio 1. Sencillez
}  Las interfaces sencillas son más fáciles de entender e implementar
Principio 2. Integridad
}  La interfaz debe permitir hacer todo lo que los usuarios necesitan hacer
}  Pero los mecanismos que soportan la interfaz deben ser pocos
y sencillos (deben hacer una única cosa, pero deben hacerla bien)
Principio 3. Eciencia
}  La implementación de los mecanismos debe ser eciente
}  Debe ser intuitivamente obvio para el programador cu´anto
cuesta una llamada al sistema.
Paradigmas o modelos
}  Para comenzar el diseño, un buen punto de partida es pensar en como van los clientes a ver el sistema
}  Para los clientes es importante que todas las características del sistema formen un conjunto consistente coherencia arquitectónica
}  Básicamente, hay dos tipos de clientes:
}  Los usuarios, que interactúan con los programas de aplicación
y la interfaz graca de usuario (GUI)
}  Los programadores, que tratan principalmente con la interfaz
de llamadas al sistema
Paradigmas de interfaz de usuario
}  Se reeren a la forma en la que el usuario interactúa con el sistema operativo y con los programas de aplicación que usa
}  Lo importante no es el paradigma escogido, sino que haya uno solo que unique toda la interfaz de usuario
}  También es importante que todos los programas de aplicación lo usen: los diseñadores del sistema deben proporcionar herramientas para ello
}  Ejemplos:
}  Windows: acciones de ratón, opciones del menú (✭✭Archivo✮✮, ✭✭Edición✮✮, . . . )
}  Palmos: letra manuscrita y puntero
Paradigmas de ejecución
}  Paradigma algorítmico
}  La lógica básica se encuentra en el código
}  El programa realiza llamadas al sistema para solicitar servicios
}  Ejemplo: Unix
}  Paradigma controlado por eventos
}  Tras una preparación inicial, el programa se queda esperando a que el SO le notique un evento.
}  Útil para programas interactivos
}  Ejemplo: Windows
Paradigmas de ejecución
Paradigmas de datos
}  Todo SO debe tener un paradigma de datos que unique la forma en la que la interfaz de llamadas al sistema representa a los recursos (lógicos o físicos) denidos en el sistema
}  Ejemplos:
}  FORTRAN: todo es una cinta
}  Unix: todo es un chero
}  Windows: todo es un objeto
}  Web: todo es un documento
La interfaz de llamadas al sistema
}  Un SO debería ofrecer el menor número posible de llamadas al sistema. Para ello:
}  Importante tener un paradigma de datos unicador
}  Llamadas al sistema que manejen el caso general (¡sin perder la sencillez!) y procedimientos de biblioteca especicos. Por ejemplo: excl., execlp, execle, execv y execvp se basan en la misma llamada al sistem a: execve.
}  Las llamadas al sistema no deben ocultar la potencia del hardware, sólo ocultar propiedades indeseables
}  Habrá que decidir si se implementan llamadas al sistema orientadas a conexiones o no
}  Habrá que decidir si las llamadas al sistema son públicas (Unix) o no (Windows)
Estructura del sistema operativo
}  Hay varias alternativas: por capas, exokernels, cliente-servidor, etc.
}  Partes del SO deben facilitar la construcción de otras partes del SO:
}  Ocultar interrupciones
}  Proporcionar mecanismos sencillos de concurrencia
}  Posibilitar la construcción de estructuras de datos dinámicas Etc.
}  ¡Prestar especial atención a los manejadores de dispositivo!
}  Constituyen una parte muy importante del sistema global
}  Son la principal fuente de inestabilidad
Mecanismos y políticas
}  La separación entre mecanismos y políticas ayuda a la coherencia arquitectónica y a la estructuración del sistema
}  Los mecanismos se pueden implementar en el núcleo y la políticas fuera o dentro del núcleo
}  Ejemplo 1. Planicacion de procesos
}  Mecanismo: colas multinivel por prioridad donde el planicador siempre selecciona al proceso listo de mayor prioridad
}  Política: planicacion apropiativa o no, asignación de prioridades a procesos por usuario, etc.
}  Ejemplo 2. Gestión de la memoria virtual
}  Mecanismo: administración, listas de paginas
ocupadas y libres, transferencia de págs.. entre memoria y disco
}  Política: reemplazo de páginas global o local, algoritmo de reemplazo de páginas, etc.
Ortogonalidad
}  Ortogonalidad: capacidad de combinar conceptos distintos de forma independiente. Es consecuencia directa de los principios de sencillez e integridad.
}  Ejemplo 1. Procesos e hilos: separan la unidad de asignación de recursos (proceso) de la unidad de planicaci´on y ejecución (hilo), permitiendo tener varios hilos dentro de un mismo proc.
}  Ejemplo 2. Creación de procesos en Unix: se diferencia entre crear el proceso en si (fork) y ejecutar un nuevo programa (exec), lo que permite heredar y manipular dechero
}  En general, tener un número reducido de elementos ortogonales que pueden combinarse de muchas maneras da pie a un sistema pequeño, sencillo y elegante.

Asignación de nombres
}  Casi todas las estructuras de datos duraderas que utiliza un
SO tienen algún tipo de nombre o identicador (nombre de
dispositivo, de chero, identicador de proceso, etc.)
}  Es común que los nombres se asignen a dos niveles:
}  Externo: cadenas de caracteres (estructuradas o no) que usan los usuarios
}  Interno: identicacion usada internamente por el SO
}  Debe existir algún mecanismo que permita asociar unos nombres con otros. Ejemplo: los directorios (enlazan nombres de cheros con nodos-i)
}  Un buen diseño debe estudiar con detenimiento cuántos espacios de nombres van a necesitarse, qué sintaxis tendrían los nombres, cómo van a distinguirse, etc.
Estructuras estáticas y dinámicas
}  ¿Las estructuras de datos del SO deben ser estáticas o
}  dinámicas?
}  Las estáticas son más comprensibles, más fáciles de programar y de uso más rápido
}  Las dinámicas son más exibles y permiten adaptarse a la cantidad de recursos disponibles. Problema: necesitan un gestor de memoria dentro del propio SO
}  Según el caso, puede ser más adecuado un tipo u otro.
Ejemplo:
}  Pila de un proceso en el espacio de usuario: estructura dinámica
}  Pila de un proceso en el espacio de núcleo: estructura estática
}  También son posibles estructuras pseudo-dinamicas
Diversas técnicas útiles para la implementación
}  Ocultación del hardware
}  Ocultar las interrupciones, convirtiéndolas en operaciones de sincronización entre hilos (unlock en un mutex, envió de un mensaje, etc.)
}  Ocultar las peculiaridades de la arquitectura hardware si se desea facilitar la transportabilidad del SO
}  Los fuentes del SO deben ser ´únicos
}  La compilación debe ser condicional
}  La parte de código dependiente debe ser lo más pequeña posible
}  Ejemplo 1: HAL (Hardware Abstracción Layer) de Windows
}  Ejemplo 2: directorios arch e include/ asm -* en Linux

Diversas técnicas ´útiles para la implementación
}  Indireccion
}  ¡Flexibilidad!
}  Ejemplo: entrada por teclado. Al pulsar una tecla se obtiene un valor que no se corresponde con su código ASCII
Posibilidad de utilizar conguraciones distintas de teclados
}  Ejemplo: salida por pantalla. El código ASCII es el ´índice de una tabla con el patrón de bits del carácter a representar
Posibilidad de congurar el tipo de letra de pantalla
}  Ejemplo: nombres de dispositivo. En Linux, los nombres de los
}  cheros especiales son independientes de los números mayor y menor de dispositivo Posibilidad de cambiar el nombre a un dispositivo
}  Mishell Díaz
Diversas técnicas útiles para la implementación
}  Reentrabilidad
}  Se reere a la capacidad de un fragmento de código dado para ejecutarse dos o más veces de forma simultánea
}  La ejecución simultánea se puede dar en varios casos:
}  En un multiprocesador dos o más procesadores pueden estar
}  ejecutando la misma porción de código
}  En un monoprocesador puede llegar una interrupción que
}  ejecute la misma porción de código que se estaba ejecutando
}  Lo mejor, incluso en un monoprocesador, es que:
}  la mayor parte del SO sea reentrante (para que no se pierdan interrupciones),
}  que las secciones críticas se protejan
}  que las interrupciones se inhabiliten cuando no se puedan tolerar
Diversas técnicas útiles para la implementación
}  Fuerza bruta
}  ¡Optimizar cuando realmente merezca la pena!
}  Ejemplo 1. ¿Merece la pena tener ordenada una tabla de 100 elementos que cambia continuamente para que las búsquedas sean más rápidas?
}  Ejemplo 2. ¿Merece la pena optimizar una llamada al sistema que tarda 10 ms para que tarde 1 ms si se utiliza una vez cada
10 segundos?
}  ¡Optimizar las funciones y estructuras de datos de la ruta crítica! Ejemplo: cambio de contexto
Diversas técnicas útiles para la implementación
}  Vericar primero si hay errores
}  Una llamada al sistema puede fallar por muchas razones:
cheros que no existen o que pertenecen a otra persona, destinatario de un mensaje que no existe, etc.
}  También hay llamadas al sistema que necesitan obtener recursos
}  Lo mejor es comprobar primero si en verdad puede efectuarse la llamada al sistema Situar todas las pruebas al principio del procedimiento que ejecuta la llamada al sistema
}  Tras asegurarse el ´éxito, hay que obtener los recursos necesarios (¡cuidado con los posibles interbloqueos!)
}  Acelera la ejecución en el caso de que la llamada no se pueda realizar

Rendimiento
}  ¿Qué es mejor, un SO rápido y poco able o uno lento pero able?
}  Las optimizaciones complejas suelen llevar a errores Optimizar sólo si realmente es necesario
}  ¿Qué es mejor, un SO sencillo y rápido o uno complejo y lento? ¡Lo pequeño es bello! Antes de añadir una
}  funcionalidad nueva compruebe que realmente merece la pena
}  En cualquier caso, antes de optimizar, tenga en cuenta que lo bastante bueno es generalmente sucientemente bueno
*  Otra consideración importante es el lenguaje de programación a utilizar
Uso de cachés
}  Se aplican en situaciones en las que es probable que el mismo
}  resultado se necesite varias veces
}  Especialmente utiles para dispositivos de E/S
}  Ejemplo 1. Cachê de bloques o cachê de disco
}  Ejemplo 2. Caché de entradas de directorio
}  Ejemplo 3. Caché de páginas
Optimización del caso común
}  En muchos casos es recomendable distinguir entre el caso más común y el peor caso posible:
}  Es importante que el caso común sea rápido
}  El peor caso, si no se presenta a menudo, solo tiene que manejarse correctamente
}  Ejemplo: llamada EnterCriticalSection del API Win32.
}  Algoritmo:
}  Comprobar y cerrar mutex en espacio de usuario
}  En caso de éxito Entrar a la sección crítica (no ha hecho falta una llamada al sistema)
}  En caso de fracaso Ejecutar una llamada al sistema que bloquee al proceso en un semáforo hasta que pueda entrar a la sección crítica
}  Si lo normal es que la primera comprobación tenga éxito, nos
}  habremos ahorrado entrar al núcleo del SO
Bibliografía
}  Andrew Tanenbaum.
}  ✭✭Sistemas Operativos Modernos✮✮, 2ª edición, capítulo 12. Prentice Hall, 2003
}  Gary Nutt.
}  ✭✭Sistemas Operativos✮✮, 3ª edición, capítulo 19. Addison Wesley, 2004