BLOQUE II. DISEÑO DEL UNIX




1. Estructura del sistema



Figura 2. Bloques funcionales del sistema operativo UNIX.






2. Sistema de Archivos (File System)

2.1 Organización de la información:

Figura 3. Estructura del sistema de archivos.



2.2 Concepto de archivo:



2.3 Directorios:

Figura 4. Estructura de un directorio.


2.4 Sistema de archivos:

Figura 5. Estructura de un Sistema de Archivos.



2.5 Manejo de los i-nodos:

Figura 6. Contenido de un i-nodo.

Figura 7. Estructura de los punteros.


2.6 Archivos especiales:

Figura 8. Relación de un archivo especial.


2.7 Principales directorios:



2.8 Permisos de acceso de archivos y directorios:

      Cada archivo y directorio creado en UNIX tiene un propietario, normalmente la persona que lo ha creado. Ese propietario pertenece además a un grupo de usuarios. El propietario del archivo o directorio puede asignar varios tipos de permisos, para permitir o denegar el acceso al archivo o directorio. Los tipos de permisos de acceso son:

      Cada usuario puede especificar el permiso de acceso a sus archivos, seleccionando la adecuada combinación de tipos de permisos, con el fin de permitir o denegar el acceso a tres niveles de usuarios (propietario, usuarios de su grupo, y el resto de usuarios).




3. Control de procesos

          Un programa es un archivo ejecutable, y un proceso es una instancia del programa en ejecución. En UNIX pueden ejecutarse varios procesos simultáneamente (esta característica es denominada algunas veces como multiprogramación o multitarea) sin un límite lógico en el número de ellos, y varias instancias del mismo programa pueden existir simultáneamente en el sistema. Algunas llamadas al sistema permiten a los procesos crear nuevos procesos, acabar procesos, sincronizar niveles de ejecución de procesos y controlar la reacción de algunos sucesos. Sujeto a sus propias llamadas al sistema, los procesos son independientes de los demás.

          Generalmente, las llamadas al sistema permiten al usuario escribir programas que realicen sofisticadas operaciones, y como resultado, el kernel del sistema UNIX no contiene muchas funciones que son parte del "kernel" en otros sistemas. Estos programas, incluyendo compiladores y editores, son programas a nivel de usuario en el sistema UNIX. El principal ejemplo de estos programas es el shell, el intérprete de comandos que los usuarios ejecutan normalmente de entrar en el sistema.

          El núcleo del sistema operativo UNIX conoce la existencia de un proceso a través de su bloque de control del proceso, donde se describe el proceso y su entorno, constituyendo un contexto consistente en:

    • Espacio de direccionamiento y entorno de ejecución: Variables que utiliza el proceso.
    • Contenido de los registros hardware: Contador de programa, registro de estado del procesador, puntero de la pila y registros de propósito general.
    • Contenido de las estructuras del núcleo relacionadas con el proceso: Tabla de proceso, áreas, regiones, etc.

          Si congelamos el estado del procesador y del proceso que está en ejecución en un determinado momento, obtendríamos lo que se conoce como imagen estática del programa. En caso de producirse una interrupción o cambio de proceso, se almacena la imagen del que está en ejecución en ese mismo instante.

          Cada proceso se reconoce dentro del sistema por un número que lo identifica unívocamente y que se conoce como Identificador del Proceso o PID.

          Todos los procesos, excepto el proceso 0, son creados por otro proceso; es decir, el sistema de creación y gestión de procesos en UNIX es jerárquico.

          El proceso que se genera con el PID 0 es un proceso especial creado en el momento de arrancar el sistema. A continuación se genera un proceso init que será el antecesor de todos los procesos que se generen en el sistema. A partir de aquí se generan tantos procesos como terminales existan (se dará una descripción más adelante).

          Los procesos que atienden a los terminales crearan otros con el fin de identificar y controlar el acceso de los usuarios al sistema, los cuales, una vez que inicien la sesión, ejecutarán un proceso intérprete de comandos Shell que será el que genere el resto de programas solicitados por el usuario.






