Indice1. Objetivo del Software 2. Arquitectura 3. Componentes 4. Comunicación entre procesos 5. La administración de los procesos y el procesador 6. Coordinación y sincronización de procesos 7. Administración de memoria 8. La administración de los archivos 9. La seguridad y protección 10. Conclusión final del trabajo 11. Referencia Bibliográfica
1. Objetivo del Software
El sistema UNIX ha sido usado ampliamente por mas de 28 años, y ha ayudado a definir muchas áreas de computación. Numerosas organizaciones han contribuido y todavía contribuyen al desarrollo del sistema UNIX.
- El sistema UNIX se invento en los Laboratorios Bell
- El Grupo de Investigación de Sistemas de Computo (CSRG) en la Universidad de California en Berkeley, le dio memoria virtual a UNIX y la implementación de referencia de TCP/IP.
Diseño de Software Berkeley, Incorporado (BSDI), El Proyecto FreeBSD, y El Proyecto NetBSD continúan con los trabajos empezados por el CSRG. El BSD4.4 amplió la base de hardware del BSD4.3, y ahora soporta numerosas arquitecturas, incluyendo Motorola 68000, Sun de SAPARC, MIPS, y PCs de Intel. Remedia varias deficiencias del BSD4.3. En particular el sistema de memoria-virtual necesitado fue completamente reemplazado. Añade una implementación de protocolos de red de la suite ISO, además aumenta y mejora el rendimiento de TCP/IP. El manejador de terminal ha sido cuidadosamente conservado compatible no solamente con Séptima Edición (Seventh Edition), sino incluso con Sexta Edición (Sixth Edition). Lo mas critico del BSD4.3 fue la falta de soporte para sistemas de archivo múltiple. El BSD 4.4 incluye una interface orientada a objetos para sistemas de archivos similar al marco de trabajo vnode de Sun. El BSD 4.4 hizo pequeñas extensiones a la interface de socket para permitir la implementación de los protocolos de red ISO.
Quien lo desarrollo. Distribuciones de Software Berkeley (Berkeley Software Distributions) Estos sistemas Berkeley han introducido varios programas y facilidades útiles para la comunidad UNIX.
En que fechas lo desarrollo. La ultima versión de CSRG fue tener dos versiones del BSD 4.4 , para ser liberadas en Junio de 1993. Una fue para seguir teniendo una distribución tradicional de código fuente y binario total, llamadoBSD4.4-Sobrecargado, que requirió el receptor para tener una licencia de código UNIX. La otra fue para tener un subconjunto del fuente, llamado BSD4.4 Lite, este fue liberado un año mas tarde, en 1994. Y una versión corregida de BSD 4.4 Lite fue distribuida en Junio de 1995.
Características principales.
- Soporta numerosas arquitecturas (Motorola 68000, Sun SPARC, MIPS, y PCs de Intel.
- Sistema de memoria-virtual reemplazado y mejorado.
- implementación de protocolos de red en la suite ISO.
- Mejoramiento de la funcionalidad de TCP/IP.
- Manejador de terminal compatible con Sexta y Séptima Edición.
- Interface orientada a objetos para sistemas de archivos, soporta sistemas de archivo múltiples locales y remotos.
- Soporta numerosos tipos de sistemas de archivos, incluyendo : Loopback, Unión, y capas de mapeo uid/gid. Además un sistemas de archivos ISO9660 útil para CDROMs.
- Soporta Sistema de Archivos de Red(NFS) de Sun Versión 2 y 3 y un sistema de archivo lógico estructurado basado en disco.
- Pequeñas extensiones para la interface de sockets para permitir la implementación de los protocolos ISO.
Que impacto ha tenido Mucho del trabajo de desarrollo de Berkeley fue hecho en respuesta a la comunidad de usuarios. Expectativas e ideas vinieron no solo de DARPA, la organización principal directamente fundadora, sino también de usuarios del sistema en compañías y universidades de todo el mundo. Los investigadores de Berkeley aceptaron no solo ideas de la comunidad de usuarios, sino también a usuarios del software actual. Contribuciones al BSD 4 vinieron de universidades y otras organizaciones en Australia, Canadá, Europa y los Estados Unidos. Estas contribuciones incluyeron características de importancia, tales como auto configuración y tiempos de disco. Berkeley solicito correo electrónico para corregir bugs y propuestas. La casa de software MT XINU de UNIX distribuyo una lista de bugs compilados de ese correo. Muchos de los bugs corregidos fueron incorporados en distribuciones posteriores. Hay una constante discusión de UNIX en general (incluyendo el BSD 4.4) en el grupo de noticias USENET comp.unix, los cuales son distribuidos en la Internet; ambos la Internet y la USENET son de alcance internacional. Existe otro grupo de noticias USENET dedicado a los bugs del BSD 4: comp.bugs.4bsd. Después, fue creado un grupo de noticias moderado dedicado a las correcciones CSRG-sancionado para tales bugs, llamado comp.bugs.4bsd.bug-fixes.
El kernel del BSD4.4 provee 4 características básicas: Procesos, un sistema de archivos, comunicaciones, y un sistema de arranque.
- Procesos:
Constituye un hilo de control en un espacio de dirección. Cuenta con mecanismos para crear, terminar y controlar procesos. El sistema múltiplexa espacios separados de dirección – virtual para cada proceso.
- Sistema de archivos
El conjunto de archivos es un conjunto de archivos nombrados, organizados en una estructura de árbol jerárquico de directorios, y de operaciones para manipularlos. Los archivos residen en un medio físico tal como discos. El BSD 4.4 soporta varias organizaciones de datos en disco. Acceso a archivos en maquinas remotas. Las terminales son usadas para acceder el sistema.
- Comunicaciones
Los mecanismos de comunicación proporcionados por sistemas tradicionales de UNIX incluye flujo simple de byte confiable entre procesos relacionados, y notificación de eventos excepcional, el BSD4.4 también tiene una característica general de comunicación – ínter procesos. Esta característica usa mecanismos de acceso distintos del sistema de archivo, pero una vez que una conexión se hace, un proceso puede accesarla como si fuera una conexión directa (pipe). Existe un marco general de red, que es normalmente usado como una capa por debajo de la característica IPC( Interprocessing comunications).
- Sistema de arranque
Cualquier sistema operativo real tiene asuntos operacionales, tales como, como arrancarlo y ponerlo en operación. Sistema operativo base El sistema operativo base como se ha insinuado antes es el UNIX, del cual la primer versión fue desarrollado en los Laboratorios Bell en 1969 por Ken Thompson como un proyecto de investigación privado para usar una de otra manera ociosa PDP-7. Pronto Dennis Ritchie se unió a Thompson, quien no solo contribuye al diseño e implementación del sistema, sino que también invento el lenguaje de programación C. El sistema fue completamente reescrito en C, dejando muy poco lenguaje ensamblador.
Plataforma en la que trabaja El BSD4.4 amplió la base de hardware del BSD4.3, y ahora soporta numerosas arquitecturas, incluyendo Motorola 68000, Sun de SAPARC, MIPS, y PCs de Intel.
Podemos ver la organización del Kernel del BSD 4.4 en dos formas.
- Como un cuerpo estático de software, categorizado por la funcionalidad ofrecida por los módulos que componen el kernel.
- Por su operación dinámica, categorizada de acuerdo a los servicios proporcionados a los usuarios.
La parte mas larga de las implementaciones del Kernel los servicios del sistema que las aplicaciones accedan a través de llamadas al sistema. En BSD 4.4, este software ha sido organizado de acuerdo a lo siguiente:
- Facilidades básicas del kernel:
Manejo del timer y del reloj del sistema, administración de descriptor y administración de procesos.
- Soporte de administración – de memoria:
Paginación e intercambio.
- Interfaces del sistema genéricas:
Las Entradas/Salidas, control, y operaciones de multiplexado ejecutadas en descriptores.
- El sistema de archivos:
Archivos, directorios, conversión de nombres de ruta, bloqueado de archivo, y administración de Entradas / salidas del buffer.
- Soporte para manejo de terminal:
El manejador de interface – de – terminal y las disciplinas de terminal en línea.
- Facilidades de comunicación – ínter procesos:
Sockets
- Soporte de comunicación de red:
Protocolos de comunicación y facilidades genéricas de red, tal como encaminado. Mas del software en estas categorías es independiente de maquina y es portable en diferentes arquitecturas de hardware. Los aspectos dependientes-de-maquina del kernel son aislados del código principal. En particular, ninguno del código independiente-de-maquina contiene código condicional para una arquitectura especifica. Cuando una acción dependiente-de-arquitectura es necesitada, el código independiente-de-maquina llama una función dependiente-de-arquitectura que es localizada en el código dependiente-de-maquina. El software que es dependiente de maquina incluye:
- Acciones de sistema-de-arranque de bajo nivel.
- Manejo de fallas y trampas.
- Manipulación de bajo nivel del contexto en tiempo de ejecución de un proceso.
- Configuración e inicialización de dispositivos de hardware.
- Soporte de tiempo de ejecución para dispositivos de Entrada/Salida.
Tabla
Software independiente de maquina en el kernel BSD 4.4.
Categoría | Líneas de código | % De kernel |
Encabezados | 9,393 | 4.6 |
Inicialización | 1,107 | 0.6 |
Facilidades del kernel | 8,793 | 4.4 |
Interfaces genéricas | 4,782 | 2.4 |
Comunicación ínter procesos | 4,540 | 2.2 |
Manejo de terminal | 3,911 | 1.9 |
Memoria virtual | 11,813 | 5.8 |
administración vnode | 7,954 | 3.9 |
Nombrado del sistema de archivos | 6,550 | 3.2 |
Almacenamiento de archivos rápido | 4,365 | 2.2 |
Estructura lógica de almacenamiento de archivos | 4,337 | 2.1 |
Memoria basada en almacenamiento de archivos | 645 | 0.3 |
Sistema de archivo cd9660 | 4,177 | 2.1 |
Misceláneos (10) Sistema de archivos | 12,695 | 6.3 |
Sistemas de archivos de red | 17,199 | 8.5 |
Comunicación de red | 8,630 | 4.3 |
Protocolos de Internet | 11,984 | 5.9 |
Protocolos ISO | 23,924 | 5.9 |
Protocolos X.25 | 10,626 | 5.3 |
Protocolos XNS | 5,192 | 2.6 |
Total Independiente de maquina | 162,617 | 80.4 |
Tabla
Software dependiente de maquina para la HP300 en el kernel BSD 4.4.
Categoría | Líneas de código | % De kernel |
Encabezados dependientes de maquina | 1,562 | 0.8 |
Encabezados manejadores de dispositivo | 3,495 | 1.7 |
Fuente manejador de dispositivo | 17,506 | 8.7 |
Memoria virtual | 3,087 | 1.5 |
Otros dependientes de maquina | 6,287 | 3.1 |
Rutinas en lenguaje ensamblador | 3,014 | 1.5 |
Compatibilidad HP/UX | 4,683 | 2.3 |
Total dependiente de maquina | 39,634 | 19.6 |
Aplicaciones
El sistema UNIX corre en computadoras desde sistemas de casa personales hasta grandes supercomputadoras. Es el sistema operativo de selección para sistemas multiprocesador, gráficos, y procesamiento de vector, y es ampliamente usado para su propósito original de compartimento de tiempo. Es la plataforma mas común para proveer servicios de red (desde FTP hasta WWW) en la Internet. Es el sistema operativo mas portable jamas desarrollado.
4. Comunicación entre procesos
La comunicación entre procesos en BSD 4.4 es organizada en Dominios de Comunicación. Los dominios actualmente soportados incluyen:
- Dominio Local
Para comunicación entre procesos ejecutándose en la misma maquina
- Dominio de Internet
Para comunicación entre procesos usando la suite de protocolos TCP/IP (quizás dentro de la Internet)La familia de protocolos para comunicación entre sitios requeridos para correrlos.
- El dominio XNS
Para comunicación entre procesos usando los protocolos de Sistemas de Red XEROX (XNS: XEROX Network Systems) Dentro de un dominio, la comunicación toma lugar entre puntos finales de comunicación conocidos como Sockets. La llamada al sistema de Socket crea un socket y regresa un descriptor. Cada Socket tiene un tipo que define su semántica de comunicación; esta semántica incluye propiedades tales como confiabilidad, ordenación, y prevención de duplicación de mensajes. Cada Socket tiene asociado con el un Protocolo de Comunicación. Este protocolo proporciona la semántica requerida por el Socket de acuerdo con los tipos mas recientes. Las aplicaciones pueden requerir un protocolo especifico cuando crea un Socket, o puede permitirle al sistema seleccionar un protocolo que sea apropiado para el tipo de socket que ha sido creado. Los Sockets pueden tener direcciones consecutivas. La forma y significado de direcciones de socket son dependientes del Dominio de Comunicación en el cual el socket es creado. Comprometer un nombre a un socket en el Dominio Local causa la creación de un archivo en el sistema de archivos. Datos normales transmitidos y recibidos a través de socket son sin tipo. Asuntos de representación de datos son la responsabilidad de librerías construidas en la parte superior de las facilidades de Comunicación – ínter procesos. Además de la transportación de datos normales, los Dominios de Comunicación pueden soportar la transmisión y recepción de especialmente datos con tipo, Derechos de Acceso establecidos. El Dominio Local por ejemplo, usa esta prestación para pasar descriptores entre procesos. Implementaciones de red en UNIX antes del BSD 4.2 usualmente trabajan sobrecargando las interfaces de dispositivo de carácter. Una meta de la interface de socket fue para programas ingenuos para ser capaz de trabajar sin cambio en conexiones de estilo – flujo. Tales programas pueden trabajar solamente si las llamadas de sistemas de Lectura y Escritura son incambiables. Consecuentemente, las interfaces originales fueron dejadas intactas, y fueron hechas para trabajar sobre socktes tipo flujo. Una nueva interface fue añadida para sockets mas complicados, tales como los usados para envía datagramas, con los cuales una dirección de destino debe ser presentada con cada llamada send. Otro beneficio es que la nueva interface es altamente portable. Poco después una edición de prueba estuvo disponible desde Berkeley, la interface de socket había sido portada a System III por proveedor de UNIX. La interface de socket fue también portada para correr en muchas tarjetas Ethernet de proveedores, tales como Excelan e Interlan, que fueron vendidas en el mercado de Pcs, donde las maquinas fueron muy pequeñas para correr redes en el procesador principal. Mas recientemente, la interface de socket fue usada como la base para la interface de red Winsock de Microsoft para Windows.
5. La administración de los procesos y el procesador
Un Proceso es un programa en ejecución. Un proceso debe tener recursos del sistema, tal como memoria y la CPU. El Kernel soporta la ilusión de ejecución de concurrencia de múltiple procesos planificando los recursos del sistema entre el conjunto de procesos que están listos para ejecutarse. Un proceso tiene su propia composición, se usa un método para switchear entre procesos, y existen políticas de planificación que se usan para compartir la CPU. Los procesos se crean y se terminan, existen prestaciones de señal y prestaciones para la depuración de procesos. Un proceso opera de dos modos modo usuario (user mode) o modo kernel (kernel mode). En modo usuario un proceso ejecuta código de aplicación con la maquina en un modo de protección no privilegiado. Cuando un proceso solicita servicios del sistema operativo con una llamada al sistema, el proceso switchea del modo de protección privilegiado de la maquina vía un mecanismo protegido, y después opera en modo kernel. Los recursos usados por un proceso son similarmente divididos en dos partes. Los recursos necesitados para ejecución en modo usuario son definidos por la arquitectura de CPU y típicamente incluye registros de propósito general de CPU, el contador de programa, el registro del estado de procesador, y registros relacionados con la pila, así como el contenido de los segmentos de memoria que constituye la noción del BSD 4.4 de un programa (en texto, datos, y segmentos de pila). Los recursos del modo kernel incluyen los requeridos por el hardware fundamental (tal como registros, contador de programa, y apuntador de pila) y por el estado requerido por el kernel del BSD4.4 para proveer servicios de sistemas para un proceso. Este Estado del Kernel incluye parámetros para llamadas al sistema actual, la identidad de usuario del proceso actual, información de planificación, y así sucesivamente. El estado de kernel para cada proceso es dividido en varias estructuras de datos separadas, con dos estructuras primarias : La Estructura de Proceso y la Estructura de Usuario. La Estructura de Proceso contiene información que debe siempre permanecer residente en memoria principal, junto con referencias a un numero de otras estructuras que permanecen residentes; donde la estrucutra de usuario contiene informacion que necesita estar residente solo cuando el proceso esta ejecutando (aunque las estructuras de usuario de otros procesos tambien pueden estar residente). Las Estructuras de Usuario son ubicadas dinámicamente por medio de las prestaciones de administración de memoria. Históricamente, mas de la mitad del estado de proceso fue almacenado en la estructura de usuario. En el BSD 4.4, la estructura de usuario es usada solamente para la pila de kernel por proceso y un par de estructuras que son referenciadas desde la estructura de proceso. Las Estructuras de Proceso son ubicadas dinámicamente como parte de creación de proceso, y son liberadas como parte del proceso de salida.
6. Coordinación y sincronización de procesos
La sincronización entre procesos del usuario de un recurso típicamente es implementada por la asociación con el recurso de dos banderas; la bandera locked y la bandera wanted. Cuando un proceso quiere usar un recurso, primero checa la bandera locked. Si el recurso actualmente no esta en uso por otro proceso, esta bandera no debería estar activada, y el proceso puede simplemente activar la bandera locked y usar el recurso. Si el recurso esta en uso, el proceso activaría la bandera wanted y llamar la función sleep() con un canal de espera asociado con el recurso ( típicamente la dirección de la estructura de datos usada para describir el recurso). Cuando un proceso ya no necesita el recurso, limpia la bandera locked y, si la bandera wanted esta activa, invoca la función wakeup() para despertar todos los procesos que llamaron la función sleep() para esperar el acceso al recurso.
Las rutinas que corren en la primer mitad del kernel no tienen un contexto y consecuentemente no puede esperar que un recurso se vuelva disponible llamando la función sleep(). Cuando la segunda mitad del kernel accesa recursos que son compartidos con la primer mitad del kernel, no puede usar la bandera locked para asegurar uso exclusivo. En su lugar, debe prevenir la primer mitad de no correrlo mientras esta usando el recurso. Acceso de sincronización con rutinas que se ejecutan en la primer mitad del kernel requiere conocimiento de cuando estas rutinas pueden correr. Aunque las prioridades de interrupción son dependiente de maquina, la mayoría de las implementaciones del BSD 4.4 las ordenan de acuerdo a la siguiente tabla.
Tabla Asignaciones de prioridad de interrupciones, ordenados desde lo mas bajo hasta lo mas alto.
Name | Blocks |
Spl0( ) | Nada (modo de operación normal) |
Slpsoftclock( ) | Procesamiento de reloj de baja prioridad |
Splnet( ) | Procesamiento de protocolo de red |
Spltty( ) | Multiplexados de terminal y dispositivos de baja prioridad |
Splbio( ) | Controladores de disco y cinta y dispositivos de alta prioridad |
Splimp( ) | Controladores de dispositivos de red |
Splclock( ) | Procesamiento de reloj de alta prioridad |
Splhigh( ) | Toda actividad de interrupción |
Para bloquear rutinas de interrupción a un cierto nivel de prioridad y por debajo de este, una sección critica debe hacer una llamada apropiada de set-priority-level (establecer nivel de prioridad). Todas las llamadas a set-priority-level regresan el nivel de prioridad previo. Cuando la sección critica es hecha, la prioridad es regresada a su nivel previo usando splx( ). Por ejemplo, cuando un proceso necesita manipular una cola de datos de una terminal, el código que acesa la cola es escrita en el siguiente estilo: s = spltty ( ); /* eleva la prioridad al bloque de procesamiento tty */ . . . /* manipula el tty */ splx(s); /*reestablece el nivel de prioridad al valor previo*/
Los procesos deben cuidar evitar bloqueo mutuo cuando busquen múltiples recursos. Suponga que dos procesos, A y B, requieren acceso exclusivo a dos recursos, R1 y R2, para hacer alguna operación. Si el proceso A adquiere R1 y el proceso B adquiere R2, entonces un bloqueo mutuo ocurre cuando el proceso A trata de adquirir R2 y el proceso B trata de adquirir R1. Ya que un proceso de BSD4.4 ejecutándose en modo kernel nunca es sustituido por otro proceso, protección de recursos múltiples es simple, aunque debe llevarse a cabo cuidadosamente. Si un proceso sabe que múltiples recursos son requeridos para hacer una operación, entonces el proceso puede seguramente proteger uno o mas de esos recursos en cualquier orden, si y solo si el proceso nunca renuncia el control del CPU. Si, como sea , un proceso no puede adquirir todos los recursos que este necesita, entonces este debe liberar algunos recursos que tiene antes de llamar a sleep( ) para esperar que el recurso inaccesible actualmente este disponible. Alternativamente, si los recursos pueden ser parcialmente ordenados, es necesario solamente que estén ubicados en un orden creciente. Por ejemplo, como la rutina namei( ) recorre el espacio de nombre del sistema de archivos, debe proteger el siguiente componente de una ruta de acceso antes de renunciar al componente actual. Un ordenamiento parcial de componentes de rutas de acceso existe desde la raíz del espacio de nombre hasta las hojas. Por lo tanto traducciones del árbol de nombres pueden solicitar un bloqueo en el siguiente componente sin preocuparse por el bloqueo mutuo. Como sea, cuando esta recorriendo arriba el árbol de nombres (p.e. siguiendo un componente de ruta de acceso de punto-punto (..)), el kernel debe cuidar evitar dormir mientras mantiene algunos bloqueos. Elevar el nivel de prioridad del procesador para protegerse contra actividad de interrupción funciona para una arquitectura uniprocesador, pero no para una maquina multiprocesador de memoria compartida. Similarmente, mucho del kernel del BSD 4.4 implícitamente asume que el procesamiento de kernel nunca se llevara a cabo concurrentemente. Numerosos proveedores (tal como Sequent, OSF/1, AT&T, y Sun Microsystem) han rediseñado el esquema de sincronización y han eliminado la asunción de uniprocesador implícita en el kernel de UNIX estándar, para que UNIX corra en arquitecturas de multiprocesador ajustadamente acopladas.
Un componente central de cualquier sistema operativo es el sistema de administración de memoria. Como su nombre lo dice, las prestaciones de administración de memoria son responsable de la administración de los recursos de memoria disponible en una maquina. Típicamente estos recursos caen en una moda jerárquica, con tiempos de acceso a memoria inversamente relacionados a su proximidad con la CPU. El sistema de memoria primaria es memoria principal; el siguiente nivel de almacenamiento es almacenamiento secundario o almacenamiento de respaldo.
Procesos y Memoria Cada proceso opera en una maquina virtual que es definida por la arquitectura del hardware donde se ejecuta.
Paginación La traducción de direcciones proporciona la implementación de la memoria virtual decoplando el espacio de direcciones virtual de un proceso desde los espacios de direcciones física de la CPU. Cada pagina de memoria virtual es marcado como residente o no residente en memoria principal.
Algoritmos de Reemplazo La política de reemplazo es el aspecto mas critico de cualquier sistema de paginación. Hay un amplio rango de algoritmos desde los cuales podemos seleccionar en el diseño de una estrategia de reemplazo para un sistema de paginación.
El Modelo de Conjunto-Trabajando El modelo conjunto-trabajando asume que los procesos exhiben una localidad cambiante lentamente de referencia. Por un periodo de tiempo, un proceso opera en un conjunto de subrutinas o lazos, causando que todas sus referencias de memoria se refieran a un subconjunto fijo de su espacio de dirección, denominado el conjunto de trabajo.
Intercambio Intercambio es el termino usado para describir una política de administración de memoria en la cual procesos enteros son movidos hacia y desde el almacenamiento secundario donde la memoria principal esta en suministro corto.
Ventajas de la Memoria Virtual Hay varias ventajas para el uso de memoria virtual en computadoras capaces de soportar esta prestación propiamente. La memoria virtual permite a grandes programas correr en maquinas con configuraciones de memoria principal que son mas pequeñas que el tamaño del programa.
Requerimiento de Hardware para Memoria Virtual Casi todas las versiones de UNIX han requerido alguna forma de hardware de administración de memoria para soportar multiprogramación transparente.
El Sistema de Memoria Virtual del BSD 4.4 El sistema de memoria virtual del BSD4.4 difiere completamente del sistema que fue usado en el BSD4.3 y predecesores. La implementación es basada en el sistema de memoria virtual del Mach 2.0, con actualizaciones tomadas del Mach 2.5 y el Mach 3.0. El sistema de memoria virtual implementa espacios de dirección protegidos dentro de los cuales puede ser mapeado fuentes de datos (objetos) tales como archivos o privados, piezas anónimas de espacio de intercambio. La memoria física es usada como una cache de paginas usadas recientemente de estos objetos, y es administrada por un algoritmo de reemplazamiento -de –pagina global parecido en mucho al del BSD 4.3 El espacio de direcciones virtual de la mayoría de las arquitecturas es dividido en dos partes. Típicamente, los mas altos de 30 a 100 Mbyte del espacio de direcciones es reservado para uso del kernel. El espacio de direcciones restante esta disponible para uso de procesos. En un mapa tradicional de UNIX, el kernel y sus estructuras de datos asociadas residen en la parte alta del espacio de direcciones. El texto inicial y las áreas de datos empiezan en o cerca del principio de la memoria. Típicamente, los primeros 4 o 8 Kbyte de memoria son conservados fuera de los limites del proceso. La razón de esta restricción es para una depuración de programa fácil; indirectamente a travez de un apuntador nulo causara un fallo de direccion invalida, en lugar de leer o escribir el texto de programa. La localización de memoria hecha por el proceso en ejecución usando la rutina de librería malloc( ) (o la llamada al sistema sbrk ) son hechas de la parte que empieza inmediatamente siguiente al área de datos y crece hasta las direcciones mas altas. El vector de argumento y los vectores de ambiente están en la parte mas alta de la porción de usuario del espacio de direcciones. La pila de usuario empieza justo debajo de estos vectores y crece hasta las direcciones mas bajas. En el BSD 4.4 y otros sistemas UNIX modernos que soportan la llamada al sistema mmap, el uso del espacio de direcciones es menos estructurado. Implementación de librerías compartidas pueden ubicar texto o datos arbitrariamente, representar la noción de regiones predefinidas obsoletas. Por compatibilidad, el BSD 4.4 todavía soporta la llamada sbrk que usa malloc ( ) para proveer una región contigua, y el kernel tiene una región de pila diseñada donde localizaciones adyacentes son automáticamente ejecutadas.
A cualquier tiempo, el proceso en ejecución es mapeado dentro del espacio de direcciones virtual. Cuando el sistema decide al contexto cambiar a otro proceso, debe almacenar la información acerca del mapa de direcciones del proceso actual, después cargar el mapeo de direcciones para el nuevo proceso. Los detalles de este mapa de direcciones cambiando son dependientes de arquitectura. Algunas arquitecturas necesitan cambiar solo unos pocos registros de mapeo de memoria que apuntan a la base, y para dar la longitud de las tablas de paginas de memoria residente. Otras arquitecturas almacenan los descriptores de la tablas de paginas en especial RAM estática de alta velocidad. Cambiar estos mapas puede requerir vaciad y recargado de cientos de entradas de mapas. Ambos los procesos de kernel y de usuario usan la misma base de estructuras de datos para la administración de su memoria virtual. Las estructuras de datos usadas para administrar memoria virtual son como sigue: vmspace Estructura que abarca ambas las estructuras dependientes de maquina y las independientes de maquina describiendo un espacio de direcciones de proceso. vm_map Estructura de datos de mas alto nivel que describe es espacio de direcciones virtual del dependiente- de- maquina vm_map_entry Estructura que describe un rango contiguo virtualmente de espacio de direcciones que comparte atributos de protección y herencia. object Estructura que describe una fuente de datos para un rango de direcciones shadow object objeto especial que representa copia modificada de datos originales. vm_page La estructura de datos de mas bajo nivel que representa la memoria física siendo usados por el sistema de memoria virtual.
8. La administración de los archivos
Soporte de sistemas de archivos múltiple Con la expansión de computación de red, se hace deseable soportar ambas sistemas de archivos local y remotos. Para simplificar el soporte de sistemas de archivos múltiple, los desarrolladores añadieron un nuevo nodo virtual o interface vnode para el kernel. El juego de operaciones exportadas desde la interface vnode se parecen mas a las operaciones de sistemas de archivos previamente soportadas por el sistemas de archivos local. Como sea, pueden ser soportadas por un amplio rango de tipos de sistemas de archivos:
- Sistema de archivos basado -en –disco local
- Archivos importados usando una variedad de protocolos de sistema de archivos remoto
- Sistema de archivos de CD-ROM de solo-lectura
- Sistema de archivos que proveen interfaces de propósito especial (Por. Ejemplo, el sistema de archivos /proc)
Algunas variantes del BSD 4.4, tal como FreeBSD, permite al sistema de archivos ser cargado dinámicamente cuando los sistemas de archivos son primero referenciados por la llamada al sistema mount.
Sistema de archivos Un archivo regular es un arreglo lineal de bytes, y pueden ser leídos y escritos empezando por cualquier byte en el archivo. El kernel no distingue limites de registros en archivos regulares, aunque muchos programas reconocen caracteres alimentación-de-línea como distinguir el fin de línea, y otros programas puede usar otra estructura. Ninguna información relacionada con el sistema es conservada acerca de un archivo en el archivo mismo, pero el sistema de archivo almacena una pequeña cantidad de información propietario, protección, y uso con cada archivo.
Un componente del nombre-de-archivo es una cadena de hasta 255 caracteres. Estos nombres de archivo son almacenados en un tipo de archivo llamado un directorio. La información en un directorio acerca de un archivo es llamada entrada-de-directorio e incluye, además del nombre-de-archivo, un apuntador al archivo mismo. Las entradas de directorio pueden referir a otros directorios, también como planear archivos. Por lo tanto una jerarquía de directorios y archivos es formada, y es llamada un sistema-de-archivos. Los Directorios pueden contener, y no hay limitaciones inherentes a la profundidad con lo cual anidamientos de directorios pueden ocurrir. Para proteger la consistencia del sistema-de-archivos, el kernel no permite a los procesos escribir directamente en los directorios. Un sistema-de-archivos puede incluir no solo archivos planos y directorios, sino también referencias a otros objetos, tales como dispositivos y sockets. El sistema-de-archivos forma un árbol, e principio del cual es el directorio raíz, algunas veces referidas por el nombre slash, representado por un carácter sólido (/). El directorio raíz contiene archivos; En el ejemplo, contiene a vmunix, una copia del archivo objeto de kernel-ejecutable. También contiene directorios; ien este ejemplo, contiene el directorio usr. Dentro del directorio usr esta el directorio bin, el cual principalmente contiene código objeto ejecutable de programas, tales como los archivos ls y vi.
Un proceso identifica un archivo especificando la ruta-de-acceso del archivo, la cual es una cadena compuesta de cero o mas nombres-de-archivo separados por el carácter diagonal (/). El kernel asocia dos directorios con cada proceso para uso en la interpretación de rutas-de-acceso. Un directorio-raíz de un proceso es el punto mas arriba en el sistema-de-archivos que el proceso puede acceder; este se activa ordinariamente para el directorio raiz del sistema-de-archivo entero. Una ruta-de-acceso que empieza con una diagonal es llamado una ruta-de-acceso absoluta, y es interpretada por el kernel empezando con el directorio raíz del proceso.
Sistema – de – archivos Local Las operaciones definidas para sistema-de-archivos local son divididas en dos partes. Comunes a todos los sistemas de archivos locales son nombrado jerárquico, buscando, cuotas, administración de atributos, y protección. Estas característica, las cuales son independientes de cómo los datos son almacenados, son provistos de código UFS. La otra parte de los sistemas de archivo local le concierne a la organización y administración de datos en el medio de almacenamiento. El almacenamiento es administrado por las operaciones de sistema-de-archivos del almacén-de-datos. Las operaciones de vnode definidas para hacer operaciones de sistema-de-archivos jerárquicos son mostrados en la siguiente tabla.
Tabla Operaciones de sistema-de-archivos jerárquico
Operación | Nombre de operaciones |
Búsqueda de ruta de acceso | lookup |
Creación de nombre | create, mknod, link,symlink, mkdir |
Borrar/cambiar nombre | rename, remove, rmdir |
Manipulación de atributos | access, getattr, setattr |
Interpretación de objetos | open, readdir,readlink, mmap,close |
Control de proceso | advlock,ioctl, select |
administración de objetos | lock, unlock, inactive, reclaim, abortop |
Sistema – de – archivos de red
Cuando redes primero se convirtiendo ampliamente disponible en el BSD 4.2, los usuarios que quisieron compartir archivos lo que tenian que hacer era entrar a través de la red a una maquina central en la cual los archivos compartidos se localizaban. Esta maquina central rápidamente se cargo mas que la maquina del usuario local, por lo tanto la demanda por una forma conveniente de compartir archivos al mismo tiempo en varias maquinas creció rápidamente.
NFS (Network file system) fue diseñado como una aplicación cliente–servidor. Su implementación es dividida en una parte cliente que importa sistemas de archivos desde otras maquinas y una parte servidor que exporta sistemas de archivos locales a otras maquinas. El modelo general es mostrado en la figura enseguida. Muchos metas fueron incluidas en el diseño de NFS:
- El protocolo es diseñado para ser sin estado. Como no hay estado que mantener o recuperar, NFS puede continuar operar incluso durante periodos de fallas de cliente o servidor. Por lo tanto, es mucho mas robusto que un sistema que opera con estado.
- NFS es diseñado para soportar semánticas de sistema-de-archivos de UNIX. Como sea, su diseño también permite soportar la posibilidad de semánticas menos ricas de otros tipos de sistemas de archivos, tal como MS-DOS.
- Los controles de protección y acceso sigue a la semántica de UNIX de tener el presente proceso un UID y un conjunto de grupos que son checados contra el propietario de archivo, grupo, y otros modos de acceso. El chequeo de seguridad es hecha por código dependiente-de-sistema-de-archivos que puede hacer mas o algunos chequeos basado en las capacidades del sistema de archivos que esta soportando. Por ejemplo, el sistema-de-archivos de MS-DOS no puede implementar la validación de seguridad total de UNIX y hace decisiones de acceso solamente basado en la UID.
- El diseño del protocolo es independiente del transporte. Aunque fue originalmente construido usando el protocolo de datagramas UDP, fue fácilmente movido al protocolo de flujos TCP. Este también ha sido portado para correr sobre otros numerosos protocolos no-basados-en-IP.
Algunas de las decisiones de diseño limitan el conjunto de aplicaciones para el cual NFS es apropiado:
- El diseño visiona a los clientes y servidores estar conectados localmente a una red rápida. El protocolo NFS no trabaja bien sobre enlaces lentos o entre clientes y servidores con puertas de acceso. También trabaja pobremente para computación móvil que tiene periodos extendidos de operación desconectados.
- El modelo de obtención (caching) asume que la mayoría de archivos no serán compartidos. La funcionalidad sufre cuando los archivos son compartidos pesadamente.
- El protocolo sin estado requiere algunas perdidas de semánticas de UNIX tradicional. El cerrar sistemas de archivos (flocks) ha de ser implementado por un demonio de estado separado. Aplaza la liberación de espacio en un archivo diferenciado hasta que el proceso final ha cerrado el archivo es aproximado con una heurística que a veces falla.
A pesar de estas limitaciones, NFS ha proliferado porque este hace un razonable trato entre semántica y funcionalidad; su bajo costo de adopcion lo ha hecho ubicuo.
NFS no es seguro porque el protocolo no fue diseñado con seguridad en mente. A pesar de esto se intenta fijar problemas de seguridad, la seguridad de NFS es todavía limitado. La encriptación es necesaria para construir un protocolo seguro, pero la encriptación robusta no puede ser exportada desde los Estados Unidos. Por lo tanto, incluso si construir un protocolo seguro fuera posible, hacer eso seria sin sentido, porque todos los archivos de datos son enviados a la red en texto limpio. Incluso si Alguien es incapaz obtener que su servidor para enviarles un archivo sensitivo, pueden solo esperar hasta que un legitimo usuario lo accede, y después pueda recogerlo cuando vaya por la red. El control de exportar de NFS esta en la granularidad del sistema-de-archivo local. Asociado con cada sistema-de-archivo local el punto de montar es una lista de hosts para los cuales ese sistema de archivos puede ser exportado. Un sistema de archivos local puede ser exportado a un especifico host, hacia todos los hosts que coincidan con la mascara de subred, o a todos los otros hosts(el mundo). Por cada host o grupo de host, el sistema de archivos puede ser exportado solo-lectura o solo-escritura. Además, un servidor puede especificar un conjunto de subdirectorios dentro del sistema de archivos que puede ser montado. Como sea, esta lista de puntos de montaje es forzada solo por el demonio mountd. Si un cliente malicioso hacer eso, puede acceder cualquier parte de un sistema de archivos que es exportado al.
La determinación final de exportabilidad es hecha por la lista mantenida en el kernel. Por lo tanto, incluso si un cliente pícaro maneja muy curioso la red y para robar un archivo maneja por un punto de montar de un cliente valido, el kernel rechazara aceptar el manejo de archivo a menos que el cliente presentando ese manejo este en la lista de exportar del kernel. Cuando el NFS este trabajando con TCP, el chequeo es llevado a cabo cuando la conexión es establecida. Cuando el NFS esta trabajando con UDP, el chequeo se lleva acabo por cada solicitud de RPC. El servidor NFS también permite limitado remapeado de credenciales de usuarios. Típicamente la credencial para el súper usuario no es confiado y es remapeado al usuario de bajo privilegio "nadie". Las credenciales de todos los demás usuarios pueden ser aceptadas como dadas o también mapeadas a un usuario por omisión (típicamente"nadie"). El usos de la lista de cliente UID y GID incambiable en el servidor implica que los espacios UID y GID son comunes entre el cliente y el servidor (p.e. el UID N en el cliente debe referir al mismo usuario en el servidor). El administrador de sistema puede soportar mapeos mas complejos de UID y GID usando el sistema de archivos umapfs.
El administrador de sistema puede incrementar seguridad usando credenciales Kerberos, en lugar de aceptar credenciales de usuarios arbitrarios enviados sin encriptación por clientes de confianza desconocida. Cuando un usuario nuevo en un cliente quiere empezar a acceder archivos en un sistema de archivos NFS que es exportado usando Kerberos, el cliente debe proveer un ticket de Kerberos para autenticar el usuario en el servidor. Si hay éxito, el sistema busca el Kerberos principal en las base de datos de grupo y clave de acceso del servidor para obtener un conjunto de credenciales, y pase al servidor nfsd una traducción local del UID del cliente a esas credenciales. Los demonios nfsd corren enteramente dentro del kernel excepto cuando un ticket Kerberos es recibido. Para evitar poner toda la autenticación de Kerberos en el kernel, el nfsd regresa del kernel temporalmente a verificar el ticket usando librerías de Kerberos, y después regresa al kernel con los resultados. La implementación de NFS con Kerberos estampas de tiempo encriptadas para advertir intentos de reenvío. Cada solicitud de RPC incluye una estampa de tiempo que es encriptada por el cliente y desencriptada por el servido usando una clave de sesión que ha sido cambiada como parte de la autenticación inicial de Kerberos. Cada estampa de tiempo puede ser usada solo una vez, y debe ser dentro de algunos minutos del tiempo actual grabado por el servidor. Esta implementación requiere que el reloj del cliente y del servidor se conserven dentro de algunos minutos de sincronización (este requerimiento es ya impuesto para correr Kerberos). También requiere que el servidor conserve copias de todas las estampas de tiempo que ha recibido que están dentro del rango de tiempo que aceptara, para que pueda verificar que una estampa de tiempo no esta siendo rehusada. Alternativamente, el servidor puede requerir que estampas de tiempo desde cada uno de sus clientes sean monótonamente incrementadas. Como sea este algoritmo causara que las solicitudes de RPC que salen de orden sean expulsadas. Este mecanismo de usar Kerberos para autenticación de solicitudes NFS no esta bien definido, y la implementación de BSD 4.4 no ha sido probada para interoperatividad con otros proveedores. Por lo tanto, Kerberos puede ser usado solo entre clientes y servidores de BSD 4.4.
10. Conclusión final del trabajo
El BSD 4.4 debe ser un sistema operativo de principal uso en redes y sistemas distribuidos por su idiosincrasia y funcionalidad en este campo. A lo largo de los años de uso del sistema UNIX, el BSD ha venido aportando conceptos nuevos de gran relevancia para los sistemas usuarios de redes, como lo es el concepto de Socket Se ha demostrado que cada día el BSD avanza en la mejora, prueba de ello es que en la actualidad soporta mas arquitecturas como lo son la de Motorola 68000 y las PCs de Intel. En la actualidad se trata de eliminar las dependencias de maquina, y vemos que el Kernel del BSD 4.4. va en ese sentido ya que solo el 19.6 % del mismo es dependiente de maquina en el ejemplo dado. Mostrando así su portabilidad. Los Dominios de Comunicación entre procesos es clasificada de manera sencilla aprovechando el concepto de Socket y los protocolos de comunicación. El BSD 4.4 es un sistema operativo muy bien administrado, administra la comunicación entre procesos locales y remotos, la administración de su memoria no es tan diferente de otros sistemas. Conserva la funcionalidad de los sistemas UNIX. Pero aun le falta completar el trabajo de la seguridad. La forma en que lleva a cabo la intercomunicación entre procesos remotos y locales es entendible y funcional. Como los demás sistemas derivados del UNIX, el BSD 4.4 también a tomado ideas de diferentes sistemas, y los ha mejorado desde el punto de vista de las diferentes organizaciones que soportan este sistema como BSD, y otros. Aunque evitar el bloqueo mutuo se debe llevar a cabo de manera cuidadosa, BSD 4.4 proporciona un mecanismo que usándolo correctamente el bloqueo mutuo se puede evitar. El sistema de memoria virtual del BSD 4.4. difiere completamente de sus predecesores, pero es basada en el sistema de memoria virtual del Mach 2.0. Con el uso del nodo virtual o interface vnode para el kernel, el sistema soporta sistemas de archivos múltiple. Es impresionante la forma en que UNIX ha marcado muchos de los sistemas con las iniciativas que se han tenido sobre él, por ejemplo, el MS-DOS se ha basado en él, el concepto de sockets que forma parte del sistema operativo BSD desde la versión 2 ahora se usan librerías para su implementación en diferentes arquitecturas. Por lo tanto esto nos puede decir que el software abierto es más probable que implemente mecanismos de; solución de problemas, de mejoramiento, de adaptabilidad, etc., que el software que no lo es.
McKusick, M. K., Bostic, K., Karels, M.J. & Quaterman, J. S. (1996). The design and implementation of the 4.4bsd operating system. [El diseño e implementacion del sistema operativo 4.4bsd]. USA: Addison Wesley.
Trabajo enviado por: Armando Fausto Flores
Análisis del Sistema Operativo BSD 4.4 (Unix) Cd. Guzmán JaL; 16 de Enero de 2003