8. CASO DE ESTUDIO: UNIX

Unix es uno de los sistemas operativos más ampliamente usados en computadoras
que varían desde las personales hasta las macro. Existen versiones para máquinas
uniprocesador hasta multiprocesadores. Debido a su historia, que evoluciona en
los Laboratorios Bell de AT&T con un simulador de un viaje espacial en el
sistema solar, pasando por su expansión en universidades y la creación de las
versiones más importantes que son la de la Universidad de Berkeley y el Sistema
V de la misma AT&T.
Debido a las múltiples
versiones en el mercado de UNIX, se comenzaron a publicar estándares para que
todas la s versiones fuesen 'compatibles'. La primera de ellas la lanzó AT&T
llamada SVID (System V Interface Definition) que defininía cómo deberían ser las
llamadas al sistema, el formato de los archivos y muchas cosas más, pero la otra
versión importante, la de Bekeley (Berkeley Software Distribution o BSD)
simplemente la ignoró. Después la IEEE usó un algoritmo consistente en revisar
las llamadas al sistema de ambas versiones (System V y BSD) y aquellas que eran
iguales las definió como estándares surgiendo así la definición 'Portable
Operating System for UNIX' o POSIX, que tuvo buen éxito y que varios fabricantes
adoptaron rápidamente. El estándard de POSIX se llama 1003.1 Posteriormente los
institutos ANSI e ISO se interesaron en estandarizar el lenguaje 'C' y
conjuntamente se publicaron definiciones estándares para otras áreas del sistema
operativo como la interconectividad, el intérprete de comandos y otras. En la
tabla 8.1 se muestran las definiciones de POSIX. [Tan92].
Estándard Descripción
1003.0 Introducción y repaso.
1003.1 Llamadas al sistema.
1003.2 Intérprete y comandos.
1003.3 Métodos de prueba.
1003.4 Extensiones para tiempo real.
1003.5 Lenguaje Ada.
1003.6 Extensiones para la seguridad
1003.7 Administración del Sistema.
1003.8 Acceso transparente a archivos.
1003.9 Lenguaje Fortran.
1003.10 Supercómputo.
Tabla 8.1 Los Estándares de POSIX
Al momento del auge de los estándares de POSIX desgraciadamente se formó un
grupo de fabricantes de computadoras (IBM, DEC y Hewlett-Packard) que lanzaron
su propia versión de UNIX llamada OSF/1 (de Open Software Fundation). Lo bueno
fue que su versión tenía como objetivo cumplir con todas los estándares del
IEEE, además de un sistema de ventanas (el X11), una interfaz amigable para los
usuarios (MOTIF) y las definiciones para cómputo distribuido (DCE) y
administración distribuida (DME). La idea de ofrecer una interfaz amigable en
UNIX no fue original de OSF, ya en la versión 3.5 de SunOS de Sun Microsystems
se ofrecía una interfaz amigable y un conjunto de librerías para crear
aplicaciones con interfaz gráfica técnicamente eficiente y poderosa llamada
SunWindows o SunVIEW. Esta interfaz junto con sus librerías estaban
evolucionando desde la versión para máquinas aisladas hacia una versión en red,
donde las aplicaciones podían estarse ejecutando en un nodo de la red y los
resultados gráficos verlos en otro nodo de la red, pero Sun tardó tanto en
liberarlo que le dio tiempo al MIT de lanzar el X11 y ganarle en popularidad.
AT&T formó, junto con Sun Microsystems y otras compañias UNIX
International y su versión de UNIX, provocando así que ahora se manejen esas dos
corrientes principales en UNIX.
Las ideas principales de UNIX
fueron derivadas del proyecto MULTICS (Multiplexed Information and Computing
Service) del MIT y de General Electric. Estas ideas son:
- Todo se maneja como cadena de bytes: Los dispositivos periféricos, los
archivos y los comandos pueden verse como secuencias de bytes o como entes que
las producen. Por ejemplo, para usar una terminal en UNIX se hace a través de
un archivo (generalmente en el directorio /dev y con nombre ttyX).
- Manejo de tres descriptores estándares: Todo comando posee tres
descriptores por omisión llamados 'stdin', 'stdout' y 'stderr', los cuales son
los lugares de donde se leen los datos de trabajo, donde se envían los
resultados y en donde se envían los errores, respectivamente. El 'stdin' es el
teclado, el 'stdout' y el 'stderr' son la pantalla por omisión (default).
- Capacidades de 'entubar' y 'redireccionar': El 'stdin', 'stdout' y el
'stderr' pueden usarse para cambiar el lugar de donde se leen los datos, donde
se envían los resultados y donde se envían los errores, respectivamente. A
nivel comandos, el símbolo de 'mayor que' (>) sirve para enviar los
resultados de un comando a un archivo. Por ejemplo, en UNIX el comando 'ls'
lista los archivos del directorio actual (es lo mismo que 'dir' en DOS). Si en
vez de ver los nombres de archivos en la pantalla se quieren guardar en el
archivo 'listado', el redireccionamiento es útil y el comando para hacer la
tarea anterior es 'ls > listado'. Si lo que se desea es enviar a imprimir
esos nombres, el 'entubamiento' es útil y el comando sería 'ls | lpr', donde
el símbolo "|" ( pipe) es el entubamiento y 'lpr' es el comando para imprimir
en UNIX BSD.
- Crear sistemas grandes a partir de módulos: Cada instrucción en UNIX está
diseñada para poderse usar con 'pipes' o 'redireccionamiento', de manera que
se pueden crear sistemas complejos a través del uso de comandos simples y
elegantes. Un ejemplo sencillo de esto es el siguiente. Suponga que se tienen
cuatro comandos separados A,B,C y D cuyas funcionalidades son:
A: lee matrices checando tipos de datos y formato.
B: recibe matrices, las invierte y arroja el resultado en forma matricial.
C: recibe una matriz y le pone encabezados 'bonitos'
D: manda a la impresora una matriz cuidando el salto de página, etc.
Como se ve, cada módulo hace una actividad específica, si lo que se quiere
es un pequeño sistema que lea un sistema de ecuaciones y como resultado se
tenga un listado 'bonito', simplemente se usa el entubamiento para leer con el
módulo A la matriz, que su resultado lo reciba el B para obtener la solución,
luego esa solución la reciba el módulo C para que le ponga los encabezados
'bonitos' y finalmente eso lo tome el módulo D y lo imprima, el comando
completo sería ' A | B | C | D '. ø Fácil no ?
El sistema de archivos
de UNIX, desde el punto de vista del usuario, tiene una organización jerárquica
o de árbol invertido que parte de una raíz conocida como "/" (diagonal). Es una
diagonal al revés que la usada en DOS. Internamente se usa un sistema de
direccionamiento de archivos de varios niveles, cuya estructura más primitiva se
le llama 'information node' (i-node) cuya explicación va más allá de este
trabajo. El sistema de archivos de UNIX ofreceun poderoso conjunto de comandos y
llamadas al sistema. En la tabla 8.2 se muestran los comandos más útiles para el
manejo de archivos en UNIX vs. VMS.
Comando en UNIX Comando en VMS Utilidad
rm delete borra archivos
cpb copy copia archivos
mv rename renombra archivos
ls dir lista directorio
mkdir create/directory crea un directorio
rmdir delete borra directorio
ln - crea una 'liga simbolica'
chmod set protection maneja los permisos
chown set uic cambia de dueño
Tabla 8.2 Manejo de Archivos en UNIX y VMS
La protección de archivos en UNIX se maneja por medio de una cadena de
permisos de nueve caracteres. Los nueve caracteres se dividen en tres grupos de
tres caracteres cada uno.
RWX RWX RWX
1 2 3
El primer grupo (1) especifica los permisos del dueño del archivo. El
segundo grupo especifica los permisos para aquellos usuarios que pertenecen al
mismo grupo de trabajo que el dueño y finalmente el tercer grupo indica los
permisos para el resto del mundo. En cada grupo de tres caracteres pueden
aparecer las letras RWX en ese orden indicando permiso de leer (READ), escribir
(WRITE) y ejecutar (EXECUTE). Por ejemplo, la cadena completa RWXR-XR-- indica
que el dueño tiene los tres permisos (READ,,WRITE,EXECUTE), los miembros de su
grupo de trabajo tienen permisos de leer y ejecutar (READ,EXECUTE) y el resto
del mundo sólo tienen permiso de leer (READ). Las llamadas al sistema más útiles
en UNIX son 'open', 'close' e 'ioctl'. Sirven para abrir, cerrar archivos; y
establecer las características de trabajo. Por ejemplo, ya que en UNIX las
terminales se accesan a través de archivos especiales, el 'ioctl' (input output
control) sirve para establecer la velocidad, paridad, etc; de la terminal.
El núcleo de UNIX (kernel) se
clasifica como de tipo monolítico, pero en él se pueden encontrar dos partes
principales [Tan92]: el núcleo dependiente de la máquina y el núcleo
independiente. El núcleo dependiente se encarga de las interrupciones, los
manejadores de dispositivos de bajo nivel (lower half) y parte del manejo de la
memoria. El núcleo independiente es igual en todas las plataformas e incluye el
manejo de llamadas del sistema, la planificación de procesos, el entubamiento,
el manejo de sentilde;ales, la paginación e intercambio, el manejo de discos y
del sistema de archivos.
El manejo de procesos en UNIX
es por prioridad y round robin. En algunas versiones se maneja también un ajuste
dinámico de la prioridad de acuerdo al tiempo que los procesos han esperado y al
tiempo que ya han usado el CPU. El sistema provee facilidades para crear 'pipes'
entre procesos, contabilizar el uso de CPU por proceso y una pila común para
todos los procesos cuando necesitan estarse ejecutando en modo privilegiado
(cuando hicieron una llamada al sistema). UNIX permite que un proceso haga una
copia de sí mismo por medio de la llamada 'fork', lo cual es muy útil cuando se
realizan trabajos paralelos o concurrentes; también se proveen facilidades para
el envío de mensajes entre procesos. Recientemente Sun Microsystems, AT&T,
IBM, Hewlett Packard y otros fabricantes de computadoras llegaron a un acuerdo
para usar un paquete llamado ToolTalk para crear aplicaciones que usen un mismo
método de intercambio de mensajes.
Los primeros sistema
con UNIX nacieron en máquinas cuyo espacio de direcciones era muy pequeño (por
ejemplo 64 kilobytes) y tenían un manejo de memoria real algo complejo.
Actualmente todos los sistemas UNIX utilizan el manejo de memoria virtual siendo
el esquema más usado la paginación por demanda y combinación de segmentos
paginados, en ambos casos con páginas de tamaño fijo. En todos los sistemas UNIX
se usa una partición de disco duro para el área de intercambio. Esa área se
reserva al tiempo de instalación del sistema operativo. Una regla muy difundida
entre administradores de sistemas es asignar una partición de disco duro que sea
al menos el doble de la cantidad de memoria real de la computadora. Con esta
regla se permite que se puedan intercambiar flexiblemente todos los procesos que
estén en memoria RAM en un momento dado por otros que estén en el disco. Todos
los procesos que forman parte del kernel no pueden ser intercambiados a disco.
Algunos sistemas operativos (como SunOS) permiten incrementar el espacio de
intercambio incluso mientras el sistema está en uso (en el caso de SunOS con el
comando 'swapon'). También es muy importante que al momento de decidirse por un
sistema operativo se pregunte por esa facilidad de incrementar el espacio de
intercambio, así como la facilidad de añadir módulos de memoria RAM a la
computadora sin necesidad de reconfigurar el núcleo.
Derivado de la
filosofía de manejar todo como flujo de bytes, los dispositivos son considerados
como archivos que se accesan mediante descriptores de archivos cuyos nombres se
encuentran generalmente en el directorio '/dev'. Cada proceso en UNIX mantiene
una tabla de archivos abiertos (donde el archivo puede ser cualquier dispositivo
de entrada/salida). Esa tabla tiene entradas que corresponden a los
descriptores, los cuales son números enteros [Deitel93] obtenidos por medio de
la llamada a la llamada del sistema 'open'. En la tabla 8.3 se muestran las
llamadas más usuales para realizar entrada/salida. Llamada Función
open Obtener un descriptor entero.
close Terminar las operaciones sobre el archivo
lseek Posicionar la entrada/salida.
read,write Leer o escribir al archivo (dispositivo)
ioctl Establecer el modo de trabajo del dispositivo
Tabla 8.3 Llamadas al sistema de entrada/salida
En UNIX es posible ejecutar llamadas al sistema de entrada/salida de dos
formas: síncrona y asíncrona. El modo síncrono es el modo normal de trabajo y
consiste en hacer peticiones de lectura o escritura que hacen que el originador
tenga que esperar a que el sistema le responda, es decir, que le de los datos
deseados. A veces se requiere que un mismo proceso sea capaz de supervisar el
estado de varios dispositivos y tomar ciertas decisiones dependiendo de si
existen datos o no. En este caso se requiere una forma de trabajo asíncrona.
Para este tipo de situaciones existen las llamadas a las rutinas 'select' y
'poll' que permiten saber el estado de un conjunto de descriptores.

Indice
| Anterior
| Siguiente