4. Servicios del sistema operativo

          En la figura 1 se mostraba el nivel del kernel inmediatamente por debajo del nivel de los programas del usuario (a.out). La estructura del kernel venía detallada en la figura 2. El kernel ejecuta varias operaciones primitivas en apoyo de los procesos del usuario para soportar la interface de usuario descrita arriba. Entre los servicios que suministra el kernel están:

    • Control de la ejecución de procesos permitiendo su creación, finalización o suspensión y comunicación.
    • Planificación justa de los procesos para su ejecución en la CPU. Los procesos comparten la CPU por el método de tiempo compartido: la CPU ejecuta un proceso, el kernel lo suspende cuando su cuantum de tiempo se acaba y el kernel planifica otro proceso para su ejecución. El kernel después replanifica el proceso suspendido.
    • Asignación de memoria principal a los procesos en ejecución. El kernel asigna a los procesos compartir partes de su espacio de direcciones bajo ciertas condiciones, pero protege el espacio de direcciones privado del proceso de accesos exteriores. Si el sistema se está ejecutando con poca memoria libre, el kernel libera memoria escribiendo un proceso temporalmente en la memoria secundaria, llamada área de swap. Si el kernel escribe un proceso entero en el área de swap, la implementación del sistema UNIX se denomina sistema de swapping; si escribe páginas de memoria, se denomina sistema paginado.
    • Asignación de memoria secundaria para almacenamiento y recuperación de datos eficiente. Este servicio constituye el sistema de archivos. El kernel asigna almacenamiento secundario para los archivos de usuario, pidiendo zonas sin usar, estructurando el sistema de archivos de una manera comprensible y protegiendo los datos de accesos ilegales.
    • Asignación a los procesos accesos controlados de los dispositivos periféricos tales como terminales, controladores de cinta, controladores de disco y dispositivos de red.

          El kernel suministra estos servicios de una forma transparente al usuario. Por ejemplo, reconoce que un archivo dado es un archivo regular o un dispositivo, pero oculta la distinción a los procesos de usuario. De forma análoga, formatea los datos en un archivo para su almacenamiento interno, pero oculta el formato interno a los procesos de usuario, devolviendo un flujo de bytes.






5. Consideraciones sobre el hardware

          La ejecución de procesos de usuario en sistemas UNIX se divide en dos niveles: usuario y kernel. Cuando un proceso ejecuta una llamada al sistema, el modo de ejecución cambia del modo usuario a modo kernel: el sistema operativo ejecuta y atiende el servicio requerido por el usuario, devolviendo un código de error si falla. Incluso si el usuario no hace una petición explícita de los servicios del sistema operativo, el sistema operativo continúa realizando operaciones que relacionan a los procesos de usuario, manipulando interrupciones, planificando procesos, administrando la memoria, etc. Muchas arquitecturas (y sus sistemas operativos) soportan más niveles que los dos descritos, pero estos dos modos, usuario y kernel, son suficientes para los sistemas UNIX.

          Las diferencias entre los dos modos son:

    • Los procesos en el modo usuario pueden acceder a sus propias instrucciones y datos pero no a las instrucciones y datos del kernel (o los de otros procesos). Los procesos en el modo kernel, sin embargo, pueden acceder a las direcciones del kernel y del usuario.
    • Algunas instrucciones máquina están privilegiadas y producen error si se ejecutan en modo usuario.


5.1 Interrupciones y excepciones:

          El sistema UNIX permite a dispositivos tales como los periféricos de entrada/salida o el reloj del sistema interrumpir la CPU asíncronamente. Al recibir una interrupción, el kernel salva el contexto (una imagen de lo que el proceso estaba haciendo), determina la causa de la interrupción y la atiende. Después de que el kernel atienda a la interrupción, restaura el entorno y el proceso interrumpidos como si no hubiese pasado nada. El hardware normalmente asigna prioridades a los dispositivos según el orden que se quiera dar a las interrupciones para manejarlas: cuando el kernel atiende a una interrupción, bloquea las interrupciones con menor prioridad pero atiende a las interrupciones con mayor prioridad.

          Una condición de excepción se refiere a eventos inesperados causados por un proceso, como un direccionamiento ilegal a memoria, ejecución de instrucciones privilegiadas, división por cero, etc. Son distintas de las interrupciones, las cuales están causadas por eventos externos al proceso. Las excepciones suceden en mitad de la ejecución de una instrucción y el sistema intenta restaurar la instrucción después de manejar la excepción; las interrupciones suceden entre la ejecución de dos instrucciones y el sistema continúa con la siguiente instrucción después de atender la interrupción. El sistema UNIX usa un mecanismo para manejar interrupciones y condiciones de excepción.



5.2 Niveles de ejecución:

          El kernel debe normalmente prevenir una interrupción durante una actividad crítica, lo cual puede resultar en datos erróneos si la interrupción tiene lugar. Por ejemplo, el kernel no debe querer recibir una interrupción de disco mientras está manipulando listas enlazadas, porque el atender a la interrupción puede corromper los punteros. Las computadoras normalmente tienen un conjunto de instrucciones privilegiadas que colocan el nivel de ejecución de procesos en el estado del proceso. Colocando el nivel de ejecución de procesos a unos determinados valores se inhabilitan las interrupciones desde un nivel hacia abajo, permitiendo sólo las interrupciones de un nivel superior. La figura 9 muestra un ejemplo de un conjunto de niveles de ejecución. Si el kernel inhabilita las interrupciones de disco, todas las interrupciones excepto las interrupciones de reloj y las de error de máquina están inhabilitadas. Si se inhabilita las interrupciones de software, todas las demás pueden ocurrir.

Figura 9. Ejemplo de prioridades de las interrupciones.


5.3 Administración de la memoria: