Publicado el 14 de Enero del 2017
863 visualizaciones desde el 14 de Enero del 2017
96,1 KB
21 paginas
Creado hace 25a (09/03/2000)
Sistemas Operativos II
T EM A 6
Implementación de
UNIX
Contenido
6.1. Introducción
6.2. El Núcleo (Kernel) de UNIX
6.3. Gestión de Procesos
6.3.1. Estructuras de Control de Procesos
6.3.2. Contexto de un proceso
6.3.3. Estados de un proceso
6.3.4. Interrupciones
6.3.5. Planificación de procesos
6.4. Sistema de Ficheros
6.4.1. Estructura del Sistema de Ficheros
6.4.2. Nodos-i
6.4.3. Estructura de un fichero regular
6.4.4. Directorios
6.4.5. El Sistema de Ficheros de Berkeley
6.4.6. Tablas de control de acceso a ficheros
6.5. Gestión de Memoria
6.5.1. Intercambio (Swapping)
6.5.2. Paginación
6.6. Entrada/Salida
6.6.1. Gestión de los dispositivos de bloque
6.6.2. Gestión de los dispositivos de caracteres
6.7. Comunicación entre Procesos (pipes)
6.8. Referencias
Sistemas Operativos II
TEMA 6
IMPLEMENTACIÓN DE UNIX
6.1. Introducción
Aunque la implementación de UNIX varía de versión en versión y de máquina a máquina, existen
conceptos e ideas que son aplicables a todas. El estudio de la implementación de UNIX es útil por dos
motivos. En primer lugar, muchas ideas empleadas en UNIX son usadas por sistemas operativos más
recientes, como OS/2 o Windows NT. En segundo lugar, el conocimiento de la implementación permite
sacar el máximo partido al sistema operativo a la hora de programar aplicaciones.
6.2. El Núcleo (Kernel) de UNIX
El kernel (núcleo) de UNIX es la parte del sistema que se carga desde disco a memoria cuando el
computador es encendido y permanece siempre en memoria hasta que el sistema es apagado o ocurre
algún error grave. Su mayor parte está escrita
en C, aunque algunos componentes del mismo
están escritos en ensamblador por motivos de
eficiencia.
Programas de usuario
Nivel de
Usuario
Biblioteca de
Llamadas al
Interrupción
Software (trap)
Sistema
con
para
diseñado
facilitar
estos dos
UNIX se basa en dos conceptos básicos:
ficheros y procesos. Por este motivo, el kernel
está
servicios
elementos
relacionados
son entidades
(Figura 1). Los procesos
"activas",
realizan
acciones por sí mismos, mientras que los
ficheros
de
información que son usados por los procesos.
lo que significa que
contenedores
son meros
Interfaz de Llamadas al Sistema
Subsistema de ficheros
Comunicación
entre procesos
Subsistema de
Control de
Procesos
Planificación
Cache de
Buffers
Gestión de
memoria
Carácter
Bloque
Manejadores de Dispositivos
tiene asignado un
El kernel es accedido por los programas
interface conocido
de usuario mediante un
como llamadas al sistema, que permiten a los
programas de usuario gestionar procesos,
ficheros y otros recursos. Toda llamada al
sistema
identificador
numérico. Los procesos realizan una llamada al
sistema colocando los argumentos de la misma
en registros o en la pila (stack) e invocando
una instrucción especial (trap) que pasa de
modo usuario a modo kernel. El identificador
de la llamada al sistema se usa como índice
para acceder a una tabla de llamadas al sistema
que existe en el kernel. Esta tabla es un array
de punteros a funciones que implementan cada
llamada al sistema. Estas funciones acceden a
estructuras de datos residentes en el kernel.
Debido a que no existe una instrucción trap en C, se suministra una biblioteca de funciones escritas en
ensamblador pero que pueden ser invocadas desde programas escritos en C.
Figura 1.- Diagrama de bloques del kernel.
Nivel de
Hardware
Nivel de
Kernel
Control del Hardware
Hardware
El kernel tiene dos componentes principales: el subsistema de control de ficheros y el subsistema de
control de procesos. El subsistema de control de ficheros realiza tareas relacionadas con la gestión de
_________________________________________________________________________________
___
TEMA 6. Implementación de UNIX
Pág. 1
Sistemas Operativos II
ficheros, como la asignación de espacio en disco, administración del espacio libre, control del acceso a los
ficheros e intercambio de información entre ficheros y programas de usuario. Los procesos interactúan con
el subsistema de ficheros a través de un conjunto de llamadas al sistema específicas, como open, close,
read, write, stat, chown, chmod, ... La comunicación entre el subsistema de ficheros y los
dispositivos físicos se realiza mediante los manejadores (drivers) de dispositivo. Se distinguen dos tipos
de dispositivos según la forma en que son accedidos:
q dispositivos de bloques (block devices).
q dispositivos de caracteres (raw devices).
El acceso a los dispositivos de bloques se realiza con la intervención de buffers, que permiten
aumentar la velocidad de transferencia. Un mismo dispositivo físico puede ser manejado tanto en modo
bloque como en modo carácter, dependiendo del manejador que use para acceder a él.
El subsistema de control de procesos lleva a cabo la comunicación y sincronización entre procesos,
gestiona la memoria y la planifica los procesos para su ejecución. Algunas llamadas al sistema para
control de proceso son fork, exec, exit, wait, brk y signal. El módulo de gestión de memoria
controla la asignación de la memoria. Así, por ejemplo, cuando en un momento dado no existe memoria
física suficiente para contener a todos los procesos, el gestor de memoria se encarga de mover algunos
procesos a almacenamiento secundario para permitir que otros se puedan ejecutar. Para ello utiliza
algunos mecanismos como swapping (intercambio) y demanda de páginas. El planificador (scheduler)
asigna la CPU a los procesos. Entra en ejecución cada cierto tiempo y determina si el proceso en ejecución
puede seguir su ejecución o, por el contrario, hay que quitarle la CPU (preemption) para asignársela a otro
proceso. El módulo de comunicación entre procesos permite que procesos arbitrarios intercambien
El control de hardware es la parte del kernel que se encarga del manejo de las interrupciones y de la
comunicación con la máquina. Dispositivos como los discos o terminales pueden interrumpir a la CPU
mientras ésta está ejecutando un proceso. En estos casos, el kernel interrumpirá al proceso en ejecución,
atenderá la interrupción y posteriormente reanudará la ejecución del proceso interrumpido.
El kernel contiene varias estructuras de datos (tabla de procesos, tabla de nodos índice, tabla de
ficheros, ...) que se implementan como tablas de tamaño fijo en lugar de estructuras de datos dinámicas. La
kernel es muy simple. El inconveniente es que limita el
número de entradas de una estructura de datos al número con el que fue originariamente configurada
cuando se generó el sistema. Si se agotan las entradas de una estructura de datos el kernel no puede
asignar nuevo espacio y devolverá un error al proceso correspondiente. Por otro lado, el espacio
reservado para las tablas que no es usado no se puede utilizar para otras tareas. No obstante, en UNIX se
considera más importante la simplicidad de los algoritmos del kernel que tener que aprovechar al máximo
toda la memoria del sistema. De este modo, los algoritmos son más eficientes y fáciles de comprender.
6.3. Gestión de Procesos
Cuando un programa es compilado se almacena en un fichero con un formato especial. Este formato
consta de cuatro partes:
• Una cabecera primaria que incluye, entre otra información, el número de secciones del fichero y el
magic number), que es usado por el kernel para identificar el tipo de fichero
ejecutable (por ejemplo, si los dos primeros caracteres son "#!", se trata de un fichero de texto que
contiene un shell script).
• Un conjunto de cabeceras (headers) de sección, que describen cada sección el fichero. Esta
descripción incluye el tipo y tamaño de la sección y la dirección de memoria virtual que debería
ocupar la sección cuando el programa sea ejecutado.
• Un conjunto de secciones, que contienen el código y los datos que se han de cargar en memoria en
el espacio de direcciones del futuro proceso. Los datos constituyen la representación en lenguaje
máquina de las variables que tienen un valor inicial cuando el programa inicia su ejecución, y la
kernel debería de reservar para las variables sin
inicializar. Esta cantidad se denomina bss y es inicializada cero por el kernel al inicio de la
ejecución del programa.
• Otras secciones, como información sobre la tabla de símbolos e información útil para depuración.
_________________________________________________________________________________
___
TEMA 6. Implementación de UNIX
Pág. 2
Sistemas Operativos II
Cabecera principal (incluye el número mágico)
Cabecera de la primera sección
Cabecera de la segunda sección
Las cabeceras son usadas por el kernel para cargar el programa en memoria e iniciar su ejecución, lo
que da lugar a un proceso. El kernel carga un fichero ejecutable en memoria durante la ejecución de una
llamada al sistema exec. Un proceso en memoria consiste
en tres regiones o segmentos: código, datos y pila. Los
segmentos de código y datos se corresponden con las
secciones de código y datos del fichero ejecutable. La pila
se crea de forma automática y su tamaño varía en tiempo de
ejecución y es controlado por el kernel. La pila consiste en
marcos de pila (stack frames) que son añadidos cuando se
llama a una función y extraídos cuando ésta termina. La
profundidad de la pila la indica un registro denominado
puntero de pila (stack pointer). Un marco de pila contiene
los parámetros de la función, sus variables locales y los
datos necesarios para recuperar el anterior marco de pila,
que incluyen los valores del contador de programa y el stack
pointer que existían cuando se llamó a la
Comentarios de: Sistemas Operativos II - TEMA 6 - Implementación de UNIX (0)
No hay comentarios