Академический Документы
Профессиональный Документы
Культура Документы
Sistemas Operativos I
Índice general I
Índice de tablas XI
Introducción XVII
I
II ÍNDICE GENERAL
1.6.5. MacOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
1.6.5.1. La fundación UNIX: el kernel Darwin y BSD . . . . . . . . 63
1.6.6. Windows 2003 Server . . . . . . . . . . . . . . . . . . . . . . . . . . 65
1.6.6.1. Un poco de historia . . . . . . . . . . . . . . . . . . . . . . 65
1.6.6.2. Características importantes . . . . . . . . . . . . . . . . . . 67
1.6.7. Consideraciones finales . . . . . . . . . . . . . . . . . . . . . . . . . . 68
1.7. Problemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
1.8. Lecturas adicionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Bibliografía 369
XI
XII ÍNDICE DE TABLAS
Índice de figuras
XIII
XIV ÍNDICE DE FIGURAS
X isten muchos libros que hablan sobre los sistemas operativos. La mayoría traen más in-
E formación de la que puede ser tratada en un curso de seis meses. En este libro se trató de
incluir aquella información que se consideró más importante para poder concluir el curso en el
tiempo señalado. No se pretende la substitución de la investigación por parte del alumno sobre
los temas de la materia, si no más bien, proporcionar un marco que ubique al estudiante para
que de ser necesario y a partir de ello tenga una idea clara de los conceptos clave y luego dirigir
su búsqueda en otras fuentes informativas.
Es importante recalcar que es obligatorio para el alumno y el docente profundizar hasta
donde sea necesario en otras fuentes de información sobre los temas analizados en este libro
para una mayor comprensión.
También es muy importante que el alumno haya cursado las materias básicas de programa-
ción I y II, incluyendo estructuras de datos y manejo de archivos. Sin estas bases sería muy
difícil dar seguimiento a las ideas subyacentes de diseño de un sistema operativo.
Existen muchos temas en los que se recomienda encarecidamente que el alumno haga progra-
mas breves en donde simule las estructuras utilizadas por el sistema operativo para las distintas
estrategias de implementación de los módulos del sistema.
Al mismo tiempo que se enseña la teoría se recomienda también poner ejemplos sobre el uso
de las interfaces o instrucciones que están directamente involucradas con el tema. En la mayoría
de las unidades se incluyen algunas instrucciones que pueden ser probadas ya sea en un sistema
operativo UNIX/Linux o en Windows.
La estructura general del libro es la que propone el programa de la materia de sistemas opera-
tivos I. Refiérase el lector al temario y actividades propuestas para complementar su aprendizaje.
En el anexo I se hace una transcripción del temario propuesto, las actividades complementa-
rias y las prácticas que deben de llevarse a cabo.
A continuación daremos un breve bosquejo del contenido del libro. En la introducción se
explica el contenido del libro para una referencia rápida.
En el capítulo 1 se hace una introducción general a los sistemas operativos. Se hacen defini-
XVII
XVIII ÍNDICE DE FIGURAS
ciones básicas. Se hace una descripción detallada de los tipos de usuario que que interactúan con
un sistema operativo. Aquí el alumno debe de identificar claramente a estos usuarios y reconocer
las necesidades de cada uno de ellos.
Es muy importante conocer la arquitectura general de la computadora incluyendo sus princi-
pales componentes. En este capítulo se recomienda que el alumno haga una investigación acerca
de todos los periféricos que existen actualmente, de preferencia incluyendo precios caracterís-
ticas y principios de funcionamiento, así como el tipo de interfaz de hardware que manejan a
nivel conceptual. Se trata también de forma general el proceso de arranque de la computadora.
Desde la configuración de la BIOS para seleccionar el dispositivo de arranque, la lectura del
Registro Maestro de Arranque o MBR, la carga del sistema operativo en sí, la inicialización del
vector de interrupciones hasta la puesta en marcha de las interfaces de usuario, que en su forma
más simple puede ser una línea de comando o hasta la más compleja: una interfaz gráfica con
un conjunto completo de ventanas. Todo esto será analizado en la sección 1.1.
Para entender cómo se ha llegado hasta los actuales sistemas operativos, se hace una breve
remembranza de la historia de las computadoras y de los sistemas operativos. Ambas han estado
siempre muy ligados, ya que a medida que se ha mejorado el hardware en esa misma proporción,
aunque más lento, ha sido también el desarrollo de los sistemas operativos. En la actualidad, y
creo que ha sido así durante mucho tiempo, el software no ha podido aprovechar completamente
el hardware nuevo. El sistema operativo por tanto, no es la excepción, al ser el encargado de
manejar todo el hardware si éste no es capaz de manejarlo es muy improbable que lo hagan las
aplicaciones.
Se dedica también una sección en 1.3 a la evolución de los sistemas operativos, poniendo
ejemplos de los principales competidores que existen en la actualidad. Debe quedar claro que
la visión aquí expuesta puede cambiar dentro de algunos años debido al gran avance que hay
en estas áreas. Se empieza analizando cómo es que surgieron los primeros sistemas operativos
dedicados, la necesidad de agrupar las tareas por lotes. La separación de la ejecución de las
aplicaciones con tiempo de CPU de aquellas con operaciones de entrada salida, hasta llegar a
los actuales sistemas de tiempo compartido o sistemas de multiprogramación que permiten hacer
un uso más eficiente del tiempo de CPU y de las tremendas capacidades de las computadoras de
hoy en día.
En los subsistemas de un sistema operativo que se analizarán en la sección 1.2 se da una
introducción general de los componentes principales y que forman parte de mucho material de
este libro. El primer tema es el relacionado con la administración de procesos. Un proceso es
la unidad básica de trabajo del sistema operativo. Cuando el sistema lee un programa de disco,
éste lo transforma en un proceso, le proporciona los recursos que necesita, lo coloca en memoria
y empieza su ejecución. El sistema puede entonces crear, suspender o “matar” a un proceso de
ÍNDICE DE FIGURAS XIX
acuerdo a las directivas impuestas por el propio sistema operativo. La planificación de la CPU es
el módulo que se encarga de proporcionar el tiempo de ejecución que corresponde a cada proceso
dentro del sistema. Existen dos técnicas generales: el planificador a corto plazo y el planificador
a largo plazo. Ambos tienen ventajas y desventajas. La mayoría de los sistemas actuales usan
la técnica de tiempo compartido con prioridades que también se analizan en el libro. El otro
aspecto importante es acerca de la administración de memoria, terminando con la administración
de dispositivos de entrada salida y con el administrador de sistemas de archivos. Se da una
descripción de los tipos de estructura de sistemas operativos más importantes: micronúcleos
y kernel modular, con dos enfoques: estructura única o estructura por niveles. Se termina el
capítulo con un análisis de los sistemas operativos más comerciales. Se recomienda que en
este punto los alumnos actualicen la información proporcionada de forma que sean capaces de
observar los cambios de características en las nuevas versiones de sistemas operativos.
En el capítulo 2 entramos a discutir todos los aspectos relacionados con los procesos, sus
definiciones, tipos de procesos: procesos e hilos, el problema de concurrencia que implica el
acceso simultáneo al mismo recurso por dos o más procesos. Los conceptos de sección crítica,
cómo debe de solucionarse el problema de la exclusión mutua, los métodos de organización
usando semáforos, monitores o paso de mensajes.
Se proporciona también las definiciones de concurrencia e interbloqueo, las condiciones que
deben de cumplirse para que exista el interbloqueo y también se dan algunas soluciones para
evitarlo, que obviamente, es impidiendo al menos una de las condiciones, pero no obstante, la
implementación de alguna de estas soluciones no es un problema trivial.
En el capítulo 2.5 se analizan los aspectos relacionados con la administración del tiempo
de la CPU. Básicamente existen dos enfoques: la planificación apropiativa y la planificación no
apropiativa. En la planificación no apropiativa, el sistema operativo asigna un proceso a la CPU
y a partir de ahí no puede recuperar el control hasta que el proceso lo ceda voluntariamente al
sistema operativo. En la planificación apropiativa el sistema operativo puede quitarle al proceso
la CPU en el momento en que sea necesario. Se analizan también varias técnicas de planificación
interesantes desde el punto de vista teórico y otras que han sido implementadas exitosamente en
algunos sistemas operativos actuales. En este capítulo se da una introducción básica a los siste-
mas operativos de multiproceso. Se hace un breve análisis de una arquitectura multiprocesador y
se analizan algunos conceptos de paralelismo. También se analizan las ventajas de los sistemas
de multiprocesamiento, su clasificación, la forma en que se organiza un sistema multiprocesador
para terminar con un análisis sobre los sistemas operativos que soportan múltiples procesadores.
En el capítulo 3 se hace un revisión de las técnicas de manejo de memoria. Se empieza
con una discusión acerca del administrador de memoria, luego se ven las técnicas de manejo
de memoria real, la memoria virtual que incluye las técnicas de paginación, segmentación y
XX ÍNDICE DE FIGURAS
los algoritmos de sustitución de páginas, con algunos aspectos para el diseño del sistema y las
formas de implementación de liberación de páginas.
En el capítulo 4 se definen los principios básicos del hardware de entrada salida. También
se analizan los principios del software de entrada salida, conocidos como controladores. Se
recalca la diferencia entre la tarjeta controladora del dispositivo y el manejador o driver de la
tarjeta controladora que viene a ser el software que debe de cargar el sistema operativo para
poder manipular ese dispositivo. Se ven también las técnicas utilizadas por algunos sistemas
operativos para mantener una interfaz estándar que es independiente del dispositivo, de forma
tal que es posible usar esta interfaz para manejar a la mayoría de ellos con pocas llamadas al
sistema.
Se describe la forma de implementar un disco RAM y cómo se accede a los discos presentes
en el sistema, definiendo primeramente el hardware de discos y luego el software de éste para
su control. Se explican los algoritmos para la planificación del disco.
En los sistemas de tiempo compartido es muy importante el control del reloj. Toda compu-
tadora tiene un reloj que el sistema operativo puede usar para poder planificar el tiempo que debe
asignarse a cada proceso. También es una forma de implementar la planificación apropiativa, de
manera que la ejecución de algún proceso sea suspendida cada cierto tiempo de forma tal que
el sistema operativo pueda tomar el control de la computadora y verificar si el proceso continúa
ejecutándose o se asigna la CPU a otro proceso. Se termina el capítulo con una descripción del
manejo de terminales, haciendo una descripción del hardware y software utilizado para su con-
trol. Se hace hincapié en los manejadores de teclado y de vídeo que son casos particulares de
las terminales y que muchas veces se tratan como si lo fueran. Aunque en realidad un sistema
de terminal se compone precisamente de un monitor y de un teclado. Las terminales actuales
incluyen también un ratón, no obstante esto no cambia en mucho el enfoque de las antiguas
terminales en cuanto a su manejo como dispositivos seriales lentos.
En el capítulo 5 se da la definición de archivo, se describen las operaciones que pueden
hacerse en un archivo y también se describe a un archivo como un componente más dentro de la
jerarquía de datos visto desde la perspectiva de los lenguajes de programación. Pasamos después
a explicar las formas más comunes que usan los sistemas operativos para la implementación del
sistema de archivos. La primera clasificación que se usa son la de los archivos de texto y los
archivos binarios. Los archivos texto son una forma simple de compartir datos entre diferentes
plataformas. La mayoría de los programadores y las aplicaciones pueden trabajar con este tipo de
archivo. Es necesario cambiar algunos caracteres especiales para que cada plataforma pueda leer
correctamente las líneas de estos archivos. Es normal que un sistema UNIX/Linux use solamente
un caracter para representar la nueva línea y el retorno de carro mientras que un sistema basado
en MS-DOS o Windows se usen dos caracteres distintos: uno para la nueva línea y otro para
ÍNDICE DE FIGURAS XXI
el retorno de carro. Por lo demás el texto es completamente legible. Los archivos binarios, en
cambio no pueden ser visualizados por algún editor de texto normal. Estos archivos pueden
representar programas ejecutables, imágenes o números, por lo tanto no es posible tratarlos
como archivos de texto. Si el usuario aún después de saber esta diferencia intenta usar un editor
de texto común o alguna utilería del sistema operativo que espera un archivo de texto para
mostrar su contenido, los resultados pueden no ser los que esperaba. En algunas ocasiones el
intentar mostrar un archivo binario en alguna terminal puede hacer que ésta se bloquee, debido
a que la terminal intentará interpretar algunos caracteres no imprimibles como órdenes.
Otro aspecto es en el manejo de archivos es comprender la importancia de la interfase con el
usuario, que incluye la forma mediante la cual el usuario puede acceder a sus datos dentro del
archivo. Con estas herramientas pasamos entonces al diseño del sistema de archivos explicando
las diferentes técnicas que se usan para implementar un sistema de archivos real. Se explican
también algunas modalidades de clientes especiales que atiende el servidor de archivos. Debido
a que este nombre es general, se hace una clasificación más específica acerca de los diferentes
servidores que un usuario puede encontrar en la red.
El respaldo de datos es un tema que debe ser recalcado a nuestros estudiantes, puesto que
permite recuperar el sistema después de algún tipo de desastre. Por desgracia a nivel de compu-
tación personal no está tan difundido el respaldo de información. A nivel empresarial es decidi-
damente necesario implementar alguna técnica de respaldo de información. La más común es la
estrategia de respaldo incremental de información.
Otro punto importante es la forma mediante la cual se implementa la seguridad en los archi-
vos, ya sea mediante un campo de atributos en su forma más simple o hasta el uso de listas de
acceso que almacenan a los usuarios y las operaciones que tienen autorizado efectuar sobre el
archivo o directorio.
Se analizan también las llamadas al sistema implementadas para el manejo de archivo y
dispositivos y de acuerdo a las interfases proporcionadas por el sistema operativo para cada tipo
de usuario. Se termina el capítulo con una explicación del lenguaje de comunicación utilizado
por el sistema operativo en línea de comandos y la forma en que se comunican las utilerías y
muchos programas por medio de tuberías.
En el capítulo 6 se analizan las técnicas de implementación y uso para la medición del
desempeño de los sistemas operativos. Se hace una descripción acerca de cómo implementar
los mecanismos de seguridad mínimos de forma que el estudiante aprenda cuáles son los reque-
rimientos de seguridad con los que debe contar cualquier sistema operativo que se encuentre
conectado en la red o incluso en una oficina al que tienen acceso varias personas. Se analizan
también las técnicas de auditoría control de acceso, seguridad por hardware o software, cripto-
grafía y algunas técnicas comunes para comprometer la integridad del sistema operativo.
XXII ÍNDICE DE FIGURAS
Como notas finales quisiera agradecer al Instituto Tecnológico de Apizaco por su apoyo
incondicional para el desarrollo de este proyecto, a la Academia de Sistemas y Computación, al
Centro de información, a la Internet, red de redes que gracias a ella, se puede despejar una duda
en menos de un minuto mediante una buena búsqueda, gracias a las miles de comunidades de
software libre existentes a nivel mundial que desinteresadamente aportan mucho de su tiempo
para que podamos hacer uso de un sistema operativo espectacular y que si lo deseamos podemos
desentrañar todos sus secretos con el código fuente frente de nosotros. Es una oportunidad que
ni nosotros ni nuestros estudiantes deben desaprovechar.
Por último para no herir susceptibilidades quiero agradecer también a todos aquellos que
directa o indirectamente intervinieron para que este trabajo se hiciera realidad.
Ojalá también este libro sea la base para futuros trabajos y como toda obra humana, el
escrito actual puede aún mejorarse de innumerables formas. Cualquier sugerencia o aportación
será bienvenida.
Espero también que nuestros alumnos hagan uso intensivo de este material como una guía
dentro de su aprendizaje, que al final es el objetivo principal de esta y de todas las obras del ser
humano.
Capítulo 1
1
2 1.1. DEFINICIÓN, Y CONCEPTO
En general podemos clasificar a nuestros usuarios en dos grandes entornos: entornos perso-
nales y entornos empresariales o institucionales. Dentro de éstos es posible categorizar aún más
en tres grupos, usuarios finales, usuarios programadores y usuarios administradores:
Entornos personales. Un sistema operativo dentro de un entorno personal debe de cubrir ne-
cesidades orientadas hacia una sola persona y su familia. Debe de estar enfocado a facilitar su
interacción con el usuario mediante sistemas multimedia, entornos gráficos y fáciles de usar,
tener la mayor cantidad de ayuda posible en línea, contar con asistentes para el desarrollo de
las diversas tareas de instalación y puesta en marcha que incluyen el sistema operativo pasando
por las aplicaciones y el uso de las mismas. El sistema operativo debe de ser capaz incluso de
proveer los mecanismos para incluir y detectar la mayor cantidad de hardware de dispositivos
de entrada/salida tales como tarjetas de vídeo, de sonido, módems, tarjetas de red, tarjetas de
captura de vídeo, memorias USB1 y toda la gama de dispositivos que surgen hoy en día orienta-
dos hacia la conectividad teléfonos celulares, cámaras de vídeo digitales, cámaras fotográficas.
Todo ello con una intervención mínima del usuario.
Hay que tener en cuenta que a nuestro usuario no podemos decirle: “Indique el número de
ranura del slot PCI en el que instaló su GeForce4 MX 420 También debe incluir el número de
interrupción que desea que utilice el sistema operativo. Es necesario que indique los controla-
dores de DRI,GLX,DDC, la tasa de refresco horizontal y vertical de su monitor y la resolución
en pixeles verticales y horizontales”. En la mayoría de los casos estos usuarios solo quieren usar
su computadora. Solamente es necesario que el usuario, tenga unos conceptos mínimos de base
para que pueda disfrutar de su equipo de cómputo.
Usuarios Finales. Los usuarios finales son aquellos que realizan tareas relacionadas directa-
mente con la productividad en su campo específico, como un usuario de hoja de cálculo o de
procesador de palabras cuyas necesidades se reducen a hacer uso de tareas como ejecutar su
aplicación, escribir su documento, imprimirlo o mandarlo vía correo electrónico, guardar una
copia en disco en CD o en su pendrive2 . Hacer presentaciones, escuchar música, ver vídeos,
incluso jugar, ya sea un juego individual o jugar en equipo vía red local o internet.
Este tipo de usuarios, por lo común requieren una interfaz lo más intuitiva y fácil de usar en
la medida de lo posible. De ahí que a lo largo de la historia de las computadoras se haya puesto
mucho énfasis en el desarrollo de interfases visuales, uso de ratón pantallas táctiles y toda una
gama de dispositivos que faciliten la interacción del usuario final con la computadora.
Podemos encontrar en este ámbito a las computadoras personales que básicamente están de-
dicadas a cubrir las necesidades de una persona y su familia. Y aparentemente no requieren de
mucha seguridad, tal vez no sea necesario un complejo sistema operativo que administre múlti-
ples tareas o múltiples usuarios al mismo tiempo, no obstante, en la actualidad, se está poniendo
cada vez más al alcance de todos la computación multitarea y multiusuario, e incluso los sis-
temas multiprocesadores (al momento de escribir este libro, pueden conseguirse procesadores
core duo 3 ). Los conceptos anteriores se analizarán con mayor detalle en el punto 1.1.1.2.
En la computación personal es frecuente que se use la computadora para hacer compras vía
internet, pagos interbancarios, declaración y pago de impuestos, inscripción a escuelas, obten-
ción de documentos personales como extractos de actas de nacimiento, constancias estatales de
no habilitación e incluso varios usuarios se “llevan” el trabajo a casa, o mejor dicho se conectan
desde su casa al trabajo para terminar los pendientes.
Todo ello implica un ajuste tremendo en la seguridad de los sistemas operativos que usan,
debido a la delicadeza de la información que se transfiere. De ahí la importancia que tiene
escoger adecuadamente un sistema operativo.
2
Memoria USB
3
Es un chip que cuenta con dos núcleos de procesador y que puede verse ya como sistema multiprocesador
CAPÍTULO 1. INTRODUCCIÓN A LOS SISTEMAS OPERATIVOS 5
Los usuarios finales empresariales difieren solamente en los mecanismos de acceso que de-
ben de usar antes de poder hacer uso de la computadora. Por lo común estarán restringidos por
políticas empresariales o institucionales al uso de algunos paquetes expresamente instalados por
el encargado de la administración de los equipos o de la red. Estos usuarios no pueden, salvo
previa autorización, instalar ningún tipo de software y frecuentemente están siendo monitoriza-
dos por el sistema operativo, guardando la hora de acceso, programas ejecutados, transacciones
realizadas y varias estadísticas orientadas al mejoramiento de la productividad de los usuarios.
Una computadora basada en esta arquitectura cuenta básicamente con los siguientes elemen-
tos: una Unidad Central de Proceso (UCP), una memoria principal, una memoria secundaria y
un conjunto de dispositivos de entrada/salida periféricos.
Registros. Los registros son usados por la unidad aritmético lógica y pueden ser de ocho,
dieciseis, treinta y dos o sesenta y cuatro bits. Los registros de mayor cantidad de bits pueden ser
divididos en registros más pequeños, de acuerdo al tamaño de dato que vaya a utilizarse. Tene-
mos unos registros especiales llamados registros de índice que pueden ser usados para acceder
un dato a partir de un desplazamiento dado. Otro conjunto de registros está encargado de guardar
las direcciones correspondientes a segmentos de memoria que indican en donde se encuentran
los datos, el código y la pila. En algunas arquitecturas cualquier registro de propósito general
puede ser usado como registro índice.
Bus de direcciones. La unidad de control debe de colocar aquí una dirección, ya sea de una
localidad de memoria principal o la de un dispositivo de entrada/salida. El número de bits usados
aquí determina la capacidad total en bytes de direccionamiento en la memoria. por ejemplo, si
contamos con un bus de direcciones de 32 bits, el número máximo de localidades que podemos
acceder es de direcciones totales = 232 bytes.
Bus de datos. Se encarga de enviar los datos a memoria principal y a los dispositivos de
entrada/salida. Es necesario que antes se coloque una dirección en el bus de direcciones. El
CAPÍTULO 1. INTRODUCCIÓN A LOS SISTEMAS OPERATIVOS 9
tamaño de los datos que se pueden extraer de la memoria depende del número de bits usados
aquí.
en ciertos equipos el procesador debe de insertar varios ciclos de espera. Estos mecanismos
maximizan el tiempo de procesador ocupado.
Memoria Secundaria. Debido a que la memoria principal es pequeña se hace patente la nece-
sidad de mantener los datos en otros dispositivos a éstos se les agrupa en la categoría de memoria
secundaria. El dispositivo de almacenamiento secundario más común son los discos magnéticos.
Un disco va a dividirse primeramente en pistas, sectores y cilindros. Luego deben de asignarse
particiones o rebanadas que van a ser independientes. Si se daña una partición, es muy probable
que las demás estén intactas. Sobre cada partición puede montarse un sistema de archivos en el
capítulo 5 daremos una explicación detallada de sus estructuras y su administración, puesto que
es uno de los recursos más importantes de una computadora. Los discos magnéticos se clasifi-
can primordialmente en base a su velocidad, y ésta es medida comúnmente en revoluciones por
minuto (rpm), así tenemos discos de 5400 rpm, 720 rpm, 10000 rpm y 15000 rpm.
Otro aspecto muy importante es su capacidad en bytes, anteriormente se manejaban en me-
gabytes, por ejemplo, 10 Megabytes. En la actualidad podemos encontrar discos duros que van
desde 10 Gigabytes (y ya es pequeño) hasta terabytes. Un Kbyte equivale a 1024 bytes, 1 Me-
gabyte equivale a 1024 Kbytes, 1 Gigabyte equivale a 1024 Megabytes, 1 Terabyte equivale
1024 gigabytes. Actualmente es común encontrar discos duros de 100 gigabytes, 180 gigabytes
y más.
Desde un punto de vista tecnológico podemos clasificar a los discos duros por su interfase
con la computadora. Existen básicamente tres clasificaciones:
La tecnología IDE/EIDE/ATA tiene tasas de transferencia del orden de los 133 Megabits
sobre segundo. La tecnología SCSI ronda en una tasa de transferencia de alrededor de los 320
Megabits sobre segundo. La tecnología Sata tiene tasas de trasferencia del orden de los 300
Megabits sobre segundo.
A medida que aumenta la velocidad se incrementa el precio. También al aumentar la capaci-
dad aumenta el precio, aunque comúnmente no va en relación directa con la capacidad. Esto es,
puede adquirirse un disco de 200 Gigabytes por una fracción de dos discos de 100 Gigabytes.
Los discos SCSI son capaces de sostener la velocidad de transferencia aún cuando tengamos
varios dispositivos conectados al bus, lo que no sucede con las otras tecnologías. Además, la
CAPÍTULO 1. INTRODUCCIÓN A LOS SISTEMAS OPERATIVOS 11
tecnología SCSI está diseñada para trabajo pesado 24 horas al día, por 365 días al año, lo que
implica que si vamos a montar un sistema operativo como servidor es más recomendable instalar
un disco basado en tecnología SCSI.
La regla del precio se aplica no solamente a los discos duros, podemos establecer una cla-
sificación basada en el costo por byte colocando primeramente los más caros para terminar con
los más baratos. En la figura 1.3 podemos ver esta relación. Observe cómo a medida que nos
alejamos del procesador la velocidad disminuye y también el precio. La única excepción que
puede hacerse son las memorias USB que cada día son más baratas, incluso se están diseñando
memorias de este tipo para substituir a los discos duros.
Hay que hacer notar que los dispositivos de almacenamiento también podemos clasificarlos
en memoria volátil y no volátil. De este modo, los registros, la memoria caché y la memoria
RAM caen dentro de la categoría de memorias volátiles Todos los demás caen dentro de la otra
categoría
12 1.1. DEFINICIÓN, Y CONCEPTO
el modo transferencia basado en bloques. El controlador solamente será llamado una sola vez
vía interrupción hardware, cuando se haya terminado de transferir los 300 Kbytes. Para lograr
que sea posible transferir cantidades de información grandes, al controlador se le asignan áreas
de memoria llamadas búffers
Después de haber descrito los componentes de una arquitectura tipo Von Newmann, ahora
corresponde analizar otro tipo de clasificación basada en el número de procesadores que puede
tener un sistema de computadora.
Mayor rendimiento. Teniendo más de un procesador el sistema operativo puede estar ejecu-
tando dos procesos de usuario en paralelo o dividir un proceso en varios subprocesos para
asignarlos a cada procesador. Esto no significa que el tiempo pueda reducirse a la mitad.
el tiempo efectivo de ejecución tiene que ver con el grado de paralelización que puede
hacerse sobre un proceso y las dependencias de información que existan entre ellos.
Compartir recursos. Como todos los procesadores comparten los mismos dispositivos, el cos-
to adicional en procesadores es mucho menor a tener varias computadoras con todo y
periféricos.
Multiprocesamiento simétrico. En esta arquitectura todos los procesadores realizan las tareas
que corresponden al sistema operativo. No existen relaciones maestro-esclavo.
con la consiguiente ineficiencia. A fin de evitar esto, los procesadores pueden compartir ciertas
estructuras de datos. Un sistema multiprocesador de este tipo permite compartir dinámicamente
trabajos y recursos entre los distintos procesadores, y puede reducir la variabilidad entre los
sistemas. Por otro lado, tales sistemas deben escribirse con mucho cuidado considerando los
accesos simultáneos a memoria o a disco a lo que se les denomina acceso a áreas críticas de
datos.
Hay que distinguir que la diferencia entre multiprocesamiento simétrico y asimétrico puede
deberse al software o al hardware. Podría existir hardware especial para diferenciar los múltiples
procesadores, o podría escribirse software que permita un solo maestro y varios esclavos. Por
ejemplo, el sistema operativo de Sun, SunOS versión 4, ofrece multiprocesamiento asimétrico,
mientras que la versión 5 (Solaris 2) es simétrica.
Después de haber analizado los componentes de una computadora explicaremos ahora cómo
funciona. Al energizar la computadora, el procesador se inicializa, la primera tarea que se hace
es colocar una dirección específica en un registro denominado contador de programa. Esta di-
rección comúnmente señala a una dirección de memoria ROM (Read Only Memory, Memoria
de Sólo lectura). que contiene un conjunto de rutinas denominadas BIOS (Basic Input Output
System). La primera tarea que tiene a cargo el BIOS es verificar todos los componentes del
equipo. Se hace una verificación general de memoria, tarjeta de vídeo, se determina el tipo de
unidades de disco, teclado, ratón y otros componentes del Sistema. Si hay errores, se le avisa
al usuario mediante mensajes en pantalla. Si existe un problema en memoria o en el procesa-
dor a algún otro error grave entonces se detendrá el sistema. En caso de que hayan pasado las
pruebas adecuadamente o haya errores corregibles, se le da oportunidad al usuario de entrar a la
configuración del sistema. Esta tarea comúnmente se realiza, presionando una tecla o combina-
ción de ellas. Las teclas más comunes pueden ser supr, F1, F9, F10 dependiendo del fabricante
de la computadora. El usuario puede optar por continuar el proceso de arranque o corregir los
problemas encontrados durante las pruebas de dispositivos.
Si no hubo errores, el sistema continua con el proceso de carga. EL BIOS, después de haber
verificado los discos, consulta la secuencia de arranque establecida por el usuario en la confi-
guración básica del sistema. En ésta se le indica qué dispositivo debe de usar en primer lugar.
Una secuencia común es primero los discos duros, después las unidades de CDROM/DVD, las
memorias USB o pendrives, las unidades de disco flexible y por último se intentará hacer un
arranque desde la red.
El BIOS cargará una pequeña rutina que, por convención, se encuentra siempre en el primer
sector de cualquier unidad de almacenamiento comúnmente conocido como sector de arranque
o también conocido como Master Boot Record (MBR) Registro de Arranque Maestro. Puede
existir un sector de arranque por cada partición, pero la BIOS sólo cargará el MBR.
Esta rutina es un cargador, que a su vez puede controlar otros cargadores que se encuentren
en otras particiones del disco duro, permitiendo así el arranque de más de un sistema operativo.
Después que el usuario ha elegido qué sistema operativo desea ejecutar, el cargador leerá de
disco un programa más grande denominado kernel o núcleo y por último le pasará el control.
En un sistema operativo GNU/linux tenemos dos programas cargadores uno llamado lilo
(Linux Loader) y otro llamado grub. En windows el cargador más común es el NT loader.
La primera función del kernel es inicializar los servicios del sistema operativo. El primero y
más importante es inicializar la tabla o el vector de interrupciones, para de esta manera, poder
atender todas las peticiones de servicios de los dispositivos y los servicios de software solicitados
CAPÍTULO 1. INTRODUCCIÓN A LOS SISTEMAS OPERATIVOS 17
En el transcurso de la historia de los sistemas operativos ha sido necesario nombrar las acti-
vidades que se realizan dentro de una computadora. En un sistema por lotes se les denominaba
trabajos, un sistema de tiempo compartido los llama programas de usuario o tareas. Incluso
un sistema operativo puede estar ejecutando un mismo programa dos o más veces. Todas estas
actividades tienen mucho en común por lo que a todas ellas se les llama procesos. EL concepto
que se usa más a menudo es el de la sección 1.2.1. Hay que tomar en cuenta que un proceso es
mucho más que sólo código de un programa que se está ejecutando (a lo que se le denomina en
muchas ocasiones como sección de texto). Un proceso incluye además de su código, informa-
CAPÍTULO 1. INTRODUCCIÓN A LOS SISTEMAS OPERATIVOS 19
ción necesaria para que el sistema operativo pueda darle seguimiento. En general va a contener
la siguiente información:
Estado del proceso. Puede ser: nuevo, preparado, en ejecución, en espera, detenido, terminado
o zombie
registros de la CPU. Guarda la información necesaria de los registros para regresar al proceso
al estado en el que se encontraba para continuar su ejecución.
Información contable. Incluye la cantidad de tiempo real ocupado por el proceso, los cuantos
de tiempo 4 , el PID (Processs IDentifier) o identificador de proceso,etc.
Información de la E/S. Incluye la lista de los dispositivos de E/S asignados al proceso, una
lista de manejadores de archivos y su estado: abiertos para lectura, escritura, bloqueados.
Contiene también un área de datos y un área de pila. El área de datos es usada por el proceso
para mantener la información que necesita durante su ejecución. El área de pila es ocupada
para pasar información entre subrutinas propias de proceso e interactuar también con el sistema
operativo para enviar o recibir información.
ya sea en memoria o en disco y restaurar el estado anterior del nuevo porceso a ejecutar para que
continúe exactamente donde fue interrumpido. el tiempo que consume un cambio de contexto
es tiempo de CPU que no ejecuta ninguna tarea de usuario, mientras menos cambios de contex-
to existan en el sistema, más tiempo se dedicará a tareas productivas. el tiempo de cambio de
contexto depende mucho del soporte que proporcione la arquitectura de la computadora sobre la
que se encuentre el sistema operativo. Algunas incluyen múltiples conjuntos de registros, con lo
que un cambio de contexto implica solamente un cambio de un apuntador a un nuevo conjunto
de registros. En otras sin embargo, debe de guardarse en la pila del proceso toda la información
de estado de los registros, lo cual implica muchas instrucciones y por tanto, ciclos de CPU.
En la mayoría de los sistemas operativos actuales, se pueden ejecutar varios proceso concu-
rrentemente y podemos crearlos y eliminarlos en la medida en que sea necesario, esto implica
que el sistema operativo debe tener mecanismos para la creación, ejecución y eliminación de un
proceso.
Creación de Procesos. Un proceso puede crear varios procesos más que le ayuden a terminar
su tarea más rápido. Al proceso que crea se le llama proceso padre y a los que creó se les
denomina procesos hijo. Cada uno de los nuevos procesos puede crear a su vez nuevos procesos.
De esta forma se construye un árbol de procesos. Cada proceso es identificado por un número
único, y se le denomina PID(Process IDentifier) o Identificador de Proceso.
El Proceso entró un el estado de espera. El proceso está esperando los resultados de una ope-
ración de entrada/salida.
Se han terminado los cuantos de tiempo o se produce una interrupción. El proceso pasa al
estado de preparado, esperando nuevamente su oportunidad de ejecución.
El proceso sale de un estado de espera Cuando se termina una operación de entrada salida pa-
ra un proceso, éste pasa al estado de preparado.
Hace un análisis más detallado acerca de las necesidades de cada proceso para que, de acuer-
do con sus resultados, se ejecute el que sea más idóneo.
Existen varios algoritmos para llevar a cabo la planificación. El más simple de ellos es el
FCFS (First Coming First Served), primero en llegar, primero en ser servido. Este enfoque asig-
na la CPU al primer proceso que lo solicite. Otro enfoque es el SJF (Shortest Job first). Este
22 1.2. FUNCIONES Y CARACTERÍSTICAS
algoritmo asigna la CPU a aquel proceso que tenga más oportunidad de terminarse primero.
La planificación por prioridades es más general que la estrategia SJF. El sistema operativo le
asocia cierta prioridad a cada proceso y entonces se le asigna la CPU a aquel que tenga la prio-
ridad más alta. Si tienen la misma prioridad entonces se usa la estrategia FCFS. Otra forma de
planificación es la planificación por turnos, diseñado especialmente para ser implementado en
sistemas de tiempo compartido. Es parecido a la FCFS pero se aplican conceptos de apropiación
para conmutar entre procesos. La planificación mediante colas multinivel permite dividir las
necesidades de los procesos en clases. Por ejemplo, un proceso interactivo necesita ser atendido
más rápidamente que un proceso basado en lotes. De esta forma, se establecen varias colas con
prioridades diferentes. Cada cola puede tener su propio algoritmo de planificación. debe, por su-
puesto, definirse una planificación entre colas. Una variación a este esquema es la planificación
mediante colas multinivel realimentadas, el cual permite que los procesos puedan migrar a
otras colas, de acuerdo a sus necesidades de ejecución.
Los registros de la CPU y la memoria principal son las áreas a las que puede acceder la CPU
de forma directa. Como se explicó en la sección 1.1.1.2, la CPU puede acceder a los registros
CAPÍTULO 1. INTRODUCCIÓN A LOS SISTEMAS OPERATIVOS 23
a la velocidad de uno o dos ciclos de reloj, siendo el área de acceso más rápido. Para acceder
a la memoria principal es necesario colocar primeramente la dirección del dato y luego esperar
a que la memoria recupere el dato y lo coloque en el bus de datos. El problema principal es
que la tecnología con la cual está hecha la tarjeta madre o base es diferente a la tecnología del
microprocesador. Mientras que un procesador típico actual trabaja a velocidades del orden de los
giga Hertz 5 (Entre uno y cuatro Giga Hertz). Un ciclo viene dado por la distancia que existe entre
un pico y el siguiente valle. El bus de direcciones y datos de la tarjeta madre trabaja en el orden
de los Mega Hertz (en el orden de los 33 Mega Hertz para modelos antiguos hasta 800 Mega
Hertz en los modelos actuales). En el mejor de los casos , si hablamos de un procesador a una
velocidad de 1.6 Giga Hertz y un bus de tarjeta madre de 800 Mega Hertz, estamos hablando de
una diferencia de magnitud 2. Si la tarjeta madre tiene un bus a una velocidad de 400 Mega Hertz
la diferencia es de magnitud 4. Esto significa que el procesador debe de permanecer inactivo
durante el doble o cuatro veces el tiempo mientras espera que la memoria termine de hacer su
transferencia. Para minimizar este problema, se hace uso de memoria caché con tecnología de
preacceso, la cual intenta leer con anticipación los datos que usará el procesador.
En un nivel perteneciente al sistema operativo, se debe tener en cuenta que en un sistema de
multiprogramación, cada usuario sólo debe tener acceso a la memoria que le ha sido asignada y
no a otras áreas. Para ayudar al sistema operativo, existe hardware al que el sistema operativo le
indica cual es el rango de direcciones legales a las que puede acceder el proceso. Si se intenta ha-
cer una lectura más allá de lo permitido, el hardware generará una interrupción predeterminada
que pasará nuevamente el control al sistema operativo. El sistema operativo terminará inmedia-
tamente el proceso enviándole una señal kill, y mostrará un mensaje de violación de segmento.
Los registros que se usan, usualmente un registro base y un registro límite solamente pueden
ser cambiados por instrucciones que pueden ejecutarse en modo protegido. Puesto que sólo el
kernel se ejecuta en este modo, es el único que puede manipularlos. Si un programa intenta ha-
cer uso de estas instrucciones se generará una interrupción indicando que no es una instrucción
permitida. De esta forma se imposibilita que el usuario acceda a áreas de memoria que no le
pertenezcan.
Una dirección lógica es aquella que es generada por la CPU. Una dirección física es aquella
con la que realmente trabaja la memoria principal. La correspondencia entre direcciones lógicas
y físicas la hace un dispositivo de hardware denominado MMU (Management Memory Unit),
Unidad de Administración de Memoria. Su función es parecida al proceso de relocalización.
Tenemos una dirección base más un desplazamiento, entonces suma toas las direcciones para
obtener la dirección física real en donde están los datos.
Ya sabemos que la cantidad de memoria que existe en una computadora es limitada. Cuando
tenemos muchos programas corriendo, lo más común es que esta memoria se acabe muy pronto.
Una solución para “aumentar” la capacidad de la memoria principal es mediante una técnica
denominada memoria virtual. la memoria virtual es espacio de disco en memoria secundaria
asignado exclusivamente para mantener procesos que están el estado de suspendidos, dormi-
dos o en espera. En el momento en que se reanude su ejecución, el sistema operativo, hará un
intercambio de contexto como es normal, pero ahora cargará de disco parte o todos los datos per-
tenecientes al proceso. Esto da al usuario la ilusión de contar con el doble de memoria de lo que
realmente tiene la computadora. Aunque a primera vista parece una buena opción, cuando el sis-
tema se sobrecarga, el sistema operativo tardará mucho más en hacer un intercambio de contexto
desde memoria secundaria que desde la memoria primaria que es más rápida, recrudeciendo aún
más el problema.
Lo más común es dividir la memoria en dos partes una para el sistema operativo y otra
para los procesos de los usuarios. La ubicación del sistema operativo está determinada en parte
por la ubicación del vector o tabla de interrupciones para el manejo de los dispositivos. Como
CAPÍTULO 1. INTRODUCCIÓN A LOS SISTEMAS OPERATIVOS 25
la mayoría de los microprocesadores asume que está colocada en la parte baja, muchos de los
diseñadores colocan al sistema operativo después de la tabla de interrupciones. Esto es, en la
parte baja de memoria.
En la asignación contigua de memoria, al momento de crear un proceso, éste se asignará
a un único bloque que tenga el tamaño solicitado por el mismo. Hay que tener en cuenta que
es normal que los datos se coloquen en otro segmento o bloque de memoria, de esta manera
es más fácil conseguir dos bloques de la mitad de tamaño a uno grande para guardar tanto los
datos como el código. En la asignación de memoria contigua, el número de procesos que pueden
existir al mismo tiempo depende del número de particiones fijas que tenga disponible el sistema,
de modo que cada partición puede contener solamente un proceso.. Cuando un proceso termina,
la partición vuelve a estar disponible para ser asignada a otro que vaya a ejecutarse. Bajo este
esquema, a medida que va transcurriendo el tiempo y van ejecutándose procesos con diferentes
tamaños, la memoria va fragmentándose en bloques muy pequeños que no pueden unirse para
satisfacer una solicitud del sistema. Entonces, aunque sumando todos los fragmentos disponible
haya espacio suficiente para cubrir los requerimientos de uno o más procesos, el sistema falla
por que no está junta. El sistema operativo puede indicar el fallo al usuario o iniciar una tarea de
compactación de memoria para reorganizar nuevamente la memoria ocupada y la libre. Aunque
este procedimiento puede resultar muy caro computacionalmente hablando.
El otro enfoque es tener bloques de memoria pequeños y de tamaño fijo. Este esquema
permite que el espacio de direcciones físicas no sea contiguo. La paginación evita el considerable
problema de buscar un bloque lo suficientemente grande como para poner un proceso cuando
la memoria se encuentra muy fragmentada o en su defecto la compactación, tanto de memoria
principal como de la secundaria o la memoria virtual.
La manera más sencilla de implementar la paginación es descomponer la memoria física
en bloques denominados frames o marcos de tamaño fijo. Cuando el sistema operativo carga
un proceso, le asigna tantos marcos de memoria como sean necesarios. Los dispositivos de
almacenamiento secundario también están organizados de la misma forma, así se facilita la
carga de marcos desde el disco a la memoria. El tamaño de página está definido por el hardware
en potencias de dos y está en el rango de 512 bytes hasta 16 MegaBytes.
Cuando se usa un esquema de paginación, no existe el problema de fragmentación, puesto
que todos los marcos pueden ser asignados a diferentes procesos independientemente de donde
se encuentren. El problema con el que nos encontramos ahora es una fragmentación interna. Si
el proceso no es un múltiplo exacto del tamaño de página entonces, el último marco estará par-
26 1.2. FUNCIONES Y CARACTERÍSTICAS
1. Operación asíncrona
2. Diferencia en velocidad
Operación asíncrona. Cuando el procesador está ejecutando uno o varios procesos, está inter-
actuando continuamente con la memoria. Coloca una dirección en el bus de direcciones
y la memoria le responde con el dato o instrucción correspondiente en el bus de datos.
Durante ese período en el que la memoria está trabajando, el procesador entra en un pe-
ríodo de inactividad. Así, decimos que trabaja en sincronía con la memoria. Además, el
CAPÍTULO 1. INTRODUCCIÓN A LOS SISTEMAS OPERATIVOS 27
procesador trabaja con el supuesto de que, a menos que la memoria esté dañada y que
es la excepción a la regla, no habrá ningún problema. El procesador no puede ocuparse
de otras tareas mientras la memoria esté trabajando. Un dispositivo, por el contrario, a
veces estará disponible y otras no. Además el procesador no puede estar esperando hasta
que el dispositivo se habilite. Aún trabajando, la mayoría de los dispositivos cuenta con
partes mecánicas que se gastan y pueden ocurrir errores o en ocasiones es necesaria la
intervención humana para que el dispositivo continúe trabajando normalmente. Por todo
lo anterior, decimos que los dispositivo trabajan asíncronamente con respecto al reloj del
procesador.
Como podemos deducir, se necesita algún tipo de diálogo entre el procesador y los peri-
féricos. Como apuntamos en la sección 1.1.1.2 este diálogo se puede dar, desde el punto
de vista del dispositivo, vía interrupciones. Desde el punto de vista del procesador, éste
puede consultar directamente los registros de estado del dispositivo en caso de necesitar
alguna información. Si está disponible puede leerla del búfer. En otro caso deberá esperar.
En este momento el procesador pasará a realizar otra tarea y si es necesario volverá pos-
teriormente a verificar los registros de estado del dispositivo, si es que no se ha generado
una interrupción del dispositivo para alertar sobre algún suceso. Cuando se completa la
operación de entrada salida, el dispositivo enviará una señal, para que sea atendido por el
procesador. Si el dispositivo no puede enviar señales, la información será recogida hasta
que el procesador vuelva a verificar los registros de estado.
Diferencia en velocidad. Existe una gran variadad de dispositivos de entrada/salida, así como
también protocolos para permitir su comunicación con la CPU. La velocidad del dispositi-
vo está relacionada directamente con la tecnología usada y su protocolo de comunicación.
Dentro de los dispositivos de almacenamiento secundario -como se dijo en la sección
1.1.1.2 las velocidades varían desde un lento disco suave (floppy), pasando pos dispositi-
vos ópticos, hasta un disco duro SCSI de 15000 rpm. En un sistema de telecomunicaciones
o de red tenemos velocidades que van desde 10Mbits hasta, actualmente 1Gigabit en ca-
bles de cobre categoría 7. Si dividimos entre ocho para saber cual es la capacidad de
transferencia en bytes o caracteres de una red, tenemos entonces que, para una velocidad
de 10Mbits, la tarjeta de red puede transferir 1,250,000 caracteres, esto es 1.25 millones
de caracteres por segundo. Aún así la velocidad de un procesador típico varía en el rango
de 1Ghertz hasta los 4 Gigahertz y subiendo. Esto es que, si hablamos de un procesa-
dor corriendo a la velocidad de 1Gigahertz y utiliza en promedio, por ejemplo dos ciclos
por instrucción, el procesador podría ejecutar cerca de 500 millones de instrucciones por
segundo, hablamos de un factor diferencia de 500 en velocidad. Para tenerlo siempre ocu-
28 1.2. FUNCIONES Y CARACTERÍSTICAS
pado necesitaríamos un sistema con cerca de 400 tarjetas de red, considerando que está
exclusivamente para atenderlas. Si el procesador esperara a que la tarjeta terminará de
enviar su caracter estaría 99.8 por ciento de su tiempo desocupado. Así, vemos la necesi-
dad de multiplexar la CPU entre los diferentes dispositivos de entrada/salida y aún, queda
mucho tiempo libre para ejecutar otros procesos del sistema o de usuario.
Manejo de memoria Virtual. Traducir las direcciones lógicas a direcciones físicas de archivo
Mantener las entradas de directorio. Contiene información que usa continuamente el usua-
rio, los datos de quien puede accederlo y además es el vínculo para poder acceder al
contenido del archivo.
CAPÍTULO 1. INTRODUCCIÓN A LOS SISTEMAS OPERATIVOS 29
Tamaño de la partición. Describe cuanto espacio del disco en megabytes va a contener la par-
tición.
Tipo de sistema de archivos. Indica la manera en la cual van a estar organizados los archivos
en la partición. Es una etiqueta que ayuda a otros sistemas operativos reconocer particiones
que no son nativas.
Tipo de partición. Si la partición es arrancable o no. Esto quiere decir que si tiene un sector de
arranque o no.
Uso de la partición. Algunos sistemas operativos necesitan una estructura especial de direc-
torios que deben crearse, ya sea en una misma partición o en forma separada para poder
funcionar. Por ejemplo, los sistemas basados en Unix, necesitan una partición de intercam-
bio exclusiva y que no puede ser usada para guardar información. Esto evita problemas
en el intercambio de memoria a disco. Los basados en windows, toman el espacio libre
que queda en el disco. Si el usuario llena más el disco, el área de intercambio se reduce,
pudiendo en ocasiones impedir su funcionamiento cuando no hay suficiente espacio para
el intercambio entre memoria y disco.
El siguiente paso es el formateo del disco. Cuando formateamos un disco se crea una estruc-
tura especial que permite separar cada partición en pistas, clusters o cilindros y sectores.
Una pista es una línea circular que va incrementando su radio y separada una de otra por una
pequeña distancia.
Una pista es un segmento pequeño de disco definido en un pista y separado por dos líneas
radiales, esto es que salen del centro del disco y llegan hasta el borde. A medida que nos acerca-
mos al borde del disco los sectores se hacen cada vez más grandes, pero esto no quiere decir que
30 1.2. FUNCIONES Y CARACTERÍSTICAS
guardan más información. Por lo general un sector se define entre los 512 bytes y los 8 Kiloby-
tes, dependiendo de la capacidad del disco duro. A discos de mayor capacidad mayor tamaño
de sector. También podemos definir un sector como la cantidad de información que es capaz de
leer una sola cabeza lectora escritora del disco. En la figura 1.4
Un cluster o bloque está definido solamente en discos que estén usando al menos dos caras
de un mismo plato del disco duro. Un disco duro puede tener múltiples platos para guardar más
información. Así, un cluster se define como la cantidad mínima que puede leer simultáneamen-
te el conjunto de cabezas lectoras escritoras del disco que comúnmente están diseñadas como
peines que se desplazan paralelamente a una distancia muy pequeña de la superficie del plato.
Entonces, físicamente un cluster está compuesto por todos los sectores que se encuentran ali-
neados por las cabezas lectoras escritoras y que pueden ser leídos o escritos simultáneamente
en una sola operación de disco. Así el tamaño de un cluster queda definido en términos de los
sectores que pueden ser accedidos al mismo. Si tenemos entonces un disco duro de un plato, el
cluster está definido por los dos sectores que se encuentran alineados en ambas caras del plato.
Si su capacidad es de 512 bytes el cluster tendrá entonces 1024 bytes o 1 Kbyte de tamaño.
Algunos autores definen un cilindro como el conjunto de sectores que se encuentran en dos
o más pistas del mismo diámetro alineadas en dos o más caras del plato y que pueden leerse
durante una rotación completa del disco, debido a que cuando giran los platos, podemos ver
cómo se forma un cilindro a través de los platos.
No obstante la unidad de acceso mínima en cualquier disco duro será la de cluster o bloque
que comúnmente son múltiplos de 512 bytes. Si se necesita solamente un sector, los demás
CAPÍTULO 1. INTRODUCCIÓN A LOS SISTEMAS OPERATIVOS 31
en la segunda generación.
A principios de los ochentas intel, junto con IBM introducen la primera computadora per-
sonal con el microprocesador 8088. En 1984 Apple Computer lanza su primera computadora
personal. Introdujo por vez primera en la computación personal una interfaz gráfica con un ra-
tón el cual fue inspirado por las investigaciones realizadas en Xerox PARC.
Los sistemas operativos usados en estas pequeñas computadoras empezaron recorriendo nue-
vamente el camino de los usados en las grandes computadoras, aunque, desde un punto de vista
temporal, el desarrollo de los sistemas operativos para las computadoras personales ha llevado
casi el mismo tiempo que el de las grandes computadoras.
A continuación haremos una descripción más detallada de las diferentes tecnologías que han
revolucionado los sistemas operativos.
34 1.3. EVOLUCIÓN HISTÓRICA
las computadoras estaba reservado sólo a grandes instituciones o empresas que podían pagar ese
tiempo de CPU valiosísimo.
La otra mejora substancial fue dejar las tareas de programación y depuración al programador
y la carga de cintas al operador de sistemas. De esta manera, si había un error el operador enviaba
al programador un volcado de memoria para que corrigiera el error, e inmediatamente ponía otro
trabajo en la computadora para tenerla ocupada el mayor tiempo posible. Los trabajos que tenían
necesidades parecidas eran agrupados en un mismo lote con el fin de que pudieran ejecutarse en
la secuencia adecuada pero sin la intervención del operador. Por ejemplo, ya sabemos que para
poder ejecutar un programa escrito en Fortran, éste debe compilarse, ensamblarse ligarlo con
las librerías y ejecutar el binario generado. Todas estas operaciones se unían en un solo lote, de
esta manera se evitaba la lenta intervención del operador humano en cada paso. Aún así, había
problemas. Cuando un programa se detenía el operador debía verificar qué había sucedido y
decidir si era posible continuar o empezar otro trabajo. Esto requería mucho tiempo.
El siguiente paso fue implementar un sistema monitor, el cual leía de un archivo todas las
tareas a ser ejecutadas, por lo común de una lectora de tarjetas, cuando se terminaba la tarea en
turno, ésta pasaba el control al sistema de monitor, éste tomaba del archivo la siguiente tarea y la
pasaba el control. Así se redujo aún más la dependencia de un operador humano. La innovación
fue mantener en memoria el sistema monitor a lo que se le llamó sistema residente. De esta
manera surgió el primer sistema operativo rudimentario.
En un sistema basado en lotes, el control de un trabajo se realiza mediante tarjetas que con-
tienen la secuencia de órdenes que debe interpretar el sistema monitor residente y luego hacer
que se ejecuten. Cada tarjeta incluye órdenes del tipo $CargarCompilador, $CargarProgramaa-
Comppilar, $CargarProramaCompilado, $CorrerPrograma, $CargarDatosdePrograma, $Fin. Ca-
da instrucción hace uso de una tarjeta.
Con la llegada de las tarjetas perforadas, se ganó un tiempo significativo con respecto al ope-
rador, pero aún así estos dispositivos, comparados con la velocidad de la CPU eran demasiado
lentos. Lo que significaba que la CPU todavía tenía muchos tiempos muertos. No obstante ya
había una mejora substancial.
A medida que mejoraba la tecnología, llegaron con el tiempo las cintas magnéticas. Estas
tenía una velocidad de acceso mucho mucho mayor que las tarjetas perforadas y las impresoras
de línea. Entonces primeros se pasaban los paquetes de tarjetas a una cinta magnética y de ahí la
36 1.3. EVOLUCIÓN HISTÓRICA
CPU leía la información. Todos los lectores de tarjetas y las impresoras operaban fuera de línea,
en lugar de ser controlados por la computadora principal. En la figura 1.5 podemos ver cómo se
lograba transferir datos de un dispositivo lento a uno más rápido.
La principal desventaja de este esquema es que incrementa el tiempo para preparar un tra-
bajo, ya que este no pasa directamente a la CPU, si no que primero debe de pasar a cinta y la
cinta debe de llenarse primero con otros trabajos de modo que se encuentre preparada para ser
leída por la CPU. El incremento de eficiencia se da por que ahora se pueden usar varias lecto-
ras de tarjetas para llenar una sola cinta, esto es, si se ponen a leer dos dispositivos de tarjetas
simultáneamente, entonces el tiempo de lectura se reduce a la mitad.
Aunque el uso de cintas mejoró mucho el tiempo de procesamiento, las cintas tienen el pro-
blema de ser dispositivos secuenciales, lo que quiere decir que el sistema no podía leer o escribir
al mismo tiempo en ambos extremos de la cinta. El acceso se debe de llevar a cabo mediante un
rebobinado, el cual es un movimiento mecánico y por lo tanto muy lento. Con el advenimien-
to de los discos o dispositivos de acceso aleatorio, se resolvió parte del problema. El proceso
consiste en leer de los dispositivos de tarjeta a disco y mantener ahí la información, lo mismo
hacemos en la salida, después de que la CPU ha terminado el trabajo, éste lo almacena en el sis-
tema de disco hasta que el dispositivo externo esté listo para imprimirlo verdaderamente a este
proceso se le denomina operación simultánea de periféricos en línea también conocida como
spool (simultaneous peripheral operation on line) Esta nueva tecnología permitió mantener
ocupada a la CPU y a los periféricos un tiempo mayor, ya que mientras se estaba imprimiendo
alguna información la CPU podía estar realizando cálculos o incluso haciendo otra operación
de entrada salida en algún dispositivo. Aquí lo único que necesita la CPU es ser informada de
que el periférico a terminado de procesar los datos y está lista para que se le envíe otro lote o
que el bloque de datos se encuentra listo para ser leído por la CPU. Todo esto combinado con
el control de los dispositivos orientados a interrupción (vea la sección 1.1.1.3 en la página 16)
CAPÍTULO 1. INTRODUCCIÓN A LOS SISTEMAS OPERATIVOS 37
dieron como consecuencia natural los entornos multitarea y multiprogramación que usan todos
los sistemas operativos existentes en la actualidad.
Los sistemas interactivos proporcionan un ambiente más adecuado para el desarrollo depu-
ración y ejecución de programas, al contrario de un sistema por lotes en donde el programador
tenía que esperar el volcado de memoria para poder hacer la depuración del programa. En un sis-
tema de multiprogramación puede editar, compilar, depurar y ejecutar el programa sin pérdidas
38 1.4. CLASIFICACIÓN
de tiempo significativas.
El ejemplo más común de un sistema multiusuario lo podemos encontrar en un campus uni-
versitario o una empresa en donde es necesario conectarse a un servidor para tener acceso a los
recursos de cómputo. En la figura 1.6 vemos una distribución clásica de terminales conectadas
a un servidor.
1.4. Clasificación
1.4.1. Sistemas por lotes sencillos
Las primeras computadoras eran muy grandes y se controlaban desde la consola. La entrada
más común era a través de tarjetas perforadas y unidades de cinta. La salida consistía se enviaba
básicamente a impresoras de línea, unidades de cinta y a tarjetasperforadas. Los usuarios no
interactuaban directamente con ellas. El usuario preparaba un trabajo, incluyendo el programa,
los datos e información de control. Este trabajo se entregaba al operador de la computadora.
Después de algún tiempo, se entregaba la salida que podría contener el resultado del programa
junto con un vaciado de memoria y registros en caso de haber un error en el programa. La tarea
del sistema operativo consistía en mantener ocupada la computadora el mayor tiempo posible.
memoria principal de modo tal que la información de los dispositivos de entrada o de salida se
almacenen en esotso buffers para que sea procesada completamente por la CPU. A esta técnica
se se conoce como spooling. Así, la CPU solamente realiza trabajo cuando se le informa que sus
datos se encuentran listos.
Cuando los dispositivos de entrada y salida mejoraron, esto es, se integró un teclado y un
monitor, fue entonces posible el que varios usuarios interactuaran directamente con la compu-
tadora, como se explicó en la sección 1.3.2.4, un sistema de tiempo compartido da al usuario la
sensación de tener una computadora propia
El Modelo cliente-servidor está basado en protocolo solicitud/respuesta las ventajas que este
tuene es que es sencillo y sin conexión y demás es muy eficiente. Los servicios que este pro-
porciona son los siguientes: ejecución de un programa; acceso a una base de datos y acceso
a un dispositivo de hardware Un servidor funciona en una computadora específica usando un
CAPÍTULO 1. INTRODUCCIÓN A LOS SISTEMAS OPERATIVOS 41
socket con un número de puerto específico. Un socket es concepto abstracto por el cual dos
programas (posiblemente situados en computadoras distintas) pueden intercambiarse cualquier
flujo de datos, generalmente de manera fiable y ordenada. El cliente conoce el nombre de la
maquina (hostname) o el IP, en la cual el servidor está funcionando y el número del puerto con
el servidor está conectado. Si el cliente lanza una demanda de conexión y el servidor acepta la
conexión, este abre un socket en un puerto diferente, para que pueda continuar escuchando en el
puerto original nuevas peticiones de conexión, mientras que atiende a las peticiones del cliente
conectado
El cliente: En la comunicación entre el cliente y el servidor se puede llevan a cabo lo si-
guiente:
El servidor
1. Ejecuta un requerimiento
4. Una vez que se conecta con alguien crea un hilo de ejecución para este usuario
Un socket proporciona una comunicación de dos vías o punto a punto, son versátiles es im-
portante porque es un componente básico de comunicación entre interprocesos e inter-sistemas
garantizando que todo octeto llegará a su destino en el mismo orden que se transmitió. Existen
varios tipos de sockets entre ellos podemos mencionar el Socket de flujo el Socket de datagrama
y el Socket de paquete secuencial
42 1.4. CLASIFICACIÓN
Cuando los precios de las computadoras fueron lo suficientemente accesibles, es posible que
cada usuario pueda tener us propia computadora. A este sistema se le conoce como computadora
personal (PC Personal Computer).
Las computadoras personales surgieron en la década de los 70’s, se trataban de microproce-
sadores muy pequeños y económicos comparados con los grandes sistemas tipo macro compu-
tadoras (main frame) las cuales sólo era posible adquirirlas por algunos gobiernos o grandes
universidades.
Estas microcomputadoras no poseían la capacidad para ejecutar sistemas operativos de tipo
multitarea de ese entonces y usaba sistemas operativos monotarea lo que implicaba también que
fuera monousuario. A diferencia de las grandes main frames de ese entonces, cuyo objetivo era
optimizar el aprovechamiento de la CPU, el objetivo de las microcomputadoras era maximizar
la facilidad de uso y enfocarse en las necesidades de los usuarios.
Los sistemas personales se clasifican básicamente en dos tipos: computadoras de escritorio y
computadoras de viaje o lap tops. Usan básicamente tres tipos de plataformas de hardware intel,
AMD siendo compatibles entre sí y la de las computadoras Macintosh que empezaron usando
microprocesadores de motorola MC68000 de tecnología CISC. En marzo de 1994, Apple intro-
dujo la gama PowerPC cambiando a una tecnología RISC y en el 2006 comenzó la transición a
los procesadores de Intel con arquitectura x86.
Los sistemas operativos más comunes a nivel de computadoras personales mencionándolos
en orden cronológico: MS-DOS, OS/2, Apple Macintosh y Microsoft Windows en diferentes
versiones.
Los sistemas operativos de computadoras personales se han beneficiado de los desarrollos
tecnológicos de los sistemas operativos para macrocomputadoras. Por ejemplo,la memoria vir-
tual y el desarrollo de esquemas de protección de archivos. En general, tanto la evolución del
hardware como de los sistemas operativos en las macrocomputadoras, se está repitiendo en las
computadoras personales.
A su vez los dispositivos de entrada salida mejoraron también existiendo ahora teclados,
ratones de diferentes tipos, apuntadores, pizarrones electrónicos, tabletas para entornos gráficos,
etc. En los dispositivos de salida también existe gran variedad, las impresoras han integrado,
la digitalización, funciones de copia, reduciendo su tamaño muchísimo. Las pantallas de LCD
o LED han substituido a la tecnología cd CRT (Tubo de rayos catódicos). Incluyendo algunas
capacidades de Toque o las pantallas Touch Screen) que permiten interactuar directamente en la
pantalla.
CAPÍTULO 1. INTRODUCCIÓN A LOS SISTEMAS OPERATIVOS 43
En base a estas definiciones podemos decir que un sistema distribuido es una colección de
computadoras que aun que son independientes, están conectadas entre sí y trabajan de manera
conjunta, y lo podemos observar en los bancos por que cuenta con cientos de sucursales dis-
tribuidas por todo el mundo y cada computadora tiene la capacidad de comunicarse con las de
otras sucursales.
Definimos como SOD a un sistema operativo que distribuye los servicios entre otros host
con el mismo sistema operativo y es visto como un solo sistema para todos y cada uno de los
elementos de la red Características:
9. Manejo de protocolos: logra una comunicación exitosa entre los dispositivos de a red.
5. Los sistemas distribuidos pueden compartir datos, periféricos caros como impresoras láser
y dispositivos de almacenamiento masivo y lograr una conexión de personas
CAPÍTULO 1. INTRODUCCIÓN A LOS SISTEMAS OPERATIVOS 45
2. Comunicación
3. Las redes de comunicación pueden perder mensajes por lo que se requiere un software
para su manejo
4. Seguridad
5. Almacenamiento
Existen dos tipos de sistemas operativos distribuidos: Los débilmente acoplados: permite que
las máquinas y lo usuarios de un sistema distribuido sean independientes entre sí en lo funda-
mental, pero que interactúen en cierto grado cuando sea necesario, también se le conoce como
débilmente acoplado puesto que las maquinas individuales se distinguen con claridad. A este
tipo de sistemas se le conoce también como multicomputadora. Se define también a un sistema
débilmente acoplado por la velocidad en que viajan los datos. En un sistema multicomputadora,
los datos viajan a través de la red y por tanto, es más lenta su transmisión. Los fuertemente
acoplados: el programa de aplicación y le sistema operativo están mejor acoplados que los dé-
bilmente acoplados y no se distinguen con tanta claridad. Los datos viajan muy rápido, por estar
conectados a través de un bus común. A estos sistemas se les conoce también como sistema
multiprocesador.
sistema de fabricación en línea, por ejemplo de automóviles, cada tarea debe de realizarse dentro
un lapso de tiempo determinado. Si el robot que se encarga de soldar ciertas piezas necesita
hacerlo en un momento o en un lapso de tiempo determinado hablamos entonces de un sistema
en tiempo real duro. Estos sistemas deben prtoveer garantías de que las operaciones ocurrirán
en un instante o en un intervalo de tiempo dados. El otro tipo de sistemas en tiempo real son
los sistemas en tiempo real suave, en el cual es aceptable que ocasipnalmente se pueda fallar a
un tiempo determinado. Los sistemas de video o de audio digital entran en esta categoría. Los
teléfonos digitales son también ejemplos de sistemas en tiempo real suave.
en cuanto a la integridad de su propio código. Lo único que podía hacer era verificar que un
programa no hubiera escrito en su área de memoria. Si así era, forzosamente se obligaba a una
nueva lectura de todo el código del sistema operativo del disco a la memoria, para poder seguir
trabajando adecuadamente. Si no era posible hacer la verificación. la computadora se quedaba
congela siendo necesario reiniciarla para empezar otra vez.
El tamaño máximo de los programas o de los segmentos no podía exceder de los 64Kbytes.
Cuando apareció el microprocesador 80286 y el 80386 de Intel. El sistema operativo no era
capaz de soportar la multitarea, debido a que sus versiones anteriores no fueron diseñadas para
manejar el modo protegidoindexmodo protegido, desaprovechando así por mucho tiempo, las
nuevas características de estos procesadores que ya soportaban el modo protegido y cálculos de
32 bits. Cuando aparecieron computadoras con un límite de memoria más allá de los 640Kbytes
de RAM, el MS-DOS implementó un manejador para permitirle al sistema operativo colocar
programas o datos en la Memoria Alta o Extendida, pero sin tener aún acceso transparente a la
misma. Esto debido a la limitación de direccionamiento con la que fue expresamente diseñado.
En al figura 1.10 observamos cómo están organizados los niveles del sistema operativo MS-
DOS. Puede verse inmediatamente que un programa de usuario tiene acceso al hardware, ya
sea vía sistema operativo o como la mayoría de los juegos que se desarrollaron en MS-DOS
accediendo directamente a la BIOS de la computadora o al hardware para lograr su máxima
velocidad. Obviamente, MS-DOS fue expresamente diseñado para ambientes de computación
familiar y de diversión. La principal ventaja que tuvo MS-DOS fue lo asequible del equipo de
cómputo y del propio sistema operativo en cuanto a precio y permitió que muchísimos progra-
48 1.5. ESTRUCTURA: NIVELES O ESTRATOS DE DISEÑO
madores desarrollaran nuevo software con poca inversión para este tipo de ambiente. De ahí,
poco a poco empezó la penetración en ambientes empresariales.
Los sistemas operativos basados en Unixrecorrieron más o menos el mismo camino, pero la
principal ventaja que tuvo fue la de separar el núcleo del sistema operativo de los servicios que
podía proporcionar, haciendo mucho más fácil añadir nuevas características para aprovechar
los nuevos avances del hardware más rápidamente. Por otro lado, a diferencia de MS-DOS,
Unix siempre fue desarrollado pensando en ambientes empresariales, instituciones de gobierno
o educativas.
objeto con estructura similar de modo que pueda ser analizado bajo el mismo enfoque. Cuando
los objetos están definidos, estos pueden interactuar entre ellos para poder solucionar un proble-
ma. En nuestro caso, el sistema operativo viene a ser un objeto, el cual está constituido por otros
objetos para que pueda llevar a cabo sus tareas. La función del objeto sistema operativo es la
de coordinar los otros objetos, tales como los que analizamos en la sección 1.2, por ejemplo, el
objeto administrador del CPU, el objeto administrador de procesos, el objeto administrador de
memoria, y el objeto administrador de dispositivos de entrada salida. Siguiendo con el análisis,
cada uno de ellos va a estar formado por otros objetos o va a interactuar con ellos. Así el admi-
nistrador de procesos, puede considerar como objeto a un proceso con sus atributos tales como
el objeto código o el objeto memoria para su ejecución.
El sistema operativo de windows NT (Windows New Technology) -Nueva Tecnología de
Windows- fue diseñado bajo este nuevo enfoque, empezando con un enfoque de micronúcleo y
terminando en uno de niveles. En la sección 1.6, explicaremos esta implementación de sistema
operativo.
También los nuevos sistemas operativos basados en Unix, como Solaris y GNU/Linux in-
cluyen tecnología orientada a objetos en sus núcleos, añadiendo también módulos dinámicos, lo
que permite que haya mayor eficiencia y seguridad.
En la figura 1.11 vemos una distribución lógica del sistema operativo GNU/Linux.
Estas distribución se aplica a todos los componentes del sistema operativo. Esto es, se aplica
al administrador de procesos, al administrador de memoria, al administrador de los dispositi-
vos de entrada salida, al sistema de archivos y agrega nuevas capas: la capa de red y la capa
50 1.5. ESTRUCTURA: NIVELES O ESTRATOS DE DISEÑO
En la figura 1.12 vemos las tareas que se deben de implementar en el sistema y en la red.
En la figura 1.13 observamos las tareas que se deben implementar en los subsistemas de me-
moria, procesamiento y almacenamiento. La última capa es la la interfaz humana, que podría
corresponderse en parte con el administrador de dispositivos.
En la figura 1.14 tenemos la última capa definida para el kernel de linux. incluye el manejo
de los dispositivos de entrada salida que interactúan directamente con el usuario final. En este
nivel está incluida la capa de seguridad.
En una estructura de niveles, cada nivel se implementa sólo utilizando operaciones defi-
nidas en los niveles anteriores aumentando su grado de abstracción y haciéndose más fáciles
de programar y entender a medida que nos acercamos al usuario y disminuyendo su grado de
abstracción al acercarse al hardware. Cada capa oculta todos los detalles de las capas inferiores.
La desventaja es que debe de hacer un análisis muy detallado de los requerimientos de los
usuarios de modo que todos ellos puedan ser cubiertos por las operaciones definidas en la última
capa. De otra forma, es necesario modificar cada uno de los niveles para proporcionar la nueva
funcionalidad. Otro problema es que el sistema operativo obtenido con este enfoque tiende a ser
menos eficiente en función de los niveles que hayan sido implementados, a mayor número de
niveles menos eficiente será, debido a que las órdenes y la información tendrá que viajar por un
número mayor de capas. En la figura 1.15 podemos observar cómo un nivel envuelve al anterior,
y por conceptos de seguridad se impide el acceso directo a los niveles más internos del sistema.
CAPÍTULO 1. INTRODUCCIÓN A LOS SISTEMAS OPERATIVOS 51
1.6. Núcleo
Cuando empezaron a desarrollarse los primeros sistemas operativos, resultaron ser demasia-
do grandes y difíciles de mantener. A mediados de los años 80’s en la Universidad de Carnegie
Mellon, los investigadores desarrollaron un sistema operativo al que llamaron Mach. Mach está
basado en una tecnología denominada micronúcleo o microkernel. Esta manera de estructurar
al sistema operativo elimina todos los componentes no esenciales del kernel y éstos se diseñan
como programas del sistema a nivel de usuario; así se obtiene un kernel más pequeño y modular.
Aún en la actualidad no hay consenso de cuales deben de ser los módulos que deban estar a nivel
de kernel y cuales no. Sin embargo es común encontrar una administración de procesos y me-
moria muy reducida. También implementan los mecanismos de comunicaciones - la cual es su
principal función- entre módulos, los programas del usuario y los distintos servicios ejecutados
a nivel de usuario. Considerando lo anterior el programa cliente y el servicio nunca interactúan
directamente, el microkernel es el medio para establecer la comunicación. El método más común
es el intercambio de mensajes entre el programa cliente hacia el microkernel del microkernel al
servicio y viceversa.
La principal ventaja de usar microkernel en el diseño de un sistema operativo, es su facilidad
para adaptar nuevos servicios. Estos se añaden a la capa de usuario y si es necesario modificar el
microkernel, los cambios serán relativamente fáciles de hacer. Los microkernels son también fá-
ciles de portar a otras plataformas de hardware. También proporcionan mayor seguridad, puesto
que la mayoría de los programas y servicios se ejecutan en el espacio del usuario y no en modo
52 1.6. NÚCLEO
kernel.
La principal desventaja que tiene el microkernel es su desempeño frente a otras formas de
implementación. La carga impuesta al microkernel por el paso de mensajes puede ser tal que
el sistema se alente demasiado. La ventaja de utilizar servicios a nivel de kernel es que éstos
pueden comunicarse directamente con otros servicios, lo que por diseño, está prohibido en un
enfoque microkernel.
Windows NT empezó siendo diseñado con la tecnología de microkernel, pero su desempeño
fue peor que el del kernel de windows 98. Se optó por ir agregando mayor cantidad de tareas al
microkernel incluyendo el manejo de gráficos y terminó casi como si fuera un kernel monolítico.
La FSF (Free Software FoundationFundación de Software Libre) diseñó un nuevo kernel
denominado Hurd basado en Mach. Hurd Es un acrónimo recursivo que significa: Hird of Unix
Replacing Daemons y en español: Demonios que reemplazan a Unix. El término Hird significa
Hurd of Interfaces Representing Depth (Hurd de Interfaces que representan profundidad). Tanto
Hurd como Hird en inglés se pronuncian como Herd que significa en español “manada”. Si a
esto añadimos que su nombre real es: GNU Hurd, donde gnu viene a ser una variante de gñu, su
significado sería “manada de gñues”.
Este diseño de kernel se basa completamente en técnicas orientadas a objetos y la idea prin-
cipal es la de no tener un solo programa o kernel que se encuentre administrando todo el sistema,
en vez de ello, un conjunto de servidore a nivel microkernel son los encargados de proporcionar
los servicios necesarios
CAPÍTULO 1. INTRODUCCIÓN A LOS SISTEMAS OPERATIVOS 53
3. Tipos de planificación
4. Llamadas al sistema
54 1.6. NÚCLEO
5. Otros módulos
La diferencia con respecto a un diseño microkernel es la habilidad que tienen los módulos
de comunicarse entre sí sin pasar a través del núcleo, lo que permite una mayor velocidad de
respuesta.
Mac OS X es un sistema operativo híbrido en el sentido en que empieza un diseño por niveles
pero permitiendo la carga de diferentes módulos dinámicamente con comunicación directa. Mac
OS X está basado también en un kernel Unix, básicamente a nivel de kernel una tecnología Mach
y BSD.
serio también en los entornos de servidores. Incluso Sun Microsystems apoya de frente el uso
del software libre abriendo el código de varios de sus productos, pero con otro tipo de licencia.
En los siguientes apartados haremos una descripción general de todos estos sistemas opera-
tivos. procurando abarcar los aspectos más importante de cada uno de ellos.
1.6.3. GNU/Linux
En esta sección presentamos un análisis general del sistema operativo GNU/Linux. Haremos
hincapié en sus ventajas y desventajas y los posibles ambientes en los que puede ser usado con
éxito.
El sistema operativo GNU/Linux está basado en un kernel desarrollado por Linus Torvalds,
un estudiante de la Universidad de Helsinky Finlandia. La idea primaria era desarrollar un kernel
basado en Minix (Para una historia completa desde UNICS, UNIX y Minix puede verse [101]),
pero con más facilidades y además que aprovechara todas las características del microprocesador
80386 desarrollado por Intel con una capacidad real de 32 bits y soporte de modo protegido. Un
poco después Linus Torvalds, puso a disposición gratuitamente de la comunidad de Internet
el código fuente del incipiente kernel. Cual sería su sorpresa cuando gente de todo el mundo
empezó a enviar sugerencias y la mayoría de las veces aportaciones muy importantes de código
para ir mejorando poco a poco el núcleo y darle mayor funcionalidad, acercándose cada vez más
a la funcionalidad de UNIX. La historia de linux, como se mencionó en 1.6.2 está fuertemente
relacionada con la FSF fundada en 1985 por un grupo de personas encabezadas por Richard
Stallman, cuyo ideal es que todo el mundo tenga acceso a software de calidad y sin ningún
costo. Para ello se diseñó una licencia especial conocida como copyleft como contraparte a
copyright. Del copyleft surge la GPL o “Licencia Pública General”, la cual permite ejecutar,
copiar, modificar y distribuir el software creado y distribuido bajo esta licencia.
En 1990, el sistema GNU de software libre, ya contaba con un editor de texto y un com-
pilador que rivalizaba con cualquier compilador comercial, a su vez también contaban con la
mayoría de las bibliotecas y utilidades para tener un sistema operativo funcional.
Hay que tener en cuenta que un sistema operativo no es solamente el kernel. El kernel se
encarga de administrar los procesos, la memoria, los dispositivos de entrada/salida, la CPU y
el sistema de archivos, pero se necesita el software que debe de hacer uso de todos estos recur-
sos, para todos los tipos de usuario que van a usar el sistema operativo. Hablamos entonces de
aplicaciones de oficina, servicios cliente-servidor y toda la gama de programas que existen en
56 1.6. NÚCLEO
la actualidad para cubrir las necesidades de todos nuestros tipos de usuarios: usuarios finales,
usuarios, programadores y usuarios administradores.
En 1992 el núcleo Linux fue integrado al Proyecto GNU bajo la Free Software Foundation
resultando de esta unión un sistema operativo completamente libre y funcional.
El proyecto GNU porta la mayoría de sus programas a otras plataformas, incluyendo UNIX,
Solaris, Windows y Mac OS X, por lo que puede existir perfectamente sin Linux. El kernel
Linux sin embargo, representa la posibilidad de tener un sistema operativo completamente in-
dependiente de las firmas de sistemas operativos comerciales, por que si existe algún tipo de
alianza con otro fabricante, es posible que impidan parcial o totalmente la ejecución de software
libre en sus sistemas operativos.
Las primeras áreas en las que fue utilizado GNU/Linux fue en las académicas dado que
era posible analizar al detalle requerido, la forma en que están implementados los distintos
componentes de un sistema operativo.
Linus Torvalds presentó al público la versión 0.01 en mayo de 1991, no podía conectarse vía
red y se ejecutaba en microprocesadores 20386 y compatibles. Poseía muy pocos controladores
de dispositivos. Manejaba el sistema de archivos Minix y su sistema de memoria virtual era muy
limitado. Algo importante es que el kernel ya implementaba adecuadamente los procesos con
espacios de direcciones protegidos.
Cuando se liberó la versión 1.0 en marzo de 1994, el kernel ya era capaz de comunicar-
se vía red, tenía soporte para los protocoles de red estándar TCP/IP de UNIX, habían también
implementado los sockets con compatibilidad BSD. Incluía un sistema de archivos mejorado y
además incluía soporte para controloadores SCSI para acceso a discos de alta velocidad, me-
joraron el sistema de memoria virtual permitiendo de esta manera el uso de paginación sobre
los archivos de intercambio y el mapeo de memoria de archivos arbitrarios. El sistema imple-
mentaba también mecanismos de comunicación interprocesos (IPC)basados en System UNIX
V, incluyendo memoria compartida, semáforos y colas de mensajes. Incluía soporte para car-
gar/descargar módulos dinámicamente del kernel. La siguiente versión importante es la versión
2.0, se mejoró el administrador de memoria para proporcionar una caché unificada para los datos
del sistema administrador de archivos. Se extendió a su vez el mecanismo de caché del siste-
ma de archivos a los sistemas de archivos de red. Se añadieron al kernel nuevos protocolos de
red incluyendo AppleTalk AX.25 y se mejoró substancialmente la eficiencia del protocolo de
TCP/IP.
La última versión hasta el momento es la 2.6.18 en su versión estable que incluyen un soporte
CAPÍTULO 1. INTRODUCCIÓN A LOS SISTEMAS OPERATIVOS 57
mejorado para los sistemas SMP (Multi Procesamiento Simétrico), sistemas de archivos con
registro diario y mejoras en el administrador de memoria. El kernel de Linux mantiene ahora un
esquema apropiativo, permitiendo al núcleo desalojar un proceso mientras se ejecuta en modo
kernel y el planificador de procesos cuenta con un eficiente algoritmo de planificación.
Como se mencionó en 1.6.3.1. El desarrollo de buena parte del núcleo fue auspiciado por la
FSF, pero tener un sistema funcional completo es otra historia.
En particular un sistema operativo GNU/Linux utiliza herramientas desarrolladas por mu-
chísimas personas alrededor del mundo. En particular usa muchas librerías que pertenecen al
sistema operativo BSD de la Universidad de Berkeley California, la cual también tiene su con-
traparte en el software libre denominado Free BSD. Otro componente importante es la interfaz
gráfica del usuario basada en X Window que fue desarrollada por el Instituto Tecnológico de
Massachusets o MIT y básicamente todo el soporte de software para la programación de siste-
mas fue proporcionado por el proyecto GNU. Por mencionar unas pocas tenemos: el compilador
C de GNU llamado gcc, editores como el GNU-emacs el depurador gdb el controlador de ver-
siones de programas CVS, entre muchas otras más.
Dado que el sistema operativo GNU/Linux es libre y de código abierto, es posible en teoría
que cualquier usuario pueda modificar el sistema al grado que desee. En particular, lo que es
complicado para la mayoría de las personas que no están involucradas en el área de ciencias
computacionales o afines, es instalar un sistema en donde sea necesario bajar los códigos fuente
del sistema operativo, compilarlo y después instalarlo en donde corresponda. Esta tarea a su vez
debe de repetirse para cualquier nuevo componente, servicio o aplicación que deseemos instalar
en nuestro sistema. Antes de poder instalarlo sería necesario buscar en internet el programa
adecuado. Este proceso sería muy tedioso para el común de las personas.
El siguiente nivel en la organización de las comunidades de internet es la personalización del
sistema GNU/Linux. Al producto que generan las comunidades que se encargan de personalizar
un sistema operativo GNU/Linux se le denomina distribución. Una distribución es una manera
particular de “distribuir” el software de un sistema GNU/Linux. En general los desarrolladores
de sistemas entregan solamente el código fuente del programa y las librerías necesarias para
poder instalarlo. Además entregan también un listado de librerías que necesita el programa en
tiempo de ejecución a la que se les denomina “dependencias” y que en ocasiones forman parte
del propio sistema GNU/Linux. Una comunidad que mantiene una distribución se encarga de
58 1.6. NÚCLEO
administrar sitios en donde juntan todo el software que forma parte de su distribución. A cada
programa que incluyen se le denomina “paquete”. Es común que a cada paquete se le asigne una
persona para mantenerlo actualizado, esto es, verificar si la comunidad de desarrolladores de ese
paquete hizo cambios. Si es así, entonces lo compilará y empaquetará de modo que cumpla con
las reglas de la distribución. Si se soporta más de una plataforma, entonces, repetirá el proceso
para todas ellas verificando que no haya problemas en las dependencias. La persona que man-
tiene el paquete no corrige errores del programa. Además de tener todos los programas que les
parecen convenientes, desarrollan otras herramientas para simplificar la instalación del sistema
completo, pasando por los asistentes de instalación, los asistentes de instalación y configura-
ción de manejadores de dispositivos, administradores de paquetes y otras herramientas que les
permitan a los usuarios no tan avanzados hacer sus tareas lo más fácil posible.
Aunque hablamos de software libre, vamos a encontrar distribuciones apoyadas por em-
presas comerciales, por ejemplo, las más representativas son Red Hat y Mandriva las cuales
manejan dos versiones de sistemas GNU/Linux fedora y mandriva, que son distribuciones li-
bres, pero para aquellas empresas que necesiten soporte técnico, se les ofrecen distribuciones
mejoradas a un precio razonable. En este caso no venden el sistema operativo, venden la dis-
tribución o el empaquetado de programas, la integración de controladores de hardware o en su
defecto el soporte técnico. Por ejemplo, Red Hat maneja su versión Red Hat Enterprise orientada
a servidores y mandriva ofrece su Corporate Desktop 4.
Una derivación de la antigua distribución Mandrake y que está teniendo mucha aceptación
en el mundo linux es PCLinuxOS, puede descargarse un DVD listo para usarse y con una
cantidad enorme de manejadores de dispositivos y de lo último en aplicaciones de usuario.
En Alemania y en el mundo, una de las distribuciones comerciales más fuertes es Suse con
un instalador de dispositivos mejorado y un manejador de paquetes relativamente fácil de usar y
con un gran soporte de controladores, es una de las preferidas de muchos usuarios.
Merece mención aparte una de las distribuciones más jóvenes la comunidad de Ubuntu.
Es una de las mejores distribuciones basadas en Debian ganando cada vez más usuarios. Es
patrocinada por una empresa comercial llamada canonical, pero ofreciendo incluso los medios
(CD, DVD) y el envío al lugar que se le indique en forma gratuita hasta el momento. La ventaja
con respecto a Debian es la actualización constante en manejadores de dispositivos y programas
con los últimos avances, aunque en ocasiones adolece de la estabilidad de Debian
Dentro de las distribuciones completamente gratuitas, la más representativa es Debian. Lo
más interesante es su contrato social, en donde se comprometen a mantener por siempre una
distribución de calidad sin cobrar un sólo centavo, contrario a lo que pasó con Red Hat y Ma-
drake(Mandriva), que al tener una base de usuarios lo suficientemente grande optaron por
lanzar una distribución paralela con un costo (Aunque muchas de las veces es simbólico).
CAPÍTULO 1. INTRODUCCIÓN A LOS SISTEMAS OPERATIVOS 59
Debian mantiene tres versiones de sus sistemas GNU/Linux. La versión Estable (Stable Ver-
sion), La versión de pruebas (Testing Version) y la versión inestable (Unstable version). La ver-
sión estable se recomienda usarla en ambientes productivos y en donde se requiera la máxima
estabilidad. La versión testing la usan personas o empresas que necesiten paquetes o manejado-
res de dispositivos actualizados pero que no les interesa tanto la estabilidad y la versión inestable
es para aquellos usuarios que deseen tener lo último o para los desarrolladores que están pro-
bando sus aplicaciones.
Un problema que siempre se achacó a Debian fue su “difícil instalación”, que en realidad no
es más que un mito. En la actualidad es tan fácil instalar la versión estable etch como cualquier
distribución de ubuntu o alguna otra. Actualmente se puede escoger entre un instalador en modo
gráfico o modo texto, dando la oportunidad de hacer algunas tareas automáticamente o con
intervención del usuario.
Al momento de escribir estas líneas, existen más de 120 distribuciones. Es común que la
mayoría de los países personalicen sus sistemas GNU/Linux creando así una nueva distribución.
Es también normal que varias instituciones educativas hagan su propia distribución. Incluso en
internet se pueden encontrar programas que ayudan en el proceso de creación de una nueva
distribución.
Existen distribuciones de GNU/Linux para casi todas las necesidades. Desde Grandes em-
presas, centros de investigación, entidades gubernamentales, hasta los usuarios ocasionales que
desean probar algo nuevo. Básicamente se puede conseguir la mayoría de los paquetes y servi-
cios que existen para un sistema operativo comercial. El pago, que mucha de la gente no está dis-
puesta a dar es el tiempo de aprendizaje cuando queremos ir más allá de un usuario de escritorio.
Podemos instalar básicamente cualquier programa con un poco de esfuerzo y de investigación
en la red. Muchas de las veces tenemos que conseguir asesoría en la misma red, preguntando a
otros usuarios. No hay un servicio técnico a la mano cuando hablamos de distribuciones libres,
pero sí tenemos a muchísima gente que ha recorrido antes el camino que empezamos a andar.
Si no conseguimos la funcionalidad que se busca, podemos implementarla o empezar un nuevo
proyecto libre para cubrir esa laguna. Habrá miles de usuarios dispuestos a ayudarnos en toda la
internet, cuyo único aliciente es trabajar por amor a la computación.
60 1.6. NÚCLEO
1.6.4. Solaris
El sistema operativo Solaris se basó en UNIX BSD de la Universidad de Berkeley. Luego
lo mejoraron incorporando todos los requerimientos impuestos por UNIX System V. De esta
manera se convirtió en un sistema operativo basado en System V.
En 1992 se publicó la versión Solaris 2, en ese momento se hace la diferencia entre el kernel
y los programas o servidores de aplicación
Solaris soporta SMP (Multi procesamiento simétrico) y desde Solaris 7 tiene soporte para
aplicaciones de 64 bits.
Solaris soporta las arquitecturas SPARC y x86 incluyendo sus compatibles como AMD64.
Solaris 10, la última liberación de Sun Microsystems, proporciona todos los servicios que
una empresa pueda desear. El sistema operativo ofrece flexibilidad y fiabilidad en servidores
dedicados.
Dentro de los servicios básicos ofrece un ambiente gráfico basado en CDE, lo que no impide
usar otras interfaces de usuario basadas en software libre como Gnome o KDE, las cuales pue-
den integrarse fácilmente en CDE o incluso substituirlo. El último escritorio de Solaris es Java
Desktop System basado en Gnome y es el que está incluido por defecto.
Solaris 10 incluye mas de 600 nuevas funciones, muchas de las cuales no están disponibles
en otros sistemas operativos. Por ejemplo, incluye un depurador llamada DTrace, maneja una
nueva tecnología de sistemas de archivos denominada ZSF y las extensiones Solaris Trusted
Extensions. El sistema operativo Solaris 10 puede descargarse gratuitamente para uso personal
o sin fines de lucro. Para poder usar Solaris comercialmente se necesita autorización y por lo
común se debe de hacer algún pago. Otras características importantes de Solaris son:
Seguridad. Incluye algunas de las características más avanzadas del mundo, tales como Manejo
de Derechos de Usuario y de procesos, Extensiones probadas para el Control de Acceso
Obligatorio, un marco de trabajo criptográfico y la Red Segura por omisión que permiten
proteger datos de misión crítica con seguridad.
Redes. Con su pila de redes optimizada y soporte para los protocolos actuales de computación
de redes avanzadas. Solaris 10 proporciona funciones de red de alto desempeño sin modi-
ficaciones.
Opciones de plataforma. Puede correr en sistemas basados en SPARC 800 y en sistemas ba-
sados en x64/x86 incluyendo sistemas de Sun, Dell, HP e IBM.
Soporte y Servicio. Ofrece un amplio portafolio de clase mundial para que sus usuarios explo-
ten l máximo el potencial de su sistema.
Como puede verse, Solaris es uno de los sistemas operativos más avanzados hasta el mo-
mento, integrando lo mejor del software libre y las innovaciones tecnológicas, permitiendo una
enorme retroalimentación con la comunidad. Como parte de esta retroalimentación, existe una
versión libre y gratuita llamada openSolaris que ofrece las mismas características del sistema
operativo, pero permitiendo una mayor personalización.
En los grandes entornos empresariales, de gobierno y educativos es una de las principales
opciones para implementar. Ofrece muchas ventajas y facilidades de desarrollo.
La principal desventaja es su gran complejidad en la administración, que se ve recompensada
con creces con el tiempo. Pues muchas de las veces, después de instalado el sistema con todas
las aplicaciones sólo resta descansar y monitorear el buen funcionamiento de las aplicaciones
durante muchísimo tiempo. Podemos decir que es el paraíso de los administradores, después de
pasar un período demasiado complicado durante la instalación de servicios.
por otro lado, para un usuario medio sería muy difícil, a lo mejor no instalar el sistema
operativo, pero sí conseguir e instalar los manejadores de dispositivos y aplicaciones.
Este sistema operativo se recomienda más para profesionales de desarrollo y para entornos
institucionales, empresariales o instituciones educativas que para ser usado en casa como sis-
tema operativo casero o familiar, puesto que no está diseñado precisamente para ello. Aunque
62 1.6. NÚCLEO
últimamente se han añadido características que permiten una interacción más sencilla para los
usuario caseros o novatos, aún es muy difícil que pueda penetrar en ese mercado tan competido.
1.6.5. MacOS
Mac OS X fue desarrollado por Apple Inc, usando un modelo de desarrollo de código ce-
rrado, lo que implica que no puede modificarse excepto por sus programadores. Aunque existe
una versión denominada fundación Darwin que es de código abierto. El núcleo está basado en
la tecnología de microkernel de Mach pero con algunas modificaciones importantes, tales como
hacerlo un kernel modular y permitir comunicación directa intermodular, con carga de módulos
dinámicos para mejorar su eficiencia. Sus versiones de servidor tienen también características
de administración muy avanzadas.
En cuanto al software del sistema éste se basa en los últimos avances de la comunidad de
código abierto BSD. El resultado es una estable plataforma de 64 bits de alto rendimiento, el
entorno ideal para ejecutar aplicaciones y servicios.
En lugar de desarrollar tecnologías propietarias, Apple ha adoptado los mejores proyectos de
código abierto, como Apache, Samba, OpenLDAP, Kerberos, Postfix, Jabber y SpamAssassin.
Mac OS X Server[51] integra estas robustas tecnologías y las potencia con una homogé-
nea interfaz de gestión unificada. Sus potentes herramientas administrativas permiten a los pri-
merizos configurar y mantener servicios de red clave, y proporciona además las prestaciones
avanzadas que los profesionales de TI más curtidos necesitan.
Como Mac OS X Server está diseñado con estándares abiertos es compatible con cualquier
infraestructura de red actual. Emplea protocolos nativos para ofrecer servicios de directorio, de
archivos e impresión, acceso remoto seguro a clientes Mac, windows y linux. Se preocupa tam-
bién por su compatibilidad con sistemas no unix, principalmente con windows 2003 y Windows
XP. Por otra parte, la arquitectura de servicios de directorio estándar open Directory permite ad-
ministrar de forma centralizada todos los recursos, incluso los privativos, como Active Directory
de Microsoft.
El servidor Mac OS X combina lo último en tecnologías de código abierto con la tecnología
líder de la industria de Apple de facilidad de uso. La potencia del servidor Mac OS X es un
regreso a los estándares de la industria de código abierto sobre las tecnologías propietarias.
Comienza con un núcleo de código abierto basado en la arquitectura de red de BSD, ofreciendo
las capacidades que se esperan de un sistema UNIX, tal como multiprocesamiento simétrico,
tecnología multihilo y memoria protegida. Mac Os X proporciona una plataforma estable para
ofrecer un alto desempeño con aplicaciones y servicios de nivel empresarial.
CAPÍTULO 1. INTRODUCCIÓN A LOS SISTEMAS OPERATIVOS 63
El núcleo del servidor Mac OS X se conoce como Darwin, el mismo que se usa para el
sistema operativo de Apple para computadoras de escritorio y computación móvil. Darwin pro-
porciona al servidor Mac OS X la estabilidad, desempeño y fiabilidad asociado con UNIX.
En el corazón de Darwin tenemos un microkernel Mach 3.0 basado en el proyecto de la OSF
(Open Software Foundation) Fundación de Software Abierto. El kernel Mach proporciona ser-
vicios de administración de memoria, control de hilos, abstracción de hardware y comunicación
interprocesos. Darwin incluye lo último en avances tecnológicos de la comunidad de BSD de
código abierto. Originalmente desarrollado en la Universidad de California, Berkeley, la distri-
bución BSD es el pilar de muchas implementaciones de UNIX actuales. Darwin está basado
ampliamente en la distribución FreeBSD e incluye los últimos avances de esta comunidad de
desarrollo.
Con esta rica herencia, Apple entrega servicios de servidor que incluye:
Tecnología Multihilos. Proporciona una mejor administración de hilos para manejar eficiente-
mente aplicaciones multihilos, más aún si los hilos están corriendo sobre múltiples proce-
sadores. Mac OS X implementa los hilos basándose en los hilos POSIX.
Caché con búfer unificado. Para minimizar el acceso a disco y el uso de la memoria principal
muchos sistemas UNIX habilitan los subsistemas de memoria virtual y el sistema de archi-
vos para compartir los búferes del kernel. Mac OS X también utiliza este enfoque y mapea
automáticamente la memoria física y los archivos en la memoria virtual para minimizar el
uso de los recursos del sistema.
Servicios de 64 bits. Las características del núcleo y las librerías de software del sistema del
servidor de MAC OS X están actualizadas específicamente para el procesador G5 Po-
werPC de 64 bits. Con direccionamiento completo de memoria de 64 bits, las aplicaciones
pueden ahora romper la barrera de la memoria física de 4 Gigabytes, permitiéndoles ma-
nejar grandes conjuntos de datos comúnmente encontrados en soluciones de computación
científica, bases de datos y multimedia. Las librerías matemáticas y de vectores han sido
afinadas para obtener la máxima ventaja de las funciones nuevas y más rápidas soportadas
por el procesador G5 PowerPC de 64 bits.
64 1.6. NÚCLEO
IPv6. Muchos de los servicios en el servidor MAC OS X han sido actualizados para soportar
el protocolo de internet versión 6 o IPv6. IPv6 elimina muchos de los problemas en IPv4,
especialmente aquellos relacionados con el número de direcciones disponibles y añaden
funcionalidad en áreas tales como el ruteo y autoconfiguración de las redes.
IP sobre FireWire. Ideal para redes y administración de sistemas IP sobre FireWire permite
crear una red punto a punto de bajo costo entre dos dispositivos. IPS sobre FireWire es
también útil como una red de latencia baja y ancho de banda alto en computación de alto
desempeño, aplicaciones de clustering y escenarios IP tolerantes a fallos.
Sistema de Archivos de 64 bits. Mac OS X tiene soporte para un sistema de archivos de 64 bits
además de permitir sistemas de archivos HFS+ (y HFS+journaled) más allá de del límite
de los 64 Terabytes de los sistemas de archivos de 32 bits. Esto habilita a los diseñadores
el desarrollo de aplicaciones que usen volúmenes enormes de bases de datos, archivos de
imágenes y almacenamiento de vídeo digital.
Altos estándares de seguridad. Probados por los expertos de seguridad a nivel mundial, los
protocolos de seguridad estándares de la industria soportan todos los aspectos del sistema,
la seguridad de los datos y del sistema de red requeridos pos las aplicaciones de hoy.
Como puede verse, el sistema operativo MAC OS X ofrece una gama completa de servi-
cios a todos los niveles con una capacidad impresionante. Por tradición, las computadoras y el
sistema operativo MAC OS X los usuarios los han orientado hacia el diseño y desarrollo de apli-
caciones multimedia, incluyendo procesamiento de imágenes, creación de vídeos y renderizado.
No obstante podemos ver que sus aplicaciones pueden ir más allá de éstas y quedar plenamente
satisfecho con este sistema operativo con todas las ventajas de UNIX y la facilidad de uso de un
sistema operativo basado en windows.
El último sistema operativo que analizaremos será windows2003 server en la sección 1.6.6
CAPÍTULO 1. INTRODUCCIÓN A LOS SISTEMAS OPERATIVOS 65
Microsoft, una empresa fundada por Bill Gates, empezó con un sistema operativo mono-
usuario, basado en el microprocesador 8088/8086, allá a principios de los años 80’s, al que
llamó MS-DOS (MicroSoft Disk Operating System) Sistema Operativo de Disco de MicroSoft.
Todo el sistema se podía adquirir en un conjunto de discos y para ejecutarse comúnmente ne-
cesitaba sólo un disco flexible. Incluía una versión del lenguaje de programación BASIC al que
llamó Q-BASIC. Cuando IBM lanzó sus computadoras personales (1980), contrató a microsoft
para desarrollar su sistema operativo e incluirlo en ellas, básicamente IBM trató a las compu-
tadoras personales como un “juguete”, comparadas con las grandes computadoras que en ese
entonces se usaban en la industria, por lo que no hizo caso de crear un sistema operativo propio.
Cuando, varios programadores se dieron cuenta del enorme potencial de las computadoras
personales basadas en los microprocesadores de Intel, empezaron a hacer múltiples aplicaciones
y a venderlas por su cuenta, dejando de lado a las grandes compañías. Borland desarrolló su
turbo Pascal y turbo C, el propio microsoft desarrolló otro lenguaje de programación para el
lenguaje C al que llamó C de microsoft. Tiempo atrás (1977) ya había desarrollado Microsoft
Fortran. Con el sistema operativo funcional a nivel monousuario, estas primeras herramientas
de programación, una computadora personal que era decenas o cientos de veces más barata que
cualquiera de su tiempo y mucha gente queriendo participar en el negocio del software, pronto
empezaron a surgir una inmensa variedad de programas de todo tipo desde juegos, editores
de texto, manejadores de datos como dBase y otras más para las microempresas y negocios
familiares.
Era cierto que la computadora sólo podía ejecutar un solo programa a la vez y que era
necesario cargar nuevamente el sistema operativo después de haber ejecutado ese programa, pero
al fin las computadoras estaban al alcance de todos. El lema de Bill Gates era “una computadora
para cada hogar”. No importaba que en ocasiones la computadora se “colgara” por un programa
mal diseñado, se adquiría la versión corregida y se continuaba trabajando. Los virus hicieron su
aparición con la versión 5. Modificaban el sector de arranque y de ese modo podían tomar el
control de los recursos y autoreplicarse en cualquier disco que se introdujera en la disquetera o
los discos duros. El más notable fue el de “ping Pong” una pelotita que iba rebotando por toda la
pantalla de la computadora hasta que ésta se reiniciara. Después fueron diseñándose virus más
complejos aprovechando las vulnerabilidades de este sistema operativo.
El MS-DOS llegó hasta la versión 6, si hablamos de manejo en modo texto.
Desde la versión 5 microsoft empezó a introducir el ambiente gráfico denominado windows,
basado en una interfaz gráfica con uso de ratón de la empresa Xerox. La primera versión estable
66 1.6. NÚCLEO
fue la Windows 3.1, la cual corría sobre MS-DOS. Con el lanzamiento de windows 3.1, empeza-
ron a surgir también las aplicaciones de ventanas surgiendo las hojas de cálculo, los procesadores
de texto y manteniendo su compatibilidad a toda costa con toda la gama de aplicaciones en modo
MS-DOS.
Con el advenimiento de los procesadores 80286/20386, se pensó en mejorar el sistema ope-
rativo, de ese modo surgió windows 95 que sin embargo aún no aprovechaba por completo las
características de estos procesadores. Ahora se cargaba directamente de disco duro y no era ne-
cesario ejecutar el MS-DOS, no obstante, se ejecutaba sobre la versión 7 del sistema operativo
MS-DOS, aún con todos los problemas que podían ocasionar aquellos programas mal diseñados.
Así el usuario tenía toda la responsabilidad sobre lo que pudiera ocurrir sobre sus datos.
Microsoft al observar que tenía una base de usuarios empresariales muy grande empezó a
incursionar con los sistemas operativos de red en 1993, empezando con Windows NT Server
y windows NT Workstation. Anteriormente ya había había incursionado en las redes locales al
proporcionar mecanismos de conectividad mediante el protocolo NetBeui y tenía compatibilidad
también con IPX/Novell y TCP/IP.
Al darse cuenta que el núcleo del sistema operativo de windows 95 no cumplía con los
estándares de seguridad exigidos por la industria, comenzó a diseñar un kernel completamente
nuevo basado en la tecnología micronúcleo de mach, pero no a nivel funcional, obligado por
el hecho de mantener la compatibilidad con todos los programas diseñados para windows 95 y
anteriores.
La siguiente versión fue windows 98, el sistema operativo ahora incluía una interfaz más
fácil de usar y el número de aplicaciones para estas computadoras seguía creciendo por su acce-
sibilidad en costo.
Por el lado de servidores sale al mercado Windows 2000 server para reemplazar a windows
NT server, el cual no pudo reemplazar a windows 98 del escritorio. En versiones de servidores
el último lanzamiento fue Windows 2003 Server.
Para mejorar la seguridad en las computadoras personales, diseña windows XP basado en
la tecnología de windows 2000. Pero aún el problema sigue siendo la compatibilidad con las
aplicaciones. En esta versión ofrece distintas maneras de compatibilidad hacia atrás y firma
contratos con las empresas de software para poder certificar su uso bajo windows XP y de esta
forma mejorar su disponibilidad.
La última versión y que supone todo un cambio, en el desarrollo del sistema operativo, ahora
sí basado en una reingeniería total y dejando de lado, hasta cierto punto la compatibilidad -
que siempre había sido su principal problema- saca al mercado Windows Vista que promete
terminar de una vez por todas con los problemas de seguridad.
CAPÍTULO 1. INTRODUCCIÓN A LOS SISTEMAS OPERATIVOS 67
A continuación hacemos una referencia de las características más importantes del sistema
operativo windows 2003 Server de microsoft:
Fácil uso. Microsoft tradicionalmente ha enfocado sus esfuerzos en hacer lo más sencillas po-
sibles la instalación desde el sistema operativo hasta los servicios y las aplicaciones.
Seguridad de la red. Hace uso de funciones de clave, como las relaciones de confianza entre
bosques del servicio de Microsoft Active Directory integrando Microsoft .Net passport.
Permite la administración de identidades por toda la red. Permite a su vez el cifrado de
datos confidenciales de una manera sencilla y puede aplicar directivas de restricción de
software para prevenir los daños causados por virus y otro tipo de código malintencionado.
Permite implementar una infraestructura de claves públicas.
Sitios Web al instante. Permite al aislamiento entre aplicaciones y un rendimiento muy mejo-
rado. Con los servicios de Windows Media es posible la transmisión de secuencias mul-
timedia con programación de contenido dinámico y puesta a punto de un sitio de internet
fácilmente
mayoría de las veces prácticamente regalan sus sistemas operativos, falta que ganen la lucha
contra la costumbre, la comodidad o facilidad de uso, la inmensa cantidad de software y la
ignorancia de mucha gente inclusive a veces de gobiernos completos.
Al final, un sistema operativo, basado en UNIX, mal administrado puede ser peor que tener
un sistema operativo con vulnerabilidades pero bien administrado y actualizado. Ahora también
entra en juego un personaje que antes estaba oculto: El administrador de los Sistemas Operativos
que será el responsable de que todos los servicios estén al día, y funcionando.
1.7. Problemas
1.1. Explique con sus propias palabras: ¿Qué es un sistema operativo?, ¿Cuáles son sus
funciones?, ¿Cuáles son sus objetivos?
1.2. Enumere cinco posibles lugares en donde haya tenido contacto con algún sistema ope-
rativo.
1.3. Describa las funciones o actividades de cada tipo de usuario de un sistema operativo.
1.5. Describa en forma ordenada los pasos que se llevan a cabo en el proceso de arranque.
1.6. Realice una línea de tiempo anotando los eventos que considere más importantes en la
evolución de las computadoras. Haga lo mismo para los sistemas operativos y compá-
relas.
1.8. ¿Qué ventajas y desventajas presentan un sistema dedicado y un sistema por lotes.
1.12. en la pregunta 2 indicó cinco posibles lugares en donde encontrar un sistema operativo.
Ahora clasifíquelos en las categorías de sistemas dedicados, por lotes, entrada salida
70 1.7. PROBLEMAS
1.13. Realice un diagrama que incluya los subsistemas de un sistema operativo. Explique
cada uno de ellos.
1.18. Enumere y explique detalladamente las operaciones que se pueden realizar sobre un
proceso.
1.21. Investigue la información técnica de una memoria actual de computadora. Explique las
características más importantes.
1.24. ¿Qué es una dirección lógica? y ¿Una dirección física? ¿Por qué es necesario usar
direcciones lógicas?
1.27. ¿Por qué es importante que el sistema operativo cuente con un administrador de sistema
de archivos.
1.28. Investigue al menos cinco sistemas de archivos y explique a grandes rasgos el funcio-
namiento de cada uno de ellos.
1.29. Dibuje diagramas para cada tipo de estructura de un sistema operativo. Describa las
ventajas y desventajas de cada uno. Suponiendo que tiene que diseñar un sistema ope-
rativo ¿Qué estructura elegiría y por qué?
CAPÍTULO 1. INTRODUCCIÓN A LOS SISTEMAS OPERATIVOS 71
1.32. Lea la licencia GPL y haga un resumen usando sus propias palabras.
1.33. Lea el CLUF de algú sistema operativo comercial y haga un resumen usando sus pro-
pias palabras.
1.37. ¿Qué es código abierto?, ¿Qúe es software libre?, ¿Qué diferencia existe entre los dos?
1.38. Enuncie diez de las distribuciones de GNU/Linux y explique brevemente cada una de
ellas.
1.39. Enuncie las fortalezas del sistema operativo Solaris y explique cada una de ellas.
1.40. Investigue la historia de Solaris y haga un resumen con sus propias palabras.
1.44. Haga una línea de tiempo sobre la historia de Microsoft sobre sus sistemas oeprativos
y explique los momentos que considere más importantes.
1.45. Describa las características más importantes del sistema operativo Windows 2003 Ser-
ver.
ofrece el código fuente de MINIX, un sistema operativo académico en donde se basó Linus Tor-
vals para desarrollar el núcleo de Linux. Milenkovic [94] Ofrece también el código fuente sobre
el diseño de un sistema operativo llamado kmos. Lampson[60] nos habla acerca del sistema
operativo mesa.
Redell[82] describe un sistema operativo para uso personal. Dawson Engler[37] describe una
arquitectura de un sistema operativo para el manejo de recursos a nivel de aplicación. Flynn[40]
ofrece los conceptos principales para el diseño de un sistema operativo rápido.
Oustterhout[79] proporciona un análisis general del sistema operativo distribuido sprite.
Capítulo 2
73
74 2.1. CONCEPTO DE PROCESO
todas las CPU. Por último nos referiremos a los sistemas distribuidos. Un sistema distribuido,
se define como la compartición de tareas entre diferentes computadoras conectadas mediante
una red. Esto es, una red permite compartir recursos, como directorios y archivos, un sistema
distribuido, permite a su vez compartir memoria y procesos o tareas.
No ejecución. Cuando un programa se encuentra en este estado, se dice entonces que está espe-
rando la oportunidad de ejecutarse, por lo tanto, no se encuentra en la CPU. Todo proceso
que es creado, empieza en el estado de no ejecución.
En ejecución. Cuando el sistema operativo decide que es tiempo de que un proceso pase a
CAPÍTULO 2. ADMINISTRACIÓN DE PROCESOS Y DEL PROCESADOR 75
Aunque esta estrategia es muy simple, podemos observar que se necesitan definir varios as-
pectos tales como el tiempo que debe asignarse a cada proceso. qué estrategia debe seguir el
sistema operativo para decidir cual será el siguiente proceso a ejecutarse. En donde se guarda-
rán los datos de los procesos que están ejecutándose en ese momento. Entre otras cuestiones
importantes.
En los sistemas operativos actuales el administrador de CPU interrumpirá al proceso en eje-
cución en intervalos regulares. Si su tiempo no ha concluido, entonces le devuelve nuevamente el
control.de otra forma seleccionará un nuevo proceso de la cola de procesos. La cola de procesos
por lo común es una lista enlazada cuyos nodos representan procesos que deben ser ejecutados.
La estrategia más común es usar la FIFO (First Input Firt Output), esto es, primero en entrar pri-
mero en salir. De acuerdo a esta estrategia, el proceso que llega primero, será el que se atienda
primero. Esto no significa que el proceso deberá continuar hasta que termine su ejecución. Este
se ejecutará hasta que se le agote su tiempo asignado. Cuando se le termine su tiempo -y si to-
davía no termina su tarea- regresará al final de la cola para esperar un nuevo turno de ejecución.
En el momento en que termine su tarea, el proceso será eliminado de memoria y la estructura de
datos que lo representa será eliminado de la cola.
Aunque el modelo de dos estados es conveniente para una aproximación general. Es común
que un proceso aún no se encuentre listo para ejecutarse debido a que está esperando que ter-
mine una operación de entrada/salida. En ese momento sería inútil que el sistema operativo le
concediera su segmento de tiempo, puesto que se lo gastaría esperando. Para evitar este y otros
problemas, se aumentan a cinco los posibles estados de un proceso:
1. Estado nuevo
3. Estado de Ejecución
4. Estado de Bloqueado
5. Estado de Terminado
Estado nuevo. Son aquellos procesos que acaban de ser solicitados para ejecución, pero que
aún el sistema operativo no termina de generar todas las estructuras de datos necesarias
para pasarlos al estado de listos.
Estado de Listo o Preparado. se encuentran en este estado aquellos procesos que tienen todo
lo necesario para ejecutarse o continuar sus tareas en donde las dejaron. solamente esperan
a que les toque su turno de ejecución.
Estado de Ejecución. El proceso que se encuentra en este estado es el que tiene el control del
procesador. Si la arquitectura de la computadora existen muchos procesadores, entonces
es posible que exista más de un proceso en este estado. Por el contrario, si hablamos de
una computadora con un solo procesador, entonces en un momento cualquiera existirá
sólo un proceso en este estado.
Estado de Bloqueado. Se encuentran en este estado aquellos procesos que están esperando
que termine una operación de entrada/salida, que se libere un recurso -a excepción del
procesador- o están esperando una señal externa.
Estado de Terminado. Están es este estado aquellos procesos que han finalizado su tarea o
incurrieron en algún acceso no autorizado o hubo un error irrecuperable y el sistema ope-
rativo los eliminó. También es posible que el padre del proceso haya enviado una señal
de terminación de proceso por que la tarea global ha sido finalizada. Esto significa que
el sistema operativo lo quitará de la lista de ejecución y después que haya obtenido las
CAPÍTULO 2. ADMINISTRACIÓN DE PROCESOS Y DEL PROCESADOR 77
Tomando en cuenta estos estados, un proceso puede pasar de uno a otro. A esto le llamamos
transiciones. En la figura 2.1, vemos las transiciones que puede efectuar el proceso. A continua-
ción explicaremos brevemente cada una de ellas:
Transición de Nuevo a Preparado. Tiene lugar cuando el SO está preparado para admitir un
proceso más y ha terminado de inicializar las estructuras de control necesarias. Se tendrán
en cuenta las restricciones de la capacidad de la memoria, de modo que aquellos proce-
sos que tengan baja prioridad o estén bloqueados se envíen a la memoria virtual en caso
necesario.
Transición Preparado a Ejecución. Esta transición se genera cuando el planificador del siste-
ma operativo ha seleccionado un nuevo proceso para ejecutar y está realizando un cambio
de contexto.
Transición Ejecución a Bloqueo. Un proceso pasa a bloqueo cuando ha iniciado una opera-
ción de entrada/salida y ésta es demasiado lenta. También cuando espera una señal exter-
na.
Transición Bloqueado a Terminado Un proceso hijo puede hacer esta transición debido a que
el proceso padre envío una señal de terminación a todos sus hijos. Otra causa puede ser
que el proceso supere el tiempo máximo de espera por un recurso y el sistema operativo
decida entonces terminarlo, aunque comúnmente enviará un aviso al usuario del proceso
y que éste decida qué hacer.
Para que el sistema operativo pueda implementar todos estos estados es necesario disponer
de dos colas, una para los procesos preparados y otra para los bloqueados. A medida que se
admiten procesos nuevos en el sistema, éstos se van colocando en la cola de preparados. Cuando
el sistema operativo tiene que elegir un proceso para su ejecución, lo hace sobre esta cola. Si su-
ponemos que no hay una política de prioridades entonces la cola puede administrarse mediante
un algoritmo FIFO como se explicó en 2.2. Cuando el sistema operativo le quita el procesador a
un proceso, puede ser porque ha terminado su ejecución, porque ha excedido el tiempo máximo
asignado. En este caso se va agregar al final de la cola de preparados. En caso de que haya que-
dado bloqueado o a la espera de una señal entonces se agregará al final de la cola de bloqueados.
Cuando tiene lugar una señal todos los procesos que esperaban por ella se envían desde la cola de
bloqueados a la de preparados. Esta última medida significa que cuando se produce un suceso,
el sistema operativo debe recorrer toda la cola de procesos bloqueados buscando aquellos que
esperen por la señal. En un sistema operativo grande puede haber una gran cantidad de proce-
sos en la cola de bloqueados, por consiguiente, resultaría más eficiente disponer de un conjunto
de colas, una para cada señal o suceso. De esta forma, cuando se produzca un evento, la lista
entera de procesos en la cola correspondiente a ese suceso podrá pasarse a estado preparado. Si
la planificación de procesos se realiza mediante un esquema basado en prioridades, entonces es
conveniente tener un cierto número de colas de procesos listos, una para cada prioridad.
suspendido o bien aceptar un nuevo proceso. Se considera suspendido a un proceso que presenta
las siguientes características:
3. El proceso fue situado en estado suspendido por el sistema operativo o el proceso padre
con el fin de que no se ejecute por alguna razón.
Estado del proceso. Puede ser cualquiera de los que analizamos en 2.2.
Información de planeación del CPU. Incluye la prioridad del proceso, los apuntadores a las
colas de planificación y otra información necesaria.
Registros de la CPU. Es necesario guardar una copia exacta del estado en que quedaron los
registros para asegurar que el proceso pueda continuar en el punto en que se suspendió su
ejecución.
Información de estado de E/S. El sistema operativo guarda una lista de dispositivos usados
por el proceso, una lista de archivos el estado en que se encuentran.
En resumen, en PCB es una estructura que permite guardar toda la información relativa
al proceso y que cambia durante la ejecución del mismo. Es importante hacer notar que aquí
se guarda la información para que el proceso, al momento de tomar nuevamente el control,
empiece a ejecutarse exactamente donde se quedó, independientemente de la operación que
estaba realizando.
Competición
cooperación
Dado que ambos procesos están ejecutándose en la misma CPU o en diferentes CPU, éstos van
a competir por los demás recursos de la computadora. También es posible que se dé la condición
de cooperación entre dos o más procesos para que lleven a cabo una tarea más eficientemente.
Tanto la competición como la cooperación requieren que el sistema operativo proporcione un
soporte conveniente de modo que exista el aislamiento adecuado cuando un proceso acceda a
un recurso -como por ejemplo, su espacio de direcciones- y pueda terminar su tarea con éxito.
La cooperación exige que el sistema operativo proporcione mecanismos de acceso controlado
a los datos y archivos compartidos para asegurar adecuadamente las operaciones atómicas del
proceso, ya sea mediante señales o algún otro mecanismo de sincronización.
En los sistemas operativos actuales es común que los procesos puedan ejecutarse concurren-
temente y también crearlos y eliminarlos dinámicamente.
switch (fork())
{
case -1:
/* Aquí insertamos el código para manejar el
CAPÍTULO 2. ADMINISTRACIÓN DE PROCESOS Y DEL PROCESADOR 81
pid=fork()
if (pid==0)
{ /* Aquí va el código del hijo*/}
else if pid > 0
{ /*Aquí va el código del padre*/}
else
{/*Aquí se maneja el error en caso de que
falle la creación del proceso*/
}
Hay que observar que incluso los procesos hijos pueden crear nuevos procesos, lo que signi-
fica que al final tendremos un árbol de procesos.
Para que podamos ver los procesos que actualmente se están ejecutando en la computadora
tenemos la instrucción ps en los sistemas UNIX/Linux en los sistemas de Windows tenemos
el administrador de tareas, el cual también indica cuanto tiempo de CPU está consumiendo
un proceso y la memoria que tiene ocupada. Para ver el consumo de recursos en UNIX/Linux
usamos el comando top.
Cuando un proceso crea uno nuevo puede darse cualquiera de los acontecimientos siguientes:
2. El padre espera a que los hijos terminen las tareas asignadas, para después seguir ejecu-
tándose.
2. el hijo cargue un nuevo programa mediante una llamada a exec() o alguna de sus variantes.
1. El proceso hace una llamada a la función exit() para indicarle al sistema operativo que
terminó sus tareas y que puede ser eliminado, regresando al padre un código de éxito o
error.
2. El proceso padre envía una señal KILL (morir) al proceso hijo para que termine su ejecu-
ción.
3. El sistema operativo envía una señal KILL al proceso a causa de un acceso (a un bloque
de direcciones -por ejemplo-) no autorizado o algún otro evento.
4. El usuario dueño del proceso envía una señal al proceso mediante la función kill() o si el
proceso tiene asociado una terminal presionando ctrl-c o ctrl-break
5. El super usuario o el administrador del sistema envía una señal al proceso mediante la
función kill() o si el proceso tiene asociado una terminal presionando ctrl-c o ctrl-break
CAPÍTULO 2. ADMINISTRACIÓN DE PROCESOS Y DEL PROCESADOR 83
Como podemos observar cada proceso hace exactamente el mismo trabajo: atender una so-
licitud del mismo tipo de servicio. Sin embargo por cada solicitud se crea un nuevo proceso con
código y datos. No tiene sentido tener todo ese código duplicado si solamente cambia el valor
de algunas variables de los datos. Además hay que contar la sobrecarga del sistema debido a la
tarea de copiar todo el contexto del proceso.
En la actualidad la mayoría de las aplicaciones están usando los hilos en vez de procesos.
Como se comentó tienen más ventajas que los procesos tradicionales.
incluso varios de los sistemas operativos actuales usan kernels multi hilo; esto significa que
existen varios hilos ejecutando tareas específicas como la administración de memoria y la admi-
nistración de los dispositivos de entrada salida.
Economía. Hacer un cambio de contexto de un hilo es mucho más rápido que hacer el cambio
de contexto de un proceso.
Aumento en la capacidad de respuesta. Si hacemos uso de varios hilos en una aplicación in-
teractiva, podemos lograr que nuestra aplicación siga respondiendo a nuestro usuario,
puesto que si se hace una tarea muy larga, como una búsqueda, los hilos encargados de la
interfaz gráfica podrán estar trabajando para procesar entradas del usuario.
Recursos compartidos. Los hilos comparten tanto el código, como los datos del proceso que
los creó, si necesitan información local pueden pedirla independientemente del proceso
padre.
#include <pthread.h>
//
/* Función que va a ejecutar el hilo
correspondiente al hijo */
void *hilo(void *nollevonada);
/* Contadorcomun, global para que sea visible
desde el principal y desde hilo */
int contadorcomun = 0;
int veceshilo=0;
int vecespadre=0;
int main()
{
/* Identificador del hilo hijo */
pthread_t Hilo;
/* error devuelto por la función de
creación del hilo */
int error;
/* se crea el hilo.
* En Hilo tendremos el PID del nuevo hilo,
* Pasamos la función que se ejecutará en el nuevo hilo
* Pasamos NULL como parámetro para esa función de manera
que obtenga los valores por defecto. */
//
error = pthread_create (&Hilo, NULL, hilo, NULL);
//
/* Comprobamos el error al arrancar el hilo */
if (error != 0)
{
perror ("No puedo crear el hilo");
exit (-1);
}
/* Bucle infinito para incrementar el contador
y mostrarlo en pantalla */
while (1)
{
contadorcomun++;
vecespadre++;
printf("Padre : %d veces %d\n", contadorcomun, vecespadre);
86 2.3. PROCESOS LIGEROS: HILOS O HEBRAS
if (vecespadre>10000)
break;
}
if vecespadre>veceshijo
printf("Terminó primero el padre");
else
printf("Terminó primero el hijo");
return(0);
}
/* Función ejecutándose en el hilo hijo.*/
void *hilo(void *nollevonada)
{
/* Bucle infinito para decrementar contador
y mostrarlo en pantalla. */
while (1)
{
contadorcomun--;
veceshijo++;
printf ("Hilo : %d veces %d\n", contadorcomun,veceshijo);
if (veceshijo>10000)
break;
}
pthread_exit(0);
}
Observe que para terminar el hilo se usa la llamada a función ptrhead_exit() con un valor de 0
que indica que no hubo problemas en la ejecución. Cuando es necesario esperar a que termine
la ejecución de una o más hilos entonces el padre usará la llamada a función pthread_join().
es la acción de eliminar de memoria un hilo que aún no termina su ejecución. Esto es ne-
cesario por que hay ocasiones en que, por ejemplo si tenemos una búsqueda concurrente sobre
una base de datos y se lanzaron varios hilos, cada uno de ellos con una parte de la misma, al-
guno encontrará primero los datos y entonces no será necesario que las demás sigan haciendo la
búsqueda y habrá que eliminarlas.
El problema de la cancelación viene a que, al igual que los procesos, no existe garantía total
de que los recursos regresen al sistema. Por ejemplo, cuando un proceso o un hilo pidieron
memoria dinámicamente. Esta memoria no se regresará hasta que no la devuelva explícitamente
el hilo o proceso que la solicitó, generando lo que se conoce como fuga de memoria, un problema
que debe tratarse con mucho cuidado en la programación con lenguaje C. La eliminación del hilo
puede hacerse de dos formas:
2. Síncrona. El proceso que creó el hilo, verifica si es posible terminarlo, si no, espera y
vuelve a repetir el proceso, dando oportunidad al hilo de terminar adecuadamente.
Con la memoria sucede un caso similar, si dos procesos tienen acceso a un área de memoria
común, deben de ponerse de acuerdo en la forma de acceder a ésta, tanto para la lectura como
para la escritura. Ambos procesos deben de acceder al recurso en instantes diferentes de tiempo
y además deben de ser capaces de terminar la operación que empezaron. de otro modo, los datos
de esa área de memoria pueden corromperse, cuando los procesos sobre escriban información
que corresponde a cada uno de ellos.
2.4.1. Definiciones
Concurrencia es cuando dos o más procesos quieren acceder a un recurso al mismo tiem-
po. El sistema operativo debe garantizar la integridad de la información, haciendo que entren al
recurso proceso por proceso y garantizar también que terminen de hacer las operaciones sobre
el recurso correspondientes. A lo anterior le llamamos exclusión mutua. La exclusión mutua,
por tanto, es hacer que un proceso ejecute sus operaciones de entrada salida sobre su recurso sin
que entre otro proceso en ese instante. A este conjunto de operaciones les llamaremos sección
crítica, por que si llega a suceder alguna intromisión puede que haya corrupción de datos. La
inanición se da cuando un proceso no puede ejecutar jamás su sección crítica, casi siempre indi-
ca que el algoritmo de exclusión mutua no garantiza que todos los procesos ejecuten su sección
crítica de una forma cíclica. tenemos una condición de carrera cuando dos o más procesos ob-
servan que el recurso está desocupado y tienden a reservarlo y puede suceder entonces que estos
procesos obtengan el derecho a ejecutar su sección crítica, con resultados desastrosos. Por últi-
mo, la sincronización es el mecanismo que usan los procesos para poder entrar ordenadamente
a un recurso compartido.
El sistema operativo es el encargado de proporcionar los medios adecuados para permitir
la concurrencia y también de proporcionar las llamadas de sistema convenientes para que los
procesos puedan hacer uso de ellas y lograr la exclusión mutua y la sincronización. A veces
se le deja esta tarea al programador, pero solamente el sistema operativo es el único capaz de
administrar los accesos de los procesos a los recursos a bajo nivel y hacerla de árbitro, para
indicar a qué proceso le corresponde acceder en su momento a los datos. En el programa de la
página 84, el proceso principal suma uno y el hilo lo resta ¿ Qué pasaría si el padre tuviera que
realizar operaciones adicionales con ese número ? es obvio que los resultados estarían alterados
por que ambos escriben sobre la variable en el momento en que les toca ejecutarse, sin saber si
otro proceso está usando esa variable.
CAPÍTULO 2. ADMINISTRACIÓN DE PROCESOS Y DEL PROCESADOR 89
Aplicaciones estructuradas. Como ampliación de los principios del diseño modular y la pro-
gramación orientada a objetos, algunas aplicaciones pueden implementarse eficazmente
como un conjunto de procesos concurrentes o un conjunto de hilos.
Sistemas operativos. Las mismas ventajas se aplican a los programadores de sistemas. Incluso
algunos sistemas operativos están implementados como un conjunto de procesos o hilos.
En un sistema multitarea con una CPU, los procesos se intercalan en el tiempo aparentando una
ejecución simultánea. Aunque no se logra un procesamiento paralelo y produce una sobrecarga
en los intercambios de procesos, la ejecución intercalada produce beneficios en la eficiencia de
la ejecución y en el desarrollo de programas basados en hilos o procesos, esto es, a medida que
crean más procesos o hilos pueden terminar más rápidamente su tarea. Si se hace uso de una
computadora con múltiples procesadores, el sistema operativo tendrá la posibilidad de asignar
cada proceso o hilo a otro procesador, sin hacer cambio alguno en la aplicación.
La intercalación y la superposición pueden contemplarse como ejemplos de procesamiento
concurrente en un sistema monoprocesador, los problemas son consecuencia de la velocidad
de ejecución de los procesos que no pueden predecirse y depende de las actividades de otros
procesos, de la forma en que el sistema operativo trata las interrupciones surgen las siguientes
dificultades:
1. Compartir recursos globales es riesgoso.
1. Asegurar la ejecución de una sola sección crítica excluyendo a los demás el acceso al
recurso compartido.
4. Cuando dos o más procesos desean ejecutar su sección crítica, se les debe proporcionar el
acceso a cada uno de ellos en un tiempo finito.
proporciona un medio a los procesos para poder deshabilitarlas puede conseguirse la exclusión
mutua, aunque puede ocasionar muchos problemas. El segundo enfoque consiste en el diseño y
utilización de algoritmos de software que permitan la sincronización y garanticen la ejecución
exclusiva para cada proceso de su sección crítica.
While (cierto)
{
/*inhabilitar interrupciones */;
/* sección crítica */;
/* habilitar interrupciones */;
/* resto */;
}
Puesto que la sección crítica no puede ser interrumpida, la exclusión mutua está garantizada. Sin
embargo, el precio de esta solución es alto. La eficiencia de la ejecución puede verse notable-
mente degradada debido a que se limita la capacidad del procesador para intercalar programas.
Un segundo problema es que esta técnica no funciona en arquitecturas de multiprocesador. Cuan-
do el sistema tenga más de un procesador, es posible (y habitual) que haya más de un proceso
ejecutándose al mismo tiempo. En este caso, inhabilitar las interrupciones no garantiza la exclu-
sión mutua. Hay que agregar que si el reloj se actualiza mediante interrupciones el inhabilitarlas
puede ocasionar un mal funcionamiento del mismo.
Cuando se inicia el programa, se da un valor inicial al cerrojo = 0. El único proceso que puede
ingresar a la sección crítica es aquel que encuentre el cerrojo en 0. Todos los demás procesos
están en espera en el ciclo while. Cuando el proceso termine la sección crítica, abre nuevamente
el cerrojo haciendo cerrojo = 0. El primer proceso que ejecute testset será el que ejecute la
sección crítica. En el siguiente programa vemos el uso de la función intercambiar.
94 2.4. CONCURRENCIA Y SECUENCIABILIDAD
El programa principal comienza con una variable compartida cerrojo = 0. Cada proceso tiene una
variable local iniciada en 1. clave = 1. El único proceso que puede entrar a la sección crítica es el
que encuentre el cerrojo abierto en 0; colocándolo en 1 (cerrado). Cuando un proceso abandona
la sección crítica, vuelve a abrir el cerrojo colocándolo en cero.
El uso de instrucciones especiales de la máquina para cumplir con la exclusión mutua tiene
varias ventajas:
Puede usarse para disponer de varias secciones críticas; cada sección crítica puede defi-
nirse con su propia variable.
CAPÍTULO 2. ADMINISTRACIÓN DE PROCESOS Y DEL PROCESADOR 95
Se emplea espera activa. Así pues, mientras un proceso está esperando para acceder a la sec-
ción crítica, continúa consumiendo tiempo del procesador.
Puede producirse inanición. Cuando un proceso abandona la sección crítica y hay más de un
proceso esperando, la selección es arbitraria. Así pues se podría denegar el acceso a algún
proceso indefinidamente.
2.4.5. Semáforos
Dentro de las soluciones de software tenemos a los semáforos. Un semáforo es un tipo de
datos abstracto que proporciona la capacidad de hacer uso de un recurso de manera exclusiva
cuando varios procesos están compitiendo por éste.
El semáforo cumple la siguiente semántica:
1. El estado interno del semáforo lleva la cuenta de cuántos procesos pueden utilizar el re-
curso. Se puede implementar, por ejemplo, con un número entero que nunca llega a ser
negativo.
init(). Inicializa el semáforo antes de que cualquier proceso haya ejecutado una operación
wait() ni una operación signal() al número número de procesos que tengan derecho
a acceder el recurso. Si se inicializa con 1, tenemos entonces un semáforo binario.
wait(). Si el estado indica cero, el proceso queda suspendido por el semáforo hasta que sea
despertado por otro proceso. Si el estado indica que un proceso más puede acceder
el recurso se decrementa el contador y la operación termina con éxito.
signal(). Una vez se ha terminado el uso del recurso, el proceso se lo indica al semáforo
con esta instrucción. Si hay algún proceso bloqueado en el semáforo entonces uno
de éstos se pasará al estado de listo, de otra forma se incrementa el contador.
96 2.4. CONCURRENCIA Y SECUENCIABILIDAD
La operación wait() debe ser implementada como una instrucción atómica. No obstante, en
muchas implementaciones se puede interrumpir. Normalmente existe una forma de comprobar
si la salida del wait() es debido a una interrupción o porque se ha dado acceso al semáforo. La
operación signal() también tiene que ser implementada como instrucción atómica. En ciertas
implementaciones se puede comprobar si se ha despertado un proceso con éxito en caso que
hubiera alguno bloqueado.
Para despertar los procesos se puede implementar varias formas que se distinguen , por
ejemplo con un simple sistema tipo FIFO.
El acceso a regiones críticas puede hacerse con un semáforo que permita el acceso a un sólo
proceso.
En la sección 2.2 hablamos sobre los estados en los que puede estar un proceso. Para evitar
que un proceso consuma tiempo de CPU es necesario crear un nuevo estado, se denomina estado
en espera. De esta forma, dos o más procesos pueden cooperar mediante señales de forma que
pueda obligar a detenerse a un proceso hasta que reciba una señal para que continúe. Así es
posible lograr que se comuniquen varios procesos de modo que todos ellos puedan acceder a
su sección crítica en un momento dado. Para lograr esto se usa una variable llamada semáforo
para intercambiar señales. Si un proceso está en espera de una señal, se suspende hasta que la
señal sea enviada por otro proceso. Como se mencionó wait() y signal() son operaciones que
no pueden interrumpirse. El semáforo mantiene una cola de procesos en espera. La manera en
que los procesos salen de la cola en espera es mediante una política primero en entrar, primero
en salir. En la figura 2.2 tenemos el diagrama de estados de los procesos incluido el estado de
espera.
A continuación tenemos los algoritmos y las estructuras que se usan para construir un semá-
foro binario.
struct semaforo_binario {
enum(zero,one) value;
queueType queue;
};
void waitB(semaforo_binario s)
{
if (s.value == 1)
s.value=0;
else {
/*colocar este proceso P
en la cola s.queue*/
CAPÍTULO 2. ADMINISTRACIÓN DE PROCESOS Y DEL PROCESADOR 97
/*bloquear el proceso*/
}
}
void signalB(semaforo_binario s)
{
if (s.queue.is_empty())
s.value=1;
else {
/*remover el proceso P
de la cola s.queue*/
/*colocar el proceso P
como listo para ejecucion*/
}
}
Un semáforo, como se mencionó, cuenta en su estructura con una cola de procesos que
esperan que el semáforo les dé el paso libre. En la operación wait(s), si el semáforo está libre
(valor 1), cierra el paso (valor 0). En la operación wait(s), si el semáforo cierra el paso (valor
0), coloca el proceso en la cola de espera de este semáforo. En la operación signal(s), si la cola
de espera está vacía, el semáforo se coloca como libre (valor 1) En la operación signal(s), si
la cola de espera no esta vacía, el primer proceso de la cola en espera se coloca en la cola de
preparados, listos para que el planificador de procesos lo lleve al CPU para su ejecución. En el
siguiente listado tenemos un programa ejemplo de la utilización de un semáforo binario.
El funcionamiento general de un semáforo es el siguiente: Sean n procesos en el vector
P(i), en cada proceso se ejecuta un wait(s) antes de la ejecución de la sección crítica. El primer
proceso que cambie el semáforo lo hará del valor 1 al valor 0, cerrando el paso, los demás
procesos que encuentren el semáforo cerrado (valor 0) se encontrarán en la cola de espera de
este semáforo. Una vez que el primer semáforo termine la sección crítica, ejecutará un signal(s)
que colocará el valor del semáforo en 1 y que habilitará para su ejecución al siguiente proceso
de la cola de espera del semáforo.
El algoritmo quedaría así:
2. No hace falta que un proceso libere su propio recurso, es decir, la operación signal() puede
que sea ejecutada por otro proceso.
3. Con simples semáforos no se puede imponer un orden en los procesos accediendo a dife-
rentes recursos.
3. Entre wait() y signal() el usuario puede realizar cualquier operación con el recurso.
2.4.6. Monitores
Los monitores son estructuras que implementa un lenguaje de programación y ofrece una
mayor funcionalidad que los semáforos pues son más fáciles de controlar. El concepto de moni-
tor fue definido por primera vez en Hoare mencionado por [33]. La estructura de monitor se ha
implementado en varios lenguajes de programación como: Pascal concurrente, Modula-2, Java,
y otros.
En concreto, para una lista enlazada se puede necesitar un cerrojo que bloquee todas las
listas enlazadas o bien un cerrojo por cada elemento de una lista. En la figura 2.3
3. En el monitor solo un proceso puede ser ejecutado en un momento dado; cualquier otro
proceso quedará suspendido esperando la disponibilidad del monitor.
Al ser un proceso por vez, el monitor puede ofrecer un servicio de exclusión mutua fácil-
mente. Así una estructura de datos puede protegerse situándola dentro de un monitor.
Los monitores deben ofrecer herramientas de sincronización. Por ejemplo: si un proceso
llama a un monitor y una vez dentro de él el proceso queda suspendido esperando alguna condi-
ción, hará falta un servicio que libere al monitor y lo deje disponible para el siguiente proceso.
Más tarde cuando la condición se cumpla, el proceso suspendido podrá regresar al monitor y
ejecutarse desde el momento de la suspensión.
El monitor proporciona variables de condición que son accesibles sólo desde dentro del
monitor.
Hay dos funciones para operar variables de condición:
cwait (c). Suspende la ejecución del proceso que llama bajo la condició+n ç". El monitor está
ahora disponible para otro proceso.
csignal (c). Retorna la ejecución de un proceso suspendido después de un cwait, bajo la misma
condición. Si hay varios procesos elige uno de ellos.
2. La planificación de procesos asociados con las señales debe ser muy fiable. Si un proceso
ejecuta un csignal(), el proceso de la cola de condición correspondiente debe activarse de
inmediato, antes de que ingrese otro proceso del exterior o cambie la condición bajo la
que se activó el proceso.
Lampson y Redell desarrollaron una definición de monitores para el lenguaje MESA [60].
La estructura de mesa reemplaza la primitiva csignal() por cnotify(). Cuando un proceso ejecuta
cnotify(x) envía una notificación a la cola de condición X, lo cual no significa que el proceso
que esta ocupando el monitor vaya a detenerse, simplemente el cnotify(x) avisa al proceso de la
cola de condición correspondiente de que será reanudado en un futuro cercano. Puesto que ésta
no garantiza que un proceso exterior entre al monitor, el proceso debe comprobar la condición
nuevamente.
En el código, la sentencia IF se reemplaza por un bucle While, lo cual genera una evaluación
extra de la variable, pero sin embargo no hay cambios de procesos extra.
Una modificación útil sería asociar un temporizador de guardia a cnotify() que permitiría
que un proceso que ha esperado durante el intervalo máximo sea situado en estado de listo,
independientemente de si se ha notificado la condición o no.
Con la norma de notificar a los procesos en lugar de reactivarlos, es posible añadir una primi-
tiva de difusión cbroadcast(). La difusión provoca que todos los procesos que están esperando
por una condición se coloquen en el estado de listo. Esto es útil cuando un proceso no sabe
cuantos procesos deben reactivarse.
El método Lampson/Redell es menos propenso a errores debido a que cada procedimiento
comprueba la condición luego de ser despertado, por medio de la instrucción while, un proceso
puede realizar una señal o una difusión incorrectamente sin provocar un error en el programa
que la recibe.
Además este modelo presenta un método más modular de construcción de programas.
Hay dos niveles de condición que deben satisfacerse para los procesos secuenciales coope-
rantes.
1. Estructura de datos consistentes: significa que el monitor hace cumplir la exclusión mutua
y concluye la operación de entrada o salida antes de permitir cualquier otra operación
sobre el búfer.
102 2.4. CONCURRENCIA Y SECUENCIABILIDAD
2. La misma condición del nivel 1 y, además disponer de suficiente memoria para que este
proceso pueda completar su solicitud de asignación.
Un monitor, a diferencia de un semáforo es una estructura que permite tener un control ma-
yor sobre los procesos que van a hacer uso de un recurso. Los sistemas operativos y los lenguajes
de programación proporcionan mecanismos muy similares para implementar las funcionalida-
des de semáforos y monitores. Por ejemplo Solaris pone a disposición del programador mútex
adaptativos, variables de condición, semáforos, bloqueos o cerrojos del tipo lector-escritor y co-
las de bloqueos. Solaris se apega a la estructura de monitor analizada en esta sección. Además,
Solaris uso ciclos infinitos para proteger el acceso a datos compartidos, solamente si el código
consta de algunos cientos instrucciones, de otra forma este mecanismo sería muy ineficiente.
Cuando el código se excede de este número de instrucciones entonces se usa un semáforo o
variables de condición. De esta forma si el hilo ya está ocupando el cerrojo, entrará en un ciclo
infinito y pasará al estado durmiente. Cuando se libere el cerrojo, el hilo que la ocupa ejecutará
una instrucción signal() dirigida al hilo siguiente en estado de espera, de modo que pueda pasar
a ejecución. Es más económico en términos de instrucciones de CPU, realizar un cambio de
contexto a estar ejecutando quizás miles de ciclos de espera en un ciclo infinito.
Windows XP al igual que en Solaris protege los bloques de datos mediante ciclos infinitos
en segmentos de código pequeños, pero por razones de eficiencia, el kernel no sacará un hilo
mientras mantenga un cerrojo que esté ejecutando un ciclo infinito. Para la sincronización de
hilos que no se ejecutan en el kernel Windows XP proporciona mútex, semáforos, sucesos y
temporizadores. El sistema protege los datos compartidos requiriendo que un hilo adquiera la
propiedad de un mútex para acceder a los datos y libere dicha propiedad cuando termine. Los
sucesos son similares a las variables de condición y los temporizadores se emplean para notificar
a uno o más hilos que ha transcurrido un determinado período de tiempo.
En Linux la sincronización se lleva a cabo mediante ciclos infinitos y semáforos usando
también versiones lector-escritor de éstos, de esta forma, se pueden establecer bloqueos en el
kernel. En una máquina de multiprocesadores, el mecanismo fundamental de bloqueo se basa en
ciclos infinitos y el kernel se diseña de modo que dicho tipo de bloqueo se mantenga sólo durante
períodos de tiempo cortos. En máquinas monoprocesador, los bloqueos mediante ciclos infinitos
no resultan apropiados y se reemplazan por un mecanismo de activación y desactivación de la
función de apropiación en el núcleo.
Las operaciones más comunes que proporcionan los sistemas operativos son enviar (send)
mensaje y recibir mensaje. Los aspectos de implementación más importantes acerca de los men-
sajes son:
Denominación directa. Es aquella que cuando se invoca una operación de mensaje, cada
emisor debe designar al receptor específico, y a la inversa, cada receptor debe designar una
fuente desde la cual desea recibir un mensaje. Por ejemplo
104 2.4. CONCURRENCIA Y SECUENCIABILIDAD
proceso A;
/*Mucho código de A*/
send(B, mensaje)
/*Más Código de A*/
fin
proceso B;
/*Mucho código de B*/
receive(A, mensaje)
/*Más Código de B*/
fin
donde mensaje es el mensaje que se ha transmitido desde A hacia B. A y B son las entida-
des que interactúan y que deben ser especificadas al momento de efectuar las correspondientes
llamadas. En este caso, si B se ejecuta antes, tendrá que esperar a que A envíe el mensaje. Si
A se ejecuta antes B tendrá que esperar a que B pueda recibir el mensaje. Esta forma de comu-
nicación es segura en el sentido de que los procesos saben exactamente a donde va y de donde
viene la información, pero bajo ciertos entornos no puede ser posible tener una lista de todos los
emisores y receptores.
Denominación indirecta. Los mensajes son enviados y recibidos a través de depósitos espe-
cializados dedicados para este propósito. A estos depósitos se les denomina buzones debido a su
modo de funcionamiento. Un ejemplo del uso de buzones puede verse en el siguiente listado:
proceso A;
/*Mucho código de A*/
send(buzón1, mensaje)
/*Más Código de A*/
fin
proceso B;
/*Mucho código de B*/
receive(buzón1, mensaje)
/*Más Código de B*/
fin
Observe que ahora que A no necesita que esté disponible B o viceversa. Si A se ejecuta antes
envía su mensaje al buzón y hasta que se ejecute B lo podrá recoger. Si B se ejecuta antes que A
tendrá que esperar a que llegue el mensaje al buzón revisándolo continuamente.
CAPÍTULO 2. ADMINISTRACIÓN DE PROCESOS Y DEL PROCESADOR 105
El sistema operativo tendrá que proporcionar las facilidades necesarias para poder hacer uso
de los buzones, tal como la de crear un nuevo buzón y la de eliminar un buzón.
La comunicación indirecta es muy versátil en el sentido de que puede proporcionar corres-
pondencias uno a uno o de uno muchos, de muchos a uno y de muchos a muchos entre los
procesos emisores y los receptores.
Copia. El intercambio de mensajes entre dos procesos, por definición, transfiere el contenido
del mensaje desde el espacio de direcciones del emisor al espacio de direcciones del receptor.
Esto se logra copiando todo el mensaje al espacio de direcciones del receptor o simplemente
pasando un apuntador al mensaje entre los dos procesos. En otras palabras, la transferencia
del mensaje puede ser por valor o por referencia. En sistemas distribuidos que no disponen de
memoria común, la copia es obviamente inevitable. En sistemas centralizados, el compromiso
está entre la seguridad y la eficiencia.
Como aspecto negativo, la copia de mensajes consume memoria y ciclos de CPU. La comu-
nicación asíncrona de mensajes y/o esquemas de protección de memoria pueden requerir que
cada mensaje sea copiado primero desde el espacio del emisor a un búfer en el sistema operativo
y desde ahí posteriormente al espacio de proceso del receptor. Esto significa que se hace una
doble copia para un solo mensaje. Aparte la estructura de datos dinámica que debe de manejar
el sistema operativo para la administración de los mensajes. Algunos diseñadores enfrentan este
problema proporcionando solamente un apuntador al espacio de direcciones del emisor, pero
este enfoque disminuye la seguridad al estar abriendo una ventana al proceso receptor con sus
consecuentes peligros.
Mach. enfrenta este problema al asignar una sola copia, tanto al emisor como al receptor,
siempre y cuando sólo la usen para lectura. En el momento en que alguno quiera realizar una
operación de escritura, se crea entonces una copia física se actualizan las tablas de direcciones
y entonces cada proceso continúa con una copia separada del mensaje.
sumensaje ha sido realmente recibido en el momento en que deja atrás la operación enviar. Una
desventaja de este método es la obligada operación síncrona de emisores y receptores, que puede
no ser deseable en algunos casos.
Con el intercambio asíncrono de mensajes, el emisor no queda bloqueado cuando no hay
un recibir pendiente. El enviar asíncrono, sin bloqueo, se implementa haciendo que el sistema
operativo acepte y almacene temporalmente los mensajes pendientes hasta que se emita el co-
rrespondiente recibir. De esta forma el emisor puede continuar su ejecución después de enviar
un mensaje y no necesita quedar suspendido, independientemente de la actividad de los recep-
tores. Este modo de operación de “depositar y olvidar” aumenta el grado de concurrencia del
sistema. Por ejemplo, un proceso que desee imprimir algo puede incluir simplemente los datos
en cuestión en un mensaje y enviarlo al proceso servidor de impresoras. Incluso si el servidor de
impresoras está ocupado en ese momento, el mensaje será almacenado en la cola por el sistema y
el emisor podrá continuar sin necesidad de esperar. Esta forma de operar también conlleva ries-
gos. Podemos notar que si se llega a tener un proceso que genere muchos mensajes sin sentido
puede llegar a llenar el almacenamiento temporal del sistema operativo, impidiendo así la co-
municación normal entre los demás procesos. Una forma de evitar este problema es imponiendo
un límite al número de mensajes que puede tener pendiente un proceso.
Un problema relacionado con el anterior se le llama aplazamiento indefinido. Este ocurre
cuando se envía un mensaje pero nunca se recibe debido, por ejemplo, a que el receptor ya no
está en el sistema, o cuando un receptor está esperando un mensaje que nunca se produce. Para
evitar este tipo de problemas se puede implementar a recibir sin bloqueo. De esta forma si el
mensaje se encuentra disponible, lo leerá, de otro modo, continuará con su ejecución normal y
después en otro momento volverá a intentar la lectura para ver si está disponible, evitando así el
bloqueo.
control para memoria dinámica, que puede conducir a problemas de fragmentación de memoria.
Aunque los mensajes son adecuados tanto para comunicación como para sincronización en-
tre procesos, analicemos primero el aspecto de la sincronización de sus operaciones con el fin
de establecer un punto de referencia con lo visto en el punto 2.4.7.1. Hay que observar que in-
tercambiar un mensaje vacío, sin datos entre dos procesos equivale a señalizar. Un proceso al
enviar un mensaje, transfiere una señal de temporización a otro proceso, el receptor. Por lo que
se refiere a la señalización, esto tiene el mismo efecto que si un proceso (el emisor) ejecuta una
operación signal() y el otro (el receptor) ejecuta un wait() sobre el mismo semáforo. En esta
analogía. la identidad del buzón corresponde con el nombre de la variable del semáforo.
Dado el poder de señalización del de los mensajes, la exclusión mutua puede lograrse si-
guiendo la lógica de una solución similar con semáforos. En el siguiente algoritmo se representa
el código de usuario que accede a un recurso compartido protegido por el buzón mútex. De
acuerdo con la lógica de los semáforos, cuando se crea un buzón está vacío, es decir, no contie-
ne mensajes. Esto es equivalente a los semáforos se inicialicen por el sistema en ocupado. Para
hacer que el recurso esté disponible para el primer solicitante, el proceso padre envía un mensaje
al buzón antes de iniciar los procesos usuarios del recurso. Puesto que este mensaje se utiliza
únicamente para fines de señalización, su contenido es irrelevante, y se supone que es un men-
saje nulo, vacío. Algún tiempo después, el primer proceso que desea utilizar el recurso invoca la
operación recibir sobre el buzón mútex. Esto ocasiona a que el mensaje nulo inicial sea retirado
del buzón y entregado al proceso a través del parámetro mensaje. Cuando ya recibió el mensaje,
el proceso es libre de continuar y entra a la sección crítica. Si cualquier otro proceso ejecuta
una instrucción recibir sobre el buzón mútex durante ese tiempo quedará suspendido debido a
que el buzón se encuentra vacío. Cuando el proceso completa su sección crítica, el propietario
devuelve un mensaje en mútex y continúa ejecutándose. Uno de los procesos suspendidos en
mútex, si los hay, recibe entonces el mensaje y por tanto, se ve capacitado para proseguir con su
sección crítica. Los restantes procesos es espera, en caso de que los haya, obtendrán sus turnos,
uno cada vez, cuando el mensaje sea devuelto por os procesos que abandonen su sección crítica.
Como se ve, este esquema es conceptualmente parecido al de los semáforos. Un solo mensa-
je circula a lo largo del sistema como testigo del permiso de utilización del recurso compartido.
puesto que sólo un proceso como máximo puede tener la propiedad del mensaje en cada ins-
tante, la exclusión mutua está asegurada. Esto, naturalmente, depende de la suposición de que
la operación recibir es indivisible en el sentido de entregar el mensaje, en caso de haberlo, a
un solo invocador cuando sea invocado concurrentemente por varios. Virtualmente todas las im-
108 2.4. CONCURRENCIA Y SECUENCIABILIDAD
plementaciones de mensajes proporciona este tipo de facilidad y se supone que esta propiedad
existe a lo largo del análisis efectuado en esta sección. Cuando se utilizan para señalización, el
mismo acto de recibir un mensaje logra el propósito deseado, y el contenido efectivo del mensaje
no importa. Después se verá que la verdadera potencia de los mensajes es cuando los procesos
transfieren datos al mismo tiempo, combinando así la comunicación y la sincronización entre
procesos dentro de una sola actividad.
En el algoritmo siguiente vemos cómo podría implementarse la protección de la sección
crítica con mensajes.
...
const int tamano;
typedef struct mensaje{
char elmensaje[tamano];
/*Otra información del mensaje*/
} Tmensaje;
int usuarioX(){
Tmensaje mensaje;
while (true) {
recibir(mútex, mensaje);
sección_critica(),
enviar(mútex, mensaje);
} /*fin while*/
} /*Fin usuarioX*/
El programa de la página 108 demuestra informalmente cómo se puede utilizar una facili-
dad de mensajes para implementar semáforos binarios. La implicación importante es que los
CAPÍTULO 2. ADMINISTRACIÓN DE PROCESOS Y DEL PROCESADOR 109
mensajes no son un mecanismo más débil que los semáforos. Los semáforos generales pueden
simularse aumentando el número de mensajes testigo en el sistema hasta que coincida con el
valor inicial de un semáforo general equivalente.
wait(disco2); procesar(disco1,impresora);
procesar(disco1,
disco2,
impresora); signal(impresora);
signal(disco1); signal(disco1);
signal(disco2);
signal(impresora); .....
.....
} }
Hasta ahora hemos hablado de los mecanismos para poder manejar la sección crítica evitando
que lleguen a acceder dos o más procesos al mismo tiempo y al mismo recurso. No obstante,
un mal uso, algunas omisiones e incluso algún código malicioso, pueden llegar a hacer que
los procesos queden esperando indefinidamente por un recurso que muchas de las veces está
desocupado, pero por los problemas anteriores parece que está siendo utilizado por otro proceso.
Un interbloqueo (también conocido como deadlock o abrazo mortal) es una situación donde
un conjunto de procesos están permanentemente bloqueados como consecuencia de que cada
proceso ha adquirido un subconjunto de los recursos necesarios para su operación y está espe-
rando la liberación de los recursos restantes mantenidos por otros del mismo grupo, haciendo
imposible que alguno de los procesos pueda continuar su ejecución.
Los interbloqueos pueden ocurrir en entornos concurrentes como resultado de la concesión
incontrolada de recursos del sistema a los procesos que hacen la petición.
Vamos a poner un ejemplo, considérese que un sistema contiene una impresora y dos uni-
dades de disco. Supóngase que dos procesos concurrentes efectúan las peticiones de recursos
indicadas en la página 109. La secuencia presentada supone que los recursos son solicitados
y devueltos al asignador de recursos por medio de las operaciones que ya conocemos wait() y
signal() sobre las variables de semáforo binario impresora y disco (general inicializado a dos),
respectivamente, Ahora suponemos que tenemos dos procesos concurrentes P1 y P2, se entrela-
zan de tal modo que en un cierto momento el proceso P1 tiene concedido el uso de la impresora
y P2 trata de conseguir una unidad de disco. En este caso, los dos procesos están interbloquea-
dos, ya que ninguno de ellos puede adquirir el conjunto de recursos que necesita para continuar
su ejecución y liberar los recursos que le han sido asignados.
Exclusión mutua. Los recursos compartidos son asignados y usados de modo mutuamente ex-
clusivo, esto es, por un proceso como máximo en cada instante.
Conservar y esperar. Cada proceso conserva los recursos que ya le han otorgado mientras es-
pera a adquirir los otros recursos que necesita.
No expropiación. Solamente el proceso puede regresar voluntariamente los recursos que le han
sido asignados. El sistema operativo no puede revocarlos.
Espera circular. Los procesos interbloqueados forman una cadena circular de modo que cada
proceso conserva uno o más recursos que son requeridos por el siguiente proceso de la
cadena.
1. Recursos reutilizables.
2. Recursos consumibles.
Los recursos reutilizables se caracterizan porque pueden ser utilizados con seguridad por un
proceso sólo cada vez como máximo. Tales recursos son normalmente asignados a un proceso
solicitante cuando están disponibles. Cuando son liberados explícitamente pos su propietario
temporal, un recurso reutilizable puede ser asignado al siguiente proceso solicitante, si es que
hay alguno. Los recursos hardware compartidos y las estructuras de datos globales estáticas y
a largo plazo pertenecen habitualmente a esta categoría. algunos ejemplos incluyen la memoria
principal, los buses de entrada salida, las unidades de disco y los búferes del sistema. por lo
común existe un número fijo de recursos reutilizables en el sistema. Pueden existir diferentes
instancias de un mismo tipo de recurso reutilizable, como las páginas de memoria o impresoras.
Si las unidades individuales de un tipo particular de recurso son indistinguibles en el sentido
de que cualquiera de ellas puede satisfacer una solicitud determinada, entonces tales unidades
no son tenidas en cuenta separadamente por lo que respecta a la detección de interbloqueos; el
sistema únicamente contabiliza el número total. En cada momento, cada recurso reutilizable está
o bien disponible, o bien temporalmente concedido a un proceso. La suposición más común es
que el propietario temporal de un recurso lo devolverá en un tiempo finito a menos que resulte
interbloqueado.
Los recursos consumibles, por ejemplo los mensajes, se producen y se consumen por pro-
cesos que se encuentran activos. Esto significa que el número de esos recursos puede variar a
medida que transcurre el tiempo. Una causa que es común de ocasionar un interbloqueo y que
afecta a los recursos consumibles es la espera de un evento, por ejemplo una señal o un mensaje,
que nunca van a llegar. Esto suele suceder por una sincronización inadecuada, un direcciona-
miento erróneo de los mensajes, el proceso encargado de generar la señal o el mensaje terminó
anormalmente o en última instancia a errores de programación.
CAPÍTULO 2. ADMINISTRACIÓN DE PROCESOS Y DEL PROCESADOR 113
Como se mencionó en la sección 2.4.9, el punto básico es evitar al menos una de las cuatro
condiciones necesarias para que se produzcan los interbloqueos. La exclusión mutua es gene-
ralmente difícil de evitar, por lo que es costumbre prevenir una o más de las tres condiciones
restantes.
Exclusión mutua Esta se aplica a los recursos que no pueden ser compartidos. Por ejemplo,
varios procesos no pueden compartir simultáneamente una impresora. Los recursos que sí pue-
den compartirse y por lo tanto, no pueden generar una situación de interbloqueo. Dentro de éstos
podemos poner como ejemplo un archivo de sólo lectura. Si varios procesos desean abrir un ar-
chivo en modo de sólo lectura entonces se les puede conceder a todos de forma simultánea. Así
un proceso no necesita esperar por un recurso compartible. No obstante, no se puede ignorar
la exclusión mutua diciendo que simplemente nunca va a suceder, por que varios recursos son
explícitamente no compartibles.
Solicitar todos los recursos. El proceso solicita de una sola vez todos los recursos antes de
entrar en su sección crítica. esto es, espera hasta que pueda recibir los recursos necesarios
antes de que pueda ejecutarse.
Petición incremental de recursos. El proceso pide los recursos uno a uno, pero si se niega
alguna petición de recurso y tiene recursos asignados entonces los libera.
Para solicitar los recursos al comienzo, un trabajo o proceso debe de indicar al sistema ope-
rativo todas sus necesidades de recursos. Esto implica que se debe de saber con anticipación
todos los recursos que va a ocupar el proceso y muchas veces, se sobreestima el número de
recursos que se usan dejando muchos de ellos inutilizados por largos períodos de tiempo. Por
ejemplo, esto puede pasar cuando se trabaja con una base de datos, en vez de solicitar un con-
junto de registros sobre los que se va a trabajar, puede solicitarse la base de datos completa con
la subsecuente pérdida de disponibilidad del recurso.
Cuando el sistema operativo asigna todos los recursos a un proceso, éstos quedan fuera
del alcance de los demás procesos durante todo el tiempo de vida del proceso propietario, en
contraposición con los realmente utilizados durante una parte de la ejecución del proceso en
114 2.4. CONCURRENCIA Y SECUENCIABILIDAD
cuestión. El problema es que algunos recursos son utilizados una pequeña parte del tiempo de
ejecución del proceso, por lo tanto pueden permanecer inactivos o sin ser utilizados por otros
procesos durante períodos de tiempo relativamente largos. Pero para garantizar la prevención
del interbloqueo no pueden ser asignados a otros procesos, aunque ya no los ocupe el proceso
propietario.
Cuando el proceso adquiere los recursos incrementalmente, según se vayan necesitando, y
evitar interbloqueos mediante la liberación de todos los recursos retenidos por un proceso si
solicita un recurso temporalmente inalcanzable. Esta estrategia evita las desventajas de solicitar
todos los recursos desde el comienzo del proceso. Sin embargo, las desventajas es que algunos
recursos no pueden ser liberados y readquiridos en tiempo posterior fácilmente. Por ejemplo
algunos cambios efectuados en memoria o sobre archivos pueden corromper el sistema si no
se llevan a cabo completamente. Así la reanudación de un recurso solo tiene sentido si no se
compromete la integridad del sistema y además cuando el gasto debido a las operaciones de
guardar y restablecer el estado del proceso por la reanudación es lo suficientemente pequeño.
Otro problema con este enfoque es que puede pasar un tiempo exageradamente largo debido
a que puede existir un recurso que sea ocupado continuamente y como el proceso, cada vez que
solicita todos los recursos, no lo encuentra disponible liberará nuevamente todos los ya adquiri-
dos generándose entonces un problema de inanición, esto es, el proceso nunca se ejecutará por
falta de uno o dos recursos.
Espera circular Para evitar esta condición un enfoque es ordenar linealmente los diferentes
tipos de recursos del sistema. Con este método, los recursos del sistema se dividen en clases di-
ferentes. Los interbloqueos se previenen exigiendo que todos los procesos soliciten y adquieran
sus recursos en orden estrictamente creciente de las clases de recursos de sistema especificados.
Además, la adquisición de todos los recursos pertenecientes a una clase deben efectuarse con
CAPÍTULO 2. ADMINISTRACIÓN DE PROCESOS Y DEL PROCESADOR 115
una sola petición y no incrementalmente. Esto quiere decir que si ya solicitó un recurso de una
clase colocada delante de un recurso de otra clase ya no podrá solicitar ninguno anterior. La
ordenación lineal elimina la posibilidad de espera circular, por que con este enfoque, ningún
proceso puede esperar un recurso que debió haber solicitado antes.
Una desventaja de este método es que los recursos deben ser adquiridos en el orden prescrito,
en vez de ser solicitados cuando realmente se ocupen. Esto puede hacer que algunos recursos
sean adquiridos con bastante antelación a su uso efectivo, bajando así el grado de concurrencia
de todo el sistema al impedir que otros procesos hagan uso de ese recurso cuando no se ocupa.
El principio básico para evitar interbloqueos es conceder únicamente las peticiones de recur-
sos disponibles que no puedan dar lugar a un estado de interbloqueo. La estrategia se implementa
haciendo que el asignador de recursos examine los efectos de la concesión de una petición par-
ticular. Se la concesión de un recurso no puede de ningún modo conducir a interbloqueo, se
concede el recurso al proceso solicitante. De otro modo, el proceso que lo solicita queda suspen-
dido hasta el momento en que su petición pendiente pueda ser concedida sin problemas. Esto
suele pasar después de que han sido liberados los recursos ocupados por otros procesos.
Esta estrategia requiere que todos los procesos especifiquen los recursos que van a usar. Una
vez que el el proceso comienza su ejecución, cada proceso solicita sus recursos como y cuando
los necesita, hasta el límite máximo solicitado. El planificador de recursos lleva la cuenta del
número de recursos que lleva asignados cada proceso y del número de recursos disponibles de
cada tipo, además de anotar el número de recursos restantes solicitados con anticipación pero
aún no requeridos por el proceso en ejecución. Si un proceso solicita un recurso que no esté
disponible tendrá entonces que esperar. En cambio, si está disponible, el planificador de recursos
examina si la concesión de la petición puede conducir a interbloqueo comprobando si cada uno
de los procesos ya activos puede terminar su ejecución sin problemas, en ese caso se asigna el
recurso al proceso.
Estado seguro Un estado es seguro si el sistema puede asignar recursos a cada proceso (hasta
su máximo) en determinado orden sin que eso produzca un interbloqueo. Más formalmente, un
sistema se encuentra en estado seguro sólo si existe lo que se denomina secuencia segura. Una
secuencia de procesos < P1 , P2 , ..., Pn > es una secuencia segura para el estado de asignación
actual si, para cada Pi , las solicitudes de recursos que PI pueda todavía hacer se pueden satisfa-
cer mediante los los recursos que se disponen actualmente, junto con los recursos retenidos por
todos los Pj , con j < i. Bajo esta situación, si los recursos que Pi necesita no están inmediata-
116 2.4. CONCURRENCIA Y SECUENCIABILIDAD
mente disponibles, entonces Pi puede esperar a que todos los Pj hayan terminado, cuando esto
suceda, Pi puede obtener los recursos faltantes para que pueda terminar su tarea asignada, y de-
volver entonces todos los recursos que solicitó y terminar su ejecución. Cuando Pi termina Pi+1
puede obtener los recursos que necesita y continuar de esta forma para los demás procesos. Si tal
secuencia no existe, entonces se dice que el estado actual del sistema es no seguro o inseguro y
por lo tanto existe un riesgo potencial de interbloqueo, y viceversa un estado seguro implica que
no puede producirse un interbloqueo. Hay que aclarar, que no obstante, un estado inseguro no
implica que habrá interbloqueo, como se dice existe un riesgo potencial. Pero un estado seguro
no podrá llevar nunca a un interbloqueo. Como ejemplo supongamos que se tiene un sistema de
arreglos de discos con 12 unidades en total y tenemos a su vez tres procesos P0 , P1 , P2 , el pro-
ceso P0 requiere para trabajar diez unidades, el proceso P1 puede necesitar como mucho cuatro
unidades, y el proceso P2 puede necesitar hasta nueve. Ahora suponemos que en el instante t0 el
proceso P0 tiene asignadas cinco unidades, el proceso P1 está usando dos unidades y el proceso
P2 tiene dos unidades. Esto significa que quedan tres unidades libres.
recurso correspondiente hasta el nodo proceso asociado. De este modo en la figura 2.4 el proceso
P1 tiene la prioridad de la impresora. Una petición de un recurso se representa mediante un arco
que va desde el nodo proceso solicitante hasta el nodo recurso solicitado. Por ejemplo en la
figura 2.4 se ha representado la petición que hace el proceso P2 de la unidad de disco.
El planificador de recursos puede entonces determinar si es segura o no la concesión de un
recurso utilizando variantes de la representación del grafo general de recursos. Una de estas
representaciones es mediante una matriz bidimensional en donde los procesos son las filas y los
tipos de recursos las columnas. Siguiendo esta línea, los elementos de la matriz corresponden
con los arcos individuales. Llamemos ahora a esta matriz asignados, y supóngase que cada
elemento aij indica el número de unidades de tipo j retenidas por el proceso i. En la tabla 2.1a
podemos ver ver un ejemplo de recursos asignados. En este caso, el proceso P1 tiene asignado
el recurso R1, para el sistema representado en la figura 2.4.
el número de recursos de cada tipo disponibles para asignación en un momento determinado
puede representarse por un vector fila de enteros disponibles, que se observan en la tabla 2.1b.
Las relaciones de recursos de recursos no utilizados pueden representarse por medio de una
matriz reclamados, semejante a la matriz asignados. Los elementos de esta matriz se pueden
calcular mediante la diferencia entre el número máximo de recursos de un tipo determinado
solicitado con anticipación por el proceso correspondiente y el número de recursos del mismo
tipo actualmente en propiedad de ese proceso. En la tabla 2.1b tenemos un ejemplo de la matriz
asignados antes de que sea concedida la petición de una unidad de disco solicitada por el proceso
P2.
La parte más importante para evitar interbloqueos es la prueba de seguridad. Podemos decir
que un estado es seguro si todos los procesos que ya tienen concedidos sus recursos tienen la
oportunidad de terminar su ejecución en algún orden determinado incluso si cada uno de estos
procesos utilizase todos los recursos a los que tiene derecho. De acuerdo a lo anterior, una prueba
de seguridad práctica debe determinar si existe tal ordenación.
Ahora ya podemos definir una operación menor que o igual sobre los vectores, C y A,
de idéntico tamaño r como C ≤ A si y solo si C[i] ≤ A[i] para todo i = 1, 2, ..., r. Con estas
definiciones podemos ahora definir la operación del planificador de recursos cuando recibe una
petición de un proceso.
Petición de recurso.
1. Para cada petición de recurso, verificar que el proceso que la realiza está autorizado a
realizar la petición, esto es, ha solicitado con anterioridad este recurso. No se deben de
autorizar peticiones que no hayan sido expresadas con anterioridad.
CAPÍTULO 2. ADMINISTRACIÓN DE PROCESOS Y DEL PROCESADOR 119
R1 R2 R1 R2
R1 R2
P1 1 0 P1 0 2
0 2
P2 0 0 P2 1 1
Asignados Reclamados Disponibles
a) Antes de la asignación
R1 R2 R1 R2
R1 R2
P1 1 0 P1 0 2
0 1
P2 0 1 P2 1 0
Asignados Reclamados Disponibles
b) Después de la asignación
2. Si un proceso solicita un recurso que no esté disponible, entonces éste será suspendido
hasta que pueda ser asignado cuando haya liberado y pueda ser asignado con seguridad.
5. Si todos los procesos ya están marcados, el estado del sistema es seguro; por lo tanto, se
concede el recurso solicitado, se restaura el vector disponibles a su valor establecido en el
paso 2 y salir al sistema operativo. En caso contrario, el estado del sistema no es seguro
y por lo tanto se debe suspender el proceso solicitante, restaurar Xasignados, reclama-
dos y disponibles a sus valores anteriores a la ejecución del paso 2 y regresar al sistema
operativo.
Como se ha visto, el evitar los interbloqueos no requiere la adquisición de todos los recursos
de una vez, ni tampoco necesita la expropiación de recursos. Los recursos son solicitados como
y cuando se necesitan. Esto elimina el problema de la inactividad de los recursos debido a
un adquisición prematura, que aparece con frecuencia en otras estrategias de prevención de
interbloqueos. Una de sus desventajas, de evitar los interbloqueos requiere que los procesos
soliciten previamente sus recursos e impone recargos de almacenamiento y tiempo de cómputo
para detectar los estados inseguros del sistema.
La estrategia de evitar interbloqueos tiende a ser conservadora y por lo tanto, reduce la
concurrencia en los sistemas donde se utiliza y puede posponer innecesariamente la asignación
de recursos disponibles a procesos que los solicitan.
Varios sistemas operativos, en vez de sacrificar el rendimiento previniendo o evitando los in-
terbloqueos, conceden libremente los recursos disponibles a los procesos solicitantes y comprue-
ban ocasionalmente el sistema para determinar si existen interbloqueos con el fin de reclamar
los recursos retenidos por los procesos involucrados, si es que existen.
Se ha demostrado que la existencia de un ciclo (o un circuito) en un grafo general de re-
cursos es una condición necesaria para la existencia de interbloqueo. La existencia de un ciclo
del cual ninguno de los nodos que lo forman sale un camino que no sea ciclo, es condición
suficiente para la existencia de interbloqueos en un grafo general de recursos. De este modo la
existencia de interbloqueos puede determinarse mediante el uso de algoritmos muy conocidos
para la determinación de ciclos en grafos. El método más común es intentar reducir el grafo
general de recursos suprimiendo todas las retenciones y peticiones de cada proceso cuyas soli-
citudes puedan ser concedidas, hasta que se efectúen todas las reducciones posibles. Si el grafo
queda completamente reducido (no quedan arcos) después de esta operación, el estado del siste-
ma no presenta interbloqueos. En otro caso, existirán procesos o (nodos con arcos) que son los
involucrados en el interbloqueo.
Cuando un algoritmo de detección determina que existe un interbloqueo, se tienen varias
alternativas. Una de ellas es informar al operador que se ha producido un interbloqueo y dejar
que lo trate manualmente. Otra posibilidad es dejar que sea el sistema el que haga la recuperación
del interbloqueo de forma automática. Existen dos opciones para romper un interbloqueo. Una
de ellas consiste en interrumpir uno o más de los procesos bloqueados.
Interrumpir todos los procesos bloqueados. Este método interrumpirá todos los procesos in-
volucrados en el interbloqueo, pero el costo será muy alto. Es posible que varios procesos
hayan invertido ya mucho tiempo de ejecución y hecho cálculos que deben reiniciarse
después de que se ponga en marcha nuevamente el proceso.
Interrumpir un proceso por vez. Este método requiere una gran cantidad de trabajo extra, por
que después de haber interrumpido un proceso, es necesario llamar al algoritmo de detec-
ción de interbloqueos.
Este método, en general no toma en cuenta los potenciales daños que pueden ocasionarse al
sistema de archivos por una actualización incorrecta o a la pérdida de consistencia en los datos
por una actualización no llevada a término adecuadamente. Decidir qué proceso debe eliminarse
no es una cuestión sencilla. Es común establecer una métrica desde un punto de vista de coste
mínimo, no obstante ser algo difícil de precisar. Dentro de los factores que se consideran pueden
ser:
1. La prioridad del proceso.
Apropiación de recursos Con este método el sistema operativo va quitando recursos a los
procesos y asignándolos a otros hasta que se interrumpa el interbloqueo. Para llevar a cabo esta
estrategia es necesario tomar en cuenta lo siguiente.
1. Selección de un proceso a eliminar. El sistema debe seleccionar un proceso con un re-
curso determinado que ayude a eliminar el interbloqueo.
2. Anulación. ¿Qué debe hacerse con el proceso al que se le expropió el recurso? Este pro-
ceso debe suspenderse y colocarlo en un estado tal que pueda reanudar sus operaciones
cuando las condiciones lo permitan.
Una planificación adecuada de la CPU depende de una propiedad observada de los procesos:
la ejecución de un proceso consta de un ciclo de ejecución en la CPU, seguido de una espera de
entrada/salida; los procesos alternan entre estos dos estados. La ejecución del proceso comienza
con una ráfaga de CPU. Esta va seguida de una ráfaga de entrada/salida, a la cual sigue otra
ráfaga de CPU, luego otra ráfaga de entrada/salida. la ráfaga final de la CPU concluye con una
solicitud al sistema para terminar la ejecución.
La duración de las ráfagas de CPU se ha medido exhaustivamente en la práctica. Aunque
varían enormemente de un proceso a otro y de una computadora a otra, tienden a presentar
una curva de frecuencia que es de tipo exponencial o hiperexponencial, con un gran número de
ráfagas de CPU cortas y un número menor de ráfagas de CPU largas. Normalmente, un programa
limitado por la entrada/salida presenta muchas ráfagas de CPU cortas. Esta distribución puede
ser importante en la selección de un algoritmo apropiado para la planificación de la CPU.
El sistema operativo debe de decidir qué proceso es el que entrará a la CPU en cualquiera de
los siguientes casos:
En las opciones 1 y 4 sólo hay una opción en términos de planificación que es la de selec-
cionar un nuevo proceso para su ejecución. En las opciones 2 y 3 existe la opción de planificar
un nuevo proceso o no.
Cuando las decisiones de planificación tienen lugar en las circunstancias 1 y 4, se dice que
el esquema de planificación es no apropiativo. Esto es, el sistema operativo no podrá obtener la
CPU a menos que el proceso la entregue voluntariamente. En el esquema apropiativo el sistema
operativo obtendrá el control de la CPU en el momento que considere necesario. En Microsoft
windows 3.x se usaba un esquema no apropiativo, mientras que en windows 95 se cambió por
un esquema apropiativo y actualmente la mayoría de los sistemas operativos comerciales usan
un esquema apropiativo.
Utilización de CPU. La CPU debe de estar ocupada el mayor tiempo posible haciendo
tareas útiles. Es común medir su ocupación en términos de porcentajes. esto es, en un
sistema real la utilización de la CPU debe variar entre un 40 por ciento para un sistema
desahogado y un 90 por ciento para un sistema cargado. Ir abajo de este límite indica
que la CPU está siendo desaprovechada y arriba del 90 por ciento indica que no se está
excediendo la capacidad de respuesta del sistema.
En procesos que se ejecutan rápido esta tasa puede hasta de diez o más procesos por se-
gundo.
El planificador de largo plazo actúa como una válvula de admisión de primer nivel para mante-
ner la utilización de recursos al nivel deseado. Por ejemplo, cuando la utilización del procesador
es baja, el planificador puede admitir más trabajos para incrementar el número de procesos que
se hallen en la cola de preparados, y con ello la probabilidad de disponer de alguna operación
útil que espere asignación de procesador. En caso contrario, si se observa que el procesador está
en un porcentaje alto de utilización entonces el planificador puede decidir bajar el número de
procesos seleccionados para ejecución, de modo que el procesador pueda responder mejor a to-
dos los trabajos que se están ejecutando. El planificador a largo plazo es generalmente mandado
a traer cuando un proceso finaliza su ejecución.
Cuando un proceso se ha ejecutado durante algún tiempo, puede resultar que debe suspen-
derse debido a una solicitud de entrada/salida o al emitir una llamada al sistema. Dado que los
procesos suspendidos no pueden progresar hacia su terminación hasta que se elimine la condi-
ción de suspensión, en ocasiones es conveniente retirarlos de memoria principal de modo que
el sistema pueda acomodar otros procesos que estén listos para ejecutarse. Cuando una serie de
estos procesos resultan estar en el estado de suspendidos y todos ellos permanecen en memoria
llegará el momento en que el sistema operativo no tendrá opción para elegir un proceso para
ejecución sabiendo, obviamente que están suspendidos esperando una señal de terminación de
operación de entrada/salida, lo que ocasionaría una degradación significativa del tiempo de res-
puesta del sistema frente a otros procesos que sí pueden ejecutarse. cuando un proceso se lleva
desde memoria principal hasta la memoria secundaria, se dice que el sistema tiene soporte de
memoria virtual. A esta operación se le denomina intercambio y al proceso que se eliminó de
memoria se le denomina retirado. El planificador a medio plazo tiene la misión de manejar los
procesos retirados, y tiene poco que hacer mientras un proceso permanezca suspendido. Cuando
desaparece la condición de suspensión, el planificador a medio plazo intenta asignarle la canti-
dad necesaria de memoria principal, de modo que pueda incorporarse a la memoria principal y
dejarlo en el estado de preparado. La información que necesita para trabajar este planificador es
la cantidad de memoria que usa el proceso al regresar a la memoria y la cantidad de memoria
que ocupan los procesos suspendidos, lo que en la práctica no es difícil de implementar.
En general cada vez que sucede uno de estos eventos el sistema operativo invoca al plani-
ficador a corto plazo para determinar si debería planificarse otro proceso para su ejecución. La
mayoría de las tareas de administración de procesos analizados en la sección 2.1 requieren que
se mande a llamar al planificador a corto plazo como parte de su procesamiento.
Los programas interactivos suelen entrar a la cola de preparados directamente después de
ser remitidos al sistema operativo, lo que ocasiona la creación del proceso correspondiente. A
diferencia de los trabajos por lotes, el flujo de programas interactivos no está limitado, y puede
supuestamente saturar el sistema.
La figura 2.5 ilustra objetivamente los papeles y la interacción entre los diferentes tipos de
planificadores en un sistema operativo. Muestra el caso más general en donde están presentes
los tres tipos. Es claro que de todos los planificadores pueden convivir en un sistema operativo
grande y que puede dar soporte a una gran empresa, pero en un sistema operativo pequeño
y posiblemente de uso personal puede que solamente tenga un planificador a corto plazo. El
planificador a mediano plazo lo podemos encontrar en sistemas operativos que tienen soporte
de memoria virtual para poder hacer el intercambio de procesos a disco. En la actualidad la
mayoría de los sistemas operativos comerciales usan algún tipo de memoria virtual, por ejemplo,
los sistemas operativos basados en UNIX/Linux usan un área de intercambio que está definida
desde el momento de la instalación del sistema operativo. Es un área llamada swap y los usuarios
128 2.6. TÉCNICAS DE ADMINISTRACIÓN DEL PLANIFICADOR
no tienen derecho a escribir en ella. Los basados en windows XX, XP o vista normalmente
toman parte de la capacidad del disco no usada por el usuario como área de intercambio, por
lo que se debe tener cuidado de dejar siempre varios megabytes (por lo común el doble de
memoria principal) para que el sistema operativo pueda funcionar sin problemas. No obstante
el usuario puede guardar información en todo el disco duro, de esa forma la memoria virtual
va disminuyendo hasta que sea incapaz de trabajar normalmente, siendo un error oscuro por
resolver, debido a que el usuario determinará que es el sistema operativo el que está funcionando
mal, no obstante, como se comentó, el problema se soluciona dejando libres varios megabytes
para que el sistema operativo lo use como memoria virtual.
productividad del sistema puede ser bastante baja. Como no existe discriminación en base al
servicio solicitado, los trabajos cortos pueden sufrir retrasos considerables en los tiempos de
retorno y de espera cuando hay uno o más trabajos largos en el sistema. Por esta razón, el
tiempo medio de espera con el algoritmo FIFO es frecuentemente muy grande.Vamos a suponer
que el siguiente conjunto de procesos llega en el instante 0, estando la duración de la ráfaga de
la CPU especificada en milisegundos:
Como puede observarse, hay una drástica reducción del tiempo medio de espera, pero no
es generalmente el mínimo y puede variar significativamente si la duración de las ráfagas de
CPU de los procesos es muy variable. Depende mucho de la duración de los procesos y puede
130 2.6. TÉCNICAS DE ADMINISTRACIÓN DEL PLANIFICADOR
llegarse el momento en que haya tantos procesos de corta duración esperando a que termine
uno de larga duración, lo que ocasiona una utilización menor de la CPU y de los dispositivos
de entrada/salida que la que se conseguiría si se permitiera a los procesos más cortos ejecutarse
primero.
En el caso de que el proceso en ejecución ceda el control al sistema operativo antes de acabar
su tiempo asignado, se declara un suceso significativo y se planifica la ejecución de otro proceso.
De esta manera, el tiempo del procesador es asignado efectivamente a procesos en ase a una
prioridad rotatoria y cada uno de ellos recibe aproximadamente 1/N de tiempo del procesador
en donde N es el número de procesos preparados.
CAPÍTULO 2. ADMINISTRACIÓN DE PROCESOS Y DEL PROCESADOR 131
La planificación por reparto del tiempo logra una compartición equitativa de los recursos
del sistema. Los procesos cortos pueden ser ejecutados dentro de una única cuota de tiempo
y por tanto exhiben buenos tiempos de respuesta. Los procesos largos pueden requerir varias
cuotas y por tanto, ser forzados a circular a través de la cola de preparados unas cuantas veces
antes de terminar. con la planificación RR, el tiempo de respuesta de los procesos largos que
constan de una serie de secuencias interactivas con el usuario, lo que importa principalmente es
el tiempo de respuesta entre dos interacciones consecutivas. Si las necesidades computacionales
entre dos de tales secuencias pueden completarse dentro de una sola cuota de tiempo, el usuario
debería experimentar un buen tiempo de respuesta. RR tiende a someter a los procesos largos sin
secuencias interactivas a tiempos de espera y de retorno relativamente largos. Sin embargo, tales
procesos pueden ser mejor ejecutados en modo lote, y podría ser incluso deseable desaconsejar
a los usuarios que los remitan al planificador interactivo.
La implementación de la planificación por reparto de tiempo requiere el soporte de un tem-
porizador de intervalos -preferiblemente uno dedicado, en lugar de compartir la base de tiempos
del sistema-. El temporizador se programa generalmene para que interrumpa al sistema operati-
vo cada vez que expire una cuota de tiempo forzando así la invocación del planificador. El propio
planificador almacena simplemente el contexto del proceso en ejecución, lo translada al final de
cola de preparados y despacha el proceso que se encuentre a la cabeza de la cola de preparados
El planificador también es invocado para despachar un nuevo proceso cada vez que el proceso
en ejecución cede el control al sistema operativo antes de que expire su cuota de tiempo, por
ejemplo, cuando el procesos se suspende debido a una solicitud de entrada/salida. El temporiza-
dor de intervalos es generalmente reinicializado en ese momento, con el fin de proporcionar un
intervalos de tiempo completo al nuevo proceso en ejecución. La frecuente inicialización y re-
inicialización de un temporizador de intervalos dedicado hace deseable la existencia de soporte
de hardware en sistemas que utilizan cuotas de tiempo.
El rendimiento de la planificación por reparto del tiempo es muy sensible a la elección de
la cuota del tiempo. Por esta razón, la duración de la cuota de tiempo suele ser modificable por
el usuario durante la compilación o instalación del sistema operativo, aunque en los sistemas
operativos actuales esta tarea se deja solamente a usuarios administradores avanzados.
La relación entre la cuota de tiempo y el rendimiento es pronunciadamente no lineal. La re-
ducción de la cuota no debería ser llevada demasiado lejos tratando de alcanzar mejores tiempos
de respuesta. Una cuota demasiado corta puede dar lugar a significativos recargos debido a las
frecuentes interrupciones del temporizador y consiguientes cambios de contexto de los procesos
involucrados. Por ejemplo, una cuota de dos milisegundos en un sistema donde una conmuta-
ción de proceso tarda quinientos microsegundos supone un recargo del veinticinco por ciento.
Por otra parte, una cuota de tiempo demasiado larga reduce el recargo por expropiación pero
132 2.6. TÉCNICAS DE ADMINISTRACIÓN DEL PLANIFICADOR
aumenta el tiempo de respuesta. Por ejemplo, una cuota de 100 milisegundos en un sistema con
50 usuarios activos implica un molesto tiempo de respuesta de 5 segundos. En el extremo, una
cuota muy larga transforma un planificador RR en un planificador FIFO.
En resumen, la planificación por reparto del tiempo se utiliza principalmente en sistemas
multiusuario de tiempo compartido en donde es importante el tiempo de respuesta de terminal.
La planificación por reparto de tiempo penaliza generalmente a los trabajos largos no inter-
activos y depende de la elección juiciosa de la cuota de tiempo para obtener un rendimiento
adecuado. La duración de una cuota de tiempo es un parámetro ajustable del sistema que puede
ser modificado durante la compilación o instalación del sistema operativo.
Usando SJF, los procesos quedarían como se muestra en la figura 2.9. Para el proceso P4 el
tiempo de espera es de 0 milisegundos. El tiempo de espera es de 7 milisegundos para el proceso
P3 , para el proceso P2 es de 15 milisegundos y para el proceso P1 es de 24 milisegundos. Por lo
tanto, el tiempo medio de espera es de (0 + 7 + 15 + 24)/4 = 15,3 milisegundos. Si se usara el
esquema de planificación FIFO el tiempo promedio de espera sería (0 + 11 + 19 + 28)/4 = 19,3
milisegundos.
El algoritmo de planificación es probablemente óptimo, en el sentido de que proporciona
el tiempo medio de espera mínimo para un conjunto de procesos dado. Anteponer un proceso
corto a uno largo disminuye el tiempo de espera del proceso corto en mayor medida de lo
que incrementa el tiempo el tiempo de espera del proceso largo. Por lo tanto, el tiempo medio
de espera disminuye. El principal problema de la estrategia SJF es conocer la duración de la
siguiente solicitud de CPU. En una planificación a largo plazo de trabajos en un sistema de
CAPÍTULO 2. ADMINISTRACIÓN DE PROCESOS Y DEL PROCESADOR 133
Figura 2.9: Organización para ejecutar los cuatro procesos con SJF
procesamiento por lotes, podemos usar como duración el límite de tiempo del proceso que el
usuario especifique en el momento de enviar el trabajo. Con este mecanismo, los usuarios están
motivados para estimar el límite de tiempo del proceso en forma precisa, dado que el valor
menor puede significar una respuesta más rápida.
Aunque el algoritmo SJF es óptimo , no puede implementarse en el nivel de la planificación
de la CPU a corto plazo, ya que no hay manera de conocer la duración de la siguiente ráfaga de
la CPU directamente. No obstante, se puede predecir su valor por el método de confiar en que
la siguiente ráfaga de CPU será similar en duración a las anteriores. De este modo, calculando
una aproximación de la duración de la siguiente ráfaga de CPU, se puede tomar el proceso que
tenga la ráfaga de CPU predicha más corta.
Brinch Hansen desarrolló la estrategia de prioridad a la tasa de respuesta más alta (HNR,
highest-response-ratio-next) que corrige algunas deficiencias de SJF, particularmente el retraso
excesivo de trabajos largos y el favoritismo excesivo para los trabajos cortos. HRN es un disci-
plina de planificación no apropiativa en la cual la prioridad de cada proceso no sólo se calcula
en función del tiempo de servicio, sino también del tiempo que ha esperado para ser atendido.
Cuando un trabajo obtiene el procesador, se ejecuta hasta terminar. Las prioridades dinámicas
en HNR se calculan de acuerdo con la siguiente expresión:
prioridad = (tiempo de espera + tiempo de servicio)/tiempo de servicio
Como el tiempo de servicio aparece en el denominador, los procesos cortos tendrán prefe-
rencia. Pero como el tiempo de espera aparece en el numerador, los procesos largos que han
esperado también tendrán un trato favorable. Obsérvese que la suma tiempo de espera mas el
CAPÍTULO 2. ADMINISTRACIÓN DE PROCESOS Y DEL PROCESADOR 135
tiempo de servicio es el tiempo de respuesta del sistema para el proceso si éste se inicia de
inmediato.
2.6.2. Multiprocesamiento
El objetivo principal de los desarrolladores de hardware de procesadores es el incremento
de velocidad de proceso. La velocidad de proceso puede incrementarse básicamente de dos
maneras:
Incremento de la velocidad de reloj. Incrementando el número de ciclos del reloj del proce-
sador, es posible también incrementar la velocidad de ejecución de las microinstrucciones
y por ende también las instrucciones máquina. No obstante, el principal problema es que
a mayor velocidad de reloj se produce un calentamiento mayor de los circuitos y se incre-
menta también la posibilidad de interferencias. Deben de resolverse estos problemas antes
de pensar en un incremento de velocidad de reloj.
2.6.3.1. multiprocesador
Se define como una computadora que contiene dos o más unidades de procesamiento que tra-
bajan sobre una memoria común bajo un sistema operativo que proporciona control integrado.
Si el sistema de multiprocesamiento posee procesadores de las mismas características, habla-
mos entonces de multiprocesamiento simétrico; de otra forma se habla de multiprocesamiento
asimétrico.
Si un procesador falla, los restantes continúan operando, lo cual no es automático y requiere
de un diseño cuidadoso. Un procesador que falla habrá de informarlo a los demás de alguna
136 2.6. TÉCNICAS DE ADMINISTRACIÓN DEL PLANIFICADOR
manera, para que se hagan cargo de su trabajo . Los procesadores en funcionamiento deben
poder detectar el fallo de un procesador determinado. El Sistema Operativo debe percibir que
ha fallado un procesador y ya no podrá asignarlo y también debe ajustar sus estrategias de
asignación de recursos para evitar la sobrecarga del sistema que está degradado.
El multiprocesamiento puede proporcionar las siguientes ventajas:
2.6.4. Paralelismo
El paralelismo consiste en ejecutar más instrucciones en una misma unidad de tiempo, aun-
que las instrucciones sigan tardando lo mismo en ejecutarse. Estas instrucciones le dicen al
procesador cómo tiene que ir modificando diferentes posiciones de memoria, y le indican el flu-
jo de ejecución. Se tiende a pensar, que un procesador con un reloj a 400 MHz (400 millones de
ciclos por segundo) ejecuta 400 millones de estas operaciones por segundo. Por lo común una
instrucción no se ejecuta en un ciclo de reloj, salvo algunas instrucciones sencillas como la ins-
trucción INC sobre un registro interno. La mayoría de las instrucciones tardan en promedio de
5 a 15 ciclos, llegando algunas a necesitar 50 o más ciclos para completarse, como por ejemplo
aquellas instrucciones que llevan a cabo operaciones con números reales de doble precisión o
aquellas instrucciones utilizadas en el manejo de vídeo, por ejemplo en juegos.
De esta forma es como algunos procesadores muy paralelizados logran ejecutar, en prome-
dio, más de una instrucción por ciclo de reloj, aunque estas instrucciones tarden, por sí mismas,
más de un ciclo en ejecutarse. En la realidad, no todo es sencillo y existen muchos problemas
al diseñar un procesador con paralelismo. Por citar algunos de los problemas más comunes, hay
veces que una instrucción no se puede ejecutar ya que requiere un dato que quizás calculaba la
operación anterior (cosa muy habitual). Claro, si ante este problema detuviéramos la anterior
instrucción, bloquearía el procesador y se acabaría el paralelismo hasta que acabara la primera
instrucción y con ella se pudiera reanudar la segunda. Para evitar estos problemas se recurre a
cortocircuitos, o lo que es lo mismo, se comunican diferentes fases del microprocesador inter-
namente para pasarse antes los datos. Esto, sin embargo, también nos da otros problemas, ya
mucho más complicados, como el encontrarnos con que hay que decidir que datos son los co-
rrectos en cada momento. Estos problemas se pueden resumir en que el procesador ha de decidir
como paralelizar las instrucciones.
En el paralelismo por software ya no es el procesador el que decide cómo paralelizar las ins-
trucciones, sino que es el compilador del software es el que decide qué conjunto de instrucciones
puedeejecutar el procesador paralelamente.
Se define paralelismo en software como la ejecución de un programa sin tomar en cuenta
al hardware con que va ser ejecutado. El paralelismo en software es considerado como el caso
CAPÍTULO 2. ADMINISTRACIÓN DE PROCESOS Y DEL PROCESADOR 139
ideal de la ejecución de las instrucciones que forman parte de un programa, ya que no toma en
cuenta las limitantes del hardware con que el mismo va ser ejecutado.
El paralelismo en Software representa el caso ideal con que dicho programa puede ser eje-
cutado. Por otro lado podemos observar las limitantes que genera la ejecución de este mismo
programa con un hardware en particular (procesador Superescalar con capacidad de ejecutar
un acceso a la memoria y una operación aritmética simultáneamente) obteniendo 6 ciclos de
maquina para ejecutar el programa. Tomando como base este ejemplo, la ejecución paralela de
las instrucciones de un programa se mide mediante el parámetro conocido como Promedio de
Ejecución Paralela de instrucciones (PEP). Este parámetro está definido como la relación entre
el número de instrucciones del programa y el número de ciclos de máquina realizados en su
ejecución. Su expresión matemática es: PEP = No. de Instrucciones / No. de Ciclos de Máquina.
Por consiguiente, el promedio de ejecución paralela de instrucciones en software para este
ejemplo es: 8/3 = 2,667 y el promedio de ejecución paralela de instrucciones en hardware es:
8/6 = 1,333.
El desarrollo de hardware y software es un proceso integral que busca soluciones que permi-
tan satisfacer cada vez más las condiciones de paralelismo con el fin de incrementar el promedio
de ejecución paralela de instrucciones. Para lograr este objetivo es necesario detectar y resolver
las dependencias entre instrucciones. El proceso de detección y resolución de dependencias entre
instrucciones se conoce como el proceso de planificación de instrucciones. Cuando la planifica-
ción de instrucciones es llevada a cabo únicamente por el compilador se dice que la planificación
de instrucciones es estática. Y cuando la planificación de instrucciones es llevada a cabo única-
mente por hardware, se dice que la planificación de instrucciones es dinámica. La planificación
de instrucciones en los microprocesadores súper escalares es un proceso de planificación de
instrucciones estático y dinámico.
Las técnicas estáticas de planificación de instrucciones están compuestas por tres grupos:
planificación de instrucciones global. Planifica todas las instrucciones que forman parte de un
programa.
140 2.6. TÉCNICAS DE ADMINISTRACIÓN DEL PLANIFICADOR
Sólo pueden emplearse uno, dos, cuatro o más procesadores de distintos tipos en una placa
si todos ellos están diseñados para el procesamiento dual o multiprocesamiento. Además los re-
querimientos de disipación de calor o de refrigeración aumentan con el número de procesadores.
Intel ha presentado una nueva tecnología llamada HyperThreading Pentium 4 a partir de 3,06
GHz y el Xeon a partir de 2,4 GHz. El HyperThreading consiste en que dentro del procesador
se tienen dos procesadores lógicos. Algunos sistemas operativos pueden ejecutarse más rápido
así como algunas aplicaciones de software. No obstante, el incremento de velocidad no es tan
elevado como en el caso de un sistema dual con dos CPU’s físicas.
Tanto Intel como AMD han desarrollado ya la tecnología de los llamados procesadores de
doble núcleo. Estos procesadores tienen colocados dos núcleos de procesador completos dentro
de un mismo recubrimiento que cuente con una conexión para el socket de la placa base. Este
truco técnico ofrece las prestaciones de un sistema dual en una placa base que sólo tiene un
socket (se requiere que sea compatible con el sistema operativo).
A principios del 2007 Intel lanzó al mercado procesadores cuádruples y AMD los hizo a
mediados del mismo año. El problema principal es que la tecnología del software tarda más en
aprovechar toda esa potencia de cómputo.
Los sistemas basados en Linux tienen soporte actualmente hasta para 16 procesadores y
Solaris puede soportar hasta 256 procesadores.
Los sistemas operativos de microsoft, por ejemplo windows XP tiene soporte solamente has-
ta dos procesadores, y su última versión windows vista tiene soporte hasta cuatro procesadores
en versiones domésticas o pequeñas empresas, pero puede soportar 8 o hasta 32 procesadores
en el servidor avanzado y en el servidor de centro de datos, aunque básicamente es el mismo
núcleo.
Sin embargo, tanto Intel como AMD planean sacar al mercado procesadores con 8 procesa-
dores para el siguiente año.
Crecimiento modular. Puede adquirirse una placa base que soporte varios procesadores
con sólo uno e ir adquiriendo los demás a medida que vayan aumentado las exigencias de
cómputo.
Rendimiento. Si tenemos una aplicación diseñada para explotar el paralelismo, ésta podrá
ejecutarse mucho más rápido.
Relación Costo/Beneficio.los procesadores comerciales son mucho más baratos, que los
de una súper computadora. Así, podemos encontrar diferentes configuraciones multipro-
ceso de acuerdo a las necesidades de cómputo.
Existen diversas categorías para los sistemas multiprocesadores. Flynn [40] introdujo un es-
quema general para clasificar a las arquitecturas de computadora de acuerdo a cómo la compu-
tadora relaciona sus instrucciones con los datos a procesar. Así define los siguientes grupos:
SISD. Flujo de una sola instrucción con flujo de un solo dato. Incluye a las computadoras
serie convencionales.
SIMD. Flujo de una sola instrucción, Flujo de múltiples datos. Se refiere a los típicos
procesadores vectoriales y a los arreglos de computadoras en donde una sola instrucción
puede operar sobre diferentes datos en unidades distintas de ejecución.
MISD. Flujo de múltiples instrucciones con flujo de un solo dato. Esta organización casi
no se utiliza, pero básicamente sería aquella en la que múltiples instrucciones operan sobre
un único flujo de datos, lo que puede compararse con las técnicas de acceso concurrente.
MIMD. Flujo de múltiples instrucciones con flujo de múltiples datos. La ejecución simul-
tánea de múltiples instrucciones que operan sobre varios flujos de datos.
Los sistemas MIMD, se basan en la relación entre procesadores y memoria, los multiproce-
sadores se pueden clasificar bajo este enfoque es:
Esta división no es muy estricta y podemos encontrar sistemas que manejen tanto memoria
compartida como memoria privada. La memoria compartida es esencial para la comunicación
y sincronización entre procesadores en sistemas fuertemente acoplados. Estos sistemas se han
distinguido por tener un mayor ancho de banda y menores retardos en sus rutas de interconexión.
En los sistemas débilmente acoplados puros, el mecanismo principal de comunicación entre
procesadores es el paso de mensajes. En el pasado éstos estaban caracterizados por un reducido
ancho de banda y por retardos elevados en sus rutas de interconexión.
Las configuraciones híbridas y algunos sistemas débilmente acoplados permiten a los proce-
sadores acceder a una memoria no local e incluso a la memoria privada de otros procesadores.
Existe generalmente una penalización por acceder a la memoria no local en forma de retardos
añadidos provocados por el arbitraje de contención y el paso a través de las rutas de intercone-
xión procesador-memoria. Estos factores dan lugar a la siguiente clasificación de los sistemas
multiprocesadores de memoria compartida en base a la arquitectura de la memoria y los retardos
de acceso.
Acceso uniforme a memoria. (UMA, Uniform memory access). Sistemas en donde los
procesadores pueden acceder a toda la memoria disponible con la misma velocidad; esto
incluye muchas arquitecturas con bus compartido.
Hipercubos.
144 2.6. TÉCNICAS DE ADMINISTRACIÓN DEL PLANIFICADOR
3. Todo está controlado por un Sistema Operativo que proporciona interacción entre pro-
cesadores y sus programas en los niveles de trabajo, tarea, paso, archivo y elementos de
datos.
Uno de los modos más sencillos de construir un multiprocesador es utilizar un bus compar-
tido para conectar procesadores y memorias. En la figura 2.11 podemos ver el esquema básico
del método de bus compartido.
1. Verificar que el conductor no esté ocupado y que esté disponible la unidad de destino.
CAPÍTULO 2. ADMINISTRACIÓN DE PROCESOS Y DEL PROCESADOR 145
Las unidades receptoras deben poder reconocer qué mensajes del bus son enviados hacia
ellas y confirmar las señales de control recibidas de la unidad emisora.
Una multitud de procesadores pueden comunicarse unos con otros y con la memoria global-
mente compartida a través de un bus compartido. Puede haber muchas variantes de este esquema
básico: los procesadores individuales pueden o no disponer de memoria privada. Los dispositi-
vos de entrada/salida pueden estas conectados a procesadores individuales o al bus compartido y
la propia memoria compartida se implementa generalmente en forma de múltiples bancos físicos
conectados al bus compartido.
Se deben tener en cuanta dos aspectos importantes: El propio bus y la memoria compartida.
Para disminuir los tiempos de contención es común que se use una memoria caché entre la
memoria compartida y cada procesador. De esta forma la mayoría de las referencias pueden
ser resueltas por la memoria caché y hacer un menor uso del bus común. Si no hay memoria
caché puede llegar a haber una saturación del bus y los tiempos de espera pueden llegar a ser
intolerables en un sistema con mucho tráfico entre los procesadores y la memoria.
Si los procesadores usan memoria caché entonces teóricamente existe una proporción de
aciertos del 90 %, lo que podría permitir a un bus compartido de la misma velocidad soportar
diez veces el número de procesadores que se soportarían si no existiera la memoria caché.
Es una organización económica, simple y flexible pero con una sola vía de comunicación,
por lo cual pueden generarse los siguientes problemas.
La tasa neta de transmisiones está limitada por la tasa neta de transmisión del conductor.
La contención por el uso del bus en un sistema sobrecargado puede ocasionar una seria
degradación.
Debe de mantenerse la coherencia de la caché de modo que múltiples copias físicas de una
sola localidad de memoria contengan los mismos valores en las cachés correspondientes.
La conmutación por barra cruzada es la única fuente de retardo entre un procesador y una
memoria. Si los procesadores no tienen memorias privadas, el sistema resultante es un multipro-
cesador con acceso uniforme a memoria (UMA).
146 2.6. TÉCNICAS DE ADMINISTRACIÓN DEL PLANIFICADOR
En este caso existe un camino diferente para cada unidad de almacenamiento, por lo cual las
referencias a dos unidades diferentes de almacenamiento no son bloqueantes sino simultáneas y
la multiplicidad de caminos de transmisión puede proporcionar tasas de transferencia muy altas.
2.6.7.3. Hipercubos
de afinidad para comunicación con nodos adyacentes. los hipercubos están considerados como
una prometedora base para el multiprocesamiento a gran escala.
Las implementaciones hipercubo de principios de los noventa tienden a incorporar memorias
privadas en cada procesador. La arquitectura NUMA resultante dicta el paso de mensajes como
mecanismo primario de comunicación y sincronización entre procesadores. Además de efectuar
el procesamiento, los nodos individuales manejan generalmente protocolos de comunicación.
También se encargan de encaminar y entregar mensajes externos para formar rutas de comuni-
cación. También se encargan de encaminar y entregar mensajes externos para formar rutas de
comunicación indirectas ente nodos remotos directamente conectados unos a otros. Los dispo-
sitivos de entrada/salida pueden estar asociados localmente a nodos individuales. Para aumentar
el ancho de banda de entrada/salida, algunas implementaciones disponen de nodos inteligentes
de entrada/salida dedicados que actúan como fuentes y depositarios de los flujos de datos de
entrada/salida para grupos de nodos.
Los procesadores y las memorias de un sistema multiprocesador pueden conectarse por me-
dio de un conmutador multietapa. Existen muchas variantes de este método. Una forma gene-
ralizada de este tipo de interconexión proporciona enlaces entre N entradas y N salidas. Tiene
m = log2 N etapas. Cada etapa consta de un conjunto de N enlaces conectad a N/2 cajas de
CAPÍTULO 2. ADMINISTRACIÓN DE PROCESOS Y DEL PROCESADOR 149
intercambio.
Las redes de conmutación multietapa proporcionan una forma de conmutación de circuito.
Existe un breve tiempo para la preparación de la interconexión, pero una vez establecida, se
aprovecha todo el ancho de banda, y es deseable transferir bloques de memoria grandes de
modo que una sola preparación pueda aprovecharse mejor.
El conmutador multietapa puede conectar simultáneamente todas las entradas a todas las
salidas, suponiendo que no haya dos procesadores que intente acceder al mismo módulo de
memoria al mismo tiempo. En caso contrario, puede aparecer contención en los módulos de
memoria y dentro de la red de conmutación lo que hace que el tráfico descienda.
El almacenamiento en búferes dentro de la red de conmutación o en la memoria puede aliviar
parte de la contención, pero no puede hacer desparecer los puntos calientes de los módulos
de memoria. Un punto caliente ocurre cuando algunos módulos de memoria son referenciados
frecuentemente por una serie de procesadores. Es obvio que solamente un procesador puede
tener acceso al módulo de memoria y los restantes deben esperar su turno. El problema es que
ese punto caliente puede también bloquear otras rutas de otros módulos de memoria durante
largos largos períodos de tiempo, afectando en consecuencia la capacidad de otras entradas y
salidas no relacionadas para establecer conexiones.
1. Supervisores separados. Cada nodo tiene un sistema operativo autónomo que administra
el procesador local, la memoria y los recursos de entrada/salida
3. Simétrico. Todos los procesadores son funcionalmente idénticos. Todos los recursos están
disponibles para todos los procesadores. Si sólo algunos procesadores tienen acceso a
150 2.6. TÉCNICAS DE ADMINISTRACIÓN DEL PLANIFICADOR
Los sistemas supervisores separados, tienen nodos que contienen un sistema operativo inde-
pendiente que administra el procesador local, la memoria y los recursos de entrada/salida. En
su forma rudimentaria este método administra efectivamente cada procesador como un sistema
independiente. Sólo hay que añadir unos pocos servicios y estructuras de datos adicionales para
soportar los aspectos multiprocesadores del hardware. Tales implementaciones de supervisores
separados ofrecen poca capacidad de equilibrio de cargas y raramente soportan el paralelismo
dentro de las aplicaciones.
2.6.8.2. Maestro/Esclavos
En este método, un procesador se dedica a ejecutar el sistema operativo. los demás proce-
sadores comúnmente son idénticos y están disponibles para ejecutar las tareas que les asigne
el procesador maestro. El procesador maestro, planifica las tareas y controla la actividad de los
esclavos. Casi todas las estructuras de datos concernientes al sistema operativo las controla el
procesador maestro y las almacena en su memoria privada. Los procesadores esclavos pueden
ser capaces de procesar directamente algunas consultas locales simples, pero la mayoría de los
servicios del sistema operativo son proporcionados por el procesador maestro.
Esta disposición permite el paralelismo dentro de una aplicación mediante la asignación a
ella de múltiples esclavos. No obstante, poco o ningún paralelismo es posible para el sistema
operativo, ya que éste se ejecuta en un solo procesador.
Los temas maestro/esclavo son relativamente fáciles de desarrollar e implementar. Aña-
diéndole la planificación de esclavos a un sistema operativo monoprocesador serie se puede
adaptar con bastante facilidad para que pueda operar como un sistema multiprocesador maes-
tro/esclavos. El problema principal con este enfoque es su poca escalabilidad, puesto que con
muchos procesadores el sistema operativo ejecutándose en un solo procesador se vuelve un cue-
llo de botella.
2.6.8.3. Simétrico
En esta arquitectura, todos los procesadores son funcionalmente idénticos. El sistema opera-
tivo también es simétrico en el sentido de que cualquier procesador puede ejecutarlo. En teoría,
la organización simétrica permite la ejecución paralela del sistema operativo en varios proce-
sadores. A este extremo, el sistema operativo necesita ser codificado en forma de una serie de
CAPÍTULO 2. ADMINISTRACIÓN DE PROCESOS Y DEL PROCESADOR 151
tareas autónomas, y tienen que existir los cerrojos adecuados para acceder a estructuras de datos
compartidas.
En la forma más sencilla de organización simétrica, la conocida como maestro flotante, el
sistema operativo es más o menos una única sección critica de grandes dimensiones. En respues-
ta a los requisitos de la carga de trabajo y la disponibilidad de procesadores, el sistema operativo
se ejecuta en diferentes procesadores en instantes diferentes. Bajo esta organización, el procesa-
dor en donde se ejecuta el sistema operativo actúa como maestro en el sentido de que se encarga
de planificar las tareas para los demás procesadores. Así el sistema operativo no está ligado a
ningún procesador y flota de un procesador a otro.
Como ejemplo podemos hablar un poco del sistema operativo Solaris. La Arquitectura avan-
zada de este sistema operativo incluye multiprocesamiento totalmente simétrico (SMP) y mul-
tithreading sofisticado (MT). El SMP/MT acelera el rendimiento del sistema al permitir que dife-
rentes aplicaciones puedan ejecutarse en múltiples procesadores concurrentemente. Así mismo,
SUN implementa un kernel de multithreading sin quebrar las interfaces del SVR4. El Kernel
de multithreading le asigna "multithreading.al hardware; esto es, muchos procesos pueden eje-
cutarse paralelamente en diferentes CPU’s incrementando el rendimiento del sistema; muchas
aplicaciones pueden beneficiarse con esto, incluyendo manejadores de bases de datos.
La multitarea significa que el sistema operativo puede realizar varias tareas al mismo tiempo.
El multiprocesamiento simétrico permite sacar toda la ventaja de los procesadores múltiples. El
multiprocesamiento asimétrico (en donde un microprocesador se dedica exclusivamente a una
tarea específica), da lugar a que un microprocesador permanezca inactivo en cuanto finaliza su
tarea. En el multiprocesamiento simétrico, el sistema operativo puede asignar diferentes tareas
a un mismo procesador; así, si uno de ellos termina su trabajo antes que otro, el sistema ope-
rativo podrá ocuparlo en otra actividad. El multiprocesamiento simétrico es bastante difícil de
implementar, pero ofrece un rendimiento muy superior. Cabe mencionar que la característica de
multithreading sólo se presenta en equipos de arquitectura Sun4m, Sun4d y Sun4u.
2.7. Problemas
2.1. Defina con sus propias palabras qué es un proceso.
2.5. Proporcione cinco ejemplos de la vida real en donde esté presente la concurrencia.
2.7. ¿De qué manera evitaría los problemas de concurrencia de la pregunta anterior?
2.9. Proporcione cinco ejemplos de la vida real en la que se presente algo parecido a la
sección crítica (Solamente una entidad puede estar haciendo uso de un recurso en un
solo momento).
2.12. ¿Quién inventó los semáforos? Defina con sus palabras un semáforo.
2.17. ¿Es posible garantizar la exclusión mutua por medio de mensajes? Explique su res-
puesta.
2.24. ¿Es posible que un sistema operativo no apropiativo pueda evitar un interbloqueo?
Sustente su respuesta.
CAPÍTULO 2. ADMINISTRACIÓN DE PROCESOS Y DEL PROCESADOR 153
2.25. ¿Qué tan correcto es terminar un proceso para romper un interbloqueo? Explique.
2.26. Investigue las formas en las que los sistemas operativos comerciales enfrentan el pro-
blema de interbloqueo.
2.30. Explique las ventajas y desventajas de que el sistema operativo se apropie de los recur-
sos que tiene asignados un proceso.
2.36. Explique los criterios de planificación. ¿Cuáles piensa que son más importantes? .¿Por
qué?
2.43. Explique las formas con las que se puede implementar el paralelismo.
2.45. Obtenga el promedio de ejecución de las ecuaciones anteriores. Establezca sus propios
tiempos de ejecución para cada operación.
2.52. Describa la arquitectura orientada a bus. ¿Cuáles son sus ventajas y desventajas?
2.53. ¿Qué ventajas ofrece que cada procesador tenga su propia memoria caché?
2.60. ¿Cuáles son los tres tipos básicos de sistemas operativos multiprocesadores? Explique
cada uno de ellos.
Administración de Memoria
157
158 3.1. POLÍTICA Y FILOSOFÍA
Como se puede observar en la figura 3.1, una palabra es un múltiplo de un byte. Si el me-
canismo de direccionamiento cuenta con 16 bits entonces seremos capaces de acceder hasta 216
bytes. Si hablamos de palabras entonces habría un compromiso entre tener la posibilidad de
acceder también a bytes individuales de las palabras o exclusivamente a palabras. Si se da la
opción de acceder a bytes entonces la memoria tendrá solamente la mitad de palabras suponien-
do que sean de 16 bits. Esto es, solamente a 215 palabras. Si sólo podemos acceder a palabras
completas entonces existe la posibilidad de acceder a 216 palabras.
La unidad de memoria necesita entonces saber únicamente la dirección de la localidad de
CAPÍTULO 3. ADMINISTRACIÓN DE MEMORIA 159
memoria que se desea acceder, después de un breve tiempo tendremos disponible los bits al-
macenados en ella. La unidad de memoria no conoce el tipo de información que se guarda en
ella. Tan solo ve un flujo continuo de direcciones y regresa entonces para cada una los bytes o
palabras correspondientes. La unidad de control de la CPU es la encargada de determinar si la
información traída de memoria es una instrucción o un dato, dependiendo esto de los registros
que haya usado para indicar la dirección a la unidad de memoria. Como se vio en la sección
1.1.1.2. Existe un registro especial llamado PC Program Counter o contador de programa el
cual siempre indica la localidad de la memoria que contiene la siguiente instrucción a ser eje-
cutada. También cuenta con un conjunto de registros de direccionamiento que permiten apuntar
a las localidades de la memoria, y en arquitecturas que permiten multiprogramación existe tam-
bién un par de registros que indican la dirección base y la dirección límite a las cuales puede
tener acceso el programa ejecutándose actualmente en memoria. Como se puede ver, en realidad,
no interesa cómo es que se genera la dirección. El administrador de memoria debe solamente
administrar los bloques de memoria que se le soliciten.
1. Registro a registro. Se hace una operación que involucra los registros dentro de la propia
CPU.
2. Registro a memoria/Memoria a registro Se hace una operación que involucra una loca-
lidad de memoria, ya sea como fuente o como destino.
4. Directo a memoria. Se hace una operación con una localidad de memoria como des-
tino y un valor constante como fuente. Algunas arquitecturas no permiten este modo de
direccionamiento, y otras solamente es posible hacerlo en ciertas instrucciones.
cuanto a su efectividad para asignar memoria, sino también como consecuencia de la influencia
e interacción que mantiene con el planificador.
La coexistencia de múltiples espacios de direcciones pertenecientes a procesos residentes en
memoria principal introduce la necesidad de satisfacer dos necesidades conflictivas: la separa-
ción de los espacios de direcciones y la compartición de memoria. El administrador de memoria
debe forzar el aislamiento de los espacios de direcciones distintos para evitar que un proceso ac-
tivo acceda errónea o maliciosamente, y destruya potencialmente los contenidos de los espacios
de direcciones de otros procesos.
Un administrador de memoria en un entorno de multiprogramación debería soportar simul-
táneamente la protección de memoria, aislando espacios de direcciones disjuntos, y la comparti-
ción de memoria, para permitir que procesos cooperativos accedan a áreas comunes de memoria
que satisfacen estos difíciles y en ocasiones conflictivos requisitos con distintos grados de cum-
plimiento.
Registros del procesador. El almacenamiento más rápido al que puede acceder el procesador
es a sus propios registros. En general tardará unos pocos ciclos de reloj para hacer alguna
operación que utilice el direccionamiento de registros.
Memoria caché interna. Es aquella que se encuentra dentro del chip del procesador
lo que le da una velocidad de acceso mayor que a la memoria principal.
Memoria caché externa. Es aquella que colocan fuera del chip del procesador, pero
muy cerca de éste, su tecnología de construcción es la misma que la que usan para
la memoria caché interna, pero con la ventaja de que el usuario puede ampliar este
tipo de memoria. Aunque su velocidad de acceso es intermedia entre la velocidad de
la memoria caché interna y la velocidad de acceso de la memoria principal.
162 3.1. POLÍTICA Y FILOSOFÍA
La capacidad de las memorias caché varía entre los 4kbytes en sistemas pequeños hasta
512kbytes o más en servidores dedicados.
Memoria principal. La memoria principal puede construirse con diversas tecnologías, pero lo
más importante es saber su velocidad de acceso, que es comúnmente medida por la veloci-
dad del bus. Actualmente son comunes velocidades que varían desde los 33 Megahertz en
bus, 100 Megahertz, 333 Megahertz, 512 Megahertz, 800 Megahertz y en modelos espe-
ciales hasta de un gigahertz o más. En cuanto a la capacidad podemos encontrar memorias
desde 32 Megabytes, 64, 128, 256, 512 Megabytes, 1 Gigabyte, 2, 4, 8 Gigabytes o más
en servidores de alto desempeño.
La velocidad de la memoria suele verse restringida por la velocidad del bus de la tarjeta base,
que también podemos encontrar en diferentes velocidades, con obviamente diferentes precios.
Estas velocidades, comparadas con las velocidades de los procesadores actuales, que gene-
ralmente varían desde los 800 Megahertz, en modelos relativamente antiguos cuando se usaban
memorias a 100 o 333 Megahertz, hasta los más actuales que llegan a velocidades cercanas a los
3 Gigahertz y que como podemos ver, triplican la velocidad del bus de la tarjeta madre y de las
mismas memorias, implica que cuando un dato no se encuentra en los registros del procesador,
éste tenga buscarlo en la memoria caché, y esperar algunos ciclos de reloj en lo que la memoria
recupera los datos. Si éstos no se encuentran tampoco en la caché el procesador insertará más
ciclos de espera, debido a que la velocidad del bus de la memoria es mucho más lenta que la
velocidad del procesador y que la memoria caché. Por eso los fabricantes de procesadores miden
la eficiencia de la memoria caché basados el número de fallos y aciertos de la caché. Un fallo, se
refiere a que el dato buscado por el procesador no se encuentra en la caché y un acierto si es que
sí se encuentra. El manejador de la caché intenta “adivinar” cuál será el siguiente dato solicitado
por el procesador y tenerlo disponible antes de que lo pida. Es normal tener tasas de acierto que
van del 90 al 95 % lo que ayuda a paliar la lentitud del bus de la tarjeta base y de la memoria
principal.
las estrategias para la administración de memoria están divididas en dos grandes categorías:
1. Particiones fijas.
2. Particiones variables
gran tamaño, cuando hay una solicitud o llega un proceso y se necesita memoria, se asigna la
memoria necesaria, manteniendo el resto para cumplir con solicitudes futuras.
En la figura 3.2 vemos un ejemplo de cómo quedaría ocupada la memoria mediante este
mecanismo.
Obsérvese que el sistema operativo ocupa una porción de memoria. En este caso tenemos
un sistema operativo residente Además otros tres procesos tienen asignada su correspondiente
memoria. Las particiones en color obscuro son áreas que se encuentran libres.
La partición dinámica elimina la fragmentación interna haciendo que cada partición tenga el
tamaño justo necesario para satisfacer la petición de espacio de un objeto, tal como un programa
o un área de datos compartida.
A medida que entran más procesos al sistema, se introducen en una cola de entrada. El
sistema operativo considera los requisitos de memoria en cada proceso y la cantidad de memoria
disponible a la hora de determinar a qué procesos se les asignará su memoria, cuando se le asigna
su espacio al proceso, se carga a memoria y puede empezar a competir por el uso de la CPU.
Cuando termina un proceso, el sistema operativo recoge su bloque de memoria ya desocupado y
lo integra a la lista de bloques libres para su futura utilización con otra solicitud u otro proceso
que necesite ejecutarse.
Cuando un objeto es eliminado de la memoria, el espacio que ocupaba es devuelto a la
memoria libre, desde el cual se efectúan las nuevas asignaciones. Después de algún tiempo
CAPÍTULO 3. ADMINISTRACIÓN DE MEMORIA 165
1. Primer ajuste. Se asigna al primer bloque que sea lo suficientemente grande. La búsqueda
puede comenzar al principio de la lista o donde se quedó la última búsqueda efectuada para
encontrar otro bloque.
2. Mejor ajuste. Se asigna al bloque más pequeño que tenga el tamaño suficiente. Es ne-
cesario hacer una búsqueda por toda la lista de bloques libres o en su defecto mantenerla
ordenada para reducir el tiempo de búsqueda. Esta estrategia logra que se genera el agujero
más pequeño posible.
3. Peor ajuste. Se asigna al bloque de mayor tamaño. Otra vez debe de hacerse una búsqueda
por toda la lista de bloques libres o en su defecto tenerla ordenada disminuyendo así
el tiempo de búsqueda. Esta estrategia produce un bloque más grande con la memoria
sobrante, lo que puede ser útil, por que disminuye la probabilidad de que haya bloques lo
suficientemente pequeños como para ya no ser útiles como podría suceder en la estrategia
del mejor ajuste.
Tanto la estrategia del mejor como el por ajuste sufren del problema de fragmentación exter-
na. El uso de cualquiera de estos algoritmos puede afectar el grado de fragmentación, por que
la estrategia de primer ajuste es mejor para algunos sistema, mientras que para otros resulta más
adecuado la de mejor o peor ajuste en otros sistemas.
Una solución al problema de la fragmentación externa consiste en la compactación. El obje-
tivo es mover el contenido de la memoria con el fin de que toda la memoria libre quede de forma
166 3.2. MEMORIA REAL
En la figura 3.4 vemos cómo se implementa esta solución. Observemos que existen tres
procesos P1 , P2 y P3 . P1 y P2 se encuentran activos en memoria, pero P3 ahora se encuentra
en disco y el sistema operativo podrá ocupar esa memoria para otro proceso si es necesario
en la siguiente ejecución del planificador. Se tiene también, un área libre que empieza en la
dirección 150H y que ocupa 10h bytes. Para asignar memoria a un proceso, el administrador de
memoria debe recorrer la lista hasta que encuentre un nodo con suficiente espacio para cubrir el
requerimiento solicitado. Si no lo encuentra, puede que sea necesario bajar a la memoria virtual
algún bloque o proceso que no esté siendo ocupado en ese momento.
En las estrategias vistas anteriormente se tiene el problema de fragmentación interna. Una
168 3.3. ORGANIZACIÓN DE LA MEMORIA VIRTUAL
solución para este problema consiste en la compactación esto es, buscar aquellos bloques que
estén contiguos para unirlos y en el peor de los casos podría ser necesario ejecutar un procedi-
miento que reacomode todas las áreas de memoria no contiguas de tal manera que ahora queden
juntas. Esta estrategia requiere primeramente un algoritmo que determine qué tan fragmentada
está la memoria y si sobrepasa cierto umbral, entonces será necesario ejecutar el defragmentador.
2. Asignación Dinámica. Se pueden asignar espacios más adecuados al tamaño de los pro-
cesos y sus requerimientos.
Ahora, ¿Qué pasa cuando en cualquiera de las estrategias anteriores, se termina la memoria
física? En esta situación pueden surgir las siguientes posibles respuestas del sistema operativo.
La memoria se ha terminado.
El sistema operativo busca procesos que se encuentren suspendidos, y si los encuentra en-
tonces puede guardarlos en disco y así liberar memoria principal y de esta forma satisfacer
la solicitud de memoria.
como puede verse, a medida que se incrementa la complejidad de las soluciones es mayor el
tiempo necesario para que el sistema operativo proporcione una respuesta al requerimiento. Esto
es, implica una degradación del desempeño del sistema, sin embargo, los últimos dos puntos
arriba mencionados ofrecen una mejor respuesta al usuario a indicarle solamente que se le acabó
la memoria.
Para que pueda darse una solución al problema de asignación, cuando la memoria física
se ha agotado, debe de planearse adecuadamente la técnica de asignación de memoria. Para
ello deben de responderse muchas preguntas de diseño, por ejemplo: ¿Qué soporte de hardware
proporciona la CPU para el manejo de memoria? La arquitectura de la CPU es la que va a dictar
en la mayoría de los casos qué estrategia de administración de memoria se va a implementar.
¿El esquema permite la asignación dinámica de direcciones? Si es así entonces el manejador
CAPÍTULO 3. ADMINISTRACIÓN DE MEMORIA 169
de memoria implementará un mecanismo de bloques de tal manera que se hagan coincidir con
archivos de disco en un lugar denominado espacio de swapping o intercambio. Este espacio es
manejado por el administrador de memoria en cooperación con el administrador del sistema de
archivos. El área de intercambio, comúnmente será un reflejo en disco de la administración en
memoria de tal forma que facilite la tarea de lectura/escritura entre ésta y el disco.
Las primeras versiones de los microprocesadores de Intel, 8088 y 8086, no contaban con
soporte de paginación y se dejaba a los compiladores el manejo de la memoria virtual.
Básicamente, el mecanismo utilizado para la administración de memoria era el de segmen-
tación. Cuando se administra la memoria con segmentos, se usa una división manejada por los
programadores, y esta consiste en:
2. Segmentos de datos. Aquí se guardan todos o parte de los datos de la aplicación. Existe
también otro denominado segmento extra.
1. Paginación. Puede ser fija o sobre demanda. Divide la memoria física en una serie de
porciones de tamaño fijo llamados marcos de página.
1. Los programas necesitarían menos instrucciones de E/S para cargar o intercambiar los
procesos, puesto que aparte de ellos estaría en memoria y sólo será necesario, si es que lo
es, cargar la parte que va a ejecutarse, por lo tanto, se ejecutaría más rápido.
2. Los programas pueden incluir mayor cantidad de funcionalidades puesto que ya no esta-
rían restringidos al tamaño de la memoria física y el programador puede definir estructuras
de datos tan grandes como crea necesario.
CAPÍTULO 3. ADMINISTRACIÓN DE MEMORIA 171
3. Puesto que es muy probable que solamente se estén ejecutando las instrucciones que usa
más comúnmente un usuario, y que son relativamente pocas comparado con el tamaño
total del programa, estas instrucciones ocuparán mucho menos memoria y por lo tanto,
podrá ejecutarse un mayor número de procesos al mismo tiempo, con el correspondiente
incremento en la tase de utilización de la CPU y la tasa de procesamiento sin incrementar
el tiempo de respuesta ni el tiempo de ejecución.
El sistema operativo puede compartir sus bibliotecas con muchos procesos, mapeando las
funciones compartidas sobre un espacio de direcciones virtual. aunque cada proceso con-
sidera que las bibliotecas compartidas forman parte de su propio espacio de direcciones
virtual, las páginas reales de memoria física en las que residen las bibliotecas estarán com-
partidas por todos los procesos. Es común que las bibliotecas se mapeen en modo de sólo
lectura dentro del espacio de cada proceso que las vaya a utilizar.
Los procesos pueden compartir un área de memoria. De esta forma, un proceso, crea una
región de memoria e indica al sistema operativo que desea compartirla con otros procesos.
172 3.4. ADMINISTRACIÓN DE LA MEMORIA VIRTUAL
3.4.1. Paginación
La paginación es un esquema de administración de memoria que permite que el espacio
de direcciones físicas de un proceso no sea contiguo. Este esquema evita el gran problema de
encajar fragmentos de memoria de tamaño variable en el almacén de respaldo; la mayoría de
los esquemas de administración de memoria antes de que se introdujera la paginación sufrían
de este problema, que surgía debido a que, cuando era necesario proceder a la descarga de
algunos datos o fragmentos de código que estuvieran en la memoria física, debía de encontrarse
el espacio necesario en disco. El disco también sufre problemas de fragmentación, pero con el
problema de hacer todavía el acceso mucho más lento, haciendo que en ocasiones no sea posible
hacer una compactación del disco sin hacer que el sistema de cómputo completo se dedique a
realizar casi exclusivamente a esa tarea.
Básicamente, la memoria física se divide conceptualmente en una serie de porciones de
tamaño fijo, llamadas marcos de página. El espacio de direcciones virtuales de un proceso se
divide además en bloques de tamaño fijo del mismo tamaño llamados páginas. La asignación
de memoria consiste en hallar un número suficiente de marcos de página sin utilizar para cargar
en ellos las páginas del proceso solicitante. Para hacer corresponder las páginas virtuales con
sus marcos de página físicos asociados se utiliza un mecanismo de traducción de direcciones.
CAPÍTULO 3. ADMINISTRACIÓN DE MEMORIA 173
Puesto que cada página se hace corresponder separadamente, los diferentes marcos de página
asignados a un proceso no necesitan ocupar áreas contiguas de memoria física.
En la paginación fija, cuando hay que ejecutar un proceso, sus páginas se cargan desde el
disco en los marcos de memoria disponibles. El disco, también está dividido en bloques de
tamaño fijo que tienen el mismo tamaño que los marcos de memoria. Toda dirección generada
por la CPU está dividida en dos partes:
El número de página se utiliza como índice para una tabla de asignación de páginas. La
tabla de asignación de páginas contiene la dirección base de cada página en memoria física; esta
dirección base se combina con el desplazamiento de página para definir la dirección de memoria
física que se envía a la unidad de memoria. En la figura 3.6 podemos observar la estructura
general para lograr la paginación.
El tamaño de página está definido por el hardware, y éste es comúnmente una potencia de dos
y que puede ir desde los 512 bytes hasta los 16 MB por página, esto depende de la arquitectura
de la computadora. La selección de una potencia de dos como tamaño de página hace que la
traducción de una dirección lógica a un número de página y a un desplazamiento de página
174 3.4. ADMINISTRACIÓN DE LA MEMORIA VIRTUAL
direcciones físicas de la memoria. Esta conversión está oculta al usuario puesto que la puede
hacer directamente el hardware de la CPU y es controlado a su vez por el sistema operativo.
Los procesos de usuario son incapaces, por el mismo esquema, de acceder a memoria que no les
pertenece. No tienen forma de direccionar la memoria situada fuera de su tabla de páginas y esa
tabla incluye únicamente aquellas páginas que sean propiedad del proceso.
El sistema operativo es el encargado de llevar el control de la asignación de la memoria
física y de las tablas de páginas de los procesos. De modo que puede saber qué marcos ya han
sido asignados y a quién, del mismo modo cuenta con una lista de los marcos que se encuentran
disponibles. Esta información suele estar almacenada en una estructura de datos denominada
tabla de marcos. La tabla de marcos tiene una entrada por cada marco físico que indica si está
libre o asignado y, en caso de estar asignado, a qué página y a qué proceso o procesos lo está.
A su vez el sistema operativo debe de hacer una traducción manual de aquellas direcciones
que proporcione el usuario, puesto que éstas direcciones se encuentran dentro del espacio de
direcciones lógicas.
páginas, usando el valor del registro base de la tabla de páginas, desplazado según el número de
páginas para obtener e número de marco luego combinarlo con el desplazamiento para obtener
la dirección física real. Así, con este esquema se realizan dos accesos a memoria, de modo que
la velocidad de acceso a memoria se ralentiza en un factor de dos.
Este problema se resuelve comúnmente utilizando un chip de hardware especial de pequeño
tamaño y de acceso rápido, denominado búfer de consulta de traducción. Este hardware es
una memoria asociativa de alta velocidad. Cada entrada del búfer se compone de dos partes: una
clave y un valor. Cuando se le presenta un elemento a la memoria asociativa, ese elemento se
compara simultáneamente con todas las claves. Si se encuentra, entonces devuelve el valor co-
rrespondiente. Esta búsqueda -realizada a nivel de hardware- es hecha en paralelo. El problema
es que el hardware es caro y de pequeña capacidad que viene a ser entre los 64 y 1024. Bajo esta
técnica se puede ahorrar hasta el 90 % del tiempo necesario si es que las entradas no fueran con-
vertidas. En caso de que el marco de página no estuviera en la memoria asociativa, entonces es
necesario hacer una consulta a la tabla de páginas en memoria como se haría normalmente pero
ahora se actualizaría la memoria asociativa de manera que la siguiente vez que sea solicitada
pueda regresar su valor inmediatamente.
sólo emplean una pequeña fracción del espacio de direcciones que tiene disponible, por tanto
sería un gran desperdicio tener tablas de páginas con entradas para todo el rango posible de
direcciones a utilizar. Algunos sistemas proporcionan mecanismos de hardware especiales en
forma de registros de longitud de la tabla de páginas, para indicar el tamaño de la tabla de
páginas. Este valor es comparado con cada dirección lógica para verificar que esa dirección se
encuentre dentro del rango de direcciones válidas definidas para el proceso.. Si la comprobación
falla, se produce una interrupción para notificar al sistema operativo.
En la figura 3.7 vemos como los procesos P 1 y P 2 comparten el código de un editor en las
posiciones 0, 2 y 4. Mientras que los datos del editor 1 se encuentran en la página 11 y los datos
del editor 2 están en la página 8.
Bajo este enfoque es posible compartir otros programas que se utilicen a menudo por muchos
usuarios, como sistemas de ventanas, bibliotecas dinámicas bases de datos, compiladores y otros.
La compartición de memoria que contengan datos entre los procesos es muy similar a la forma
en que se comparte código.
178 3.4. ADMINISTRACIÓN DE LA MEMORIA VIRTUAL
Ahora consideremos la carga de un programa ejecutable desde el disco a memoria. Una posi-
ble solución sería cargar el programa completo al momento de ejecutar el programa. El problema
que se presenta bajo este esquema es que en realidad no es necesario tener inicialmente todo el
programa. Por ejemplo, en la mayoría de las ocasiones lo que primeramente se ejecuta es un me-
nú que, cuando el usuario escoge una opción, entonces llamaría al módulo correspondiente, pero
no tendría caso entonces tener en memoria todos los módulos, puesto que comúnmente sólo uno
se ejecutará en un momento dado. De esta forma, si el sistema operativo sólo carga las páginas
que realmente sean necesarias y después a medida que se vayan solicitando, traerlas entonces
desde disco, a esto se le denomina paginación bajo demanda. Esta técnica es comúnmente utili-
zada en los sistemas de memoria virtual. Bajo este esquema, sólo se cargan las páginas cuando
así se solicita durante la ejecución del programa, bajo esta lógica, aquellas páginas que nunca
sean solicitadas para ejecución no serán tampoco nunca subidas a la memoria física.
Cuando el planificador de procesos recibe la orden de cargar de disco un programa, el pa-
ginador realiza una estimación de qué páginas serán utilizadas antes de descargar de nuevo el
proceso. En lugar de cargar el proceso completo, el paginador sólo carga en la memoria las pági-
nas que posiblemente sean necesarias, así evita cargar en la memoria las páginas que no vayan a
ser utilizadas, reduciendo considerablemente el tiempo de carga y la cantidad de memoria física
en comparación a cargar el proceso completo.
Con este esquema, es necesario que el hardware proporcione soporte para distinguir entre
las páginas que se encuentran en memoria y las páginas que residen en disco. Puede usarse un
bit que indique si la página es “válida” o “inválida”. Si el bit se coloca a “válido” entonces
se dice que la página asociada será legal y además se encontrará en memoria. De otra forma
decimos que la página no es válida, esto es, o no se encuentra dentro del espacio de direcciones
del proceso o es legal pero se encuentra almacenada en disco y es necesario entonces subirla a
memoria.
Si una página está marcada como inválida pero no es accedida por el proceso no tendrá
entonces ninguna implicación. Por tanto, si el paginador carga exactamente las páginas que
serán ejecutadas por el proceso, éste se ejecutará exactamente igual que si se hubieran cargado
todas las páginas del mismo. En caso de que el proceso necesite acceder a una página que no
haya sido cargada, entonces el hardware al detectar que el bit se encuentra en “inválido” generará
una interrupción denominada interrupción de fallo de página. El sistema operativo entonces
mandará a traer al paginador para que lea de disco la página solicitada y sea puesta en memoria.
El procedimiento que sigue el sistema operativo es:
3. Se busca un marco libre, ya sea de la lista de marcos libres, y si ya no hay entonces se baja
a disco un marco de otro proceso que lleve tiempo de no ser accedido
4. Se hace una operación de lectura de disco para leer la página deseada en el marco recién
asignado.
5. Terminada la lectura de disco, se modifica la tabla interna que se mantiene con los datos
del proceso y la tabla de páginas para indicar que dicha página se encuentra ahora en
memoria.
6. Se reinicia la instrucción que fue interrumpida. El proceso podrá ahora acceder a la página
como si siempre hubiera permanecido en memoria.
en el caso extremo, se podría empezar a ejecutar un proceso sin ninguna página en memoria.
Cuando el sistema operativo hiciera que el apuntador de instrucciones apuntara a la primera ins-
trucción del proceso, se encontraría entonces en una página no residente en memoria, entonces
se generaría inmediatamente una interrupción de fallo de página, después de cargar dicha página
en memoria el proceso continuaría ejecutándose. Si llegara a requerir otra página nuevamente
se genera otra interrupción, este proceso seguiría hasta el momento en que el proceso se ejecute
sin fallos de páginas llegando a estabilizarse. A esto se le denomina paginación bajo demanda
pura esto es, nunca cargar una página en memoria hasta que sea requerida.
Es probable que haya programas que podrían acceder a varias páginas nuevas de memoria
con cada ejecución de una instrucción, y por supuesto generando también muchos fallos de pá-
ginas, lo que implicaría una grave degradación del sistema, la buena noticia es que los resultados
de los análisis de procesos indican que este comportamiento es bastante improbable, de manera
que pueden obtenerse prestaciones de desempeño bastante razonables.
El hardware que se necesita para dar soporte a la paginación bajo demanda es el siguiente:
Tabla de Páginas. Permite marcar una entrada como inválida mediante un bit válido-
inválido o mediante un valor especial de una serie de bits de protección.
le denomina como dispositivo de intercambio y la sección del disco utilizada para este
propósito se le denomina espacio de intercambio.
3.4.2. Segmentación
La estrategia de manejo de memoria por segmentación, recuerda las primeras formas de
asignación de memoria. El sistema operativo apartaba un conjunto de localidades de memoria,
por ejemplo, la parte baja y en ocasiones también la parte alta de la memoria física. El resto
se ocupaba para los programas. El orden en que se asignan los segmentos tiene que ver con
la forma lógica en que los programadores empezaron a dividir sus programas. En general, un
usuario programador se imagina la memoria como una secuencia muy grande de bytes, que se
encuentran secuencialmente. Con esta idea en mente decide tomar una cierta cantidad de ella
y acomodar ahí el código de su programa. De la misma forma, toma otro bloque de memoria
secuencial y coloca ahí sus datos. Con la pila sucede lo mismo, un bloque secuencial, en donde
el proceso colocará los retornos de las llamadas a función que fueron hechas por el programa
principal y otras funciones. A su vez, también se usará para colocar ahí los parámetros por
referencia o por valor que necesitará esa función.
CAPÍTULO 3. ADMINISTRACIÓN DE MEMORIA 181
Como el código, los datos, y la pila varían de programa en programa, estos segmentos pueden
adaptarse al tamaño real que ocuparán en memoria. Tanto el código como los datos empezarán a
referenciarse a partir del principio del segmento con un desplazamiento de cero. El compilador,
en este caso lo que hace es ir incrementando el número de bytes que ocupe la instrucción o el
dato, en su correspondiente segmento.
La segmentación, por tanto, es un esquema que soporta la organización lógica de memoria
del usuario programador. De esta forma, podemos definir que un espacio lógico de direcciones
será un colección de segmentos y cada segmento tendrá su propio nombre y una longitud de-
terminada. Las direcciones especifican tanto el nombre del segmento como el desplazamiento
dentro del segmento. De esta manera el usuario programador, especifica dos valores para cons-
truir una dirección completa: la dirección del segmento o su nombre y el desplazamiento dentro
de éste.
Los segmentos más comúnmente utilizados son los siguientes:
1. Un segmento de código
El compilador también puede crear otros segmentos para cargar bibliotecas adicionales. Adi-
cionalmente, es posible crear “segmentos dinámicos”, que permiten cargar módulos de bibliote-
cas en tiempo de ejecución, bajando a disco aquel segmento que no se ha ocupado y subiendo
uno nuevo, aunque esta alternativa puede consumir mucho más tiempo, debido al tamaño del
segmento, que un sistema de paginación sobre demanda.
Ahora, una dirección lógica estará formada por un número de segmento s y un desplaza-
miento d. El número de segmento se utiliza como índice para la tabla de segmentos. El despla-
zamiento d de la dirección lógica debe estar comprendido entre 0 y el límite del segmento; si no
es así, se producirá una interrupción del tipo segmentation fault o intento de acceder más allá
del segmento asignado al proceso. Cuando el desplazamiento está dentro del rango adecuado,
entonces se suma al valor señalado por el índice dentro de la tabla de segmentos, de esta forma
se genera la dirección física en donde se encuentra el byte o palabra solicitado.
En la figura 3.8 podemos observar la relación que existe entre el espacio lógico de direccio-
nes, la tabla de segmentos y las direcciones de memoria física.
Como ejemplo, consideremos la situación mostrada en la figura 3.8, en donde tenemos cua-
tro segmentos. En el segmento 0 tenemos almacenado el código de una biblioteca, un segmento
de datos (segmento 0), el segmento de código del programa principal (segmento 2) y un seg-
mento de pila (segmento 3). Los segmentos se almacenan en la memoria física de acuerdo a lo
establecido en la tabla de segmentos, en donde tenemos la dirección inicial o base y el tamaño
CAPÍTULO 3. ADMINISTRACIÓN DE MEMORIA 183
total del segmento. por ejemplo, para el segmento de código de la biblioteca (segmento 0) em-
pieza en la dirección 1000 con 500 bytes de longitud. De esta forma, si se hace una referencia
al byte 300 del segmento 0 tenemos entonces que su dirección en memoria física sería entonces
1000 + 300 = 1300. podemos calcular entonces de la misma forma otros desplazamientos para
los segmentos 1, 2 y 3.
2. Guardar los registros de usuario y el bloque de control del proceso (su estado)
10. Determinar si la interrupción corresponde a la petición realizada por el proceso que causó
el fallo de página.
11. si es así entonces actualizar la tabla de páginas para indicar que la página ya está lista en
memoria.
184 3.4. ADMINISTRACIÓN DE LA MEMORIA VIRTUAL
13. restaurar los registros de usuario, el estado del proceso y la nueva tabla de páginas y
reanudar la ejecución de la instrucción interrumpida.
De acuerdo a lo anterior tener varios fallos de página seguidos puede implicar una ralentiza-
ción severa del sistema. Cuando esto sucede, el sistema operativo debe de buscar un marco libre
en el paso 6. Si no encuentra ninguno, entonces estaremos en un caso de sobrepaginación. El
sistema operativo debe entonces buscar alguna estrategia para cumplir la solicitud del proceso.
Una de ellas podría ser indicar el problema al usuario y terminar su proceso, pero no sería lo
más adecuado, sin embargo, el papel de la memoria virtual es precisamente el de apoyar al siste-
ma operativo en estas situaciones. El sistema operativo tiene entonces la opción de elegir algún
proceso bajo algún criterio preestablecido y enviarlo al disco, liberando así todos sus marcos
de memoria y de esta manera cumplir con la solicitud de página del proceso demandante. Esta
solución reduce el nivel de multiprogramación del sistema.
Otra alternativa del sistema operativo es sustituir solamente una o algunas de las páginas para
no tener que bajar todo el proceso a disco, que visto de esa forma puede ser también ineficiente,
por que no sabemos cuantas páginas conforman todo el proceso.
En general la sustitución de páginas usa la siguiente estrategia. Si no hay ningún marco libre,
se localiza uno que no esté siendo actualmente utilizado y se libera. Se puede liberar un marco
de memoria escribiendo su contenido en el espacio de intercambio y modificando la tabla de
páginas para indicar que esa página ya no se encuentra en memoria. Ahora se puede utilizar el
marco liberado para almacenar la página que provocó el fallo de página en el proceso.
El algoritmo de sustitución de página quedaría entonces de la siguiente forma:
3. Leer la página deseada y cargarla en el marco recién liberado y actualizar las tablas de
páginas y de marcos.
4. Esperar a que el proceso sea seleccionado para ejecución y reiniciarlo donde se quedó
antes del fallo de página.
Hay que observar que cuando no se encuentra un marco libre se hacen dos transferencias de
páginas una de escritura y otra de lectura de disco, duplicando por tanto, el tiempo de respuesta
en el servicio del fallo de página y se incrementa el tiempo efectivo de acceso.
Esta carga se puede reducir en un cierto porcentaje si se agrega un bit de modificación.
Cuando se hace uso de este esquema, el hardware se encarga de modificar este bit cuando haya
un acceso de escritura a un byte o palabra de la página. cuando el sistema operativo selecciona
una página para sustitución, verifica si ha sido modificada, si es así, entonces se escribe la página
a disco, pero si no ha sido modificada entonces simplemente lee la página que se necesita del
disco y la coloca en el marco seleccionado.
Este algoritmo asocia con cada página el instante en que dicha página fue cargada en me-
moria. Cuando hace falta eliminar una página, se elige la página más antigua. No es necesario
anotar el tiempo real del momento en que se cargó la página. Éste se puede substituir con una
cola tipo FIFO para almacenar todas las páginas de memoria y sustituir la página situada al
principio de la cola. cuando se carga en memoria una página nueva, se inserta al final de la cola.
El rendimiento de este algoritmo no siempre es bueno aunque es fácil de entender y progra-
mar. Un problema de FIFO es que puede desafiar la intuición al hacer que aumente el número
de fallos de página cuando se asignan más páginas reales al programa. Este comportamiento se
conoce como anomalía de Belady. Por estos problemas FIFO no es la primera elección de los
diseñadores de sistemas operativos para sustitución de páginas.
Un algoritmo que sustituya de forma óptima las páginas solicitadas por los procesos será
aquel que tenga el menor número de fallos de página de entre todos los algoritmos y que no esté
sujeto a la anomalía de Balady. A este algoritmo se le denomina OPT o MIN.
Este algoritmo existe y puede implementarse de la siguiente forma:
Sustituir aquella página que no vaya a usarse por un período largo de tiempo.
186 3.4. ADMINISTRACIÓN DE LA MEMORIA VIRTUAL
La utilización de esta sencilla regla garantiza la tasa de fallos de página más baja posible para
un número fijo de marcos de memoria.
Por desgracia, para implementar este algoritmo es necesario saber las solicitudes futuras de
páginas y su secuencia, lo cual en la realidad es muy difícil. Por lo general este algoritmo se usa
solamente como referencia para saber qué tan buena es otra técnica de sustitución de páginas.
Este algoritmo asocia con cada página el instante correspondiente al último uso de dicha
página. Cuando hay que sustituir una página , este algoritmo selecciona la página que no haya
sido utilizada durante el período de tiempo más largo (Least-Recently-Used).
Este algoritmo es mejor que FIFO. Esta política se considera que es en general bastante
buena. El problema viene al momento de implementarla, ya que requiere bastante asistencia del
hardware. Para implementarla existen dos posibles formas:
Pila. Esta técnica consiste en mantener una pila de número de página. Cada vez que se
hace referencia a una página, se extrae esa página de la pila y se le coloca en la parte
superior. Así la página que ha sido recientemente utilizada quedará en el tope de la pila y
aquella de haya sido menos utilizada quedará en el fondo. Esta técnica resulta particular-
mente apropiada para las implementaciones de algoritmos de sustitución LRU realizadas
mediante software o microcódigo.
Contadores. Este es el caso de implementación más simple. Se asocia con cada entrada
en la tabla de páginas un campo de tiempo de uso y se añade a la CPU un reloj lógi-
co o contador. El reloj se incrementa con cada referencia a memoria. Cuando se realiza
una referencia a una página, se copia el contenido del registro de reloj en el campo de
tiempo de uso de la entrada de la tabla de páginas correspondiente a dicha página. De
esta manera siempre se tiene el “tiempo” de la última referencia a cada página y se podrá
entonces sustituir la página que tenga el valor temporal menor. Esta estrategia requiere
realizar una búsqueda en la tabla de páginas para localizar aquella que haya sido menos
recientemente utilizada. Debe tenerse en cuenta el desbordamiento del reloj y los tiempo
deben mantenerse apropiadamente cuando se modifiquen las tablas de páginas.
El algoritmo LRU pertenece a la clase mayor de los algoritmos de sustitución de tipo pila.
Un algoritmo pila se distingue por la propiedad de actuar mejor, cuando tenga más memoria real
disponible al contrario de lo que pasa con FIFO, no sufre de la anomalía de Belady.
CAPÍTULO 3. ADMINISTRACIÓN DE MEMORIA 187
Existen varias técnicas que llevan la cuenta del número de referencias que ha tenido una
página. En general, estas técnicas manejan los siguientes esquemas:
1. Algoritmo LFU. (Least frecuently used) o la menos frecuentemente utilizada. Esta téc-
nica sustituye la página que tenga el valor más pequeño de contador. La razón para esta
selección es que las páginas que más se han utilizado deben tener un valor grande de con-
tador de referencias. Sin embargo, puede surgir un problema cuando una página se usa con
mucha frecuencia cuando comienza un proceso e inicializa su estado y luego ya no se la
vuelve a utilizar. Después de haber sido usada muchas veces, tendrá un valor de contador
alto y permanecerá en memoria a pesar de que ya no es necesaria. Una forma de dismi-
nuir este problema es desplazando una posición a la derecha los contenidos del contador
a intervalos regulares, obteniendo así un contador del uso promedio con decrecimiento
exponencial.
2. Algoritmo MFU. (Must frequently used.) o la más frecuentemente utilizada. En esta téc-
nica se argumenta que la página que tenga el valor de contador más pequeño acaba proba-
blemente de ser cargada en memoria y todavía tiene que ser utilizada.
Como puede deducirse, ninguno de los dos algoritmos se usan comúnmente debido a su ele-
vado costo computacional y además tampoco son buenas aproximaciones al intercambio óptimo
esperado, comparado con el algoritmo de sustitución óptimo.
Estos son procedimientos que permiten acelerar el tiempo de reinicio del proceso que solicita
la página. De esta manera, cuando se produce un fallo de página el algoritmo puede proporcionar
inmediatamente un marco libre de un conjunto disponible de ellos, así el proceso no tiene que
esperar a que se desocupe un marco para continuar con su ejecución. El algoritmo, como los
demás, escoge también un marco víctima, lo escribe en disco, y libera el marco poniéndolo
ahora en su conjunto de marcos libres, pero esto es hecho una vez que el proceso que causó el
fallo ha sido reiniciado.
Otra forma de implementar estas estrategias, es la de mantener una lista de páginas modifi-
cadas y cada vez que el dispositivo de paginación esté desocupado, se selecciona una de ellas,
se escribe a disco y se borra el bit de modificación. De este forma se incrementa la posibilidad
de encontrar una página limpia al momento de seleccionarla para ser sustituida, de manera que
no será necesario escribirla.
188 3.4. ADMINISTRACIÓN DE LA MEMORIA VIRTUAL
Protección.
Compartición.
Si se encuentra entonces
Como puede verse, cuando el sistema no tiene marcos libres se incrementa el tiempo de
respuesta para proporcionar un marco al proceso solicitante, puesto que se debe de escoger una
página para ser liberada y luego reasignada al proceso solicitante.
3.5. Problemas
3.1. Defina con sus propias palabras el funcionamiento de la memoria principal.
3.4. ¿bajo qué forma se clasifica la memoria principal? Proponga otras alternativas de cla-
sificación y explique.
3.9. Explique las estrategias más comunes para la selección de un bloque de memoria.
3.13. Describa cómo se lleva a cabo la administración de memoria con mapas de bits.
3.16. Haga una comparativa sobre ambas estrategias e indique de acuerdo a sus resultados
cuál es la mejor.
3.17. ¿Para qué sirve el espacio de intercambio? ¿Con qué otro nombre se le conoce?
3.18. ¿Por qué la mayoría de los sistemas actuales implementan la memoria virtual?
3.19. ¿Cuales son las dos estrategias para la organización de la memoria virtual? Descríbalas.
3.21. ¿Cuál es la distribución lógica de segmentos que usa un programador? Describa cada
uno de ellos.
3.25. ¿Es lo mismo liberar una página al sistema que mandarla a la memoria virtual? Expli-
que.
Administración de Entrada/Salida
A sta ahora nos hemos dedicado a analizar el funcionamiento de los algoritmos que per-
H miten administrar la CPU, los procesos y la memoria, no obstante todo ello, es parte de
dos de las tareas que debe de realizar un sistema de computadoras: el procesamiento y las ope-
raciones de entrada salida. Hasta ahora se había dejado fuera esta importante tarea que va a
permitir al sistema interactuar con el mundo externo. Los mecanismos utilizados para lograr
esta interacción son precisamente los dispositivos de entrada salida.
El sistema operativo tiene la responsabilidad de administrar y controlar las operaciones de
entrada salida que se lleven a cabo sobre todos los dispositivos del sistema.
1. Existe una creciente estandarización de las interfaces de software y hardware, lo que per-
193
194 4.1. DISPOSITIVOS Y MANEJADORES DE DISPOSITIVOS
2. En contraposición, existen cada vez más dispositivos de entrada salida, algunos de éstos
son tan distintos a los anteriores que constituye un gran reto el incorporarlos a nuestros
sistemas de computadora incluyendo que los reconozcan nuestros sistemas operativos.
Este desafío se enfrenta haciendo que los fabricantes se adhieran a las especificaciones bási-
cas del hardware de entrada salida, como los puertos, buses y controladores de dispositivo. Éstos
últimos comúnmente son proporcionados por los mismos fabricantes, de este modo, es posible
integrar una amplia variedad de dispositivos de entrada salida y además permiten encapsular los
detalles de los diferentes tipos de dispositivos. El núcleo del sistema operativo se estructura de
tal forma que hace uso de módulos específicos de controladores de dispositivos como sea ne-
cesario y además presenta una interfaz común de acceso a los dispositivos, permitiendo así un
acceso uniforme a todos ellos.
En varias ocasiones, el sistema operativo incluirá también un módulo de autoconfiguración
de dispositivos y un gran conjunto de controladores para este fin, pero debe quedar claro que
no estarán incluidos en el paquete del sistema operativo como tal, soló serán un extra para
poder ayudar al usuario final a configurar más rápidamente su equipo. Esta tendencia se ve
más remarcada en sistemas operativos tales como windows y Linux, en donde para ganar más
usuarios, se ha facilitado muchísimo la instalación de controladores y programas.
1. Dispositivos de almacenamiento.
2. Dispositivos de transmisión.
Los dispositivos de almacenamiento los analizamos con cierto detalle en la sección 1.1.1.2,
resaltando que en la figura 1.3, en la parte derecha tenemos a los dispositivos de almacenamiento
masivo más comunes. Estos son discos duros, unidades de CDROM, cintas magnéticas, unidades
de memoria flash o pendrive, entre otros.
Los dispositivos de transmisión son aquellos que van a permitir a nuestra computadora co-
municarse con otros dispositivos o computadoras. Entre ellos podemos citar a las tarjetas de red
CAPÍTULO 4. ADMINISTRACIÓN DE ENTRADA/SALIDA 195
o NIC (network Interface Computer) o interfaz de red de computadora los dispositivos de rayos
infrarrojos, o aquellos que usan el estándar bluetooth, entre otros.
Entre los dispositivos de interfaz humana tenemos por ejemplo, el ratón, el teclado, la tarjeta
de vídeo y monitor, las tarjetas de sonido y bocinas, por citar algunos.
Otros dispositivos son más especializados y va a depender mucho el área de aplicación, como
por ejemplo, en control industrial.
No obstante la tremenda variedad de tipos de dispositivos, para entender cómo se conectan
éstos mediante su software específico solamente se necesitan algunos conceptos básicos.
En general los dispositivos se comunican con la computadora a través de señales que envía
por un medio físico que puede ser un cable, ondas electromagnéticas, luz, rayos infrarrojos o
rayos láser.
Cada dispositivo tiene asignado un puerto o punto de conexión, tal como un puerto USB, o
el puerto paralelo. Si los dispositivos, utilizan un conjunto de hilo o alambres, como en el caso
del puerto paralelo se le denomina entonces bus. Estos tienen a su vez asignado un protocolo
que indica cómo, cuando y qué información debe de ser enviada o recibida.
Para lograr la comunicación, el dispositivo que desea conectarse debe se hacer primero una
traducción de bytes a bits y a señales eléctricas, un cero lógico equivale a 0 voltios y un 1
lógico equivale a cinco voltios. Luego estas señales eléctricas deberán a su vez ser traduci-
das nuevamente para adecuarlas al medio correspondiente, si es un cable pueden ser mandadas
directamente, pero en otro caso, deberán ser convertidas a pulsos de luz, radiofrecuencia o in-
frarrojos. Luego las señales que viajan a través de los medios de transmisión, deben de ser al
final traducidos nuevamente a pulsos eléctricos y enviados al hardware de la computadora. El
hardware de la computadora los recibirá y a su vez traducirá estos impulsos en 0’s y 1’s lógicos,
se empaquetarán en grupos de ocho bits y serán pasados al programa correspondiente para su
uso e interpretación.
A los dispositivos que hacen esta traducción se les llama controladores de dispositivos. Un
controlador de dispositivo en un conjunto de circuitos electrónicos que son capaces de realizar
la traducción de la que hablamos en el párrafo anterior. por lo común, también es posible que
haga la traducción de la información que viene de regreso (comunicación Full Dúplex). En la
sección 4.1.2 haremos una descripción más detallada sobre éstos.
En la figura 4.1 podemos ver una distribución común del bus principal de una tarjeta base
conocido como PCI.
Como ejemplo de un controlador sencillo, tenemos el del puerto serie. Está compuesto por
un chip al que se le llama UART (Universal Asynchronous Receiver-Transmitter) Transmisor-
Receptor Asíncrono Universal, que se encarga de las transmisiones vía puerto serial y que es
usado comúnmente para conectar un módem (modulador-demodulador) o una impresora serial.
196 4.1. DISPOSITIVOS Y MANEJADORES DE DISPOSITIVOS
También es usado para conectar terminales seriales o incluso para configurar ruteadores de in-
ternet los cuales son sistemas operativos dedicados, de modo que pueda verse la configuración
en la pantalla de la computadora y sea posible enviarles comandos de configuración.
Como ejemplo de una controladora compleja podemos encontrar a la tarjeta de vídeo, la
cual es común que tenga un procesador dedicado, memoria dedicada (podemos encontrar desde
64Mbytes hasta 512Mbytes) y un conjunto de instrucciones relativamente grande para el manejo
eficiente de gráficos. Actualmente tienen un puerto dedicado denominado AGP (Accelerated
Graphics Port). Es posible que algunas tarjetas base no cuenten con este puerto, en ese caso
tendría que conseguirse una tarjeta controladora de vídeo tipo PCI.
La tarjeta controladora SCSI se inserta en algún slot PCI y está compuesta por un procesador,
microcódigo y cierta cantidad de memoria para procesar los mensajes del protocolo SCSI. Los
discos duros tienen su tarjeta controladora integrada en uno de sus lados y es la que permite
la conexión con los puertos IDE o SCSI. Tiene también un procesador y microcódigo para
realizar algunas tareas como el mapeo de sectores erróneos, el almacenamiento en búfer y el
almacenamiento en caché.
La CPU se comunica con las tarjetas controladoras de varias formas. Es común que éstas
dispongan de un conjunto de registros, por ejemplo, pueden tener:
1. registros de entrada.
2. registros de salida.
3. registros de control.
4. registros de estado.
La CPU colocará un valor en el registro de salida y luego colocará otro valor en el registro de
control. De esta forma le indica que realice la operación designada por el registro de control. En
el registro de estado el controlador indicará si hubo problemas cuando se realizó la operación, o
si está listo para recibir más datos, o alguna otra información relevante.
198 4.2. MECANISMOS Y FUNCIONES DE LOS MANEJADORES DE DISPOSITIVOS
Cuando es necesario procesar muchos datos, cientos o miles de bytes, la tarjeta controlado-
ra puede tener acceso directo a memoria. En este caso, los registros de entrada y salida están
mapeados a localidades de memoria, pero la CPU ahora transferirá toda la información en esa
área de memoria y luego colocará la operación que desea que se ejecute sobre eso datos en los
registros de control.
Para saber sobre el resultado de la operación pedida a la tarjeta controladora, la CPU leerá
los registros de estado. Muchas veces es necesario informarse primeramente sobre el estado
de un dispositivo antes de intentar que realice una operación. En estos casos, la CPU leerá
primeramente los registros de estado y si el dispositivo se encuentra listo procederá a colocar
la información en los registros de entrada/salida, colocar el número de orden en los registros de
control y nuevamente leerá los registros de estado para averiguar so la operación tuvo éxito o
no.
Como la CPU corre varios órdenes de velocidad más que el proceso de los datos, la CPU
después de colocar los datos y la instrucción en los registros correspondientes, regresará al-
gún tiempo después a verificar los registros de estado. La mayoría de las tarjetas controladores
interactúan con la CPU vía interrupciones de hardware y éste generará una interrupción para
indicarle a la CPU que ha sucedido algo relevante en el procesamiento de los datos. En general
estos eventos pueden ser:
Algunos sistemas usan ambas técnicas, por ejemplo, un sistema de computadora personal
utiliza instrucciones de entrada salida para controlar algunos dispositivos que no manejan mu-
chos bytes, pero maneja algunos otros con mapeo de entrada salida a memoria.
2. Hacer una interface sencilla para que pueda usarla el sistema operativo.
5. Los programas pueden acceder a cualquier dispositivo de E/S sin especificarlo a priori.
6. Nomenclatura uniforme.
7. independiente de la máquina.
8. Manejo de errores.
Es lógico que todo usuario que compra una tarjeta controladora es para obtener de ella su
máxima capacidad y de esta manera hacer más rápido su trabajo, permitirle al usuario explotar
su hardware completamente a través del sistema operativo es uno de los primeros objetivos. El
fabricante, debe proporcionar confiabilidad y desempeño para poder competir por la preferencia
del usuario.
A su vez debe proporcionar la interfaz adecuada con el sistema operativo de modo que éste
pueda soportar completamente su dispositivo.
Debe proporcionar a los programadores una amplia gama de instrucciones de modo que pue-
dan extraer todas las capacidades del hardware. Incluso hay fabricantes de dispositivos, como
por ejemplo, los que fabrican las grabadoras de CDROM o DVD que incluyen junto con su ma-
nejador de dispositivo, programas de usuario final completamente funcionales o en su defecto,
200 4.2. MECANISMOS Y FUNCIONES DE LOS MANEJADORES DE DISPOSITIVOS
están asociados con las compañías de producción de software de grabación e incluyen progra-
mas a prueba durante cierto tiempo o con algunas características deshabilitadas, en donde con
algunas facilidades o descuentos pueden habilitarlos para su completa funcionalidad.
Actualmente, incluso las compañías ensambladoras de PC desarrollan algunos programas de
usuario final de modo que sea mucho más sencillo para éste hacer uso de todas las capacidades
que incluyen en sus equipos sin que el usuario tenga que pagar costos adicionales por el softwa-
re. Aunque comúnmente, estos programas son para periféricos específicos como grabadoras de
CDROM, cámaras de vídeo impresoras y dispositivos digitalizadores y no cuentan con muchas
de las capacidades del software propietario expresamente diseñado para usuarios avanzados.
En cuanto a la independencia del dispositivo el sistema operativo debe proporcionar los
mecanismos adecuados para poder estandarizar en la medida de los posible las llamadas a los
dispositivos de entrada/salida. La independencia de máquina se refiere al hecho que las llamadas
al sistema deben de ser fáciles de portar y además debe de haber un manejo adecuado y también
estándar para los errores que puedan generarse durante una operación de entrada salida.
1. Sondeo.
2. Manejadores de interrupciones.
En la sección 4.1.2 hablamos acerca de cómo el sistema operativo puede establecer comuni-
cación con la tarjeta controladora y la manera mediante la cual hace uso de los registros de
entrada/salida o mapeo a memoria, los registros de control y de estado. Para darnos una idea
más completa acerca de este vamos a explicar un poco el proceso de control completo que lleva
a cabo el sistema operativo con un dispositivo, mediante las dos técnicas de sondeo e interrup-
ciones.
4.2.2.1. Sondeo
proporcionados anteriormente o haciendo alguna rutina de supervisión. cuando termina esta ac-
tividad borrará este bit de modo que ahora indique que se encuentra desocupado de esta forma
está avisando que se encuentra lista para recibir más datos u otras órdenes. La CPU le indica a la
tarjeta controladora que quiere procesar información poniendo el bit preparado activo para indi-
carle que en el registro de control existe ya una orden disponible con los datos correspondientes
en los registros de entrada o en el área de memoria mapeada. El proceso completo lo podemos
ver como sigue:
1. La CPU lee repetidamente el bit de ocupado hasta dicho bit esté en cero (desocupado)
4. Cuando la tarjeta controladora observa que está activado el bit de orden lista en el registro
de control, activa el bit de ocupada
6. Cuando ha terminado la operación la tarjeta controladora borra el orden lista, borra el bit
de error en el registro de estado para indicar que la operación de entrada salida ha tenido
éxito y borra también el bit de ocupado para indicar que ha finalizado y está lista para
recibir más órdenes.
Este ciclo se repite para cada byte. En el paso 1, la CPU se encuentra en un estado de
espera activa o sondeo: ejecuta un ciclo leyendo repetidamente el registro de estado hasta que
se desactive el bit de ocupado. Si la tarjeta controladora es de alta velocidad y el dispositivo
también, este método resulta razonablemente rápido, pero si la espera es larga, sería entonces
conveniente que la CPU conmutara a otra tarea. Más si hace esto no habrá forma de saber si la
tarjeta controladora ya terminó su operación de entrada salida. En algunos dispositivos la CPU
debe proporcionar un flujo continuo de datos hacia la controladora, de otra forma habría una
pérdida de datos. por ejemplo, cuando se graba un CDROM, si la unidad se queda sin datos, el
disco seguirá girando y dejará entonces un área sindatos haciendo el disco inutilizable. Incluso
aunque la mayoría de las grabadoras tienen búferes dedicados, si la CPU tarda más tiempo del
debido en enviar los datos puede correrse el riesgo de que el búfer también se vacíe.
Es común que una operación de sondeo no involucre más de cuatro operaciones para la CPU:
por ejemplo:
202 4.2. MECANISMOS Y FUNCIONES DE LOS MANEJADORES DE DISPOSITIVOS
ciclo:
IN AL, Puerto
AND AL,0001000b
JNZ masdatos:
JMP ciclo
fin:
Como puede verse, la operación de sondeo resulta ser muy eficiente. Sin embargo, estas
operaciones se encuentran dentro de un ciclo, lo que puede hacerla en extremo ineficiente si es
que la tarjeta controladora no es tan rápida como la CPU. En este caso la CPU va a encontrarse en
muchas ocasiones que la tarjeta controladora aún no está lista para recibir más datos, mientras
que otras tareas que serían más útiles tendrían que esperar a que la CPU se desocupe para
continuar con su procesamiento normal.
En los casos en donde el dispositivo es demasiado lento, es más eficiente que la controladora
avise a la CPU cuando ya terminó de hacer su tarea en lugar de que ésta espere leyendo su
registro de estado. A este mecanismo se le conoce como interrupción y lo analizaremos en el
siguiente apartado.
4.2.2.2. Interrupciones
1. El hardware de la CPU tiene un pin llamado línea de solicitud de interrupción que la CPU
comprueba vía hardware después de ejecutar cada instrucción.
2. Cuando la CPU detecta que una tarjeta controladora ha activado una señal a través de esta
línea, la CPU guarda el estado actual y salta a la rutina de servicio de interrupción situada
en una dirección fija de la memoria.
6. Regresa a la tarea que estaba ejecutando en el mismo instante en que fue interrumpida.
CAPÍTULO 4. ADMINISTRACIÓN DE ENTRADA/SALIDA 203
Interrupciones no enmascarables. Son aquellas que están reservadas para sucesos que
se refieren al hardware de la computadora y que no pueden ser retrasadas.
El mecanismo de interrupción acepta una dirección, que es el número que selecciona una
rutina específica de servicio de interrupciones de entre un pequeño conjunto de rutinas dispo-
nibles. En muchas de las arquitecturas, esta dirección es simplemente un desplazamiento que
empieza a contar desde la parte baja de la memoria y que se denomina vector de interrupciones.
Este vector contiene las direcciones de memoria de las rutinas especializadas en el servicio
de interrupciones. El propósito de este mecanismo es reducir la necesidad de que una única rutina
204 4.2. MECANISMOS Y FUNCIONES DE LOS MANEJADORES DE DISPOSITIVOS
de tratamiento de interrupciones tenga que analizar todas las posibles fuentes de interrupción
para determinar qué dispositivo la generó.
de suceso no manejable, en caso de que ninguna las rutinas haya podido dar servicio al evento.
Estas estructuras presentan el compromiso entre el gasto asociado a disponer de una tabla de
interrupciones de gran tamaño y la poca eficiencia que se experimenta a la hora de proporcionar
servicio a las interrupciones con la otra opción que consiste en proporcionar una sola rutina de
servicio de interrupción.
En la tabla 4.2 vemos la asignación del número de interrupción con la del evento que lo ge-
nera. Dentro cada elemento del vector de interrupciones tenemos comúnmente un par de direc-
ciones de tipo CS:CP. Esto es, tenemos la dirección del segmento de código y su correspondiente
desplazamiento para el contador del programa dentro de ese segmento.
También podemos observar que las interrupciones en el rango de 0-31, son no enmascarables
y se utilizan para señalizar diversas condiciones de error. Las interrupciones que van de la 32 a la
255, son enmascarables, se utilizan para todas las interrupciones generadas por los dispositivos.
El mecanismo de interrupciones también implementa un sistema de niveles de prioridad de
interrupción. Este mecanismo permite a la CPU diferir el tratamiento de las interrupciones de ba-
ja prioridad sin enmascarar todas las interrupciones. También hace posible que una interrupción
de alta prioridad desaloje a otra interrupción de prioridad más baja.
Los sistemas operativos actuales interactúan con el controlador de interrupciones de varias
formas. En primer lugar, durante el arranque, el sistema operativo comprueba los buses hard-
ware pare determinar qué dispositivos existen e instalar las rutinas de servicio de interrupción
correspondientes dentro del vector de interrupciones. Durante las operaciones de entrada salida,
las diversos controladores de dispositivos generan interrupciones cuando están listas para llamar
la atención a la CPU. Estas interrupciones pueden indicar que ha terminado una operación de
entrada salida o que hay disponibles datos para ser leídos o que acaba de ocurrir algún error que
debe ser atendido.
El mecanismo de interrupciones también se utiliza, como puede verse en la tabla 4.2 para
manejar las excepciones, como la división por cero, el acceso no autorizado a localidades de
memoria protegidas o que están más allá de la memoria física y virtual. También existen algunas
interrupciones que son usadas por los depuradores, por ejemplo, la interrupción uno y la tres.
En resumen todas las interrupciones no enmascarables obligan a la CPU a ejecutar rutinas
que se consideran como urgentes, por la gravedad o importancia de la excepción.
módulos para que éste pueda manejar adecuadamente su dispositivo. A este conjunto de rutinas
se les denomina manejador de dispositivo. En realidad es el manejador de dispositivo el que
interactúa con el sistema operativo y la tarjeta controladora.
En la figura 4.2 podemos ver cómo el sistema operativo provee solamente una interfaz que
se denomina subsistema de entrada salida del kernel mediante la cual se acoplan todos los
manejadores de dispositivo de manera que puedan interactuar ambos.
El tipo de interacción entre el manejador y el sistema operativo puede ser de dos tipos:
Entrada/Salida programada. También llamada PIO (programmed I/O). Bajo este esquema, el
manejador solicita a la CPU byte por byte y lo va procesando tal como van llegando. Como
puede verse, es computacionalmente hablando muy caro. La mayoría de los manejadores
evita esta sobrecarga y los fabricantes comúnmente agregan un procesador dedicado para
ejecutar esas tareas.
de DMA el cual ejecuta esta tarea mediante la tarjeta controladora de DMA que se encarga de
sincronizarse en el acceso directo a la memoria procurando lo menos posible intervenir con
la CPU. Esto es, este controlador es el que se encarga de hacer uso del bus de direcciones y
de datos para realizar la transferencia efectiva entre el manejador de dispositivo y la memoria
sin la intervención de la CPU. Mientras se esté realizando una transferencia entre la tarjeta
controladora y la memoria , la CPU no podrá realizar ningún acceso a memoria, aunque sí
puede acceder a su memoria caché a a la memoria secundaria. A esto se le conoce como robo
de ciclos puesto la CPU tiene que esperar a que se desocupe el bus para acceder a la memoria si
es que está ocupada.
Cuando se ha terminado la tarea el manejador de DMA envía una interrupción al procesador
para indicar que la tarea ha sido concluida.
1. Planificación.
2. Almacenamiento en búfer.
3. Almacenamiento en caché.
4. Administración de colas.
5. Reserva de dispositivos.
6. Tratamiento de errores.
2. Permite adaptar el tamaño de transferencia de datos que pueden tener dispositivos diferen-
tes. Esto es el tamaño de búfer interno puede variar de dispositivo a dispositivo. Entonces
con un búfer intermedio puede resolverse este problema.
3. Permite también mantener la integridad de los datos durante una transferencia de datos.
Esto suele pasar cuando una aplicación hace una llamada al sistema operativo para escribir
información de su búfer, el sistema operativo copia primero esos datos a otro búfer y libera
a la aplicación. Si la aplicación hace cambios en su búfer, éstos no se reflejarán en disco
puesto que fueron hechos después de la llamada de escritura.
Como es de esperarse, el sistema operativo debe de tener control absoluto sobre cualquier
intento de entrada salida que desee llevar a cabo el usuario. Esto es así debido a que es la única
forma de verificar si el usuario realmente tiene derecho a efectuar algún tipo de operación de
entrada salida. Como podemos ver, entonces la mayoría del software de entrada salida se va
a encontrar en el sistema operativo y éste proporcionará un conjunto de llamadas (llamadas
al sistema) que permitirá al usuario interactuar con los dispositivos de entrada salida bajo la
supervisión del kernel.
La biblioteca estándar stdio.h es un buen ejemplo de ello. Si el usuario desea leer un bloque
de datos de un archivo usará entonces la instrucción read(file-des,buffer, bytes-solicitados)
esta función quedará enlazada en el programa del usuario, pero el sistema operativo se encarga
primeramente de verificar que el usuario tenga los derechos pertinentes de lectura del archivo
solicitado antes de leer los datos de disco. Entonces, aunque el usuario tiene una amplia gama de
funciones que puede usar para llevar a cabo sus tareas, el sistema operativo verificará si es que
tiene los permisos correspondientes sobre el recurso que está solicitando para que pueda llevarse
a cabo la solicitud.
Hay que aclarar que el sistema operativo puede delegar algunas tareas a procesos especia-
lizados en algún dispositivo de entrada salida, por ejemplo, tenemos al servidor de impresión.
Un usuario envía su trabajo a una impresora que en realidad está representada por una cola de
impresión. La cola de impresión mantendrá el trabajo hasta que sea su turno de enviarlo real-
mente a la impresora. En este caso, el servidor de impresión es el único proceso que tiene acceso
directo a la impresora de modo que ningún usuario puede hacer uso directo de ésta a no ser que
sea por medio de ese servidor.
1. Es muy rápido en comparación con un disco tradicional, puesto que se accede a memoria
en lugar de un disco duro tradicional.
2. Puede formatearse.
3. Es transparente a las aplicaciones, puesto que no habrá diferencia en cuanto a las instruc-
ciones que se usarán para acceder a éste.
4. Se pueden tener tantos discos RAM como se deseen, restringiendo solamente a la cantidad
de memoria física con la que cuente el sistema y la que necesita el sistema operativo para
poder funcionar adecuadamente.
2. Quita gran cantidad de memoria al sistema operativo, lo que puede ocasionar que baje el
desempeño del sistema, teniendo que hacer más intercambio con el disco físico.
3. La memoria RAM es volátil y en el momento que se quita la energía eléctrica los datos se
pierden.
De acuerdo con esas ventajas, podemos básicamente ejecutar cualquier servicio cuyos da-
tos puedan caber en el disco RAM. Por ejemplo, un servidor DNS, cuyos archivos son muy
pequeños o un sitio web que no exceda, por ejemplo, los 128Mbytes.
En caso de hacerlo, hay que recordar que antes de que pueda funcionar adecuadamente es
necesario copiar la información del disco normal al disco RAM. A partir de ese momento, las
consultas al servidor WEB serán mucho más rápidas, por que ya no se tendrá que hacer un
acceso al disco duro.
También sería posible poner una base de datos pequeña en un disco RAM, principalmente
aquellas en donde es predominante la lectura y con pocos o ningún acceso de tipo escritura. En
caso de que haya escrituras, se debe sincronizar la base de datos del disco RAM con la base de
212 4.4. OPERACIONES DE ENTRADA/SALIDA
datos en disco duro, cada cierto tiempo, para poder reflejar los cambios en los datos cuando el
servidor se reinicie.
En la figura 4.3 muestra cómo se distribuye la memoria cuando se da de alta un disco RAM.
El disco RAM se divide en n bloques, según la cantidad de memoria que se haya asignado.
Cada bloque es del mismo tamaño del que es usado en un disco real. cuando el manejador
recibe un mensaje para leer o escribir un bloque, simplemente determina el lugar en la memoria
correspondiente al disco RAM y efectúa la operación. La forma de hacer un disco RAM en
Linux es la siguiente:
Con las órdenes quedaría así: mkdir -p /media/ramdisk0 mkfs -t ext3 /dev/RAM0 mount
/dev/RAM0 /media/ramdisk0
A partir de este momento se puede usar como cualquier otra partición.
4.4.2. Discos
Los discos, hasta ahora, han sido el medio de almacenamiento secundario más usados. Un
disco duro, es un dispositivo que puede grabar y recuperar grandes cantidades de información en
tiempos relativamente rápidos en comparación con otros medios de almacenamiento secundario,
como por ejemplo, las unidades de CDROM o las cintas magnéticas.
Un disco duro está compuesto de varios elementos. Por ahora describiremos el funciona-
miento general de éste. En primer lugar, la información se almacena en unos finos platos o
discos, generalmente de aluminio, recubiertos por un material sensible a alteraciones magnéti-
cas. Estos discos, cuyo número varía según la capacidad de la unidad, se encuentran agrupados
uno sobre otro y atravesados por un eje, y giran a gran velocidad.
Cada disco posee dos diminutos cabezales de lectura/escritura, uno en cada cara. Estos ca-
bezales se encuentran flotando sobre la superficie del disco sin llegar a tocarlo, a una distancia
de unas 3 o 4 micropulgadas, siendo una distancia mucho menor que el diámetro de un cabello
humano. Por ello, es importante nunca abrir un disco duro (a menos que ya no funcione), por
que simple y sencillamente, al momento de abrirlo, le caerá polvo y este hará que las cabezas,
rayen la superficie de los datos, con el consecuente daño permanente del disco. Estos cabezales
generan señales eléctricas que alteran los campos magnéticos del disco, dando forma a la infor-
mación. (dependiendo de la dirección hacia donde estén orientadas las partículas, valdrán 0 o
valdrán 1).
La distancia entre el cabezal y el plato del disco determinan la densidad de almacenamiento
de éste, ya que cuanto más cerca estén el uno del otro, más pequeño es el punto magnético y así
podrá almacenar más información.
En la figura 4.4 podemos ver la distribución de sus elementos de hardware más sobresalien-
tes. En general, está compuesto por su tarjeta controladora, los platos o discos y el brazo que
sostiene las cabezas de lectura/escritura. Para poder mover todos estos elementos cuenta con
dos motores: el que hace girar los discos a alta velocidad y un motor de pasos que hace que se
posicione la cabeza de lectura escritura en un lugar radial predeterminado.
Una unidad de disco está compuesto por el controlador de disco y además contiene un paque-
te de discos, también denominado volumen. El paquete de discos está formado por un conjunto
214 4.4. OPERACIONES DE ENTRADA/SALIDA
de superficies cubiertas de una capa que puede magnetizarse o desmagnetizarse (discos) monta-
dos sobre un eje.
Cuando opera, el eje y los discos rotan a una alta velocidad, dependiendo de la tecnología,
actualmente encontramos velocidades que van desde las 5400 revoluciones por minuto (RPM)
y 7200.2 RPM en discos IDE y SATA hasta las 10,000 y 15000 RPM en discos con tecnología
SCSI . Los datos se graban sobre las pistas, que son circulares y que se encuentran sobre cada
superficie. Las pistas que se encuentran unas sobre otras forman cilindros.
Tenemos un conjunto de cabezas de lectura/escritura ubicadas al final de un brazo que se
mueven como un grupo, de tal forma que éstas pueden ser posicionadas sobre todas las pistas de
un mismo cluster. De este modo, toda la información de un cluster puede ser accedida sin tener
que mover el brazo, que es la operación más lenta.
Un cilindro por tanto, puede leerse completamente en un sólo giro de los platos del disco sin
tener que mover las cabezas de lectura/escritura.
Las pistas se dividen en porciones, que son las unidades más pequeñas de espacio que se
pueden acceder, y pueden ser sectores o bloques.
En la figura 4.5 podemos ver gráficamente cómo están definidas estas divisiones lógicas de
disco.
sectores. Son divisiones físicas y, por tanto, de tamaño fijo. Los sectores van numerados, de
modo que sectores consecutivos tienen números consecutivos. Es común que un sector
sea accedido de una sola vez por una cabeza lectora/escritora.
Cilindros. Un cilindro está compuesto por todos los clusters que se encuentran en la misma
pista y que pueden accederse sin mover las cabezas de lectura/escritura, pero los platos
CAPÍTULO 4. ADMINISTRACIÓN DE ENTRADA/SALIDA 215
Clusters. Un cluster es una cantidad fija de sectores contiguos, Por lo común se de-
nomina cluster a aquellos sectores que pueden ser accedidos por todas las cabezas
lectoras/escritoras en una sola operación en la posición en que se encuentran y cons-
tituye la unidad de espacio más pequeña que se puede asignar a un archivo. Una vez
se localiza un cluster, no hay que mover las cabezas para leer todos sus sectores.
Extent. Un extent es un trozo de archivo formado por varios clusters contiguos. Me-
diante ellos se pretende enfatizar más la contigüidad física de los sectores. Lo ideal
(en acceso secuencial) es tener un solo extent. Cuantos más haya, más desperdiga-
do estará el archivo y, por lo tanto, más tiempo se dedicará a mover las cabezas de
lectura/escritura.
216 4.4. OPERACIONES DE ENTRADA/SALIDA
Bloques. Son divisiones lógicas y, por lo tanto, su tamaño es variable. Este tamaño puede ser
distinto para cada aplicación, y se puede fijar como un múltiplo del tamaño de registro,
por lo que no hay problemas de fragmentación interna. Los bloques contienen datos e
información sobre los datos: tamaño en bytes y, en ocasiones, una clave indicando, por
ejemplo, el valor de algún campo clave del último registro del bloque. Además, hay in-
formación invisible al programador al principio de cada bloque, más cantidad que con los
sectores.
Cuando las pistas se encuentran divididas en sectores hay problemas de fragmentación in-
terna debido a que todos los sectores son del mismo tamaño: si en un sector no cabe un múltiplo
del número de registros, hay huecos.
Al principio de cada sector hay información invisible al programador en donde figura la
dirección del sector, la dirección de la pista en la que se encuentra y su condición (en buen
estado o defectuoso).
Comparando sectores y bloques, estos últimos ofrecen mayor flexibilidad: se ahorra tiempo
y se consigue mayor eficiencia, ya que el programador determina cómo se van a organizar los
datos en disco. Los bloques son superiores a los sectores cuando se desea que la localización
física de los archivos corresponda con su organización lógica. Sin embargo, el programador y/o
el sistema operativo deben hacer trabajo extra para determinar la organización de los datos.
La dirección de un registro en disco, normalmente necesita información sobre el número de
cilindro o el número de cluster, la superficie y el sector o bloque.
Costo del acceso a disco En general, existen tres factores que afectan directamente a la veloci-
dad con que los datos se transfieren entre disco y memoria principal. Cada uno de estos factores
consume un tiempo y conlleva una operación física.
Refiérase a la sección 1.1.1.2 para ver algunas tasas de transferencia comunes en los discos
duros.
Tiempo de búsqueda (seek). Es el tiempo necesario para mover el brazo con las cabezas de
lectura/escritura desde su posición actual hasta el cilindro direccionado. El brazo puede
estar sobre el cilindro deseado, tener que ir al siguiente cilindro o al otro extremo del
disco; por lo tanto, dependiendo de la distancia a recorrer, será más o menos caro. En un
sistema multiusuario este tiempo es más notable ya que cada usuario estará accediendo
a un archivo distinto y lo más probable es que en cada acceso de cada usuario haya que
emplear un tiempo de búsqueda que será, por término medio, el tiempo de recorrer un
tercio del número de cilindros.
CAPÍTULO 4. ADMINISTRACIÓN DE ENTRADA/SALIDA 217
Tiempo de rotación (latencia). El disco debe girar hasta que la cabeza esté situada sobre el
sector a leer o escribir. El tiempo medio es el tiempo requerido para dar media vuelta.
Tiempo de transferencia. Es el tiempo empleado en leer o escribir los datos. Este tiempo es
función del número de bytes transferidos (número de bytes transferidos / número de bytes
por pista ∗ tiempo de dar una vuelta).
Hasta ahora hemos analizado, de forma general la estructura física de un disco duro. El sis-
tema operativo debe de establecer ciertas divisiones que agrupan a varios bloques, clusters o
cilindros en unidades más grandes denominadas particiones y además debe de incluir la infor-
mación necesaria para poder manejar un disco.
De acuerdo a lo anterior un disco será dividido lógicamente en los siguientes espacios:
Sector de Arranque. Llamado también Master Boot Record (MBR) por sus siglas en inglés
o registro de arranque maestro. Es en este lugar donde el BIOS buscará un cargador de
sistema operativo.
Particiones. Las particiones son conjuntos de bloques, clusters o cilindros que serán manejados
como una unidad. Deben definirse en el momento de la instalación del sistema operativo
o con un programa especializado (comúnmente se llama fdisk). Una partición también
puede marcarse como arrancable. Esto indicará al cargador que está en el Master Boot
Record que proporcione las diferentes opciones al usuario para que pueda cargar otros
sistemas operativos. No todos los cargadores reconocen o dan estas opciones al usuario.
Existen dos tipos de particiones:
En la sección anterior hablamos acerca de la estructura general del disco duro. En este apar-
tado nos concentraremos en el software que se debe de utilizar para poder tener funcionando un
disco duro.
Lo primero que se debe hacer al comprar un disco duro, es instalarlo dentro de nuestro
sistema de computadora. De acuerdo al tipo de disco duro, podemos tener tres, como se comentó
en la sección 1.1.1.2 Discos IDE, SATA y SCSI. Cada uno de ellos trae sus propios conectores
y es inconfundible la forma de conectarlos.
Después de haber instalado el disco duro, el siguiente paso es decidir el número de particio-
nes que vamos a necesitar. Por lo común hay que pensar primero si se van a tener dos sistemas
operativos. Como dijimos, cada uno debe de tener al menos una partición para el sistema ope-
rativo y otra para los datos. En caso de instalar alguna versión de windows con dos particiones
será suficiente. Si vamos a tener dos sistemas operativos, entonces hay que crear al menos cua-
tro particiones. Los sistemas basados en UNIX, como Solaris o Linux necesitarán al menos las
siguientes:
/ La partición Raíz. Aquí es donde se guardará el núcleo y los archivos de dispositivos, las
órdenes del sistema y los de usuario correspondientes al sistema operativo (/sbin y /bin) y
los archivos de configuración del sistema.
/var En esta partición se guardan los datos variables o que van cambiando continuamente, como
los archivos de logs o avisos del sistema y de otros servicios.
/tmp En esta partición se guardan datos temporales, como por ejemplo, visualizar un archivo,
pero sin descargarlo al espacio de usuario. En esta área,los archivos aquí guardados per-
manecerán poco tiempo que va desde un día hasta una semana. Por tanto no es correcto
usarla para guardar archivos importantes.
CAPÍTULO 4. ADMINISTRACIÓN DE ENTRADA/SALIDA 219
El programa que se usa para llevar a cabo el particionado de disco se llama fdisk. En el
entorno gráfico de windows tiene una herramienta que se llama administrador de discos. Tanto
en unix como en linux se llama fdisk. Es recomendable saber primero los nombres de los discos
un sistema UNIX/Linux. Esto se consigue con la opción fdisk -l. En el siguiente listado vemos
una salida típica de la ejecución de este comando.
debian:/home/nalonzo# fdisk -l
Capacidad en Gb y en bytes.
Total de unidades.
220 4.4. OPERACIONES DE ENTRADA/SALIDA
Como puede observarse, en el listado tenemos dos discos duros, uno que se llama hda de 160
Gb, que tiene dos particiones /dev/hda1 con formato del tipo 7 NTFS y /dev/hda2 formateada
con FAT32 modo LBA y otro que se llama sda de 250 Gb y que tiene nueve particiones tres
particiones primarias y seis extendidas. La primera partición tiene formato NTFS y la segunda
FAT32 LBA. La tercera partición corresponde a la partición raíz de linux. La partición extendida
tiene cinco particiones: la partición de swap o intercambio y cuatro de tipo linux. En este caso
formateadas como ext3.
Obviamente si el disco es nuevo solamente aparecerán los datos del disco sin ninguna par-
tición. por lo tanto es necesario ejecutar el comando fdisk /dev/nombredisco en donde nom-
bredisoco podría ser hda o sda en nuestro caso
En el siguiente listado observamos cual es el menú que despliega este comando.
en donde tenemos las opciones necesarias para definir nuestras particiones desde borrarlas,
crear nuevas, definir su tipo y guardar los cambios a disco.
Hay que tener en cuenta que si ejecutamos esta operación sobre un disco que contenga
información, al momento de guardar los cambios hechos a las particiones todos los datos se
perderán, por eso debemos estar conscientes de qué es lo que realmente queremos hacer, puesto
que va a ser muy difícil recuperar los datos una vez hecho el reparticionado del disco.
Ya que se ha hecho el particionado adecuado, ahora se procede a formatear cada partición.
Esto se hace con la orden mkfs. En el siguiente listado vemos un fragmento de la ayuda de esta
orden.
DESCRIPTION
mkfs is used to build a Linux file system on a device,
usually a hard disk partition. filesys is either the
device name (e.g. /dev/hda1, /dev/sdb2) or the mount
point (e.g. /, /usr, /home) for the file system.
Blocks is the number of blocks to be used for the
file system.
OPTIONS
-V Produce verbose output, including all file
system-specific commands that are executed.
Specifying this option more than once inhibits
execution of any file system-specific commands.
This is really only useful for testing.
-t fstype
Specifies the type of file system to be built.
If not specified, the default file system type
(currently ext2) is used.
fs-options
File system-specific options to be passed to the
real file system builder. Although not guaranteed,
the following options are supported by most file
system builders.
-l filename
Read the bad blocks list from filename
BUGS
All generic options must precede and not be combined
with file system-specific options. Some file system-
CAPÍTULO 4. ADMINISTRACIÓN DE ENTRADA/SALIDA 223
AUTHORS
David Engel (david@ods.com)
Fred N. van Kempen (waltje@uwalt.nl.mugnet.org)
Ron Sommeling (sommel@sci.kun.nl)
The manual page was shamelessly adapted from Remy
Card’s version for the ext2 file system.
SEE ALSO
fs(5), badblocks(8), fsck(8), mkdosfs(8), mke2fs(8),
mkfs.bfs(8), mkfs.ext2(8), mkfs.ext3(8), mkfs.minix(8),
mkfs.msdos(8), mkfs.vfat(8), mkfs.xfs(8), mkfs.xiafs(8)
Version 1.9
Esta es una orden que permite formatear una partición con el tipo especificado. por ejemplo
mkfs -t ext3 /dev/hda1 formateará hda1 con un sistema de archivos ext3. Después de este paso,
el sistema operativo estará listo para poder guardar información en esa partición.
En un entorno windows, en el ambiente gráfico, aparecerá la unidad después de que ésta
ha sido definida como partición. En el ícono “Mi PC” damos click con el botón derecho para
obtener el menú secundario y se selecciona la opción “Formatear” la unidad. Si se desea hacerlo
desde la línea de comandos se usará la orden format y nombre de la unidad, por ejemplo, for-
mat d:. Despúes de haber formateado la unidad, ahora podemos hacer uso de ella para guardar
archivos.
1. El tiempo de localización. Este es el tiempo que tarda el brazo del disco en ubicarse en
el cilindro correspondiente.
2. Retardo rotatorio. Es el tiempo en que tarda en girar el disco para ubicarse en el bloque
correspondiente en el cilindro dado.
224 4.4. OPERACIONES DE ENTRADA/SALIDA
3. Tiempo de transferencia. Es el tiempo que tarda la circuitería en leer los datos del cabezal
y transmitirlos a la CPU.
Para la mayoría de los discos, la operación que más se lleva tiempo es la del posicionamiento
del brazo junto con el cabezal en el cilindro correspondiente.
En base a lo anterior, se puede mejorar el desempeño del sistema planificando adecuadamen-
te el acceso al disco. Existen las siguientes estrategias que pueden implementarse:
FCFS. First Coming First Served. La primera en llegar, la primera en ser atendida. El brazo
atenderá las solicitudes como van llegando, lo que implica que en ocasiones tendrá que
recorrer el disco de inicio a fin.
SSF. Shortest Served First Atender primero a la solicitud más cercana. Las solicitudes se guar-
dan en una lista y ésta se ordena de acuerdo a la posición actual del brazo de modo que
éste atenderá aquella solicitud que se encuentre más cerca haciendo entonces el movi-
miento más corto posible entre dos peticiones. aunque a primera vista el algoritmo parece
eficiente tiene le problema de que el brazo puede quedarse a mitad de disco generando a
veces largos tiempos de espera, en las siguientes solicitudes.
Algoritmo del elevador Consiste en ir atendiendo todas las solicitudes generadas en una direc-
ción. Cuando termine empezará a servir las solicitudes en la dirección contraria.
4.4.3. Relojes
Los relojes son el medio por el cual funciona la CPU. Básicamente todo sistema de compu-
tadora cuenta con un cristal de cuarzo que vibra a determinada frecuencia. Incluso, cuando se
compra un procesador, lo primero que se hace es saber a qué velocidad de reloj trabajará éste.
Actualmente se cuentan con procesadores capaces de trabajar a velocidades que varían desde
los 800 MegaHertz hasta los 4 GigaHertz o más. Un Hertz está definido como el tiempo que
transcurre durante un ciclo completo, donde un ciclo se define como un pico y un valle. En la
figura 4.6 podemos ver la onda cuadra generada por el reloj, después de haber sido amplificada
por un circuito electrónico para ese fin.
En los sistemas de computadora actuales tenemos un reloj. Como dijimos, éste está basado
en ticks de reloj o pulsos de reloj. Un pulso se define como un Hertz y se generan mediante
cristales de cuarzo, el cual al ser cortado y sometido a cierta presión empezará a vibrar a una
CAPÍTULO 4. ADMINISTRACIÓN DE ENTRADA/SALIDA 225
2. Un amplificador de señal.
3. Un Contador.
El oscilador de cristal tiene una amplitud muy pequeña, pero su frecuencia de vibración es
muy exacta, la señal del cristal de cuarzo es enviada a un amplificador, el cual devolverá una
señal ya útil para el sistema de computadora, comúnmente entre cero y cinco voltios. Los con-
tadores permiten disminuir la frecuencia de la señal, de tal forma que pueda ser utilizada para
diversos fines. Uno de ellos, por ejemplo, es llevar la cuenta del tiempo transcurrido Por ejemplo,
si tenemos un contador de decenas, éste generará un pulso cada vez que cuente diez ciclos de re-
loj, por lo tanto, hemos dividido la frecuencia de reloj por un factor de diez, así para contabilizar
los segundos es necesario calcular a cuantos ticks equivale y activar un contador que mida esa
proporción. En la realidad se tienen contadores que proporcionan tiempos de microsegundos y
milisegundos para cumplir con estas tareas.
Para implementar un reloj que lleve la hora del día se puede al usuario que introduzca la hora
actual,entonces el sistema calcula el número de pulsos que han transcurrido a partir de las 12
A.M. del 1 de enero de 1970, como lo hacen actualmente los sistemas basados en UNIX/Linux.
226 4.4. OPERACIONES DE ENTRADA/SALIDA
para evitar que la hora se pierda cuando el sistema se desconecta, esta información queda guar-
dada por la BIOS utilizando un registro que se alimenta por una baria interna.
Como hemos visto el reloj hardware lo que hace es proporcionar ticks de reloj muy precisos.
Estos ticks pueden usarse para generar interrupciones dirigidas a la CPU, de modo que éste pue-
da llevar a cabo tareas cada cierto tiempo. Estas tareas son llevadas a cabo por el manejador de
reloj. Las tareas que debe de llevar a cabo el manejador de reloj son comúnmente las siguientes:
3. El procesador necesita los ciclos de reloj para poder ejecutar sus instrucciones.
4. Hacen uso de él utilerías tales como cron y crontab para tareas repetitivas del adminis-
trador tales como respaldos y de los usuarios.
5. Obtención de estadísticas a altas horas de la noche cuando el uso del sistema es menor y
obtención de tiempos de ejecución de algunos procesos para ver su eficiencia.
La implementación del manejador de reloj puede llevarse a cabo de tal forma que contenga
las siguientes rutinas básicas:
1. TIME orden
2. DATE
4. TIMES
En Linux, se tiene la función time orden. La orden time order ejecuta el programa orden
con los argumentos suministrados. Cuando termina la orden, time escribe un mensaje en la salida
estándar devolviendo las estadísticas temporales sobre la ejecución de este programa.
Estas estadísticas están compuestas por:
CAPÍTULO 4. ADMINISTRACIÓN DE ENTRADA/SALIDA 227
Para establecer la nueva fecha y hora Linux hace uso de la función date si no se dan pará-
metros entonces regresa la fecha y hora actual, en otro caso, establecerá la fecha indicada por
los parámetros de acuerdo a un formato preestablecido. La versión función de modo que pueda
ser llamada desde un programa C es times. y permite saber el tiempo de ejecución en ticks de
reloj de algún conjunto de instrucciones o procesos.
Para consultar el reloj linux proporciona otra instrucción denominada hwclock que permite
manipular directamente el reloj de hardware.
4.4.4. Terminales
Todo sistema de computadora cuenta al menos con dos dispositivos de entrada salida: un
teclado y una pantalla o monitor, siendo los medios más comúnmente usados por el usuario
para comunicarse con ésta. Aunque, físicamente, podemos decir que se encuentran separados,
en la mayoría de las ocasiones es necesario que el usuario observe en la pantalla lo que está
escribiendo, (incluso cuando teclea su contraseña, aparecen asteriscos en la pantalla), de modo
que aunque físicamente separados, ambos trabajan en estrecha relación. En las grandes compu-
tadoras, pueden existir decenas o incluso miles de usuarios conectados a la misma, mediante
un teclado y una pantalla a ambos se les ha llamado históricamente terminales, aunque en la
actualidad es también posible que una computadora personal esté siendo usada para conectarse
al servidor universitario, por ejemplo. Existen diferentes tipos de terminales. Las más comunes
son:
1. Terminal autónoma con interfase RS-232 en serie para usarse con mainframes.
3. Terminales de red, como las usadas por los servidores netra de Sun.
Las terminales RS-232 son dispositivos que contienen un teclado y un medio de despliegue,
tal como una pantalla y que se comunican mediante el uso de una interfaz en serie, esto significa
que solamente pueden transferir un bit en cada momento. Estas terminales emplean un conec-
tor de 25 pines1 . Obviamente se tienen dos tipos denominados DB25 macho y DB25 hembra,
comúnmente el conector hembra se encuentra en la terminal y el conector macho en el cable,
aunque también pueden existir cables con conectores macho-macho y macho-hembra.
En la figura 4.7, tenemos una imagen de los conectores de este tipo.
De estos 25 pines o conexiones, una se usa para transmitir los datos, otra para recibir los
datos y una tercera es tierra común. Las otras 22 conexiones son para funciones de control, y
muchas de ellas no se utilizan. De ahí que exista una versión simplificada de conectores, deno-
minados DB9, incluso, por ser tan pocos las conexiones utilizadas que es posible usar también
para conexiones serie, conectores RJ-45.
En la figura 4.8 tenemos las asignaciones de conexiones para el DB25. Observe que el pin
2 se usa para transmitir datos y que el pin 3 se usa para recibir los datos. El pin 7 es el que se
conecta a tierra o la masa. Los pines de control son el 4, 5, 6, 20 y 22.
En la figura 4.9 las correspondientes para el DB9. Observe que el pin 2 corresponde a datos
recibidos, el 3 a datos enviados el 5 corresponde a la masa o tierra y los restantes corresponden
a las líneas de control.
Una vez que hemos descrito los conectores, pasaremos ahora a describir el hardware que se
utiliza para la transmisión de datos. Como ya sabemos, en nuestro sistema de computadora existe
un puerto denominado com1 hasta com4 este nombre es el se le da en entornos windows. En
entornos basados en UNIX/Linux se les denomina tty1 hasta ttyn, no obstante, a nivel hardware
ambos están basados en un hardware denominado UART descrito al principio de esta sección y
que ahora profundizaremos un poco más. Para que la CPU pueda comunicarse con la terminal,
es necesario que ésta cuente entonces también con su UART. Ya que este requerimiento está
1
Un pin es una pequeña aguja que puede insertarse en otra entrada
CAPÍTULO 4. ADMINISTRACIÓN DE ENTRADA/SALIDA 229
satisfecho, ambas deben de configurarse bajo los siguientes parámetros de modo que pueda
haber una comunicación fiable. A esto se le conoce como configurar o sincronizar la transmisión.
Las frecuencias de transmisión van desde los 300, 1200, 2400, 4800, 9600 e incluso actualmente
pueden llegar a alcanzar velocidades de 54000 bps (bits por segundo) y más. En la tabla 4.3
podemos encontrar una lista de velocidades en las que se puede configurar la UART.
Esto significa que se pueden transferir bits a esa velocidad. Por ejemplo, si se configura la
UART para transferir a 2400 bps entonces, suponiendo que un caracter se codifique con 8 bits
estaría entonces transmitiendo aproximadamente 300 caracteres por segundo, se dice aproxima-
damente por que se ocupan algunos bits de control como los bits de paro, y el bit de paridad.
Debido a que las computadoras y las terminales trabajan con caracteres completos, es nece-
sario que la UART traduzca la secuencia de bits en caracteres para que éstos puedan ser usados.
Es común que las computadoras, tengan ya integrados los puertos correspondientes para el
manejo de terminales. Además, actualmente, es un poco complicado encontrar terminales tal
y como se describen aquí. Lo más normal es que encontremos computadoras de baja potencia
230 4.4. OPERACIONES DE ENTRADA/SALIDA
Tasa de Baudios MCR Bit 7=1 Tasa de Baudios MCR Bit 7=0
600 2400
1200 4800
2400 9600
4800 19.2k
9600 38.4k
19.2k 76.8k
38.4k 153.6k
57.6k 230.4k
115.2k 460.8k
En la figura 4.10 podemos ver los elementos básicos de un sistema orientado a terminales.
Observe que incluso, en hardware avanzado puede contarse con un dispositivo apuntador, como
por ejemplo, el ratón.
Las terminales ofrecen una manera adecuada y de bajo costo para acceder a un sistema de
computadora.
Uniendo todos los elementos, podemos decir entonces, que la CPU, envía uno o más caracte-
CAPÍTULO 4. ADMINISTRACIÓN DE ENTRADA/SALIDA 231
res al manejador de terminal. Este separa los bits del caracter y los envía por la línea serie. En el
otro lado, la terminal, recibe los bits, los vuelve a empaquetar en los caracteres correspondientes
y se encarga de visualizarlos en pantalla o en la impresora de papel. Cuando un usuario hace uso
del teclado, el manejador de la terminal, toma los caracteres, los divide en los bits correspon-
dientes y los envía a la CPU a través de la línea serie. De esta forma , el usuario puede enviar
instrucciones a la CPU, para que ésta ejecute ciertos programas o tareas.
Tipos de terminales Los primeros sistemas UNIX R no tenían consolas. En su lugar la gente
se conectaba y ejecutaba sus aplicaciones a través de terminales conectadas a los puertos serie
de la computadora. Es muy parecido a la manera en la que actualmente se usa un modem y un
programa de terminal para marcar hacia un sistema remoto para hacer trabajo en modo texto.
Las PC’s actuales tienen consolas con gráficos de alta calidad, pero la habilidad para esta-
blecer una sesión en un puerto serie todavía existe en casi cualquier sistema operativo UNIX al
día de hoy. Utilizando una terminal conectada a un puerto serie libre, se puede acceder y co-
rrer cualquier aplicación en modo texto que podría correr normalmente en la consola o en una
ventana xterm en el sistema X Window.
Para el usuario empresarial, se pueden conectar muchas terminales a un sistema y ponerlas
en los escritorios de sus trabajadores. De esta forma se puede convertir una computadora de un
solo usuario, en un poderoso sistema de usuarios múltiples.
En general, existen tres categorías de terminales:
1. Terminales tontas.
3. Terminales X
Terminales tontas. Son piezas de hardware especializadas que se pueden conectar a compu-
tadoras a través de puertos serie. Se llaman “tontas” porque sólo tienen poder computacional
suficiente para desplegar, enviar y recibir texto. No puede ejecutar ningún programa en ellas. Es
la computadora a la cual se conectan la que tiene todo el poder para correr editores de texto,
compiladores, correo electrónico, juegos, y demás.
Existen cientos de tipos de terminales tontas hechas por muchos fabricantes, incluyendo VT-
100 de Digital Equipment Corporation y WY-75 de Wyse. Algunas terminales mejoradas pueden
incluso desplegar gráficos, pero solo algunas aplicaciones de software pueden tomar ventaja de
estas funciones avanzadas.
Las terminales tontas son populares en ambientes de trabajo donde los trabajadores no nece-
sitan acceso a aplicaciones gráficas como las que provee el sistema X Window.
232 4.4. OPERACIONES DE ENTRADA/SALIDA
PC’s como terminales. Si una terminal tonta sólo tiene la habilidad para desplegar, enviar
y recibir texto, entonces ciertamente cualquier computadora personal puede actuar como una
terminal tonta. Todo lo que necesita es un cable que DB25 o DB9 como se describió en la
sección 4.4.4.1 y software de emulación de terminal para correr en la computadora.
Terminales X. Las terminales X son el tipo más sofisticado de terminal disponible. En lugar
de conectar a un puerto serie, usualmente se conectan a una red como Ethernet. En lugar de
ser relegadas a aplicaciones de modo texto pueden desplegar aplicaciones, de modo que pueden
hacer uso de otros dispositivos tal como el ratón o una pantalla táctil para lograr una mayor
interacción con el usuario.
Existen diferentes formas de conectar este tipo de terminales al servidor, una de las más
comunes es usar una computadora de bajo costo a un servidor de altas prestaciones o en su
defecto, utilizar estaciones de trabajo con el mismo fin.
Terminales en memoria Las terminales en memoria no se conectan vía los puertos serie, si
no que forman parte integral del sistema. Es común encontrar esta configuración en las compu-
tadoras personales, puesto que no es necesario que se conecte más de un usuario al sistema al
mismo tiempo. Aunque en la actualidad, la tendencia está cambiando muy rápidamente hacia
los sistemas multiusuario caseros. También estas terminales están más asociadas directamente
con las tarjetas de vídeo las cuales pueden tener su propia memoria RAM o pueden estar com-
partiendo la memoria principal con el sistema. La CPU, puede entonces escribir directamente
en la memoria RAM asociada a la tarjeta de vídeo de modo que el controlador de vídeo pueda
entonces extraer estos bytes de esa parte de la memoria y realizar su tarea de despliegue en el
monitor. Esto lo hace en un tiempo cercano a 16 centésimos de segundo.
La tarjeta de vídeo, es un componente electrónico para generar una señal de vídeo que se
manda a una pantalla de vídeo por medio de un cable. La tarjeta de vídeo se encuentra normal-
mente en la placa de sistema de la computadora o en un bus de expansión. La tarjeta de vídeo
reúne toda la información que debe visualizarse en pantalla y actúa como interfaz entre el pro-
cesador y el monitor; la información es enviada a éste por la placa luego de haberla recibido
a través del sistema de buses. Una tarjeta gráfica se compone, básicamente, de un controlador
de vídeo, de la memoria de pantalla o RAM vídeo, y el generador de caracteres. Actualmente
también poseen un acelerador de gráficos. El controlador de vídeo va leyendo cada cierto tiem-
po la información almacenada en la RAM vídeo y la transfiere al monitor en forma de señal de
vídeo; el número de veces por segundo que el contenido de la RAM vídeo es leído y transmitido
al monitor en forma de señal de vídeo se conoce como frecuencia de refresco de la pantalla.
Entonces, la frecuencia depende en gran medida de la calidad de la placa de vídeo.
CAPÍTULO 4. ADMINISTRACIÓN DE ENTRADA/SALIDA 233
Adaptador de Pantalla Monocromo (APM). Las primeras computadoras personales sólo vi-
sualizaban textos. El APM contaba con 4KB de memoria de vídeo RAM que le permitía
mostrar 25 líneas de 80 caracteres cada una con una resolución de 14x9 puntos por carác-
ter.
Tarjeta gráfica Hércules. Con ésta tarjeta se podía visualizar gráficos y textos simultáneamen-
te. En modo texto, soportaba una resolución de 80x25 puntos. En tanto que en los gráficos
lo hacía con 720x350 puntos, dicha tarjeta servía sólo para gráficos de un solo color. La
tarjeta Hércules tenía una capacidad total de 64k de memoria vídeo RAM. Poseía una
frecuencia de refresco de la pantalla de 50HZ.
Color Graphics Adapter (CGA). La tarjeta CGA utiliza el mismo chip que la Hércules y apor-
ta resoluciones y colores distintos. Los tres colores primarios se combinan digitalmente
formando un máximo de ocho colores distintos. La resolución varía considerablemente
según el modo de gráficos que se esté utilizando:
Tarjeta EGA. Enchanced Graphics Adapter (EGA). Se trata de una tarjeta gráfica superior a
la CGA. En el modo texto ofrece una resolución de 14x18 puntos y en el modo gráfico
dos resoluciones diferentes de 640x200 y 640x350 a 4 bits, lo que da como resultado una
paleta de 16 colores, siempre y cuando la tarjeta esté equipada con 256KB de memoria de
vídeo RAM.
Tarjeta VGA. Esta tarjeta ofrece una paleta de 256 colores, dando como resultado imágenes
de colores mucho más vivos. Las primeras VGA contaban con 256KB de memoria y solo
podían alcanzar una resolución de 320x200 puntos con la cantidad de colores menciona-
dos anteriormente. Primero la cantidad de memoria vídeo RAM se amplió a 512KB, y
más tarde a 1024KB, gracias a esta mejora es posible conseguir una resolución de, por
ejemplo, 1024x768 pixeles con 8 bits de color. En el modo texto la VGA tiene una resolu-
ción de 720x400 pixeles, además posee un refresco de pantalla de 60HZ, y con 16 colores
soporta hasta 640X480 puntos.
Tarjeta SVGA. La tarjeta SVGA (Super Vídeo Graphics Adapter) contiene conjuntos de chips
de uso especial, y más memoria, lo que incrementa la cantidad de colores y la resolución.
234 4.4. OPERACIONES DE ENTRADA/SALIDA
Acelerador gráfico. La primera solución que se encontró para aumentar la velocidad de pro-
ceso de los gráficos consistió en proveer a la tarjeta gráfica de un dispositivo electrónico
especial llamado acelerador gráfico. El acelerador gráfico se encarga de realizar un con-
junto de funciones relacionadas con la presentación de gráficos en la pantalla, que de otro
modo, tendría que realizar el procesador. De esta manera, le quita tareas a éste, y así se
puede dedicar casi exclusivamente al proceso de datos. La velocidad con que se ejecutan
las aplicaciones basadas en Windows para el manejo de gráficos se incrementa muy no-
tablemente, llegando al punto (con algunas placas) de no necesitar optimizar la CPU. El
estándar hoy día está dado por los aceleradores gráficos de 64 bits. También, aunque no
tan comunes, hay aceleradores gráficos de 128 bits.
Coprocesador gráfico. Para obtener una mayor velocidad se instalaron en las tarjetas de vídeo
otros circuitos especializados en el proceso de órdenes gráficas, llamados coprocesadores
gráficos. Se especializan en la ejecución de una serie de instrucciones de generación de
gráficos. En muchas ocasiones el coprocesador se encarga de la gestión del ratón (mouse)
y de las operaciones tales como las ampliaciones de pantalla.
Aceleradores gráficos 3D. Los gráficos en tres dimensiones son una representación gráfica de
un objeto o escena usando tres ejes de referencia, X, Y, Z, que indican el ancho, el alto
y la profundidad de ese gráfico. Para manejar un gráfico tridimensional, éste se divide en
una serie de puntos o vértices, en forma de coordenadas, que se almacenan en la memoria
RAM. Para que ese objeto pueda ser dibujado en un monitor de tan sólo dos dimensiones
(ancho y alto), debe pasar por un proceso denominado renderización.
La renderización se encarga de modelar los pixeles (puntos). Para llevar a cabo esta tarea,
se agrupan los vértices de tres en tres, hasta transformar el objeto en un conjunto de trián-
gulos. Estos procesos son llevados a cabo entre el microprocesador y el acelerador gráfico.
Normalmente, el microprocesador se encarga del procesamiento geométrico, mientras que
el acelerador gráfico del renderizado.
El teclado El teclado es uno de los elementos más usados en la interacción con la compu-
tadora. Mientras e ha habido mucho avances en los dispositivos de interfaz humana, hasta el
momento sigue ejerciendo su hegemonía en la mayoría de los sistemas de computadora.
Un teclado típico consta de una matriz de contactos, hechos de una capa delgada de carbono
conductor y que cuando se presiona una tecla, cierra un circuito dado dentro de la matriz. El
microcontrolador del teclado detecta la tecla que fue presionada y genera el código correspon-
diente de acuerdo a ala posición en la matriz. Al liberarse la tecla se genera otro código. Así el
controlador del teclado puede saber cuando fue presionada y liberada la tecla correspondiente.
Los códigos generados, se denominan códigos de barrido o “scan code”.
Existen diferentes tipos de teclado. Los más comunes son los siguientes:
4. Tipo ergonómico. Un teclado abierto que proporciona mayor comodidad a las muñecas
los teclados tienen diversas maneras de conectarse con la tarjeta madre las más comunes son:
Conector DIN. (Deutsches Institut für Normung) Conector “grande” de cinco pines
Conector mini DIN. Se conoce también como conector PS/2, debido a que las computadoras
de IBM modelo PS/2 fueron las primeras en introducir este conector.
Conector USB. Existen teclados que usan el Bus Serial Universal para conectarse a la tarjeta
madre.
desaparece es el cable entre el dispositivo que se conecta al conector del PC y el propio te-
clado. La tendencia comenzó con los de enlace infrarrojo, pero actualmente casi todos son de
radio-frecuencia.
En caso de que los conectores con que cuenta la tarjeta base no coincida con el del teclado,
es posible conseguir adaptadores entre los diferentes tipos para hacer posible la conversión.
Una vez que ha sido detectada la pulsación de la tecla,se generan los códigos de barrido
correspondientes y se envían mediante una línea serie hacia la placa base de la computadora.
Aquí la BIOS del teclado interpreta los códigos de barrido y los compara con la tabla para asociar
el código ASCII correspondiente. Después de esto genera una interrupción por hardware para
darle a conocer al procesador la existencia de la tecla presionada. A continuación se describe en
un detalle mayor estos sucesos.
Cuando se pulsa una tecla, el chip del teclado genera un código de exploración de un byte,
que en este caso se llama código de acción (“Make code”). Cuando posteriormente la tecla es
liberada, se genera un nuevo código (“Break code”), cuyo valor es el de pulsación incrementado
en 128. Por ejemplo, cuando se pulsa la letra “A” se genera un código de exploración 30 (1Eh),
y de 30 + 128 = 158 (9Eh) cuando se libera
Cuando el código de exploración es depositado en el puerto A (060h) del controlador de
dispositivos, cada pulsación/retroceso registra dos códigos, enseguida este controlador devuelve
rápidamente una señal de reconocimiento ACK al chip del teclado, por el puerto B (061h), para
indicarle que el caracter ha sido guardado.
Además de lo anterior, cuando el PIO recibe un código de exploración, genera una petición
de interrupción poniendo en tensión baja la línea IRQ1 del bus de datos (que está reservada al
teclado). Cuando la interrupción es atendida y el procesador está listo para recibir el caracter, el
controlador de interrupciones contesta con la interrupción número 9 (de teclado) y enmascara
las siguientes peticiones de interrupción que pudieran producirse en la línea IRQ1 hasta que la
actual haya sido atendida.
El valor 9 es la posición de la rutina que atiende el servicio del teclado en el vector de
interrupciones. Esta rutina sabe que tiene que leer el puerto de teclado (60h) para ver qué código
de exploración hay en el búfer de la interfaz de teclado. A continuación transforma este número
en un código de 2 bytes, conocidos como keycodes o bytecodes, que son pasados al búfer del
teclado hasta que los lea algún programa que los necesite.
Las reglas de formación de estos dos keycodes se establecen como sigue:
1. Si se presiona una tecla del teclado estándar, el byte auxiliar (de la izquierda, de mayor
peso) contiene el propio código de exploración, mientras que el byte principal (de menor
peso) contiene el código ASCII del carácter de la tecla (1 a 255). Para la determinación se
CAPÍTULO 4. ADMINISTRACIÓN DE ENTRADA/SALIDA 237
2. Cuando se pulsa una tecla especial, como es el caso de las teclas de función (F1/F12) o
Shift; las teclas de movimiento de cursor, como Home o End, y las del teclado numéri-
co independiente, el byte principal contiene un cero y el auxiliar contiene el código de
exploración.
Los “Break code” se descartan, a excepción de los que corresponden a teclas de conmutación
permanentes y no permanentes, que tiene influencia en los bytes de estado.
El búfer del teclado es un área de 32 bytes de RAM en las direcciones 41Eh-43Dh (memoria
de datos de la ROM BIOS). Puesto que se generan 2 byte-codes por cada código de exploración,
es posible almacenar un máximo de 16 teclas, aunque sólo se aprovechan 15. La posición 16
contiene información especial que, como veremos enseguida, es necesaria para el esquema de
funcionamiento.
El búfer es una cola circular (FIFO) y es maneja de acuerdo a los valores de dos apuntado-
res; el de inicio, almacenado en las direcciones 41Ah-41Bh, señala la dirección de inicio, y el
apuntador de cola, almacenado en las direcciones 41Ch-41Dh, señala la dirección del final. El
apuntador de inicio señala siempre la posición del primer caracter del búfer (en cualquiera de
las 15 posiciones posibles). En el momento inicial, cuando el búfer está vacío, el apuntador de
cola apunta al mismo sitio que el de inicio. Cuando se van añadiendo códigos, el apuntador de la
cola va señalando posiciones sucesivas (de dirección creciente), hasta que se alcanza la posición
superior, comenzado entonces por la dirección inferior del búfer. Cuando se alcanza la posición
de inicio, el búfer está lleno y se rechazan los caracteres siguientes (algunos sistemas señalan
esta situación mediante un pitido en el altavoz del equipo).
4.4.4.3. Manejadores
Manejadores de teclado. La primera tarea que debe de realizar el manejador de teclado con-
siste básicamente en recibir los caracteres que envía el teclado. Como es de suponerse, el sistema
operativo implementa las rutinas necesarias del manejo de caracteres haciendo uso del vector de
interrupciones, puesto que como vimos, cada vez que se presiona y libera una tecla se produce
una interrupción hardware. La otra tarea que debe de realizar es la de pasar los caracteres a la
aplicación que los necesite.
238 4.4. OPERACIONES DE ENTRADA/SALIDA
Existen básicamente dos maneras de leer caracteres por un programa, la primera es la lectura
caracter por caracter y la segunda es la de leer una línea completa de caracteres. Cuando se
hacen lecturas caracter por caracter, la aplicación tiene la oportunidad de interpretar incluso los
caracteres de control como el retroceso o nueva línea, pero depende de ésta darle la oportunidad
al usuario de corregir una entrada. Se hace la lectura por línea completa, se dice que el usuario
ha terminado de editar la línea en el momento en que presiona la tecla entrar. Antes de que esto
suceda, tiene la oportunidad de usar las teclas de retroceso, borrar un caracter hacia atrás o borrar
el caracter actual (tecla Del). Cuando la línea está lista puede entonces presionar la tecla entrar.
Cuando se usa el método de caracter por caracter, se hace uso de un búfer pequeño que puede
ir desde los diez hasta los veinte caracteres. Algunos sistemas permiten añadir nuevos búferes
a medida que aumenta la cantidad de caracteres introducidos por el usuario pero que no son
todavía usados por la aplicación. Otros, no obstante restringen la entrada a una cierta cantidad.
Cuando ésta se excede, entonces cada vez que se envía un nuevo caracter el sistema envía al
altavoz un pitido para indicarle al usuario que el búfer ya no acepta más caracteres y a partir de
ese momento éstos serán ignorados.
Con el método basado en líneas, es importante saber el tamaño máximo permitido de la línea
y que por lo común va de los ochenta hasta los 255 caracteres. obviamente, esto no quiere decir
que el usuario deba forzosamente llenar todo este espacio, como se dijo, se indica el final de una
línea cuando el usuario presiona entrar.
Para manejar las entradas de caracteres, existen dos métodos:
1. Reserva de búferes.
En el primer método, cada terminal está asociada con una estructura de datos que contiene
comúnmente un apuntador a la cadena de búferes, correspondiente a las entradas recibidas de
esa terminal. A medida que se teclean más caracteres, se obtiene más búferes y se ligan a la
cadena. Cuando los caracteres se pasan a un programa de aplicación, los búferes se desocupan
y vuelven a la reserva central.
El otro método consiste en manejar los búferes dentro de la estructura de datos asociada
directamente con la terminal, sin usar una reserva central. Este método hace más sencillo el
controlador y se ocupa mucho en las computadoras personales que manejan un solo teclado.
Aunque el teclado y la pantalla son dispositivos independientes, es normal que el usuario ob-
serve inmediatamente en la pantalla lo que ha escrito. Esto limita severamente las capacidades
de la mayoría de los editores de texto. Algunas terminales muestran automáticamente vía hard-
ware lo que acaba de escribirse. En la mayoría de las terminales actuales, en general el mostrar
CAPÍTULO 4. ADMINISTRACIÓN DE ENTRADA/SALIDA 239
el caracter escrito depende completamente del software, permitiendo de esta manera mayor fle-
xibilidad al programa de aplicación, con la desventaja de que si estamos hablando de terminales
remotas, el mostrar los caracteres escritos sea una tarea lenta, pudiendo llegar a molestar a los
usuarios. Ese efecto es más pronunciado en redes de bajo ancho de banda como cuando se usa
un módem, por ejemplo.
Existen diversas conbinaciones de caracteres que se usan para control. por ejemplo, en la
tabla de Códigos ASCII las primeras representaciones de caracteres indican al terminal las ac-
ciones que deben de llevarse a cabo en la pantalla. El caracter de control más usado, puede ser,
por ejemplo, el retorno de carro (10h) o trece en decimal, que le indica a la pantalla que coloque
el cursor al principio de la línea. También en algunos sistemas se usa en combinación con el
caracter de nueva línea o salto de línea cuya función es bajar el cursos a la siguiente línea. En
los sistemas basados en Unix, solamente se utiliza el salto de línea, llevando implícito el retorno
de carro. En los sistemas basados en windows deben de usarse los dos (el retorno de carro y la
nueva línea).
Manejadores de vídeo
para cierto tipo de terminal se usara en otra. Una solución que introdujo la Universidad de
Berkeley en su sistema operativo Berkeley UNIX, fue introducir una base de datos de terminales
denominada termcap. Este paquete de software definía un conjunto de acciones básicas, como
colocar el cursor en una posición determinada, el programa de aplicación se encargaba de usar
estas secuencias de escape y el sistema operativo se encargaba de hacer la traducción de la base
de datos de termcap a las propias secuencias de escape de la terminal, de modo que aquella
terminal que tuviera registradas sus secuencias de escape en la base de datos termcap podía ser
fácilmente usada o en su defecto emulada, facilitando así la migración de muchos programas a
diferentes tipos de terminales.
Fue entonces una necesidad urgente estandarizar las secuencias de escape, de esta forma se
desarrolló el estándar ANSI. En la figura 4.11 vemos una sesión de terminal típica.
Íconos. Son pequeños dibujos que intentan dar una descripción gráfica de la función que reali-
zan.
Menús. Son conjuntos de órdenes organizadas por jerarquías de funciones relacionadas y que
pueden accederse mediante el apuntador o ratón.
Apuntadores. Son dispositivos que permiten seleccionar un elemento. El más común es el ra-
tón, pero también se puede hacer uso de una pantalla táctil o como en las computadoras
portátiles, un área sensible al tacto y al calor del dedo para poder mover el apuntador de
la pantalla.
La manera de implementar la GUI depende del enfoque del diseñador del sistema operativo.
por ejemplo, Windows de Microsoft prefiere integrarlo al kernel mismo, para darle una mayor
velocidad de respuesta al usuario. Los sistemas basados en UNIX/Linux, por el contrario, dele-
gan la tarea a aplicaciones a nivel de usuario, dejándolo por tanto, fuera del kernel del sistema
operativo, pero subordinado a éste. El enfoque más común en este tipo de sistemas es el de
cliente servidor.
En la sección 4.4.4.2 hicimos una descripción detallada sobre el funcionamiento de los
monitores. En esta sección profundizaremos un poco más en cómo es que se implementa el
242 4.4. OPERACIONES DE ENTRADA/SALIDA
sistema gráfico. Especificamente hablaremos acerca del sistema que es usado en los sistemas
UNIX/Linux el sistema X, que es la base de las GUI’s en estos sistemas.
El manejo de ventanas. Enseguida haremos una descripción general de cómo se manejan las
ventanas en cualquier ambiente gráfico.
El principal elemento de la pantalla es un área rectangular que define una ventana. El tamaño
y la posición de la ventana están definidos de manera única por sus coordenadas (en píxeles) de
sus dos esquinas diagonalmente opuestas, empezando por la esquina superior izquierda. Una
ventana puede contener diferentes widgets los cuales pueden ser:
Un menú. Que proporciona diferentes opciones al usuario, junto con teclas de acceso rápido o
abreviaciones de teclas.
Una barra de título. Indica el nombre de la ventana. Si es la principal, entonces será el nombre
de la aplicación.
Barras de herramientas. Son íconos que representan gráficamente las funciones que puede
realizar un usuario al hacer click en ellos.
Otros elementos internos. Como íconos, entradas de texto, botones de selección, editores de
texto y otros.
en un ciclo infinito esperando que el sistema operativo les envíe los eventos generados por el
ratón o el teclado para que puedan realizar sus funciones. Dentro de cada función la primera
estructura de control que se maneja es una de opción múltiple. en C se le llama switch, de modo
que puedan distinguirse todas aquellas acciones que es capaz de reconocer la aplicación.
Los eventos, como se puede ver, son la manera mediante la cual se comunican los elementos
de las aplicaciones y también es posible mediante éstos la comunicación inter aplicaciones de
modo que puedan pasarse datos de una aplicación a otra.
programa puede no estar ejecutándose en la misma máquina que el servidor. El mecanismo para
conseguir esto es la variable de entorno DISPLAY. Es común, aún hoy en día, tener que decirle a
una máquina que el terminal gráfico está en otra computadora mediante “set DISPLAY=IP:0.0”.
Este es el mecanismo que manejan actualmente la mayoría de los servidores de terminales que
usan computadoras relativamente antiguas, pero que son capaces de correr solamente el Sistema
X Window, con su teclado, ratón y monitor, permitiendo de esta forma ejecutar aplicaciones que
fácilmente rebasarían la capacidad de estas computadoras, siendo entonces imposible ejecutarlas
localmente.
4.5. Problemas
4.1. ¿Qué es el hardware de computadora?
4.4. ¿Cómo se llama el módulo de sistema operativo que maneja a los dispositivos de entra-
da/salida?
4.5. ¿Cuáles son las tendencias actuales sobre los dispositivos de entrada/salida?
4.6. ¿Cómo se estructura el núcleo para poder soportar tantos dispositivos como sea posible?
4.9. ¿En qué categorías se pueden clasificar los dispostivos? Explique cada una de ellas y
escriba dos ejemplos de cada una de éstas.
4.14. Explique de forma general los registros más comunes que puede tener una tarjeta con-
troladora de dispositivo.
4.18. Describa el proceso que lleva a cabo la CPU cuando recibe una interrupción.
4.21. Explique las dos formas que existen para interactuar con las tarjetas controladoras.
4.25. ¿En qué casos usaría negociación y en cuáles interrupciones? Fundamente sus respues-
tas.
4.28. ¿En qué lugar se guardan las direcciones de las rutinas de manejo de interrupción?, ¿De
qué tamaño es?
4.29. ¿Cómo se resuelve el problema que conlleva el tener un vector de interrupciones rela-
tivamente pequeño?
4.45. Liste las características más importantes de un disco duro que son dadas por los fabri-
cantes.
4.55. Liste las particiones que necesita un sistema basado en UNIX/Linux y explique para
qué sirven.
4.58. ¿Qué orden se usa en un sistema UNIX/Linux para crear un sistema de archivos?
4.60. ¿Cuales son los factores que determinan el tiempo para leer o escribir un bloque de
disco?
4.70. ¿Cuales son los tipos más comunes de terminales? Explique cada una de ellas.
Sistemas de archivos
251
252 5.1. CONCEPTO
Los procesos deben poder guardar información para cuando la requieran. El sistema ope-
rativo debe proporcionar los mecanismos adecuados para que un proceso pueda guardar
su información a discos o cintas y también los medios para que pueda recuperar esa infor-
mación en otro momento.
Acceso concurrente a la información. El sistema operativo debe permitir que dos o más pro-
cesos accedan simultáneamente a la información contenida en disco. Por ejemplo, en caso
de accesos de sólo lectura y en accesos de escritura debe serializar los procesos para ga-
rantizar la integridad de la información.
5.1. Concepto
La estructura de datos que utiliza el sistema operativo para lograr sus objetivos se le llama
archivo. De este modo, cuando un proceso requiere guardar información, le solicita al sistema
operativo la creación de un archivo, hace las operaciones necesarias sobre él y al final, el proceso
solicita el cierre del archivo. Desde este momento, el archivo ha quedado guardado y el proceso
podrá acceder a éste en el momento en que lo desee, no importando si el proceso muere y luego
es corrido nuevamente.
El sistema operativo debe de ser capaz de manejar todos los archivos que le sean solicitados
por diferentes procesos. A la estructura de datos que usa el sistema operativo para este propósito,
se le denomina sistema de archivos. Esta estructura permite mantener información importante
acerca de los archivos como por ejemplo:
nombre del archivo. Es el que le asigna el usuario para poder acceder a éste.
El propietario del archivo. Es la persona que ha creado el archivo y que puede indicar qué
operaciones pueden realizarse en él.
Los grupos u otras personas que pueden acceder al archivo. El propietario indica a qué per-
sonas o grupos de ellas puede dar acceso de lectura, escritura o ambas.
Ubicación en disco. Indica en qué lugar del disco se encuentra almacenada la información.
Tipo. En algunos sistemas operativos es importante el tipo, por que permite cargar la aplicación
asociada con el archivo de modo que pueda ser interpretado correctamente.
Fecha y hora. Indican cuando se creó el archivo y a qué hora, algunos sistemas de archivos
indican simplemente la fecha y la hora de la última modificación.
CAPÍTULO 5. SISTEMAS DE ARCHIVOS 253
El sistema operativo maneja una abstracción de datos denominada archivo que permite ocul-
tar al usuario todos los detalles relativos al almacenamiento de la información. De esta forma,
lo único que tiene que saber el usuario es la manera de crear un archivo, abrirlo si ya está crea-
do, leer o escribir en éste y cerrarlo para liberar las estructuras proporcionadas por el sistema
operativo.
Un archivo es una colección de datos relacionados, el usuario le asigna un nombre y el
archivo puede entonces crearse, escribir en él, leer bytes o registros sobreescribir en algunas
posiciones y cerrar el archivo para asegurarse de que toda la información se ha vaciado de los
búferes intermedios al disco o cinta. Para un usuario normal, los archivos son la única forma que
tiene para guardar alguna información a disco, no importa que solamente necesite guardar uno
o dos registros o incluso sólo algunos caracteres. Será necesario hacerlo mediante un archivo.
La información de los archivos es almacenada en la estructura de directorios que el sistema
operativo guarda también en el almacenamiento secundario. Una entrada de directorio típica es-
tá compuesta del nombre del archivo y de un identificador de usuario que es único en todo el
sistema. El identificador a su vez, permite localizar los otros atributos del archivo. En muchos
sistemas de archivos es normal que cada entrada de archivo necesite al menos un kilobyte de
almacenamiento. En sistemas donde se tienen muchos archivos, podría ser un problema de ren-
dimiento el tener la estructura de directorios en disco, por lo que en sistemas de tipo servidor, es
común que el sistema operativo coloque buena parte de la estructura de directorios en memoria
para mejorar la eficiencia del sistema. Esto implica que si en algún momento se tiene una caída
de la alimentación de la energía eléctrica, esta estructura de directorios en memoria se pierda
sin haberla podido reflejar en disco, lo que implica un daño severo a la estructura de directorios
de disco. Si estas caídas de alimentación eléctrica persisten, puede llegar el momento en que
el sistema de archivos quede inutilizado. De ahí la importancia de proporcionar un sistema de
respaldo de energía eléctrica a estos servidores de modo que el sistema operativo pueda apa-
garse correctamente, permitiendo una sincronización adecuada de la estructura de directorios
contenida en memoria con la contenida en disco.
Escritura. Para escribir datos en un archivo, debe de abrirse en modo escritura proporcio-
nando el nombre del archivo en el que se desea escribir y elegir el tipo de transferencia
que se efectuará, seleccionando la llamada al sistema correspondiente, que puede ser mo-
do caracter o modo bloque. Con esta información, el sistema operativo busca el nombre
dentro de su estructura de directorios y lleva un apuntador en el lugar en que debe de rea-
lizarse la siguiente escritura. Si se añade más información, el apuntador se actualiza en el
lugar correspondiente.
Lectura. Para leer de un archivo, éste debe abrirse en modo lectura, especificando el nom-
bre del archivo que se desea leer. Después de hace una llamada al sistema que puede ser
usando una llamada de lectura de bloque o de caracter, especificando la variable apun-
tador que proporcione la dirección en memoria en donde debe guardarse la información
leída. El sistema operativo lleva también un apuntador de archivo que indica la posición
siguiente que debe ser leída.
Estas son las operaciones básicas. En un sistema operativo real, habrá muchas más llamadas
a función como por ejemplo, aquellas que se utilizan para obtener los atributos de un archivo, y
las llamadas al sistema para el manejo de errores de entrada salida del sistema, entre otras.
Mediante estas dos formas de acceso, el usuario tendrá que traducir todos los datos que vaya
a manejar a bytes o bloques, de manera que pueda guardar su información a disco. El usuario,
por la tanto, es el responsable de interpretar correctamente el tipo de dato que está guardado en
el archivo. En general, los tipos de datos que puede manejar un lenguaje de programación son
los siguientes:
char. Representa un byte o un caracter. Un byte es un número que desde 0 hasta 28 o que puede
representar un número entre ±27 .
int. Un número entero está representado por una palabra. Las palabras varían de acuerdo a la
arquitectura de la computadora que se esté usando y puede ir desde los 16, 32, hasta los
64 bits. De acuerdo a esto varía la cantidad que puede guardar una palabra. Por ejemplo,
si tenemos una palabra de 16 bits entonces podremos guardar enteros positivos que van
desde 0 hasta 216 . Si queremos representar número negativos y positivos. El rango sería
de ±215 .
float. El tamaño que usa en bytes es 4 el valor máximo es 1037 y el mínimo es 10−37 .
long. Usa también 4 bytes y sus valores van desde 2,147,483,647 con signo (4294967295 cuan-
do es unsigned) y el mínimo es -2,147,483,648 (0 cuando es unsigned).
short. Tiene solamente 2 bytes y su valor máximo es 32767 (65,535 cuando es unsigned). Su
valor mínimo es -32768 (0 cuando es unsigned).
void. Es un tipo especial en donde se le exige al usuario conocer el número de bytes que ocupa
su datos y al momento de usarlo debe de indicar cómo quiere que se trate esa cantidad de
bytes.
256 5.2. NOCIÓN DE ARCHIVO REAL Y VIRTUAL
Después de los tipos de datos básicos, el siguiente nivel son los arreglos y matrices de datos
simples. Estos pueden almacenarse como bloques de bytes a disco o pueden guardarse byte a
byte, debiendo entonces ser nuevamente interpretados de acuerdo a las necesidades del usuario.
El siguiente nivel en los lenguajes de programación son las estructuras. Una estructura es
un conjunto de variables de datos de distintos tipos pero agrupados bajo un sólo nombre y que
pueden entonces ser manejados como tal.
El último nivel son los objetos, que agrupan a un conjunto de variables de datos de distintos
tipos junto con las operaciones que pueden realizarse en ellas. En realidad, cuando se guarda
un objeto a disco, solamente se guardan los datos contenidos en éste el código es tomado del
programa objeto. A diferencia de una estructura, con un objeto es posible mandar a guardar a
otros objetos que estén dentro de éste y si estos subobjetos están definidos por otros objetos,
entonces es posible a su vez guardar también sus contenidos. De esta forma se pueden guardar
varios niveles de objetos con una sola llamada al objeto principal, permitiendo así recuperar
exactamente el estado del objeto en el momento en que fue guardado. Este comportamiento sería
muy difícil de conseguir con estructuras ordinarias. El único requisito para poder hacer esto es
permitir primeramente a los subobjetos que guarden su información correspondiente y luego el
objeto principal deberá guardar la suya. Al momento de leer la información, el objeto principal
deberá leer sus datos y enseguida indicar a sus subobjetos que hagan lo propio, siguiendo el
mismo orden.
Es común que todos los arreglos, las matrices, las estructuras y los objetos se guarden como
bloques, puesto que sería más ineficiente guardarlos byte a byte.
Algunos lenguajes de programación como Pascal imponen al usuario que en la creación del
archivo se indique el tipo de dato que va a ser guardado en el archivo. En otros como en C el
usuario es el responsable de interpretar los bytes que escribe y lee de disco.
Los archivos, a nivel programación se consideran también tipos de datos, y es claro para el
programador que debe primeramente declarar variables de tipo archivo para poder hacer uso de
ellas. Estas variables tendrán diferentes nombres dependiendo del lenguaje de programación.
Por ejemplo, en C tenemos solamente variables del tipo FILE. En C++ se cuenta también con
flujos o streams. Ambos enfoques están orientados a byte o bloque. Depende del programador
el significado que vaya a darles a la secuencia de bytes que lee o escribe.
terminado el proceso, el archivo persiste almacenado en disco y otros procesos pueden hacer uso
del archivo usando su nombre como referencia. A los datos almacenados en el disco se le llama
archivo real y al nombre asignado al archivo se le conoce como archivo virtual.
Las reglas que se usan para nombrar archivos tiene que ver más en cómo facilitarles a los
usuarios la tarea de recordar los contenidos que en hacer un uso más eficiente del espacio de
almacenamiento de las entradas de directorios. Por lo tanto, la evolución de la manera en que se
nombran los archivos ha seguido esta línea.
En los primeros sistemas personales, era común nombrar a los archivos hasta con ocho letras
para el nombre un punto y tres letras para la extensión. No permitían el uso de caracteres espe-
ciales. En la medida en que se hicieron evidentes las desventajas, se fue haciendo más versátil
la forma de nombrar archivos. Actualmente, la mayoría de los sistemas soportan sistemas de
archivos que pueden almacenar hasta 255 caracteres como nombre de un archivo y es posible
que el usuario haga uso de prácticamente cualquier caracter para incluirlo dentro de un archivo,
ya sean caracteres alfanuméricos o caracteres especiales.
En los sistemas personales basados en MS-DOS era común que el sistema operativo no hicie-
ra distinción entre las letras mayúsculas y minúsculas. En los sistemas basados en UNIX/Linux
y en los sistemas de archivos NTFS de Windows 2000 en adelante todos ellos hacen distinción
entre mayúsculas y minúsculas. Esta nueva forma permite más variedad cuando se nombran
archivos y a su vez permiten crear contraseñas más fuertes, siendo más difícil decodificarlas.
Muchos sistemas de archivos manejan nombres de archivos en dos partes, separadas con
un punto. La parte que va después del punto se llama extensión y es usada para determinar
la aplicación que debe ser lanzada cuando se haga referencia a ese archivo. En los sistemas
UNIX/Linux, los archivos pueden tener dos o más extensiones. Esto indica que el archivo ha
sido procesado por más de una aplicación. Por ejemplo un archivo que se llame respaldo.tar.gz
indica que el archivo fue generado por el archivador tar y luego fue comprimido por gzip. Por
lo tanto, debe primero descomprimirse y luego desarchivarse para poder hacer uso del archivo.
En los sistemas operativos orientados a usuario es común que las extensiones estén asociadas
a ciertas aplicaciones. En la tabla 5.1 damos un listado de las asociaciones más comunes.
Como se comentó, en los sistemas tipos UNIX/Linux es responsabilidad del usuario y de
las aplicaciones asignar un significado a una extensión específica. el sistema operativo no tiene
cuidado de cómo usarlas. En realidad quien lleva a cabo estas asociaciones es el front-end gráfico
o la interfaz gráfica. Por ejemplo, KDE, GNOME o CDE.
En un sistema operativo basado en Windows, éste lleva un registro de las extensiones y el
programa correspondiente asociado con la misma. Si existe más de una aplicación que puede
manejar esa extensión, el sistema operativo podrá mostrar mediante una ventana secundaria
qué aplicaciones están disponibles para el archivo. Pero por omisión utilizará un sólo programa
258 5.2. NOCIÓN DE ARCHIVO REAL Y VIRTUAL
asociado.
1. Archivos de texto.
2. Archivos binarios.
CAPÍTULO 5. SISTEMAS DE ARCHIVOS 259
Los archivos de texto regularmente son archivos ASCII. Estos consisten en una o más líneas
de texto terminadas con un caracter de retorno de carro. En otros se usa el caracter de salto de
línea y los sistemas basados en MS-DOS usan ambos. Una ventaja de este tipo de archivo es
que puede verse e imprimirse tal como está teniendo un tipo de letra determinado, del mismo
modo en que se ve puede imprimirse. Este tipo de archivos no soporta gráficos ni tampoco
formateos complejos. Es lo más cercano a lo que podríamos realizar con una máquina de escribir
mecánica. Otra ventaja importante es su velocidad de manejo y su tamaño. También es posible
usar una gran cantidad de editores de texto y además poder hacerlo en diferentes plataformas,
con algunos cambios mínimos, que la mayoría de las veces, las aplicaciones de intercambio
de archivos como ftp hacen automáticamente. El manejo de archivos de texto facilita mucho la
comunicación entre aplicaciones siendo también posible enviar la salida de un programa hacia
la entrada de otro mediante el uso de tuberías, que significa básicamente la redirección de las
salidas a otros programas o dispositivos, siendo una forma estándar de comunicación entre las
utilerías proporcionadas por los sistemas operativos y entre varios programas de aplicación.
Los lenguajes de programación usan comúnmente archivos de texto que se denominan pro-
gramas fuente. El compilador toma estos archivos y genera un archivo objeto que posterior-
mente se enlaza con un conjunto de librerías para finalmente obtener el código binario listo para
ejecutarse. Algunos editores como LATEX (orientado a estructura) toman también un conjunto
de órdenes de formateo en texto plano y producen un documento perfectamente legible de alta
calidad. Hay que notar que las órdenes van insertadas en el propio documento de texto al igual
que en otros editores de formateo como openoffice writer (con un enfoque denominado “Lo que
tú ves es lo que obtienes”) pero su salida real se verá solamente bajo el propio editor de texto o
cuando esté impreso el trabajo.
Al igual que sucede con un archivo de código fuente de un lenguaje de programación, el
resultado o código binario no se verá hasta que se haya pasado el archivo fuente por la fase de
compilación.
Otro ejemplo de uso de archivos tipo texto son las páginas web. El lenguaje denominado
html (Hiper Text Meta Language) permite a los diseñadores Web colocar órdenes de tipo texto
para distribuir todo tipo de información dentro de una página WEB. El archivo no necesita pasar
por ningún proceso de compilación. El resultado se verá a través del navegador de internet el
cual interpretará adecuadamente las órdenes y mostrará el resultado al usuario final. Si vemos
estos archivos en un editor de texto normal, podremos ver las órdenes que utilizó el diseñador.
Las imágenes estarán indicadas por un enlace a la ubicación de la misma y además seremos
capaces de ver la mayoría del texto plano de la página, tal como sucedería en un archivo de
260 5.2. NOCIÓN DE ARCHIVO REAL Y VIRTUAL
LATEX.
Es común también que la mayoría de los sistemas operativos basados en UNIX/Linux usen
archivos de texto para mantener los archivos de configuración del sistema. De esta forma es
relativamente sencillo agregar o eliminar parámetros de configuración del sistema.
Los sistemas basados en Windows, también usan archivos de configuración basados en texto,
como en el archivo de configuración Windows.ini, pero también usa otro formato que debe ser
previamente procesado para poder ser legible tal como el registro de Windows.
1. Los archivos.
Los archivos son el elemento básico que guarda la información o el código ejecutable de las
aplicaciones.
La estructura de directorios organiza a los archivos de acuerdo a la solicitud de los usuarios
siendo común que cada aplicación cree sus propios directorios.
Es costumbre también que los sistemas operativos manejen una estructura de directorios
preestablecida para organizar todos los archivos pertenecientes al mismo y sugieran a su vez
otra estructura para el manejo de usuarios.
ni la estructura de los archivos implicados. El sistema de archivos básico forma parte del
sistema operativo.
4. La entrada/Salida lógica. Es la parte del sistema de archivos que permite a los usuarios y
aplicaciones acceder a los sistemas de archivos. Esto se explica más a detalle en la sección
5.3.1 de llamadas al sistema.
5.3.2.1. Fopen
Su declaración es:
#include <stdio.h>
FILE *fopen (const char *file_name, const char type);
Si todo funciona correctamente fopen abre el archivo cuyo nombre está apuntado por fi-
le_name y le asocia un flujo que no es más que una estructura de tipo file. Si la llamada falla
fopen devuelve un apuntador NULL y errno tendrá el código de error producido.
Type es una cadena que le indica a fopen el modo de acceso al archivo. Entre otros, puede
tomar los siguientes valores:
“a” Abrir para escribir al final del archivo o crar un archivo, si no existe para escribir en
él.
“w+” Abrir el archivo para leer y escribir, pero truncando primero su tamaño a 0 bytes. Si
el archivo no existe, se crea para leer y escribir en él.
5.3.2.2. Fread
el total de bloques leídos. Si el valor devuelto es 0 significa que se ha encontrado el final del
archivo.
5.3.2.3. Fwrite
Fwrite permite escribir datos en un archivo a través de su flujo asociado. Su declaración es:
#include <stdio.h>
size_t fwrite (const char *ptr, size_t size, size_t nitems, FILE *stream); Fwrite copia
en el archivo apuntado por stream nitems bloques, cada uno de tamaño de size bytes. Los
bloques a escribir se encuentran en la zona de memoria apuntada por ptr.
Si la llamada se ejecuta correctamente, devuelve el total de bloques escritos. Si se da una
condición de error, el número devuelto por fwrite será distinto del número de bloques que se le
pasó como parámetro.
5.3.2.4. Fclose
Fclose cierra un archivo que ha sido abierto con fopen. Su declaración es la siguiente:
#include <stdio.h>
int fclose (FILE *stream);
Fclose hace que toda la memoria intermedia de datos asociada a stream sea escrita en el
disco, que el espacio de memoria reservado para las memorias intermedias sea liberado y que el
flujo sea cerrado.
La operación de cerrado se realiza de forma automática sobre todos los archivos abiertos
cuando llamamos a la función exit. Fclose devuelve 0 si la llamada se ha ejecutado correcta-
mente y EOF (Final de archivo) en caso de que se produzca un error.
En la biblioteca estándar existen dos funciones para leer y escribir caracteres (bytes) sobre
un archivo asociado a un flujo. Estas funciones son fgetc y fputc que se declaran así:
#include <stdio.h>
int fgetc (FILE *stream); /* Lectura de caracteres */
int fputc (int c, FILE *stream) /*Escritura de caracteres*/
Fgetc devuelve el caracter siguiente al último leído del archivo asociado al stream. Aunque
fgetc va a leer los datos del archivo, devuelve un entero, con lo que se consiguen dos objetivos:
el primero es que el byte leído se devuelve como un caracter sin signo, y el segundo, que cuando
CAPÍTULO 5. SISTEMAS DE ARCHIVOS 265
se detecta el final del archivo se puede devolver EOF(-1) sin que haya lugar a confundirlo con
un dato válido.
En fputc, c es el byte que se va a escribir en el archivo. Cuando se produce un error, fputc
devuelve EOF. Si la escritura se produce correctamente, fputc devuelve el valor escrito.
Estas dos funciones tienen dos macros equivalentes: getc y putc, que se sirven de la memoria
intermedia asociada al flujo y de las funciones __fillbuf y __flsbuf para agilizar el proceso de
lectura/escritura.
Las funciones getchar y putchar, que actúan sobre la entrada estándar y la salida estándar,
pueden codificarse como macros a partir de getc y putc de la siguiente forma:
#define getchar() getc (stdin)
#define putchar(c) putc ((c), stdout)
Órdenes de consola o terminal. Se tienen muchas órdenes para interactuar con la computado-
ra a nivel consola. Esta interfaz permite tener un mayor control tanto sobre el sistema operativo
266 5.3. COMPONENTES DE UN SISTEMA DE ARCHIVOS
como sobre el hardware. El problema es que la línea de aprendizaje es larga y la complejidad ma-
yor. En general, para que un usuario haga uso de la consola o terminal de realizar los siguientes
pasos:
1. Entrar al sistema o inicio de sesión. Existen muchos programas que permiten conectarse
con la computadora y que dependen directamente de sistema operativo que se utilice. En
general, si estamos frente a una computadora local, ésta debe de arrancarse. Cuando el
sistema operativo termine de cargar, se presentará una pantalla de bienvenida y a su vez
indicará que introduzcamos un nombre de usuario y una contraseña. Si es administrador
del sistema dio de alta nuestro usuario entonces entraremos al sistema y podemos hacer
uso de el.
Si deseamos entrar a una computadora remota vía terminal, el proceso, no varía mucho,
se arranca la terminal, ésta contactará con el servidor remoto y nuevamente solocitará el
nombre de usuario y contraseña. Si es válida entonces iniciaremos una sesión y podremos
trabajar.
El último caso, es cuando necesitamos conectarnos desde una computadora a un servidor.
Es necesario contar con un programa que permita hacer la conexión. Tenemos el más co-
mún llamado telnet que permite iniciar una sesión bajo una terminal virtual. El problema
de esta orden es que envía el nombre de usuario sin incriptar, y es muy sencillo que otros
usuarios puedan ver la contraseña vía un sniffer que se usa para analizar los paquetes de
red y ver su contenido. Existe otro protocolo llamado ssh o shell seguro permite enviar
toda la información incriptada al servidor y recibirla de la misma forma.
Existen otros programas que permiten hacer estas funciones de diferente forma. Por ejem-
plo, si deseamos solamente enviar archivos y no abrir una sesión de trabajo, se puede
hacer uso de la orden ftp. Otra vez, con este protocolo la información viaja sin incriptar.
Su contraparte incriptada es la orden sftp o protocolo de transferencia de archivos segura.
mkdir <nombre directorio>. Crear un directorio vacío, su uso es muy simple, so-
lamente hay que añadir el nombre del nuevo directorio detrás del comando. Por
ejemplo mkdir prueba.
rm <dir>. Permite borrar el directorio llamado <dir>. Si el directorio no está vacío
no se borra. Si se desea borrarlo con todo y su contenido se usa entonces rm -R
<dir>.
ls o dir. lista el contenido de un directorio.
df -h. Se usa para ver la cantidad de espacio libre en el disco.
fuser -m <dispositivo>. Muestra todos los usuarios o procesos que están usando
el <dispositivo>. Si se usa la opción -mk permite “matar” los procesos que están
usándolo de mod que pueda desmontarse.
sudo <comando>. Permite ejecutar una orden con permisos de administrador. Cuan-
do necesitamos algún comando con más privilegios que los que tenemos como usua-
rio usamos entonces la orden sudo.
history. Muestra el historial de órdenes que se han ejecutado últimamente. Podemos
volver a ejecutar una orden del historial escribiendo !<numero de la historia>.
top. Muestra los procesos que se están ejecutando, carga del procesador, memoria
libre y ocupada. Esta información se actualiza constantemente.
ps -aux. La orden ps muestra los procesos activos en nuestra máquina, con la opción
-aux muestra información detallada de cada uno de ellos, como el propietario y el
uso de cpu por parte del proceso.
kill <pid>. Permite eliminar (matar) un proceso del sistema, es necesario conocer el
número del proceso que se desea terminar. Podemos obtener este pid de otras órdenes
como ps por ejemplo.
xkill. Igual que el comando kill pero de forma gráfica, si tienes una ventana que se ha
quedado colgada, ejecuta xkill y selecciona la ventana con el cursor que te aparecerá.
La ventana y el proceso que la creó morirán.
man <orden>. Quizás uno de las más importantes comandos del sistema, muestra
la ayuda detallada de la orden dada en <orden>.
medida de lo posible prestar estos nombres y contraseñas a otros, debido a que pueden
hacer tareas a nuestro nombre que sean dañinas u ofensivas a terceros y por lo tanto,
podemos tener problemas al ser los representantes directos de la cuenta.
El sistema operativo proporciona diferentes librerías que pueden ser usadas por los compi-
ladores y éstas a su vez por los programadores, de manera que éstos puedan llevar a cabo sus
CAPÍTULO 5. SISTEMAS DE ARCHIVOS 269
consola.
Existen otros directorios que contienen las cabeceras y las librerías para el desarrollo de
aplicaciones gráficas que se encuentran también en /include y en /lib. Hay que recordar, sin
embargo, que muchas de éstas deben ser instaladas vía terceras partes y que en sí no forman
parte del sistema operativo.
1. Pilas. Los datos se recogen en el orden en que llegan. Cada registro consta de una ráfaga
de datos. Su finalidad es acumular una masa de datos y guardarla.
2. Archivos secuenciales. En esta estructua se emplea un formato fijo para los registros, son
de la misma longitud y constan del mismo número de campos de tamaño fijo con un orden
determinado. Se necesita almacenar los valores de cada campo; el nombre del campo y
la longitud de cada uno son atributos de la estructura del archivo. Cada registro tiene un
campo clave que lo identifica (generalmente es el primero de cada registro). Los registros
se almacenan en secuencia por la clave. Se utilizan normalmente en aplicaciones de pro-
cesos por lotes, ya que es la única organización de archivos que se puede guardar tanto en
CAPÍTULO 5. SISTEMAS DE ARCHIVOS 271
cintas como en discos. Para las aplicaciones interactivas que incluyen peticiones o actua-
lizaciones de registros individuales, los archivos secuenciales no son óptimos. El acceso
requiere una búsqueda secuencial de correspondencias con la clave. Si el archivo entero
o gran parte de él pueden traerse a la memoria principal de una sola vez, se podrán apli-
car técnicas de búsquedas más eficientes. Al acceder un registro de un archivo secuencial
grande, se produce un procesamiento extra y un retardo considerable.
4. Archivos indexados. A los registros se accede solo a través de sus índices. No hay res-
ticción en la ubicación de los registros, al menos un índice contiene un puntero a cada
registro y pueden emplearse registros de longitud variable. Se suelen utilizar dos tipos de
índices, uno exhaustivo que contiene una entrada para cada registro del archivo principal
y se organiza como un archivo secuencial para facilitar la búsqueda, el otro índice es par-
cial que contiene entrada a los registros donde esté el campo de interés. Con registro de
longitud variable, algunos registros no contendrán todos los campos y cuando se añade un
registro al archivo principal, todos los archivos de índices deben actualizarse.
Desde el punto de vista del usuario la organización lógica de la mayoría de los sistemas
de archivos actual es a través de jerarquías y se les denominan carpetas, directorios o catálogos.
Cada directorio puede contener a su vez, más carpetas o archivos. Estas carpetas pueden contener
todavía más archivos y carpetas, y así sucesivamente. La cantidad de carpetas y archivos que
puede contener el sistema está limitado a la capacidad del medio de almacenamiento y a la
capacidad de direccionamiento del sistema operativo La estructura jerárquica permite mantener
organizados lógicamente los archivos y las carpetas.
El registro Maestro de Arranque (MBR). Master Boot Record sirve para arrancar la compu-
tadora.
Tabla de particiones. Viene al final del MBR y contiene la dirección inicial y final de cada
partición. Una de las particiones de la tabla está marcada como activa.
Varias particiones primarias y lógicas. Pueden contener diferentes sistemas operativos o da-
tos.
bloque de arranque Superbloque Admon. de espacio libre Nodos-i Dir. raíz Archivos y directorios
Estas son las convenciones que la mayoría de sistemas operativos siguen. Después de ello, la
organización del sistema de archivos difiere. Por ejemplo, en los sistemas UNIX/Linux, existen
los elementos mostrados en la figura 5.5. Observe la presencia del superbloque. Aquí se guarda
274 5.5. MECANISMOS DE ACCESO A LOS ARCHIVOS
información referente al tipo de archivos que existe en la partición, el número de bloques que
hay en el sistema de archivos y otros datos. Como esta información es muy importante varios
sistemas mantienen una copia de seguridad en diferentes bloques de la partición.
También hay un área reservada para administrar el espacio libre, el conjunto de nodos-i
almacenados en una estructura que permite conocer todo lo relativo al archivo. Existe una de
ellas por cada archivo, el directorio raíz que viene a ser la estructura más alta dentro de esa
partición y después los archivos y directorios que puede contener la partición.
Cintas Magnéticas. Éstas sólo permiten al acceso secuencial de los datos, pudiendo rebobi-
narse las veces que sea necesario para poder releer otro dato. La ventaja que tienen estos
dispositivos es su gran capacidad de almacenamiento en comparación con los discos y
su relación muy atractiva de costo/byte. Aunque esto está cambiando muy rápidamente a
favor de los discos.
Discos. Permiten el acceso directo a los discos con cierto tiempo de latencia en la recuperación
de la información, pero mucho más rápidos que el acceso a una cinta. También se incluyen
CAPÍTULO 5. SISTEMAS DE ARCHIVOS 275
Del funcionamiento de estos dispositivos se desprenden también los dos enfoques de acceso
a los archivos. El acceso secuencial y el acceso directo que analizaremos en las dos secciones
siguientes.
aprovecha las ventajas de los discos que pueden escribir rápidamente información en un cilindro
dado, permitiendo así el acceso inmediato a cualquier bloque del archivo tanto para lectura como
para escritura.
En general un archivo se considera compuesto de varios bloques de tamaño fijo, por lo tanto,
las aplicaciones o el sistema operativo pueden acceder a cualquier registro en casi el mismo
tiempo, en comparación con los dispositivos de acceso secuencial. También es posible simular
en un dispostivo de acceso aleatorio el acceso secuencial, puesto que también es posible acceder
a los registros en el orden dado.
En la mayoría de los sistemas actuales están orientados a caracteres o bytes y a bloques. Por
lo tanto, el usuario debe de proporcionar el byte o el bloque al que desea acceder. Un disco o un
CD-ROM es común que guarde muchos archivos. El usuario entonces debe de proporcionar el
nombre al que desea acceder y el byte o número de bloque, refiriéndose a partir del byte cero
o al bloque cero del archivo en mención. El sistema operativo traducirá entonces el nombre del
archivo y el número de bloque a una dirección de número de pista y número de sector o de
cilindro para determinar su ubicación exacta dentro del disco. Al número de byte o bloque y
nombre del archivo se le denomina número de bloque relativo.
Ahora supóngase que un usuario desea acceder al registro N de un archivo. Suponga también
que los registros tienen una longitud lógica de L. El sistema operativo traducirá esta petición en
una solicitud de entrada salida sonde se piden entonces L bytes a partir de la ubicación L ∗ (N )
dentro del archivo. Como los registros lógicos son del mismo tamaño, resulta sencillo realizar
operaciones de lectura escritura o borrar registros en cualquier parte del archivo.
El sistema operativo verifica también que el resultado anterior no exceda el tamaño espe-
cificado en la entrada de directorio. Si se excede, entonces generará un error de fin de archivo
alcanzado End Of File (EOF). De esta forma se asegura que un usuario no acceda a otros
archivos para los cuales no tenga autorización.
CAPÍTULO 5. SISTEMAS DE ARCHIVOS 277
Los manejadores de bases de datos utilizan algunos archivos especiales llamados archivos de
índice los cuales relacionan un dato con una posición específica dentro del archivo, permitiendo
así un acceso extremadamente rápido cuando un usuario realiza búsquedas de datos. De esta
forma el manejador de bases de datos solamente realizará la búsqueda en el archivo índice el
cual es mucho más pequeño que la base de datos original, después que ha encontrado el dato
solicitado, leerá la posición del registro en disco y procederá a leerlo completo de disco para
ponerlo a disposición del usuario.
Como puede verse en la figura 5.7, el archivo índice tiene almacenados los apellidos de
algunas personas y en otro campo guarda la dirección del registro en donde se localiza toda la
información concerniente a esa persona. Con este método no es forzoso que el archivo relativo
se encuentre ordenado, puesto que es más fácil ordenar el archivo índice.
Un archivo relativo puede tener varios archivos índice asociados, lo que permite una gran
versatilidad al momento de hacer búsquedas. Es común en bases de datos utilizar campos llave
para generar los archivos de índice. Es lógico que para poder usar un archivo de índice es ne-
cesario primero establecer el campo llave que va a utilizarse y entonces generarlo. Este proceso
de generación de archivos índice puede tardar mucho tiempo de acuerdo al tamaño del archi-
vo relativo. Una vez generado, los accesos serán mucho más rápidos por medio del archivo de
índice. Otro problema que debe tenerse en cuenta es que a medida que se agregue información
al archivo relativo, ésta no se refleja en el archivo índice, por lo que es necesario generarlo de
nuevo o implementar mecanismos que permitan la actualización simultánea de ambos archivos.
278 5.6. MANEJO DE ESPACIO EN MEMORIA SECUNDARIA
Asignación contigua. Es el esquema más sencillo. Se define el tamaño de bloque, que puede
ser ya sea por sector, o cluster que es lo más común. Ya definido el tamaño de bloque, se divide el
tamaño total del archivo entre el tamaño de bloque y se asigna esa cantidad de bloques contiguos
para almacenar el archivo en disco. El sistema operativo registra los bloques asignados como
marcados e indica en la estructura de datos a qué archivo le pertenecen.
La asignación de espacio contiguo en disco tiene dos ventajas importantes:
1. Su implementación es sencilla por que para llevar el control solamente necesita registrar
dos datos: la dirección en disco del primer bloque y el número de bloques con que cuenta el
archivo. Así es posible localizar cualquier bloque del archivo mediante una simple suma.
2. El desempeño de lectura es excelente porque puede leerse todo el archivo del disco en una
sola operación. Sólo se necesita posicionar el brazo en el primer bloque y los datos podrá
transferirse al máximo ancho de banda. (Lógicamente si el archivo es más grande que un
cilindro entonces necesitará reposicionarse el brazo en el siguiente al siguiente).
El problema principal de esta técnica es que con el tiempo tiende a fragmentarse. La frag-
mentación significa que, a medida que se van añadiendo y eliminando archivos, puede llegarse
el caso en el que el número de bloques contiguos disponibles no sea suficiente para almacenar
archivos mayores que un bloque.
CAPÍTULO 5. SISTEMAS DE ARCHIVOS 279
Vamos a poner un ejemplo de cómo es que se fragmenta un disco. Supóngase que el arreglo
de la figura 5.8 es el disco. Se define un tamaño de bloque de 10Kb y que se necesitan hacer las
siguientes operaciones:
a a b b c
⇓
a a c d d d
⇓
a a d d d e e e e
De acuerdo a las operaciones realizadas, cuando el disco está limpio se escribe sin ningún
problema los archivos a, b y el archivo c. Todos van en secuencia. Cuando se borra el archivo b
queda un hueco de dos bloques. La siguiente petición, exige tres bloques libres para el archivo d,
de modo que tiene que colocarse al final de los archivos en el espacio libre del disco. Enseguida
viene una petición de eliminación del archivo c de 10Kb. Como está junto con el archivo que se
borró el b tenemos ahora tres bloques libres. La última petición es la escritura del archivo e, pero
éste solicita cuatro bloques de modo que debe de escribirse de nuevo al final de los archivos en
el espacio libre.
Aunque en el ejemplo se observó que cuando se eliminan archivos que están juntos se crean
bloques más grandes, si las nuevas peticiones requieren aún más espacio, éstas deben de hacerse
al final de los archivos.
280 5.6. MANEJO DE ESPACIO EN MEMORIA SECUNDARIA
A medida que trascurre el tiempo, se irán acumulando los huecos pequeños, evitando así
escribir archivos grandes aún cuando la suma de todos los huecos sea mayor al tamaño del
archivo que se desea escribir.
Por el problema de fragmentación es que esta técnica ya no se utiliza para la implementación
de sistemas de archivos aunque para el acceso a ellos es muy rápida, por que siempre podemos
acceder a ellos en una sola operación de lectura.
Asignación por lista ligada. Este método consiste en guardar el archivo como una lista ligada
de bloques de modo que cada palabra contenida al principio del bloque indique la posición del
siguiente. El resto del bloque es para datos.
Con este esquema, las entradas de directorio almacena solamente la dirección del primer blo-
que del archivo, siendo entonces más pequeñas. Otra ventaja con respecto a la técnica anterior
es que aquí se utilizan todos los bloques, por tanto no existe fragmentación del del disco o frag-
mentación externa. Solamente existe fragmentación interna en el último bloque. La desventaja
es que el acceso a cada bloque implica la lectura del anterior, lo que hace a esta técnica dema-
siado lenta en operaciones de lectura/escritura debido al acceso aleatorio y al reposicionado de
las cabezas de lectura/escritura en busca de cada bloque del archivo.
2 −→ 13 −→ 15 −→ EOF
Bloque 0 Bloque 1 Bloque 2 Bloque 3
8 2 13 15
Como puede verse, otro problema es que el acceso ya no puede hacerse directo. Esto es,
para que el sistema operativo pueda, por ejemplo, alcanzar el último bloque de un archivo es
necesario leer n − 1 bloques, para poder acceder al número de bloque final, por lo que se pierden
todas las ventajas que puede proporcionar el disco con acceso aleatorio. Otro problema con
este enfoque es que la cantidad de bytes almacenados en un bloque ya no es potencia de 2. La
mayoría de los programadores está acostumbrado a utilizar potencias de dos como tamaño de
bloque, de modo que el sistema operativo necesita concatenar dos bloques para dar la cantidad
de bytes solicitada, lo que disminuye el rendimiento del sistema debido a las operaciones de
copiado.
Estas desventajas pueden eliminarse sacando el apuntador de cada bloque de disco y colo-
cándolo en una tabla en memoria. En la figura 5.10 podemos ver cómo quedaría esta tabla para
el ejemplo de la figura 5.9.
CAPÍTULO 5. SISTEMAS DE ARCHIVOS 281
Bloque Físico
0
1
2 13
3 8
4
5
6
7
8 2 ←− Aquí empieza el archivo
9
10
11
12
13 15
14
15 EOF
Con este enfoque los programadores pueden hacer uso de los bloques completos. El sistema
operativo tiene la opción de cargar la tabla de asignación de archivos o FAT (File Allocation
Table) a memoria una sola vez, de modo que el acceso a ésta es muy rápido.
No obstante el problema de fragmentación sigue existiendo aunque a otro nivel. Cuando
el sistema operativo crea por primera vez un archivo, le asigna todos los bloques que necesita
y éstos será muy probable que estén juntos. A medida que se añaden y se eliminan archivos
pequeños y grandes, el sistema operativo empezará a asignar bloques, en donde quiera que
éstos se encuentren. Esto hace que con el tiempo sea más difícil acceder a cada bloque del
archivo, debido a que se tendrá que hacer nuevamente muchos reposicionamientos de las cabezas
lectoras/escritoras. Aunque el sistema puede acceder a todos los bloques, el tiempo de acceso a
los mismos se incrementará en la medida en que éstos se encuentren dispersos por todo el disco.
Los sistemas operativos de microsoft han venido arrastrando el problema de fragmentación
desde el sistema de discos MS-DOS. Aunque era difícil notarlo por la pequeña capacidad de
los discos. A medida que éstos fueron creciendo en capacidad, el problema se hizo mucho más
notorio.
El problema se agrava cuando el sistema operativo tiene que implementar el servicio de
memoria virtual, si éste no define una partición especial en disco. Para poner un ejemplo, los
sistemas operativos de Microsoft siguieron este enfoque. Los diseñadores, no creyeron necesario
tener una partición especial para intercambio a modo de no reducir el espacio útil en disco
duro del usuario. De esta forma, el sistema operativo sigue indicando al usuario que cuenta con
todo su espacio en disco duro, pero el sistema mantiene oculto un archivo de intercambio que
aumenta y disminuye de acuerdo al uso del sistema. Esto ocasiona que muchos bloques queden
reservados por el sistema de intercambio así, los archivos de usuario tienden a fragmentarse
más rápido de lo normal, siendo entonces obligatorio correr cada cierto tiempo una aplicación
282 5.6. MANEJO DE ESPACIO EN MEMORIA SECUNDARIA
para defragmentar el disco duro que viene incluida en el propio sistema operativo o mediante
aplicaciones de terceros.
Otra desventaja de este método es que, para ganar la mayor velocidad posible, toda la tabla
debe de estar en memoria. Para discos pequeños, esto no es problema, pero para un disco de 80
GB con un bloques de 1 KB, la tabla necesitaría 80 millones de entradas. Si cada entrada necesita
tener un mínimo de cuatro bytes, entonces la tabla tendría 320 MB, lo que sería demasiado,
incluso para las computadoras actuales de 1 GB de memoria RAM.
Nodos-i. En este método se asocia a cada archivo una estructura de datos llamada nodos-i o
nodos-índice que contiene los atributos y direcciones en disco de los bloques de archivo. Dado
el nodo-i, es posible encontrar todos los bloques del archivo. La gran ventaja de este esquema
respecto a los métodos anteriores es que el nodo-i sólo tiene que estar en la memoria cuando
el archivo correspondiente está abierto. Si cada nodo-i ocupa n bytes y no puede haber más de
k archivos abiertos al mismo tiempo, la memoria total ocupada por el arreglo que contiene los
nodos-i de los archivos abiertos es de sólo kn bytes.
Este arreglo, es mucho más pequeño que el que se utilizaría para mantener la tabla de asigna-
ción de archivos. La razón es simple. La tabla debe tener forzosamente un tamaño proporcional
al tamaño del disco. Si el disco tiene n bloques, la tabla necesita n entradas. A medida que
aumenta el tamaño de los discos aumentará también la tabla en la misma proporción. En con-
traste„ el esquema de nodos-i requiere un arreglo en la memoria cuyo tamaño es proporcional al
número máximo de archivos que pueden estar abiertos a la vez. No tiene que ver el tamaño del
disco.
La estructura de un nodo-i la podemos ver en la figura 5.11. Como puede verse, en la es-
tructura se designa la primera parte del bloque para mantener los atributos del archivo, luego
se designan las primeras diez entradas para almacenar direcciones directas simples. Esto es,
almacenan direcciones de bloques de datos directamente.
La dirección de bloque de apuntadores se usa para extender la capacidad de los apuntadores
directos simples. Estas entradas pueden ser:
Indirecto simple. Es aquella que reserva un bloque de disco para guardar direcciones de tipo
directo simple.
Indirecto doble. Señala un bloque que contiene direcciones de bloques de tipo indirecto simple.
Indirecto triple. Señala un bloque que contiene direcciones de tipo indirecto doble.
Este mecanismo puede extenderse hasta donde sea necesario de modo que puedan guardarse
archivos de tamaño arbitrario. Para hacerlo, simplemente hay que agregar a la tabla de la figura
CAPÍTULO 5. SISTEMAS DE ARCHIVOS 283
5.11 más entradas al final especificando el tipo de direccionamiento que manejará, pudiendo ser
incluso, indirecto cuádruple, quíntuple, ... hasta donde sea necesario.
Implementación de directorios. Hasta ahora hemos visto la forma en la que es posible ma-
nejar los archivos en disco. A partir de este momento pasaremos a ver cómo se implementan los
directorios.
Un archivo, debe tener un nombre y atributos que permitan indicar las operaciones que pue-
den llevarse a cabo sobre éste y los usuarios que están autorizados a efectuarlas. Para que un
archivo pueda ser utilizado, es necesario primeramente abrir el archivo. Para ello el usuario debe
proporcionar un nombre, ya sea por medio de una ruta absoluta o una relativa. Con esta infor-
mación, el sistema operativo localizará la entrada de directorio correspondiente y comenzará a
efectuar las operaciones solicitadas.
De acuerdo a la técnica de manejo de archivos utilizada la información obtenida de la entrada
de directorio puede variar. Por ejemplo, puede proporcionar el bloque inicial y final si es que se
usa asignación contigua o el primer bloque si el esquema es de tipo FAT o nodo-i. En todos los
casos la principal función del sistema de directorios es estableces una correspondencia entre el
nombre de archivo ASCII y la información necesaria para localizar los datos.
Un aspecto muy importante es la manera en la que se relacionan los atributos con los archivos
y las entradas de directorio, su dueño, la fecha y hora de creación. Muchos sistemas lo hacen en
las entradas de directorios.
La primera opción es usar una estructura de datos con entradas de tamaño fijo, una por cada
284 5.6. MANEJO DE ESPACIO EN MEMORIA SECUNDARIA
archivo, que contiene un nombre de archivo de longitud fija, una estructura con los atributos del
archivo y una o más direcciones de bloques que indica en qué posición en disco se encuentra el
archivo.
En la figura 5.12 vemos cómo pueden distribuirse estos datos en la estructura de datos de
entradas de tamaño fijo.
El manejo de la estructura presentada en la figura 5.12 es muy fácil de implementar pero tiene
muchos inconvenientes. El primero de ellos es que por ser los nombres demasiado cortos llegan
a ser poco descriptivos, lo que dificulta la búsqueda de éstos por el usuario. Otro problema es el
manejo de subdirectorios que deben de implementarse de otra forma para mantener la estructura
coherente.
En los sistemas que usan nodos-i, se utiliza la misma lista, pero la diferencia es que ahora
usan uno o más nodos-i para guardar la información referente a los atributos en lugar de hacerlo
en las entradas de directorio. De esta forma, la entrada de directorio puede ser más corta: se
incluye solamente el m¿nombre de archivo y un número de nodo-i. En la figura 5.13 vemos
cómo se organiza esta estructura.
nombres.txt −→
cuentas.dat −→
muebles −→
-
Estructura de
datos con
atributos.
Longitud de entrada
del archivo 1
Atributos del archivo 1
c o n t a b
i l i d a d
Entrada - - f i n a
para un n c i e r a
archivo - r e a l
Longitud de entrada
del archivo 2
Atributos del archivo 2
v e n t a s
- d e l - m
e s
Longitud de entrada
del archivo 3
Atributos del archivo 3
v e n t a
.
.
.
tiendo los caracteres a sus valores ASCII y, por ejemplo, sumarlos y luego hacer una división
entre un número impar. La tabla consistirá entonces en n-1 entradas donde cada una contendrá
un nombre. Bajo este esquema es necesario manejar las colisiones. Una colisión sucede cuando
al calcular el valor llave de algún nombre éste ya ha sido ocupado por otro, por lo tanto, esa
posición no puede ser asignada al nuevo nombre. Una forma de solucionar este problema es me-
diante el uso de listas simplemente ligadas, de modo que si esa posición de la tabla está ocupada,
entonces se crea un nuevo nodo de lista y éste se liga a la posición ya ocupada. Esto permite que
siempre haya lugar en la lista no importando cuántas veces haya sido ocupada esa llave. Este
esquema combina la fortaleza de la búsqueda por llaves y una ligera búsqueda lineal dentro de
la lista simplemente ligada.
El problema de este enfoque es que si está mal diseñado el cálculo de las llaves entonces la
tabla hash puede degenerar en una sola o muy pocas listas simplemente ligadas perdiéndose las
CAPÍTULO 5. SISTEMAS DE ARCHIVOS 287
Apuntador al
nombre de archivo 1 (00)
Entrada
Atributos del archivo 1
para un
Apuntador al
archivo
nombre de archivo 2 (30)
Atributos del archivo 2
c o n t a b
00
i l i d a d
06
- - f i n a
12
n c i e r a
18
- r e a l
24
30 v e n t a s
36 - d e l - m
42 e s v e n
48 t a
.
.
.
Sobre las implementaciones de los sistemas de archivos a nivel de usuario, el sistema ope-
rativo debe de ser capaz de proporcionar diferentes formas de acceder a los archivos que han
sido guardados en el disco duro. Desde los comienzo de la computación ha sido necesario per-
mitir a un usuario acceder a sus archivos de forma remota vía terminal o por medio de otras
computadoras.
Un servidor de archivos entonces será aquella computadora que sea capaz de proporcionar
acceso a los archivos guardados en algún medio de almacenamiento masivo como un disco duro,
una cinta, un DVD o algún otro a uno o varios usuarios. Entonces en general podemos decir que
cualquier computadora es un servidor de archivos. Cuando las redes de computadoras personales
hicieron su aparición se modificó un poco esta definición. Se excluyen aquellas computadoras
que solamente dan servicio a un solo usuario y se reemplaza por aquellas que pueden propor-
cionar el servicio de archivos a más de un usuario a la vez. Aunque una computadora personal
puede proporcionar archivos a muchos usuarios, debe hacerlo de forma secuencial, éstos so-
lamente pueden usarla un usuario a la vez. Una computadora que es capaz de proporcionar el
servicio de archivos a más de un usuario al mismo tiempo se le denomina servidor de archivos
Actualmente se ha afinado aún más la clasificación de servidores de acuerdo al tipo de servicios
que manejan y podemos encontrar las siguientes:
1. Servidor de archivos. Proporciona servicios de archivos a usuarios de la red.
5. Servidor de correo. Proporciona servicio de correo electrónico a sus usuarios ya sea local
o de red internet.
8. Servidor de juegos. Permite que varios usuario se conecten vía red y compartan los mis-
mos escenarios de un juego, es posible hacer alianzas, comerciar, pagar tributos o inter-
cambiar recursos.
CAPÍTULO 5. SISTEMAS DE ARCHIVOS 289
10. Servidor proxy. Permite compartir la red internet a varios usuarios con una sola salida
a internet. Restringiendo o privilegiando a distintos usuarios de acuerdo a las pautas del
administrador.
12. Servidor WEB. El servidor de páginas WEB proporciona los archivos en formato html
para que sean interpretados por el navegador WEB del usuario.
Es aquella computadora que permite la conexión de varios usuarios permitiéndoles las ope-
raciones comunes de archivos. Es posible también que aplicaciones remotas hagan uso de los
archivos locales con los que cuenta el servidor. La mayoría de las veces no permite la ejecución
de aplicaciones en el servidor.
Una definición sencilla puede ser: un servidor de archivos es una computadora que almacena
diferentes tipos de archivos y los pone a disposición de varios clientes de la red simultáneamente.
Básicamente cualquier servidor puede funcionar como servidor de archivos.
Algunos protocolos que suelen utilizarse en servidores de archivos son:
1. NETBEUI. Protocolo usado por MS-DOS y Windows para compartir archivos vía red.
2. NetWare IPX/PSX. Protocolo usado por Novell para compartir archivos en la red.
una técnica conocida como túnel que permite empaquetar esos protocolos en datagramas
de tipo TCP/IP.
3. Seguridad. Para poder acceder al servidor el usuario debe de autenticarse. Además las
aplicaciones las proporciona el propio servidor haciendo uso de certificados para poder
CAPÍTULO 5. SISTEMAS DE ARCHIVOS 291
autorizar su ejecución o uso de los archivos de datos del sistema, por lo tanto se consideran
más seguras.
2. Sitios de Internet. Son aquellos que se encuentran disponibles para todo el mundo, siendo
necesario contar con al menos un servidor de nombres de dominio, un servidor de páginas
WEB y un servidor de correo electrónico opcional.
Se deben tener al menos una computadora con conexión a internet, y se debe contar con un
conjunto de programas básicos para dar servicio WEB. Existen básicamente dos tipos de páginas
WEB que se manejan actualmente:
Páginas estáticas. Las páginas estáticas son aquellas que se diseñan una sola vez y que
son actualizadas manualmente.
Páginas dinámicas. Son aquellas generadas vía algún lenguaje de programación WEB
como PHP o java en combinación con manejadores de bases de datos, lo que permite la
actualización dinámica o en tiempo real de las mismas.
292 5.6. MANEJO DE ESPACIO EN MEMORIA SECUNDARIA
La seguridad de los archivos se refiere tanto al hecho de impedir que personas no autorizadas
accedan a su información como a posibles desastres que inutilicen al sistema de archivos. La
destrucción de un archivo, es problemático. La destrucción de todo el sistema de archivos es
un desastre. Incluso si se daña la computadora, ésta puede reemplazarse sin muchos problemas.
Pero cuando se daña el sistema de archivos, hay muy poco por hacer. Es posible también intentar
recuperar la tarjeta de interfaz del disco duro siempre y cuando los platos magnéticos no tengan
problema.
Aunque el sistema de archivos no podrá nunca prever desastres naturales o daños imprevistos
del hardware, sí puede ayudar a proteger la información de diversas maneras.
Los discos flexibles pasan el control de calidad sin mucho problema, pero a través del uso
y debido a que las cabezas de lectura escritura tienen contacto físico con la superficie, si éstas
bajan un poco más de lo debido pueden causar rayaduras en su superficie. Incluso, si el propio
empaque del disco baja por causa de un golpe o por haber soportado un peso excesivo, puede
causar también rayaduras que dañen a uno o más sectores.
Es posible también que bajo la presencia de un campo relativamente débil, durante mucho
tiempo podría ocasionar la pérdida de algunos sectores o de todo el sistema de archivos conte-
nido en éste.
Se sabe que ha habido discos que han soportado mucho peso y campos magnéticos intensos,
pero cuando se trata de información importante, no está demás considerar un cuidado adecuado
con sentido común de los discos.
Los discos duros, tienen un promedio de vida que va de los cuatro a los cinco años sin pre-
sentar algún problema. Algunos durarán mucho más. No obstante, aunque nuestro disco duro no
reciba golpes, puede, por el uso continuo empezar a presentar problemas de lectura o escritura.
Aunque el controlador de disco puede manejar los sectores defectuosos o marcarlos para
que no se usen, existen otras técnicas que se pueden emplear para mantener segura nuestra
información. En la siguiente sección mencionaremos algunos mecanismos de protección que
todo profesionista de la información debe de conocer.
CAPÍTULO 5. SISTEMAS DE ARCHIVOS 293
1. El primer campo define los permisos de acceso del propietario del archivo o directorio.
Por omisión tiene los permisos de lectura, escritura y ejecución o acceso al directorio.
2. El segundo campo define los permisos de grupo. Estos los puede definir, ya sea el propie-
tario del archivo o en su defecto el administrador del sistema.
3. El tercer campo define los permisos de todo el mundo. Esto es, cualquier persona que tenga
contacto con el archivo o directorio puedeejercer los permisos que tenga esta sección.
La primera columna establece los permisos y está dividida en cuatro partes. La primera
indica el tipo de entrada. por ejemplo, para la primera línea tenemos que es una entrada de
directorio. Luego vienen tres grupos escritos de la forma rwx. El guión significa que no se tiene
asignado ese permiso. La siguiente columna indica el número de enlaces que tiene, luego el
nombre del propietario, el del grupo al que pertenece, el tamaño (en bytes), una marca de tiempo,
y el nombre del archivo. La marca de tiempo que se visualiza es la de la última modificación.
Para archivos especiales de dispositivo el campo de tamaño se reemplaza normalmente por los
números de dispositivo mayor y menor.
294 5.6. MANEJO DE ESPACIO EN MEMORIA SECUNDARIA
Si es un directorio, indica que se tiene permiso para entrar a él y mostrar sus conte-
nidos.
Directorios de un solo nivel. Es la forma más sencilla de guardar los archivos. También se
le conoce como directorio raíz, pero como es el único, el nombre no importa. Cuando
empezaron a surgir las primeras computadoras personales era común este tipo de organi-
zación, debido a que los discos eran de poca capacidad y por que la mayoría de las veces
solamente podía trabajar olamente un usuario. Si la computadora se compartía entonces
cada usuario portaba su información en un disco flexible e incluso transportaba también
su propio sistema operativo de disco. También existieron computadoras multiusuario que
utilizaron este tipo de estructura de directorio. por ejemplo, la primer supercomputadora la
CDC 6600, tenía solamente un directorio que compartían todos los usuarios. El problema
de usar un solo directorio es que es posible que varios usuarios intenten usar un mismo
nombre para archivos diferentes causando incluso pérdida de información al sobreescribir
un archivo existente de forma accidental. También otro problema inherente es la poca or-
ganización del sistema de archivos. Con el tiempo se vuelve difícil y complicado navegar
a través de muchos archivos que no tienen que ver con los que realmente usa algún usuario
determinado. Por estas y otras razones actualmente ya no se usan.
Directorios de dos niveles. Mediante el uso de esta organización de directorios, no importa que
varios usuarios escojan el mismo nombre para diferentes archivos. Estos son identidades
diferentes por el simple hecho de estar almacenados en directorios distintos. De esta for-
ma proporcionando a los usuarios directorios privados, el usuario es libre de asignar los
nombres que desee sin preocuparse por los demás usuarios. Bajo Este esquema, tendremos
entonces el directorio raíz, después tendremos los directorios privados de los usuarios y
dentro de ellos los archivos de cada uno.
torios privados de los usuarios y éstos también tienen el permiso de crear a su vez tantos
subdirectorios como crean necesario para organizar sus archivos. De esta manera se crea
un árbol de directorios y el sistema operativo proporciona un conjunto de órdenes para
poder navegar a través de ellos, basándose también en los permisos adecuados de acceso.
Cuando el sistema de archivos está organizado como árbol de directorios, es posible acceder
a diferentes archivos, ya sea entrando primeramente a cada uno de ellos, o haciendo uso de la
ruta completa para referenciar el archivo. A esta ruta se le denomina nombre de ruta. El nombre
de ruta especifica a qué directorios se deben de acceder primeramente para poder hacer uso de
un archivo. El nombre del archivo va al final del nombre de ruta. Los sistemas UNIX/Linux
utilizan la “/” como separador de directorios y de archivo. Los sistemas basados en Windows
usan la barra invertida \ para esa función. La ruta absoluta se especifica a partir del directorio
raíz. En la tabla 5.3 tenemos algunos ejemplos de rutas absolutas.
Windows \sistemas\vídeo
UNIX/Linux /home/nalonzo/sistemas
MULTICS >usr>datos
Observe cómo éstas se especifican desde el directorio raíz, esto significa que deberán empe-
zar, por ejemplo en windows con un \ y en UNIX/Linux con una /.
Las rutas relativas son aquellas que no llevan al principio el \ o la /. Esto hará que el sistema
operativo empiece a buscar en el directorio actual el nombre del directorio o el archivo que se
desea. En la tabla 5.4 tenemos algunos ejemplos de rutas relativas.
La ruta relativa también está relacionado con el concepto de directorio de trabajo o direc-
torio actual. El usuario puede especificar tanto para el sistema operativo como para la mayoría
CAPÍTULO 5. SISTEMAS DE ARCHIVOS 297
Windows documentos\datos
UNIX/Linux documentos/dato
de las aplicaciones en qué directorio desea que se ubique después de que éstas empiezan a eje-
cutarse.
Vamos a suponer que tenemos un archivo llamado datos en el directorio /home/documentos,
De acuerdo a lo visto anteriormente tenemos dos maneras de hacer referencia a éste:
• cd /documentos
• less datos
Observe que cuando usamos la ruta relativa ha sido necesario ubicarse primeramente en el
directorio documentos el directorio actual o directorio de trabajo. Después de esto se puede
acceder al archivo sin la ruta.
La mayoría de los sistemas operativos actuales permiten establecer rutas por omisión, de ma-
nera que si se hace referencia relativa a un programa o a un archivo, el sistema empieza a buscar
en el directorio de trabajo o directorio actual. Si no lo encuentra empezará entonces a buscar en
las rutas establecidas por defecto. Es común que estas rutas por defecto estén almacenadas en las
variables de entorno. Muchas aplicaciones establecen variables de entorno de manera que pue-
dan localizar los archivos necesarios para su ejecución. Una variable de entorno es aquella que
se inicializa desde un archivo de configuración momentos después de que se inicia el sistema
operativo o que puede ser definida por el usuario en tiempo de ejecución.
Existen dos nombres de directorios especiales que son muy útiles para hacer referencia a
otros directorios. Estos son el nombre de directorio “.” y el nombre de directorio “..”, llamados
directorio “punto” y directorio “punto punto”. El directorio “.” hace referencia al directorio de
trabajo actual. y el directorio “..” hace referencia al nombre del directorio padre. De esta forma
si estamos haciendo uso de la orden “cd” Change Directory y deseamos subir al directorio padre
tenemos que ejecutar la instrucción.
cd ..
si se ejecuta la instrucción
cd . el sistema operativo no hará nada(estamos en el directorio actual).
298 5.7. MODELO JERÁRQUICO
En los sistemas UNIX/Linux para regresar inmediatamente al directorio de trabajo por de-
fecto se usa la orden cd sin ningún parámetro.
Operaciones con directorios Las operaciones más comunes que podemos realizar sobre los
directorios son las siguientes:
4. Cerrar directorio. Una vez que se ha leído un directorio, éste debe cerrarse, puesto que
es un caso especial de archivo . Esto permite guardar los cambios hechos en la estructura
de directorios a disco y lleguen a ser permanentes.
5. Leer directorio. Una llamada de este tipo devuelve la siguiente entrada de un directorio
abierto.
8. Desligar. Esta operación permite eliminar la entrada del archivo del directorio donde se
encuentra. En general esta operación solamente eliminará la entrada de directorio corres-
pondiente. Si existe más de una instancia o enlaces al archivo, se decrementará el contador
de nodo-i (específico de UNIX) y se eliminará la entrada de directorio correspondiente, las
CAPÍTULO 5. SISTEMAS DE ARCHIVOS 299
demás entradas permanecerán hasta el contador de nodo-i llegue a cero. En ese momento
el archivo o directorio quedará eliminado de disco.
Existen otras operaciones relacionadas con los permisos asociados a cada directorio, inclu-
yendo las listas de acceso y los permisos de lectura escritura a los mismos.
5.8.1. Implementación
La implementación de los mecanismos de protección van orientados hacia la prevención de
la pérdida de información y también hacia la pérdida o borrado involuntario o accidental de
archivos. Los mecanismos de protección son los siguientes:
1. Copia de seguridad de las aplicaciones. La mayoría de las aplicaciones llevan dos ar-
chivos paralelamente y con unos cuantos minutos de variación que son elegidos por el
usuario. De esta forma, si se pierde el archivo principal, el usuario tendrá que recuperar
solamente la información capturada durante ese lapso de tiempo.
2. Copias por el sistema operativo. Este mecanismo es muy usual en muchos sistemas
operativos. Cuando un usuario borra un archivo, éste no se borra en realidad, si no que
pasa a un directorio conocido como papelera de reciclaje de esta forma, si el usuario
borró accidentalmente ese archivo podrá recuperarlo inmediatamente restaurándolo de la
papelera. Cabe hacer mención que los archivos que se encuentran en la papelera no podrá
ser usados como archivos normales hasta que no se restauren.
también los respaldos diarios, de nuevo en orden inverso. Es normal que se usen esquemas
de respaldo incremental más elaborados para facilitar la recuperación.
La mayoría de los sistemas de archivos no permiten respaldar archivos que estén siendo
usados actualmente. También si se llegara a permitir esta situación bajo las circunstancia de
que el archivo esté siendo usado en modo de solo lectura, puede ser posible que un minuto o
segundos después cambie su modo a escritura, lo que hace que el respaldo realizado no será
consistente con respecto al archivo original. Esto obliga entonces a dedicar completamente el
sistema de archivos a la operación de respaldo, lo que implica dejar de usar el sistema. Pero un
respaldo de mucha información puede tardar más de una hora, dependiendo de la cantidad de
información, lo que lo hace complicado, puesto que tendría que dejar el sistema fuera de línea
durante parte de la noche.
La creación de respaldos, como se ve, presenta muchos problemas no técnicos en una orga-
nización. El mejor sistema de manejos de respaldos en línea del mundo podría ser inútil si el
administrador de sistemas guarda todas las cintas de respaldo en el sótano, junto con materiales
inflamables o que puede ser susceptible a inundaciones, incluso a ser destruidas por roedores.
Además el hacer un respaldo diario, no sirve de mucho si las cintas se encuentran en el mismo
edificio u oficina y el incendio, además de acabar con las computadoras, termina también con
las cintas de respaldo. Lo recomendable es tener también otro paquete de cintas de respaldo en
otro edificio, aunque esto también sea un problema potencial de seguridad frente al espionaje o
robo de información.
Existen dos formas de realizar los respaldos de un disco en cinta.
1. Respaldo físico. Permite hace una copia exacta bloque por bloque del disco. El programa
lo que hace es copiar a nivel de bloque todo el disco, uno a uno registrando también la
posición a la que corresponde cada uno de ellos. La principal ventaja que ofrece es que es
posible eliminar casi por completo los posibles errores de copiado, incluso si un bloque
está dañado, la aplicación avisará y además solamente afectará al archivo o directorio
302 5.9. PROBLEMAS
5.9. Problemas
5.1. ¿Por qué es necesario el uso de archivos?
5.6. ¿Cuáles son las dos principales formas de acceso a archivos que proporciona un sistema
operativo?
5.21. ¿Cuáles son los métodos de acceso a los dispositivos de almacenamiento masivo? Ex-
plíquelos.
5.26. ¿A qué nos referimos con una ruta relativa?, ¿Y con una absoluta?
304 5.9. PROBLEMAS
5.33. Explique la estrategia de asignación por lista ligada de bloques para un archivo.
5.36. ¿Cómo se almacenan los nombres largos?, ¿Qué estructuras de datos se utilizan?
5.39. ¿Cuáles son las diferentes servicios que se derivan de un servidor de archivos? Explique
cada uno de ellos.
5.40. ¿Cuáles son los protocolos de red más comunes? Explique cada uno de ellos.
5.47. ¿Qué deben proporcionar los mecanismos básicos de seguridad de un sistema operati-
vo?
CAPÍTULO 5. SISTEMAS DE ARCHIVOS 305
5.49. ¿Cuál es el significado de las abreviaturas rwx en una entrada de archivo?, ¿Y en una
entrada de directorio?
5.55. ¿Cuál es la estrategia más común que usan las aplicaciones para prevenir pérdidas
accidentales de algún archivo?
5.57. Haga un análisis sobre aquella información que debe ser respaldada en un sistema de
computadora y cuál no.
5.67. Explique los tres tipos de interfaz que proporciona el sistema operativo a sus usuarios.
306 5.10. LECTURAS ADICIONALES
5.68. Explique los tres pasos para poder trabajar en un sistema operativo en modo consola.
5.69. ¿Cuáles son las órdenes más comunes que se utilizan en una sesión de usuario en modo
consola?
5.71. ¿Bajo qué forma entrega el sistema operativo la interfaz correspondiente a los progra-
madores?
5.73. En un sistema UNIX/Linux, ¿Cuál es el símbolo que se utiliza para usuarios normales?,
¿Y para el administrador?
Los sistemas RAID permiten unir dos o más discos para verlos como uno solo. Existen dife-
rentes niveles (denominados niveles RAID) que indican la forma de implementar la distribución
de los datos en los discos. Holland[49] describe una herramienta para sistemas RAID, mientras
que Chen y Petterson[27] describen una técnica para maximizar el desempeño en arreglos de
discos divididos.
Diane Tang[102] realiza una evaluación de desempeño de algunos sistemas de archivos.
También S. Chen y Towsley[28] realizan otras medidas de desempeño sobre una arquitectura
RAID.
308 5.10. LECTURAS ADICIONALES
Capítulo 6
Protección y Seguridad
U alquier aplicación, incluyendo los sistemas operativos, deben de realizar sus tareas en un
C tiempo adecuado como para que puedan entonces considerarse útiles. Cualquier aplicación
que entregue su trabajo tiempo después, comparado, por ejemplo, con un operador humano, no
tendrá entonces oportunidad de que al menos se siga usando, por muchos que sean los beneficios
que pueda proporcionar.
A medida que salen al mercado nuevos procesadores más rápidos, discos duros y memorias
de mayor capacidad, se les exige entonces a las aplicaciones y a los sistemas operativos mayor
facilidad de uso y desempeño. Ha habido muchas aplicaciones de software que al no poder
funcionar con una velocidad adecuada han sido desechados y retomados nuevamente mucho
tiempo después, hasta el momento en que ya existía el hardware adecuado como para poder
ser utilizado. Un ejemplo de ello fueron los algoritmos de entrenamiento de redes neuronales
artificiales. Incluso, con los avances de hardware actuales se sigue teniendo problemas para el
entrenamiento de grandes redes.
Existen muchas áreas, principalmente en el campo de la ciencia, en donde se requiere una
gran capacidad de cómputo para llevar a cabo sus tareas. En estas áreas la mayoría de las veces
se sacrifica la facilidad de uso, como por ejemplo, los entornos gráficos, para aprovechar esa
preciosa capacidad de cómputo en la resolución de problemas. Tenemos por ejemplo, el área
emergente de los algoritmos bioinspirados aplicados a la optimización de recursos, la búsqueda
combinatoria de nuevos compuestos farmacéuticos, la clasificación de estrellas y muchos más.
En el lado productivo se requieren sistemas que puedan controlar fábricas completas. Estos
sistemas se encuentran presentes en toda la línea de producción y comúnmente se usan sistemas
operativos en tiempo real.
Los grandes sistemas de correo electrónico, páginas WEB y los buscadores se ven cada
día más presionados por la competencia, tanto en la capacidad de almacenamiento que deben
309
310
soportar como en la velocidad promedio a la que deben de atender a sus usuarios. A medida
que se incrementa el número de usuarios aumenta el tiempo de espera del mismo. Bajo este
panorama, los administradores de sistemas deben de buscar alternativas que permitan mejorar el
tiempo de respuesta a sus usuarios.
En el área de la computación personal, el slogan de las empresas de software es vender, por
ejemplo uno de los campos más exigentes son los juegos. Las operaciones gráficas son las más
costosas computacionalmente hablando. En segundo lugar tenemos el medio ambiente gráfico,
que en la actualidad ya no es un lujo, es una necesidad para la mayoría de los usuarios de
computadoras.
Debido a que las empresas les interesa más vender, salen al mercado con cierta regularidad
nuevas versiones de software que incluyen muy pocas ventajas o funcionalidades con respecto
a la versión anterior. No obstante, cada cierto tiempo que va de unos tres a cuatro años1 , salen a
la luz versiones de sistemas operativos o de aplicaciones que exigen una capacidad de cómputo
mayor que el promedio de las computadoras con una vida cercana a los dos años anteriores. Esto
obliga irremediablemente a una actualización de hardware, cerrándose de esta forma el ciclo. Es
común que el software vaya a la zaga con respecto al desarrollo del hardware, pero, como se
dijo en cierto momento, el software da un salto intentando emparejarse y ocasionando entonces
una actualización obligada. (Si es que se desea contar con lo último en innovación tecnológica).
También se ha visto que algunos sistemas operativos tienen poco soporte hacia atrás. Esto
es, llega el momento en que los cambios son tan grandes que ya no es posible seguir soportando
las características de varias aplicaciones que en las versiones anteriores del sistema operativo
funcionaban correctamente.
La mayoría de las personas que compran un nuevo sistema de cómputo se basan principal-
mente en tres aspectos: la velocidad de procesador, la capacidad de la memoria y el disco duro.
Los más informados tomarán en cuenta también la capacidad de memoria caché en el procesa-
dor, la memoria RAM, las velocidades de bus de la tarjeta madre y de la memoria incluyendo
también la velocidad de acceso del propio disco duro, obteniendo con estos datos el timming
o los ciclos de reloj que debe insertar la CPU para esperar a que la memoria RAM o el disco
duro haga la tarea designada. Así, se dará una idea más clara de cuanto se está desperdiciando
en tiempo de procesador.
Aunque que la velocidad del procesador es importante, también hay que observar que se
debe de combinar adecuadamente la velocidad del procesador con la del bus de la tarjeta madre,
con la velocidad de la memoria y por supuesto, con el tiempo de acceso del disco duro. No
tiene caso tener un procesador de 3GHz, sin memoria caché, montado en una tarjeta madre con
1
Que por otro lado, es el tiempo de vida o garantía que tiene una computadora o servidor convencional
CAPÍTULO 6. PROTECCIÓN Y SEGURIDAD 311
un bus de 100MHz2 , o una memoria PC663 o agregando un disco duro de por ejemplo, 5400
revoluciones por minuto, que tenga, eso sí 200 GBytes de capacidad (No creo que exista uno
de estos). (compárese con un disco duro SCSI de 15 mil revoluciones por minuto). El ejemplo
anterior es un extremo y es muy improbable que se dé, pero si vamos a hablar de optimización
y desempeño es necesario tener en cuenta el hardware que tiene nuestro equipo y ajustar en la
medida de lo posible las velocidades junto con nuestro presupuesto.
La tendencia actual es facilitar en la medida de lo “imposible” el uso de la computadora. Al
hacer uso del término imposible4 , me refiero al hecho de que la mayoría de las aplicaciones y
de los sistemas operativos incluirán código que se use muy raras veces y que, en cambio debió
dedicarse muchísimo tiempo de programación y depuración para implementarlas, en lugar de
impulsar funcionalidades que ayuden a disminuir claramente la brecha entre el sistema operativo
y el usuario mejorando el tiempo de respuesta. El costo por incluir funcionalidades de este tipo
puede incurrir en una carga más grande y también una disminución significativa de la preciada
memoria RAM.
Todo ello se ve impulsado por la necesidad de venta y por la necesidad de tener cautivos a
los usuarios. De este modo, si se encuentran con otro sistema operativo en donde sea necesario
tener que aprender una larga lista de órdenes o un esquema que exija un razonamiento mínimo
acerca del uso de algún servicio del sistema operativo. La mayoría de los usuarios regresarán a
la comodidad del “doble click”.
Aunque el invento del ratón significó un gran avance en la computación, también ha creado
una gran dependencia del mismo y si la gente no tiene al alcance de un “click” y su ícono
correspondiente la función que desea, no encontrará la manera de hacerlo por otro camino. Así,
cada vez más vamos formando a nuestros futuros egresados como “Licenciados del doble click”.
A son de broma incluso algunos usuarios se refieren a la cantidad de clicks que son necesarios
para instalar un sistema operativo o alguna aplicación dada.
Este enfoque puede ser perfecto para aquellas personas que no tienen que ver con la compu-
tación, pero un egresado de las ciencias de la computación y áreas afines, debe estar preparado
más allá del famoso doble click.
Aunque cabe aclarar que muchas personas consideran que regresar a la línea de órdenes
frente a una consola es retroceder a la edad de piedra de la computación. Ojalá y algún día no
tengan que instalar un servidor SUN de última generación, con todos sus servicios, un desem-
peño inmejorable y tener que configurarlos en la terminal5 !!!.
2
Actualmente existen tarjetas base que corren a 1 GHz en bus.
3
Quiere decir que corre a 66 MHz. Existen en el mercado memorias que corren a 800MHz.
4
Considerando que el usuario debe estar ante un sistema operativo “amigable” o en otras palabras “a prueba de
tontos”.
5
Aunque intentan poner una interfaz gráfica amigable, su fuerte está en el desempeño y a ello dedican más su
312 6.1. CONCEPTOS Y OBJETIVOS DE PROTECCIÓN
1. El sistema debe ser consistente. El sistema debe comportarse como se espera, esto es, no
deben darse nunca cambios inesperados.
tiempo.
CAPÍTULO 6. PROTECCIÓN Y SEGURIDAD 313
2. Servicio. El sistema debe proporcionar los servicios necesarios de forma confiable, cons-
tante y consistente.
4. Control de acceso. La información generada por un usuario no debe ser puesta a disposi-
ción de otros a menos que así lo decida el propietario. El sistema operativo debe de contar
con los mecanismos adecuados en el sistema de archivos de tal forma que pueda asegurar
diferentes modalidades de acceso a los archivos. (Vea por ejemplo, la sección 5.6.3.1 en
la página 293).
5. Autenticación. El sistema debe contar con los mecanismos adecuados para asegurarse de
que la persona es realmente quien dice ser. Además de contar con los privilegios necesarios
para realizar las tareas a las que está autorizado y de acceder a sus archivos bajo esos
privilegios.
Los equipos informáticos deben protegerse mediante medidas de seguridad física. Estas me-
didas pueden ir desde guardias de seguridad hasta mecanismos sofisticados de autenticación.
La seguridad física debe de contemplarse desde la planeación misma del centro de proce-
samiento de datos. Por ejemplo, debe seleccionarse un área elevada para evitar inundaciones,
pero no tanta como para atraer continuamente rayos o en su defecto instalar pararrayos a una
distancia adecuada, para evitar que lleguen a caer en sus cercanías.
Otro aspecto importante de observar es evitar en la medida de lo posible su ubicación en
donde haya continuas marchas, mítines y manifestaciones. o en su defecto buscar la manera de
protegerlo con las medidas adecuadas.
La calidad del servicio eléctrico es otro factor en el que debe de poner sumo cuidado. Con-
tinuos apagones puede ocasionar desde la pérdida parcial de datos, hasta el daño de los propios
equipos. Considérese también el uso de fuentes ininterrumpibles de poder, la instalación de sis-
temas de potencia de emergencia o ambos, dependiendo del caso.
Todas estas medidas de seguridad deben de ser acompañadas de políticas y procedimientos
claros sobre el acceso y uso del equipo y de la información. Debe también de existir el regla-
mento correspondiente que norme con sanciones las faltas que pongan en riesgo los sistemas o
la información, de manera que se hagan cumplir las reglas por el bien de todos.
314 6.1. CONCEPTOS Y OBJETIVOS DE PROTECCIÓN
Existen muchos libros sobre la seguridad en donde se puede ampliar este tema. El escribir
más sobre ello sale del alcance de los objetivos de este libro.
1. Amenazas. En general los sistemas de computación tienen tres metas a cumplir basándose
en la seguridad. Por supuesto, para estas metas tienen sus respectivas amenazas:
Integridad de datos. Implica que solamente los usuarios autorizados pueden hacer
cambios a los datos. Esto implica que nadie ajeno a esta información puede alterar o
añadir información falsa.
Confidencialidad de datos. Sólo puede acceder a los datos la persona autorizada
para ello. Implica que nadie más puede leer y mucho menos modificar los datos con-
tenidos en el sistema. Esto es, si el propietario de los datos ha indicado que solamente
un determinado grupo puede acceder a esa información, el sistema debe asegurarse
de que así sea.
Disponibilidad del servicio. Significa que nadie debe poder alterar el sistema de
modo que se vuelva inestable o que sea imposible usarlo. Los ataques que se realizan
para lograr esto se llaman ataques de negación de servicio.
2. Intrusos. Un intruso es una persona que no está autorizada a entrar en un sistema dado,
de modo que intenta hacerlo sigilosamente. Existen dos clasificaciones para los intrusos:
Intrusos pasivos. Son aquellos que solamente les interesa leer los archivos y que,
por supuesto, no están autorizados para ello. Aquí podemos incluir a aquellas per-
sonas que solamente quieren curiosear y que muchas veces no tiene conocimiento
técnico para llegar más allá. Si el sistema lo permite, entonces verán el contenido de
cualquier archivo. Por ejemplo en un sistema UNIX, GNU/Linux, tanto las carpetas
como los directorios se crean por omisión con permisos de lectura y ejecución para
el grupo y para todo el mundo. En los sistemas basados en windows, antes de la
versión de NT, no tenían ningún tipo de protección, más que la que proporcionaba
CAPÍTULO 6. PROTECCIÓN Y SEGURIDAD 315
la utilería attrib y que además para alguien con ese conocimiento resultaba absurda-
mente fácil cambiar también los permisos. Incluso aquellos sistemas basados en NT
sin una buena administración de usuarios para mantener los datos privados, puede
resultar igual de sencillo ver el contenido de los archivos.
Intrusos activos. Estos intrusos, desean, además de leer, hacer cambios en los datos,
ya sea para beneficio personal o simplemente destruir la información. Claro, tampoco
están autorizados para realizar esos cambios o borrar los archivos.
Estos usuarios, son por lo común gente que se encuentra autorizada a entrar al sis-
tema, pero consideran un reto violar los mecanismos de seguridad para ganar pri-
vilegios. En este grupo podemos encontrar a profesores, estudiantes o técnicos que
trabajan en el mismo centro de cómputo o que estudian en una universidad.
hay otros que intentan usar su posición dentro del sistema para intentar ganar dinero.
Por ejemplo, en un banco, una técnica común es truncar las fracciones de centavo y
enviar esas fracciones a otra cuenta. Esto lo logran modificando los programas o los
scripts que hacen las consultas o actualizaciones a las bases de datos. En otros casos
son capaces de chantajear a la administración exigiéndoles mejores condiciones de
trabajo e incluso dinero, amenazándolos con destruir la información.
El último grupo es el de aquellos que se introducen en los sistemas comerciales o
militares para robar nuevos diseños y patentarlos antes de que lo haga la empresa.
Así cuando la empresa intente patentarlo, la persona que lo hizo podrá demandarla
o exigir regalías por uso de la patente, en la mayoría de los casos la empresa pre-
fiere pagar las regalías o comprar de nuevo su patente a detener la producción del
nuevo producto, evitando así grandes pérdidas económicas. En el caso de accesos no
autorizados a un sistema militar puede vender la información al enemigo.
3. Pérdida de datos. Sin considerar aquellas que son ocasionadas por gente mal intenciona-
da, existen pérdidas accidentales de datos, dentro de ellas podemos enumerar las siguien-
tes:
La forma más barata y común de evitar muchos de estos problemas es manteniendo res-
paldos en un lugar alejado y bien resguardado del centro de procesamiento de datos. En la
sección 5.8 de la página 299 se vieron algunas de las técnicas más comunes de respaldo
de datos.
6.1.2. Vigilancia
La vigilancia es una técnica que permite monitorear de cerca a algunos usuarios sospechosos
de forma que pueda llevarse un seguimiento de todas las actividades que está realizando. A
medida que el tiempo pasa se van acumulando pruebas sobre el sospechoso de modo que no
haya ninguna duda sobre sus actos no autorizados.
Para evitar que hagan daño a otros usuarios, es normal que se implemente un sistema de
cómputo exclusivamente para recolectar toda esta información. A estos sistemas se les denomina
jaulas y pueden estar dentro del mismo sistema operativo pero en otro directorio que emula
perfectamente al sistema real o puede ser, como se dijo, una copia en otra computadora. Debido
a que los intrusos (que pueden ser hackers o crackers) intentan borrar todas las huellas que van
dejando a su paso es recomendable ir almacenando la información en otro sistema paralelo.
Este esquema debe complementarse con las técnicas adecuadas de auditoría y registro de
actividades del sistema.
Existen otras herramientas que permiten monitorear al sistema en tiempo real como swatch.
Esta herramienta debe configurarse con algunas palabras clave o patrones que buscará en los
archivos de logs en tiempo de ejecución. Cuando encuentre una coincidencia ejecutará la acción
correspondiente que puede consistir en enviar una alarma, ejecutar otra aplicación o enviar un
correo electrónico al administrador.
de los usuarios incluyendo la fecha, hora y el tiempo que estuvo dentro de la sesión. De esta
forma, el administrador del sistema puede localizar actividades que estén fuera de lo común y
prevenir así daños mayores.
La administración de usuarios basada en el principio de privilegio mínimo, implica que cada
usuario tenga su propia cuenta, esto permite asignarle solamente los privilegios necesarios sobre
su información y restringir su acceso a otros datos. Algunos sistemas operativos basan sus me-
canismos de control de acceso en base a roles denominado RBAC (Role-Based Access Control)
para proporcionar esta funcionalidad.
En la figura 6.1, el dominio D1 tiene acceso de lectura sobre el archivo 1 y sobre el archivo 2.
El dominio D2 puede solamente imprimir usando la impresora láser. El dominio D3 puede eje-
cutar el archivo 1 y leer el archivo 3. Aunque, por obvias razones, se debe de incluir un permiso
CAPÍTULO 6. PROTECCIÓN Y SEGURIDAD 319
de lectura “oculto” para poder ejecutar el archivo 1, que más bien, aquí estaría indicando que
no puede ser visualizado por el dominio D3 . El dominio D4 tiene permisos de lectura/escritura
sobre el archivo 1 y el archivo 3.
En un sistema de protección dinámico es necesario en algunas ocasiones revocar derechos de
acceso a los objetos compartidos por diferentes usuarios. Se debe dar respuesta a las siguientes
preguntas para saber la manera mediante la cual se debe hacer la revocación:
1. Parcial o total. ¿Es necesario revocar solamente un subconjunto de derechos asociados
con un objeto, o revocar todos?
3. Inmediata o diferida. ¿La revocación debe darse inmediatamente o debe ser efectuada
en algún momento en el futuro?
4. Temporal o permanente. ¿Se puede revocar el acceso por un período de tiempo determi-
nado o ya no se debe volver a asignar ese derecho?
3. El diseñador de un subsistema no tiene que proporcionar los mecanismos para hacer cum-
plir la protección.
4. Una notación declarativa es natural por que los provilegios de acceso están íntimamente
relacionados con el concepto lingüístico de tipo de datos.
Las ventajas relativas del cumplimiento de la protección par parte del núcleo en comparación
con la protección proporcionada en gran medida por un compilador serían
1. Seguridad: La obligación del cumplimiento por parte del núcleo ofrece mayor grado de
seguridad que el que ofrece el compilador ya que en el compilador, la seguridad depende
de lo correcto que sea el traductor, del mecanismo suyacente de administración de alma-
cenamiento que proteja los segmentos desde los cuales se ejecuta el código compilado y
de la seguridad de los archivos desde los que se carga un programa.
Por su parte, el sistema operativo debe acometer también su responsabilidad con respecto a
la seguridad e implementar los mecanismos adecuados tomando en cuenta el tipo de usuario al
que va dirigido.
Si se mantiene el principio de mínimo privilegio éste debe de respetarse en todos los ámbitos.
Esto significa que debe de haber un sistema operativo a la medida para cada situación. Por
ejemplo, no podrá usarse el mismo sistema operativo para divertirse en casa que aquel que va
a usarse en la empresa o en un banco. Como puede verse los niveles de seguridad debe de
extremarse en el último caso.
322 6.6. VALIDACIÓN Y AMENAZAS AL SISTEMA
6.6.1. Validación
6.6.1.1. Validación de usuarios
En los primeros sistemas no había aún autenticación de las personas que deseaban entrar a
la computadora. Por ejemplo, en los sistemas MS-DOS simplemente era necesario introducir el
disco del sistema operativo y a partir de ahí era posible tener acceso a todos los recursos de la
computadora y leer a su vez todos los discos flexibles o discos duros que estuvieran al alcance.
Ahora todos los sistemas operativos cuentan con algún método de autenticación. Cuando una
persona inicia una sesión en el sistema operativo, lo primero que tiene que hacer es introducir
su nombre de usuario y una contraseña. Algunos sistemas pueden obviar la contraseña más
aún cuando la seguridad no es un factor importante en el sistema, como por ejemplo en una
computadora para uso personal o multimedia.
Con estos datos, el sistema operativo determina la identidad del usuario y al mismo tiempo
CAPÍTULO 6. PROTECCIÓN Y SEGURIDAD 323
Información privada del usuario. Es una o más palabras que sólo conoce el usuario.
Cosas que se posee el usuario. Puede ser por ejemplo, una llave de hardware, una tarjeta elec-
trónica, alguna característica física, como sus huellas digitales digitales o el iris de sus
ojos o algún otro dispositivo que sea irrepetible por cada usuario.
Como puede notarse, la forma más utilizada de autenticación es la del par nombre de usuario
y contraseña. Este método es fácil de entender y de implementar. La forma más sencilla de ha-
cerlo es manteniendo una lista de pares que incluye el nombre de inicio de sesión y su contraseña
respectiva.. Cuando una persona desea entrar al sistema escribe su nombre de usuario y su con-
traseña, el sistema buscará el nombre en la lista y comparará la contraseña, si coincide entonces
permitirá a la persona entrar al sistema, de otra forma será rechazado el inicio de sesión.
Es común que la contraseña, cuando la escribe el usuario se cambie por asteriscos, incluso
algunos sistemas no muestran absolutamente nada para ni siquiera dar información de la longitud
de la misma. El primer enfoque lo utilizan los sistemas de windows NT en adelante, mientras
que los sistemas Unix toman el segundo enfoque.
Si un hacker o un cracker quieren entrar a un sistema, lo primero que deben hacer es con-
seguir un nombre de usuario y su respectiva contraseña. En la sección 6.6.2.1 vimos algunas de
las técnicas más comunes, por ejemplo, la de ingeniería social.
Existe una gran variedad de ataques para obtener los nombres de usuarios y sus contraseñas.
Para obtener el primero se puede hacer uso de una utilería llamada finger en Unix o intentar
con diferentes tipos de nombres. Es común que los ataques vayan dirigidos. Lo primero que
hará un hacker si es posible, será un poco de ingeniería social, ya sea de manera local o remota,
324 6.6. VALIDACIÓN Y AMENAZAS AL SISTEMA
fingiendo ser un amigo de internet en una sala de chat. Después intentará encontrar la contraseña.
Esto se logra mediante una técnica conocida como ataque a diccionario. Con esta técnica el
atacante creará primeramente un diccionario de área local, por ejemplo, uno para Estados Unidos
y otro para México (Si se va a atacar una computadora de México no tendrá mucho sentido usar
un diccionario estadounidense), incluso pueden ser aún más localizados, como por ejemplo, el
estado o ciudad llegando incluso a nivel de oficina o la casa. Este diccionario contendrá los
nombres de los objetos y las personas más comunes en ese lugar. Después creará un programa
shell o programa por lotes para automatizar el ataque que irá proporcionando una a una las
palabras al sistema hasta encontrar la contraseña correcta. Existe una versión completamente
funcional con varios diccionarios incluidos con la opción de añadirle más se llama john the
ripper. Es libre en internet y es usada por muchos administradores de sistemas para verificar las
contraseñas de sus usuarios, pero también puede ser usada para otros fines. Más aún si el cracker
tiene acceso a la computadora como usuario local.
Aunque parezca increíble, algunos estudios, como el Morris y Thompson (1979) demos-
traron que cerca del 87 % aparecían en las listas que diseñaron, que consistía en una lista de
contraseñas verosímiles tales como los nombres de pila y apellidos, nombres de calles, ciuda-
des, palabras de diccionario escritas normalmente y al revés, número de matrículas de auto y
cadenas de caracteres cortas formadas aleatoriamente.
Otra técnica es la conocida como marcadores bélicos Un marcador bélico es una compu-
tadora con un programa diseñado para marcar automáticamente números telefónicos. Si se com-
bina uno de estos con los ataques a diccionario puede ser una combinación fatal. Por ejemplo un
cracker usó un marcador bélico combinado con la adivinación de contraseñas logrando entrar
a una computadora de citybank en Arabia Saudita, de donde obtuvo una lista de números de
tarjetas de crédito y registros de transacciones.
Con todo lo anterior vale la pena preguntarse ¿Es necesario construir contraseñas difíciles
de adivinar?
La respuesta es obviamente sí. Enseguida se proporcionan algunas reglas que deben de se-
guirse para obtener una contraseña difícil de adivinar:
5. Debe ser fácil de recordar. Una contraseña imposible de adivinar no sirve si se olvida.
Algunos sistemas operativos obligan a los usuarios a cambiar su contraseña con regularidad,
limitando posibles daños si es que llega a adivinarse la contraseña de algún usuario. El problema
de este enfoque es que si la cambian con demasiada frecuencia se vuelva un proceso tedioso y
acabarán por hacer uso de contraseñas fáciles o si usan contraseñas complicadas las anotarán en
hojitas adhesivas y las tendrán pegadas cerca del monitor o en algún cristal a la vista de todo el
mundo convirtiéndose en un problema de seguridad potencial.
6.6.1.2. Dominios
En la figura 6.2 tenemos definidos tres dominios. El dominio 1 tiene asociados dos archivos
el archivo 1 tiene permiso de lectura y el archivo 2 tiene permisos de lectura y escritura. El
dominio dos tiene tres archivos el archivo 3 tiene permiso de lectura y que el archivo 4 tiene
permisos de lectura, escritura y ejecución. El archivo 5 tiene permisos de lectura y escritura. El
dominio 3 tiene un archivo de lectura, escritura y ejecución. El dominio 2 y tres comparten una
impresora que tiene solamente permisos de escritura.
6
Identificador de usuario
326 6.6. VALIDACIÓN Y AMENAZAS AL SISTEMA
Todo usuario puede hacer uso de objetos. Un objeto puede ser por ejemplo, la CPU, una
unidad de cinta o un disco duro. Cada objeto está relacionado con un conjunto de operaciones
que se pueden ejecutar sobre dicho objeto. Se puede concluir entonces, que todo objeto pue-
de se considerado como un dominio. Incluso, es posible también definir dominios en base a
un subconjunto de operaciones de un objeto que permitan tener un control más fino sobre las
operaciones que pueden llevar a cabo determinados usuarios sobre un objeto en particular.
Borrado. Permite eliminar el archivo y liberar la entrada de directorio para su uso futuro junto
con el espacio.
Cuando se almacena por filas consiste en asociar a cada objeto una lista ordenada que con-
tiene todos los dominios que pueden tener acceso al objeto y cómo. Esta lista se denomina lista
de control de acceso (ACL: Access Control List).
Cada archivo en la figura 6.3 tiene asociada una lista ACL. Por ejemplo, el archivo F1 indica
que el usuario A, tiene permiso de lectura y escritura y B tiene solamente permiso de lectura.
El archivo F2 tiene en su ACL a tres usuarios con permisos distintos: el usuario A y el usuario
C tiene permiso de lectura, B tiene permiso de lectura y escritura. Observe que los procesos
pertenecientes a ese usuario también tienen exactamente los mismos derechos. De esta forma,
no importa tanto el identificador de proceso, es el dueño del proceso quien es el que indica al
sistema operativo a qué archivos y qué derechos tiene de acuerdo a su lista de control de acceso.
En la figura 6.3 muestra la forma básica del uso de las listas de control de acceso. En la
práctica se usan sistemas más elaborados. Hasta ahora solamente se han manejado tres tipos
CAPÍTULO 6. PROTECCIÓN Y SEGURIDAD 327
de permisos (RWX), pero pueden existir más. Puede haber, por ejemplo, permisos globales o
genéricos. También pueden asignarse derechos por grupo y no por usuario, de esta manera, se
facilita la administración de algunos recursos que deben ser compartidos por varios usuarios. La
manera más común es crear nuevos grupos. El GID o identificador de grupo, puede incluirse en
la lista de control de acceso correspondiente. El sistema operativo debe por tanto, verificar si un
usuario pertenece a un grupo que sí tenga los permisos para acceder al archivo solicitado.
grado la interacción con el usuario, que algunos lectores de correo pueden llamar automática-
mente al programa asociado sin intervención del propio usuario. Además viene también de la
necesidad de sacar nuevas versiones del programa y poder obtener algún dinero extra con las
actualizaciones.
Otro ejemplo es el contenido de las páginas WEB. Antes todo el contenido era estático y los
elementos animados que podía contener una página se reducían a imágenes tipo gif . Al pasar el
tiempo, se pasó por incluir contenido dinámico dentro de los sitios WEB. El contenido dinámico
implica que el usuario tenga que correr pequeños programas llamados applets o cokies (galle-
titas) para hacer una página más atractiva. Todo esto implica que cualquier persona maliciosa
pueda usar estos pequeños programas con otros fines e instalar, por ejemplo, un keylogger7 .
Cuando las páginas eran estáticas, no había tantos problemas de seguridad. Ahora, apenas se ha
corregido un problema, cuando ya otros han tomado su lugar.
Algunas instituciones prefieren la seguridad a las funciones llamativas. Por ejemplo, los
sistemas militares, pero la mayoría de las empresas prefieren un sistema fácil de usar aunque esté
lleno de agujeros de seguridad a implementar sistemas más sencillos con la debida capacitación.
Para resumir, es necesario contar con un modelo de seguridad en el centro del sistema opera-
tivo que sea lo suficientemente sencillo, por ejemplo, como el principio de privilegios mínimos
de modo que todos los involucrados en el proyecto puedan entenderlo completamente y resistir
todas las presiones por añadir funciones superfluas, que debiliten la seguridad en general.
En el centro de todo sistema basado en el enfoque de confianza se encuentra la base de
cómputo de confianza (TCB Trusted Computing Base que consiste en el hardware y software
necesarios para hacer cumplir todas las reglas en materia de seguridad. Si la base de confianza
trabaja de acuerdo a las especificaciones, la seguridad del sistema no podrá ser violada, sin
importar que las otras cosas estén mal.
La TCB consta de la mayor parte del hardware, haciendo a un lado aquellos dispositivos que
por su propia naturaleza no afectan la seguridad, una porción del kernel del sistema operativo y
la mayoría, si es que no todos los programas de usuario que tienen facultades de superusuario.
Entran también aquellas funciones propias del sistema operativo como la creación de procesos,
la administración de la memoria, la planificación de procesos y la mayoría de las tareas de
administración de archivos y de entrada salida.
Una parte importante de la TCB es el monitor de referencias. El monitor de referencias acep-
ta todas las llamadas al sistema con implicaciones de seguridad, como la solicitud de apertura de
archivos y decide si debe de ser procesada o no. De esta forma permite colocar todas las decisio-
nes de seguridad en un solo sitio, sin posibilidad de ignorarlo. Muy pocos sistemas operativos
7
Un pequeño programa que captura la entrada del teclado y es capaz de enviar los resultados a otro sitio o un
correo electrónico
CAPÍTULO 6. PROTECCIÓN Y SEGURIDAD 329
se diseñan de esta manera y en muchas de las ocasiones es la razón principal de sus problemas
de seguridad.
En la figura 6.4 tenemos el mecanismo básico para implementar un monitor de referencias.
6.6.1.5. Auditoría
Una de las principales actividades que debe de llevar a cabo un administrador es la de efec-
tuar regularmente auditorías a los registros del sistema. En la sección 6.8.2 se habló brevemente
de algunas instrucciones que pueden usarse para leer los registros de actividades del sistema. No
obstante, confiar al cien por ciento en estos registros no tiene fundamento. En primer lugar por
que la mayoría de la información escrita se encuentra en texto plano y es muy fácil de modificar
si se tiene el permiso de acceso correspondiente. Lo más recomendable es guardar los registros
en otra máquina que se encuentra fuera de la computadora que se va a auditar o en el mejor de
los casos enviar la salida correspondiente, no a los archivos de logs del sistema si no directa-
mente a la impresora. De esta forma, se hace muy difícil de poder eliminar. En el entendido de
que la impresora no se encuentre al alcance de los atacantes.
En un sistema basado en Unix existe el mecanismo de logs para almacenar toda la informa-
ción concerniente a las actividades del sistema.
330 6.6. VALIDACIÓN Y AMENAZAS AL SISTEMA
La mayoría de las actividades realizadas por un sistema Unix son susceptibles de ser mo-
nitorizadas: desde el tiempo que utiliza la CPU para ejecutar una aplicación, pasando por los
accesos a los archivos, el ingreso de los usuarios al sistema, procesos que ejecutan hasta la hora
en que salen incluyendo los accesos fallidos que ha habido durante el inicio de alguna sesión.
Aunque el sistema de logs tiene el problema de ser texto plano, tiene la ventaja de que puede
ser también procesado rápidamente y de esa forma saber si existen actividades irregulares en el
sistema, esto es permiten de manera automática detectar actividades “sospechosas”.
Un sistema Unix se basa en los siguientes procesos y archivos para poder dar seguimiento a
las actividades del sistema:
El demonio syslogd . Este proceso se lanza automáticamente después de que arranca un sis-
tema Unix. Es el proceso encargado de guardar los informes correspondientes a las ac-
tividades desarrolladas en una máquina. Recibe los mensajes de las diferentes partes del
sistema y se encarga de clasificarlos en distintos archivos, de acuerdo a su procedencia.
syslog. El archivo syslog (guardado en /var/log/ o en otro directorio parecido) es uno de los
archivos de log más importante del sistema; en éste se almacenan, en texto plano, los
mensajes correspondientes a la seguridad de la máquina, como los accesos o los intentos
de acceso a ciertos servicios. No obstante, este fichero es escrito por syslogd, por lo que
dependiendo de nuestro archivo de configuración encontramos en el archivo una u otra
información. Al estar guardado en formato texto, podemos ver su contenido con un simple
more, less o cat.
wtmp. Es un archivo binario y no podemos visualizar su contenido con visores de texto. Aquí
se almacena información relativa a cada conexión y desconexión al sistema. Podemos ver
su contenido con la orden last.
utmp. El archivo utmp es un fichero binario con información de usuarios que están conectados
actualmente; el programa /bin/login genera un registro en este fichero cuando un usuario
conecta, mientras que init lo elimina cuando lo desconecta. Para ver el contenido de es-
te archivo podemos se utilizan como last (indicando el nombre del archivo mediante la
opción -f), w o who (que significa en este caso quien).
CAPÍTULO 6. PROTECCIÓN Y SEGURIDAD 331
sulog. Es en este archivo de texto donde se registran las ejecuciones de la orden su, indican-
do fecha, hora, usuario que lanza el programa, usuario cuya identidad adopta, terminal
asociada y éxito (‘+’) o fracaso (‘-’) de la operación.
Puede hacerse uso de herramientas que facilitan el resumen de la gran cantidad de informa-
ción contenida en los archivos logs del sistema, como por ejemplo la herramienta swatch[7],
que permite avisos en tiempo real cuando se detecta alguna actividad sospechosa.
Tan pronto se ha detectado una intrusión al sistema es prioridad establecer que tipo de in-
formación ha sido expuesta y analizar todo el sistema en busca de puertas traseras. Es necesario
aislar completamente el sistema para evitar que el intruso efectúe una acción que pueda com-
prometer mucho más el sistema, como el borrado del disco duro o algo similar.
En la sección 6.6.1.3 se hizo una descripción de cómo hacer uso de las listas de control
de acceso como medio de control de las actividades en el sistema de archivos. Como podrá
recordarse a cada archivo y directorio se le asigna un propietario, un grupo o una lista de usuarios
con permisos particulares. Otro enfoque, que podemos encontrar en Solaris 10 es el de control
de acceso basado en roles (RBAC, role-based access control). La idea principal ahora es el
privilegio. Un privilegio es el derecho que tiene un objeto (ya sea un usuario o un proceso) de
ejecutar una llamada al sistema o a usar una opción dentro de dicha llamada al sistema como
abrir un archivo para lectura o escritura. La ventaja es que se pueden asignar privilegios a los
procesos, limitando a exactamente el tipo de acceso que necesitan para realizar su tarea.
Los privilegios y programas pueden asignarse a roles. Un rol es parecido a un dominio, esto
es, es un conjunto de privilegios que forman parte de una tarea común (rol). Así los roles se
asignan a los usuarios para que pueda ejecutar la aplicación con la que podrá desempeñar su
tarea. La asignación de roles que activan uno o más privilegios reducen el riesgo de seguridad
asociado con los superusuarios y con los programas que necesitan privilegios de superusuario
temporalmente (programas con el setuid activado).
En la figura 6.5 vemos cómo el usuario n ejecuta un proceso con los privilegios que están
asignados a un rol.
332 6.6. VALIDACIÓN Y AMENAZAS AL SISTEMA
El control de acceso. El sistema operativo provee los mecanismos de acceso a los recursos de
forma tal que asigna solamente los recursos necesarios autorizados a cada usuario.
Auditoría. El administrador u otro equipo deben de vigilar continuamente los registros del
sistema para prevenir o detener ataques.
La técnica más confiable y que debería estar implementada completamente en todos los
sistemas operativos es la de los sistemas basados en la confianza en donde todas las llamadas
son analizadas antes de que sean pasadas al núcleo. Este enfoque se describió en la página 327
en la sección 6.6.1.4.
Aunque un sistema esté basado con la política de seguridad en mente, deben de hacer pruebas
exhaustivas antes de poner el sistema operativo en el mercado. En realidad, tal parece que es todo
lo contrario. Las estrategias de marketing y las propias compañías liberan versiones beta para
que sean probadas por los usuarios. En esta etapa es posible detectar muchos errores y aún así
el sistema operativo que llega al usuario final está lleno de fallos.
Para enfrentarse a esta gran cantidad de problemas y resolverlos lo más pronto posible, en
la actualidad existen sistemas de reporte de errores automatizados para la mayoría de las aplica-
334 6.6. VALIDACIÓN Y AMENAZAS AL SISTEMA
ciones incluidos los sistemas operativos. Esto permite que los desarrolladores sean rápidamente
notificados sobre alguna vulnerabilidad encontrada durante el trabajo diario de los usuarios.
Muchas de ellas están a tal grado automatizadas que simplemente solicitan al usuario su auto-
rización para que sea enviado el reporte de error junto con toda la información necesaria para
poder reproducir el fallo y corregirlo. El usuario debe esperar a que se genere el paquete de
parches o Service pack que incluye las nuevas versiones de utilerías o aplicaciones que tienen
corregidas las vulnerabilidades encontradas durante uno o dos años.
Son aquellos que se realizan dentro del propio sistema por usuarios que trabajan en la em-
presa. Podemos tener los siguientes:
Ingeniería social. La ingeniería social es una técnica que ocupan algunos usuarios para ha-
cerse de contraseñas de otras personas o incluso del superusuario o administrador. Se le llama
ingeniería social por que el usuario llega con la persona que escogió como víctima y podrá hacer
cualquiera de las siguientes cosas:
2. Buscar pequeñas notas. Hay muchas personas que escriben sus contraseñas cerca del
monitor o el teclado “para acordarse más rápido”. Una simple ojeada y el usuario se hará
de una nueva contraseña.
3. Mirar el teclado. Si se observa suficientes veces, un usuario será capaz de “leer” la con-
traseña a medida que la persona la escribe. Es mucho más fácil cuando la persona no está
familiarizada con el teclado.
Caballos de troya. El nombre viene por la manera en cómo los griegos lograron penetrar en
la ciudad de Troya. En términos de computación se trata de un pequeño programa que parece
CAPÍTULO 6. PROTECCIÓN Y SEGURIDAD 335
inocente pero que contiene código que puede realizar alguna función inesperada o destructora.
Por ejemplo, dicha función puede modificar, borrar o cifrar los archivos del usuario, además
de que pueda reenviarse a otros vía correo electrónico. El programa comúnmente va disfrazado
como una aplicación útil y gratuita como un juego, un visor de algún formato de vídeo, un
programa que proporciona nombres de usuario y contraseñas para entrar a sitios de pornografía
o algo parecido que pueda llamar la atención del usuario de manera que se animen a bajarlo e
instalarlo. Como puede verse, ya que se está ejecutando el caballo de troya puede hacer todo lo
que tiene permitido el usuario, incluyendo conexiones a la red borrar archivos o enviarlos a una
dirección preestablecida por el diseñador del programa.
Otra manera de engañar al usuario para que ejecute el caballo de troya es guardándolo en un
directorio en donde alguien lo pueda ejecutar. La mayoría de los sistemas operativos manejan
una variable de entorno llamada $PATH que indica en cuáles rutas debe de buscar el sistema
operativo para ejecutar una orden. Las entradas más comunes pueden ser las siguientes:
/usr/local/SDK/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games para mostrar las rutas que
existen actualmente en $PATH se usa la orden:
echo $PATH
Así, cuando se teclea una orden en el shell éste verifica primero si existe un programa con
ese nombre en cada ruta separada por “:” si lo encuentra entonces lo ejecuta, de otra forma
indicará que no existe. Si el caballo de troya fue insertado en alguno de esos directorios y es
llamado por el usuario entonces habrá ganado la batalla. También es común que se haga uso
de aquellos errores de “dedo” más comunes como por ejemplo “cst” en lugar de “cat”, “la” en
lugar de “ls”. Si el usuario comete este pequeño error, se ejecutará el programa y luego mostrará
un mensaje indicando que el programa no existe para pasar inadvertido. En muchas ocasiones
cuando un intruso ha robado una contraseña intentará colocar el caballo de troya llamándolo
como una orden del sistema colocándolo en el mismo directorio del usuario. Así sólo le queda
esperar a que éste ejecute una de esas órdenes. Este truco puede funcionar en un sistema basado
en windows, por que el sistema operativo verifica primero si el programa se encuentra en el
directorio actual antes de buscarlo en las rutas del sistema. En un sistema basado en UNIX no se
ejecutará debido a que el directorio actual no se toma en cuenta a menos que la orden se ejecute
indicando el directorio actual por ejemplo: ./ls, lo cual es muy improbable que haga el usuario.
Falsificación de inicio de sesión. Esta técnica la usa un usuario que tiene acceso al sistema.
Elabora un programa que se asemeja al inicio de sesión del sistema y la deja corriendo en su
propia sesión. De esta forma, cuando llega otro usuario escribirá su nombre de usuario para
ingresar, a continuación el programa le solicita la contraseña y la guarda en el directorio del
falsificador. En vez de dar acceso al usuario simplemente termina la sesión y permite que el
336 6.6. VALIDACIÓN Y AMENAZAS AL SISTEMA
sistema operativo pida nuevamente el nombre de usuario y contraseña. El usuario pensará que
se equivocó y nuevamente ingresará con sus datos al sistema. El falsificador tendrá entonces en
su directorio los datos necesarios para acceder a la información de la víctima. Si el falsificador
deja corriendo muchas sesiones falsas en diferentes áreas podrá hacerse de muchas contraseñas
en muy poco tiempo.
Actualmente esta es una técnica común que usan algunos estafadores en internet. Hacen una
interfaz idéntica a la de algún banco, envían un correo electrónico a la víctima indicando que el
banco necesita confirmar alguna información y que es necesario que entre a verificarlos. Junto
al mensaje proporcionan la liga al sitio de internet con la interfaz falsa. Si el usuario se introduce
en ella, escribe sus datos de acceso y no observa la barra de dirección del navegador8 entonces
le habrá dado su información al defraudador con las consecuencias que ya conocemos.
Bombas lógicas. Son segmentos de código insertados en el sistema que verifican que se siga
dando algún evento, por ejemplo que un usuario siga proporcionando su nombre y contraseña.
Si se sigue haciendo esto todo el tiempo no pasa nada, pero si trascurre mucho tiempo sin que
ese evento suceda entonces la bomba se activará ocasionando pérdida de información o alguna
otra cosa.
Algo parecido a una bomba lógica son las trampas. La diferencia es que una trampa per-
mite el acceso al sistema por medio de un usuario oculto. Esto puede lograrse insertando en el
programa de autenficación una parte de código que evite la verificación de la contraseña para
ese usuario en específico. La única manera de evitar este problema es mediante la revisión de
código fuente como procedimiento estándar. De esta forma, cuando un programador termine de
codificar un módulo, tendrá que explicar ante un comité de control cada línea del código escrito.
Esto permite elevar considerablemente la probabilidad de encontrar alguna trampa y también
aumenta el riesgo para el programador, puesto que puede ser una forma persuasiva para evitar
este tipo de conductas.
Son aquellos que son efectuados desde fuera de las instalaciones. Lo más común es que
estos ataques vengan desde la red o internet. Su primer objetivo es buscar la manera de entrar
al sistema por algún puerto y de hacerse de uno o más nombres de usuario y después intentar
adivinar las contraseñas para poder acceder al sistema. Algunos de ellos, como ciertos virus solo
intentan reproducirse en la computadora y reenviarse a otros huéspedes o hosts.
8
Aunque algunos navegadores se les puede engañar haciendo que muestren una dirección cuando en realidad
están en otro sitio
CAPÍTULO 6. PROTECCIÓN Y SEGURIDAD 337
Puertas traseras. Son parecidos a las bombas lógicas en el sentido de que son dejados por
los programadores del sistema operativo o de alguna aplicación. La diferencia es que permiten
el acceso, ya sea local o desde la red, sin que sea un usuario normal del sistema. Para pasar
desapercibido muchas veces utilizará un nombre muy parecido al de otro usuario o a veces ni
siquiera lo necesita para lograr una consola de sesión.
Cuando un sistema ha sido penetrado, es muy común que el atacante añada versiones modifi-
cadas de las órdenes de consola u otros programas comunes, de tal forma que cuando éstos sean
ejecutados por el usuario o el administrador, el atacante tenga la oportunidad de mantener abier-
ta una puerta trasera dada. Por ejemplo, la ejecución de un shell o consola con los privilegios
del usuario actual sin necesidad de nombre de usuario y contraseña. Este programa escuchará
un número de puerto predeterminado brindándole el acceso al diseñador del mismo.
Un problema mayor es cuando se ha publicado el número de puerto hacia el cual hay que
dirigirse para poder tener acceso, lo que implica que no sólo el atacante podrá entrar al sistema
si no que también puede entrar cualquier persona que haya recibido la información, aumentando
así el riesgo de difusión de datos almacenados en el servidor.
Desbordamiento de pila o de búfer. Es una de las formas más comunes utilizadas por los
atacantes externos del sistema, mediante una conexión de red, ya sea de área local o vía telefó-
nica. Los usuarios locales también pueden utilizar esta técnica para obtener mayores privilegios
sobre el sistema.
Una vez que al atacante ha logrado robar un nombre de usuario o contraseña, el siguiente
paso es obtener mayores privilegios. Si no ha podido hacerse de un nombre de usuario y su res-
pectiva contraseña, entonces intentará atacar aquellos programas que proporcionan un servicio
público, como un servidor de correo o un servidor de archivos buscando principalmente que
usen alguna función que pueda comprometer la seguridad del sistema.
En general, lo que hace el atacante es aprovechar un error de algún programa que común-
mente esté escrito en lenguaje C o con alguno que no haga comprobación de límites en arreglos
o en búferes. El proceso que hace es el siguiente:
1. Analizar el programa fuente para ver qué llamadas utiliza. Por ejemplo, una instrucción
que puede comprometer al sistema es la función gets(), que permite leer una cadena desde
teclado, pero que no comprueba que exista suficiente espacio para los caracteres leídos.
2. Si no está disponible el código fuente, probará los programas por prueba y error, esto lo
logra intentando escribir más caracteres de los que podría prever la aplicación.
3. Cuando encuentra que un programa tiene esa vulnerabilidad, lo que hace es escribir un
programa en lenguaje ensamblador y pasarlo como argumento del programa.
338 6.6. VALIDACIÓN Y AMENAZAS AL SISTEMA
4. El programa está diseñado para que exceda la máxima capacidad permitida por la cadena
o el búfer de lectura, lo que ocasiona que se sobreescriba parte de la región de la pila, que
como sabemos, es donde el sistema operativo guarda los parámetros de la llamada a la
función y por ende, guarda también la dirección de retorno de la función.
5. A partir de este momento sólo se espera a que la llamada de función regrese, pero cuando
la CPU toma la dirección de retorno, ésta ya habrá cambiado por cualquiera que haya
colocado el atacante en el punto 2 anterior.
Como puede notarse, el atacante puede, ya sea ejecutar un shell con los privilegios del pro-
ceso o programa atacado o incluso, insertar el código que desee ejecutar en la misma cadena que
se usa como parámetros.
Una alternativa para reducir este tipo de ataques es que la CPU evite la ejecución de instruc-
ciones que se encuentren en la sección de memoria dedicada a la pila. Por ejemplo, las versiones
recientes del chip de SPARC de Sun incluyen este mecanismo de seguridad y por tanto, las
versiones más recientes de Solaris la utilizan. Aunque puede seguirse modificando la dirección
de retorno de la rutina desbordada, cuando la dirección de retorno de la función apunta a una
ubicación dentro de la sección de pila y se intenta ejecutar el código almacenado en ésta, se
produce una excepción y el programa se detiene con un error.
Las versiones recientes de los microprocesadores de AMD e Intel x86 incluyen la funcio-
nalidad NX, que permite detener también este tipo de ataques. Esta funcionalidad también está
siendo utilizada por varios sistemas operativos para x86 y AMD dentro de éstos tenemos a Linux
y Windows XP con el paquete de servicios SP2 (Service Pack 2). La implementación vía hard-
ware implica el uso de un nuevo bit dentro de las tablas de páginas de la CPU. Este bit permite
marcar la página asociada como no ejecutable, impidiendo así ejecutar instrucciones desde ella.
Virus. Los virus son programas autorreplicables que representan otro tipo de amenaza. Co-
múnmente están diseñados para “infectar” a otros programas. Pueden causar muchos problemas
debido a que en el momento en que se encuentran activos en el sistema, pueden destruir o mo-
dificar programas o archivos, dependiendo de las capacidades que haya incluido el programador
del virus. Un virus es un pequeño conjunto de instrucciones que viene dentro de un programa
legítimo. Son muy específicos de la arquitectura, del tipo de sistema operativo y de las apli-
caciones. La mayoría de ellos utilizará una o más vulnerabilidades aún desconocidas (a veces
conocidas) por los administradores de sistemas e incluso de los propios diseñadores de aplica-
ciones o de sistemas operativos. Los virus constituyen un problema muy grave para los usuarios
de máquinas tipo PC, especialmente aquellos que corren alguna versión de Windows. Esto se
CAPÍTULO 6. PROTECCIÓN Y SEGURIDAD 339
debe principalmente a que en esta plataforma existe una gran diversidad de software y el inter-
cambio de programas y la piratería es altísimo, lo que implica una infección casi segura cuando
no se usa software original o legítimo. Por otro lado, la cantidad de vulnerabilidades conoci-
das son muchas, sin considerar aquellas desconocidas para poder cuantificarlas pero que pueden
estar siendo usadas en este momento para la creación de algún virus nuevo.
Los sistemas basados en UNIX, son menos propensos a los virus debido a que los programas
ejecutables están protegidos contra escritura por el propio sistema operativo. Incluso, si un virus
llega a infectar a uno de esos programas, sus poderes están comúnmente limitados, esto es,
son pocos los programas que tiene privilegios de ejecución a nivel de administrador. Cuando un
usuario de un sistema UNIX se infecta con un virus el daño suele no pasar más allá del directorio
de trabajo del propio usuario, dejando intactos los demás directorios de los otros usuarios del
sistema.
La propagación de un virus puede realizarse de muchas formas, las más comunes son:
1. Vía correo electrónico. Es el medio más común para difundir un virus mediante adjuntos
con código tipo Active X.
3. Compartir programas por la red. Como se comentó la piratería es un medio muy común
de distribuir también virus.
5. Caballo de troya. Es un anzuelo para hacer que el usuario ejecute el programa del virus,
puede entonces ser parte de una animación bonita, una presentación, el mostrar algún
documento, etc. Es común que vengan como archivos adjuntos de un correo electrónico.
de comunicaciones y fueron necesarias miles de horas hombre para llevar a cabo las tareas de
limpieza.
En la actualidad se ha vuelto una técnica común intentar descubrir de forma controlada las
posibles vulnerabilidades del sistema. Lo que se hace es que algunas personas tomen el papel
de hackers para entrar subrepticiamente a un sistema de computadora. La forma más habitual
es contratar a un grupo de expertos en seguridad conocidos como grupos tigre o equipos de
penetración. Este equipo tratará de introducirse en el sistema utilizando desde las técnicas más
comunes en Internet hasta las más sofisticadas. En muchas ocasiones, son los propios hackers
los que informan al administrador de sistemas de las vulnerabilidades encontradas y que aprove-
charon para hacer la intrusión. No se recomienda esperar a que alguien que no conocemos, aún
con las mejores intenciones, burle las medidas de seguridad existentes, debido a que es posible
que haya difundido su “éxito” a través de la red y en poco tiempo es seguro que se tenga una gran
cantidad de ataques y no precisamente de gente que sólo quiere husmear por el servidor. Muchas
veces intentarán enviar correo basura desde las computadoras afectadas o dirigir ataques a otras
computadoras haciéndonos parecer culpables.
Como comentamos en la sección 6.6.2.1 en la página 334 existen técnicas que fácilmente
podemos contener con un poco de cuidado en la implementación de las aplicaciones, el sistema
operativo o simplemente al administrar el sistema.
3. Intentar introducirse en el sistema pasando a través del router de una red LAN, aprove-
chando las vulnerabilidades encontradas en el paso anterior.
CAPÍTULO 6. PROTECCIÓN Y SEGURIDAD 341
4. Utilizar herramientas “todo en uno” como netcat o nessus. Estas herramientas, permiten
que casi cualquier persona con algo de conocimientos de red pueda llevar a cabo ataques
sistemáticos para encontrar los puntos débiles del sistema.
Acabar con los procesos que pueden poner en peligro la identidad en la intrusión.
Por ejemplo cambiando la orden who por una modificada que evite mostrar nuestro
usuario.
Borrar las huellas de intrusión para evitar ser detectados, lo más común es borrar los
logs del sistema o en su defecto enmascararlos.
Evitar que cierre esa entrada que ya se logró colocando una puerta trasera.
Prevención de un ataque Ahora daremos una lista de algunas de las posibles acciones que
deben realizarse para evitar que llegue a efectuarse la intrusión.
1. Cambiar todas las contraseñas que vienen por defecto en routers o en servidores tales
como la cuenta Administrador en Windows con contraseña en blanco. Las de los routers
son específicas del modelo pero los fabricantes las describen en sus páginas de soporte
técnico.
2. Cerrar todo aquel servicio que no se use. mientras menos servicios superfluos haya más
seguro será el sistema, pues habrá menos puntos de entrada.
3. Bloquear vía firewall todos los puertos. Un puerto es un número que identifica un servicio
en el sistema y es común que tenga asociado un programa servidor para proporcionar la
información deseada. Algunas veces estos servicios son lanzados por un programa deno-
minado superserver. que es el único que se encuentra en ejecución. Al recibir una solicitud
por un puerto, se encarga entonces de lanzar el programa correspondiente. De esta forma
se evita que el sistema se sobrecargue con mucho programas de servicio, puesto que no es
muy común que haya peticiones de diferentes servicios continuamente. Cuando la deman-
da de un servicio es muy grande, se recomienda lanzarlos independientes del superserver.
4. Restringir los lugares desde donde se conectan los usuarios en la medida de lo posible.
De preferencia hacerlo por servicios. Por ejemplo los trabajadores de finanzas solamente
podrán conectarse desde sus oficinas, pero no podrán hacerlo desde el exterior, pero si
342 6.6. VALIDACIÓN Y AMENAZAS AL SISTEMA
podrán acceder a sus archivos personales desde su casa. De esta forma, aunque un ata-
cante tenga una cuenta de finanzas, no podrá acceder desde otro equipo que no sea el del
departamento.
6. Evitar utilizar todos aquellos programas de conexión remota que envían las claves en tex-
to plano. Si se está instalando un sistema servidor evítelos completamente y proporcione
otras opciones a sus usuarios. Por ejemplo, es cada vez menos frecuente el uso del pro-
grama de telnet que permite conectarse a un servidor Unix (corriendo como servidor el
programa telnetd) para iniciar una sesión remota, pero que envía el nombre de usuario y
su contraseña en texto plano. En cambio se está extendiendo el uso de ssh (Secure Shell)
que usa un canal cifrado para el envío de datos (por el lado del servidor corre el programa
sshd). Lo mismo sucede con el servicio de ftp (file transfer protocol) por su contraparte
sftp (secure file transfer protocol) que abre primero una sesión ssh para enseguida trans-
ferir la información cifrada entre el cliente y el servidor. En el lado del servidor corre el
programa sftpd o algún otro.
7. Ser extremadamente cuidadosos con las relaciones de confianza. Si se dice que confiamos
en un sistema es por que se confía completamente en su seguridad tanto como en la nues-
tra. El problema es que cualquier usuario de ese sistema puede iniciar una sesión en el
nuestro sin pedirle una contraseña.
8. Establecer una política de cuentas adecuada. Desactivar las cuentas que crea por defecto
el sistema cuando se instala, por ejemplo, la cuenta de invitado en windows, debido a que
es común que no tengan contraseña.
9. Evitar contraseñas débiles en el sistema. Esto puede lograrse aumentando los requerimien-
tos para las contraseñas seguras o corriendo programas para romper las contraseñas antes
de que otros lo hagan. De esta forma se le indica al usuario que la cambie por otra más se-
gura. Así mismo se recomienda cambiar las contraseñas después de un tiempo razonable.
10. Establecer una política de caducidad después de cierto tiempo en que no haya sido utili-
zada la cuenta.
CAPÍTULO 6. PROTECCIÓN Y SEGURIDAD 343
Detección de la intrusión Aún después de haber prevenido la intrusión siguiendo los puntos
anteriores, debemos ser capaces de saber si se ha dado alguna en el sistema o no. A continuación
se dan algunas guías generales que permitirán conocer si hemos sido afectados.
1. Verificación continua de los logs del sistema para detectar actividades sospechosas.
2. Monitorear los procesos en ejecución para detectar aquellos que lleven corriendo mucho
tiempo. Es común que difieran en una o dos letras con respecto a los nombres de los
procesos normales, por eso hay hacerlo con mucho cuidado para poder detectarlos.
4. Es normal también que un intruso cree directorios que consisten de puntos por ejemplo,
“...” para hacerlo parecer como el directorio “..” que significa regresar al nivel anterior en
la estructura de directorios.
5. Verificar continuamente los directorios de los usuarios para saber si no contienen archivos
o directorios que no pertenezcan a el usuario, o en el peor de los casos que existan pro-
gramas setuidados o setgidados También la existencia de programas C debe de evaluarse
con cuidado para descartar la posibilidad de aprovechar alguna vulnerabilidad como por
ejemplo el desborde de pila.
6. Verificar también las conexiones de red que están establecidas tanto las internas, como las
externas. Si encuentra alguna que viene de Rusia debería preguntarse si su jefe anda de
vacaciones o estamos en problemas.
Recuperación de una intrusión Una vez que se ha detectado que un intruso ha logrado rom-
per la seguridad de nuestro sistema, lo que debemos hacer primeramente es aislar el sistema del
mundo exterior. Preferentemente debe de desconectarse inmediatamente de la red, incluso de la
local. En el caso de que sea muy complicado dejar fuera de servicio el sistema, debe bloquearse
al menos la cuenta del usuario que sirvió como punto de entrada para el ataque. Esto no significa
que el usuario no haya tenido la oportunidad de escalar sus privilegios o que no haya podido
hacerse de más de una cuenta, es solamente una medida para evitar más daños. no obstante, in-
dependientemente de bloquear la cuenta, tan pronto sea posible el sistema deberá desconectarse
para poder evaluar completamente los daños.
Ya que el sistema se encuentra aislado debe de procederse con calma. En ocasiones es más
peligroso un administrador desesperado que actúa sin pensar las consecuencias de sus actos. Por
344 6.6. VALIDACIÓN Y AMENAZAS AL SISTEMA
ejemplo, puede ser capaz de borrar archivos que dejen inutilizado el sistema por considerarlos
sospechosos simplemente por que nunca se dio a la tarea de revisar cual era su función o motivo
por el cual están en ejecución. Esto suele ser cierto para aquellos servicios obscuros, como un
servidor de fuentes o uno de sincronización de tiempo.
Después de calmarse, lo primero que debe hacerse es revisar, lo más exactamente posible, la
fecha de la primera intrusión. Esta puede averiguarse preguntando al dueño de la cuenta cuando
fue la última vez que la utilizó (suponiendo que no haya motivos para desconfiar de éste). La
fecha puede darnos un indicio de cuanto tiempo tuvo el intruso para poder modificar el siste-
ma. Aunque usando shells automatizados, pueden instalar muy rápidamente la mayoría de los
programas necesarios para asegurarse dos o más cuentas, junto con sus correspondientes puer-
tas traseras. En esta parte entramos en la fase de investigación y puede durar mucho tiempo.
Incluso, para este tipo de situaciones existen equipos a nivel mundial que se encargan de rea-
lizar estudios muy detallados sobre el nivel de intrusión. A estos estudios se les llama análisis
forense. En México, es el equipo UNAM-CERT (Equipo de Respuesta a Incidentes de Segu-
ridad en Cómputo) de la UNAM (Universidad Nacional Autónoma de México) la encargada de
responder a cualquier tipo de incidente relacionado con la seguridad.
De ser posible, debe llamarse inmediatamente a alguno de estos equipos de expertos. En
caso de que no sea así, debemos entonces proseguir nosotros.
Después de todo lo anterior se deben de fijar claramente cuales son los objetivos que pre-
tenden alcanzarse después de una intromisión. A continuación se da una lista detallada de todos
estos posibles objetivos.
6.7. Cifrado
La criptografía de hecho, no es parte del sistema operativo propiamente dicho. Se usa un al-
goritmo de cifrado para mantener segura la lista de contraseñas, pero no puede mantener cifrado,
por ejemplo, todo el sistema de archivos u otras funciones.
No obstante, como vimos en la sección anterior, es importante mantener las contraseñas
seguras y la única forma es mediante el cifrado. El algoritmo usado en Unix es unidireccional,
quiere decir que una vez cifrada la contraseña será relativamente imposible descrifrarla a partir
de la contraseña misma. En otras palabras se tiene el programa de cifrado pero no se tiene el
complemento para descifrarlo. ¿Entonces cómo hace el sistema operativo para comparar las
contraseñas? Simplemente cifra la contraseña introducida por el usuario y la compara con la
contraseña cifrada almacenada si coinciden inicia la sesión y si no, se rechaza.
La ventaja de este esquema es que ni siquiera el superusuario podrá ver la contraseña sin
cifrar de otro usuario.
346 6.7. CIFRADO
La desventaja es que alguien que tenga las contraseñas cifradas podrá seguir la misma lí-
nea del sistema operativo, intentará cifrar tantas contraseñas como tenga almacenadas en su
diccionario y las comparará con las cifradas existentes en el sistema. Cuando encuentre una
coincidencia en el diccionario, habrá “descifrado” la contraseña.
1. Esquemas simétricos. Es aquel que utiliza la misma clave para cifrar y descifrar el texto
o mensaje.
2. Esquemas asimétricos. Utiliza claves distintas, una para cifrar y otra para descifrar el
mensaje.
1. Ataque del texto cifrado. Sucede cuando un adversario entra en posesión del texto cifrado
y aplica técnicas estadísticas del lenguaje para intentar determinar el código usado.
2. Ataque usando texto conocido. Ocurre cuando el atancante tiene en su poder el texto
cifrado y además posee también el texto plano y su correspondiente texto cifrado.
3. Texto plano con el algoritmo de cifrado. Es el más peligroso debido a la facilidad que
tiene para generar texto cifrado y poder compararlo con el que se quiere descifrar.
2. Autenticidad. Sólo el dueño de la clave privada puede codificar el mensaje, y puede leerlo
toda aquella persona que conozca la clave pública. Esta característica es útil para garanti-
zar el origen del mensaje. Es común que en vez de cifrar el texto del mensaje completo, se
cifre solamente un resumen del mismo que se adjuntan al final del mensaje (El resumen
sin cifrar y el resumen cifrado).
3. Integridad. El que lee el mensaje, si desea verificar la autenticidad del mismo, descifrará
el adjunto elaborado en el paso anterior y lo comparará con el resumen en texto plano.
348 6.7. CIFRADO
Deben coincidir. Si no coinciden debe asumirse que el mensaje ha sido cambiado. A este
proceso se le conoce también como firma digital.
1. Sólo sirven para dificultar la lectura de la información. No asegura que no puedan ser
descifrados.
2. Hace falta sincronizar las claves por persona con la que nos queremos comunicar (la que
nos dé él, y la que usamos para él).
3. Es necesario tener contacto personal para intercambiar las claves o usar una vía de comu-
nicación segura y que no pueda ser interceptada. (Cifrar lo cifrado).
4. Se pueden hacer ataques aprovechando las propiedades estadísticas conocidas de los len-
guajes naturales, tal como la ocurrencia de algunas palabras comunes. por ejemplo, en el
español los artículos (el, la, los) y las propiedades de las sílabas, disílabas, trisílabas, entre
otras. Todo ello puede hacerse en un tiempo relativamente corto con el uso de computado-
ras y diccionarios del lenguaje utilizado.
CAPÍTULO 6. PROTECCIÓN Y SEGURIDAD 349
A los métodos nombrados anteriormente se les conoce como cifrado por sustitución. Fun-
cionan reemplazando cada símbolo o grupo de símbolos del texto plano por otros símbolos con
el fin de ocultar los originales.
1. I0 D0 = t(entrada).
In = Dn−1
L
Dn = In−1 f (Dn−1 , Kn )
vuelta, las mitades izquierda y derecha del resultado intermedio de 64 bits se intercambian;
la mitad izquierda pata la siguiente ronda es la mitad derecha de la anterior. La nueva mitad
derecha se obtiene calculando el XOR (OR exclusivo) de la mitad izquierda de la ronda anterior
y el resultado de una función bastante compleja de la mitad derecha de la ronda previa y la clave
de la ronda actual.
El cálculo de la función f contribuye significativamente a la complejidad computacional del
algoritmo. Sus entradas se utilizan para realizar sustituciones mediante ocho cajas de sustitución
separadas, llamadas cajas-S. Su salida combinada se permuta entonces haciéndola pasar a través
de una caja de permutaciones llamada caja-P.
Cada una de las 16 permutaciones utiliza una clave diferente Ki . Esta clave se obtiene efec-
tuando una serie de permutaciones y desplazamientos sobre la clave de 56 bits dada por el
usuario.
Para terminar el algoritmo en el paso 3 se aplica la inversa de la permutación inicial al
resultado de la última interacción. El descifrado se hace ejecutando los pasos descritos en orden
inverso.
La clave pública del destinatario. Se usa para enviarle mensajes al destinatario que debe
descifrar con su clave privada.
La clave privada personal. Para cifrar los archivos propios que no deben ser leídos por
otras personas.
Ambas claves. Para enviar mensajes cifrados firmados, de modo que el destinatario pueda
asegurarse de que realmente los envió la persona que dice ser, ya sea mediante una com-
paración de firmas digitales o mediante algún organismo que certifique la identidad de la
persona con su firma digital.
CAPÍTULO 6. PROTECCIÓN Y SEGURIDAD 351
Es fácil entender que en este esquema, la seguridad la proporciona la clave del destinatario
ya que sólo él puede descifrarlo y la autenticidad del mensaje la proporciona la clave privada
que solo es conocida por su dueño. En resumen tenemos que:
La clave pública personal es conocida por todo el mundo para que envíen mensajes cifra-
dos al dueño de la clave privada.
La clave privada del dueño no se transmite por ningún medio, de esta forma se conserva
en secreto más fácilmente. Esto es, no está propensa a ser interceptada.
El uso de la clave privada garantiza que sólo el propietario generó el mensaje, salvo que
haya sido robada. En ese caso el dueño debe de enviar un certificado de revocación a todos
a los que proporcionó su clave pública. De esta forma se inutilizará dicha clave.
Para mantener comunicación cifrada con varias personas se necesita solamente una clave
pública por cada una de ellas.
CP rA (CP uA (T P )) = T P
De modo que el el descifrado de un mensaje genera el texto plano original TP. El descifrado
utiliza la clave privada. y el cifrado se hace con la clave pública
CpuA .
ed mod n = 1
352 6.7. CIFRADO
Φ(n) = (p − 1)(q − 1)
C = P e mod n (6.1)
es inversa de
P = C d mod n (6.2)
Si
ed mod Φ(n) = 1, donde Φ(n) = (p − 1)(q − 1)
La ecuación 6.1 se usa para como método de cifrado para muchos algoritmos de clave pú-
blica, con e y n como claves. El descifrado se realiza con la ecuación 6.2 con d y n como claves.
Dado que la clave (e, n) es pública, sólo el número d del par de descifrado (d, n) es privado. Si d
se elige como primo relativo en Φ(n), y e se elige como inversa multiplicativa de d, entonces el
texto plano cifrado utilizando la ecuación 6.1 puede ser descifrado usando d en la ecuación 6.2.
En general estas son las ideas principales del algoritmo RSA. En términos prácticos, el al-
goritmo RSA necesita la determinación de n, d, y e mediante los siguientes pasos:
3. Elegir un número d como un número aleatorio grande que sea primo relativo con Φ(n),
esto es que ed mod Φ(n) = 1.
Se pueden utilizar estos parámetros para cifrar texto plano P donde 0 ≤ P < n. Si el texto
plano es más largo se debe entonces dividir en partes más pequeñas que n.
Una forma de intentar atacar este tipo de cifrado es buscar la forma de factorizar números
grandes para encontrar d a partir de la clave pública n y e. que son públicamente conocidos.
Lamentablemente para el descifrador que efectúa el ataque, encontrar los factores de núme-
ros muy grandes puede llevar una gran cantidad de tiempo que con las computadoras actuales
llega a ser prohibitivo. Tampoco ha habido trabajos que demuestren que puede haber alguna
manera más corta y computacionalmente factible para descubrir las claves del algoritmo.
CAPÍTULO 6. PROTECCIÓN Y SEGURIDAD 353
2. El receptor B envía al emisor A un mensaje cifrado con su clave pública CpuA . El emisor
A descifra el mensaje y lo regresa a B en texto plano.
1. El emisor aplica su propia transformación usando su clave privada para obtener CprA (P ).
6.8. MEDICIÓN DEL DESEMPEÑO (PERFORMANCE) DE LOS SO, MONITOREO Y
354 EVALUACIÓN
3. Se envía el mensaje a B.
Ponemos un ejemplo de qué es lo que debe optimizarse, con respecto al tiempo invertido: las
partes propias del sistema operativo. Se debe de poner especial atención sobre aquellas tareas
que se realizan un mayor número de veces en una unidad de tiempo dado. Por ejemplo, el
manejador del reloj del sistema debe ser lo más óptimo posible debido a que es usado por varios
planificadores del sistema operativo, además de que debe llevar la cuenta del tiempo. Si este
proceso fuera ineficiente cabría la posibilidad de que contara de más o de menos, haciéndolo de
esta forma inservible para su propósito.
Por otro lado, un servicio que se usa muy pocas veces a lo largo de la vida del sistema
operativo, como por ejemplo una utilería conocida como fdisk9 , que se vio en la sección 4.4.2.2
en la página 218, que se usa una vez cuando se instala el sistema y luego se usará de nuevo
cuando se agregue otro disco al sistema, y como puede verse no se hace todos los días. Sería
entonces ilógico intentar optimizarlo durante cinco meses para reducir el tiempo de creación de
la partición de un minuto a 30 segundos.
9
Se usa para crear las particiones en el disco.
CAPÍTULO 6. PROTECCIÓN Y SEGURIDAD 355
Cuando hablamos que un programa se encuentra completamente en RAM junto con sus
datos es indicio de que puede ejecutarse más rápidamente a que si éste se divide en módulos
que deben cargarse o que sea necesario cargar sus datos de disco. En computación, si se desea
que un programa se ejecute más rápido, entonces debe ponerse completamente en memoria.
Esto es, se debe sacrificar espacio. Al contrario, si es necesario optimizar tamaño en memoria
entonces se tendrá que sacrificar velocidad. Incluso, la mayoría de los compiladores, por ejemplo
c++ proporcionan al programador diversas formas automáticas de optimización. Obviamente las
más comunes son de velocidad y de espacio en memoria.
Existen también reglas generales en programación para optimizar con respecto a la veloci-
dad: usar macros en lugar de procedimientos. Cuando el compilador ve una macro lo que hace
es sustituir el código de la misma por su llamada, generando así un programa más grande. Si
se desea optimizarlo para tamaño, entonces deben de usarse llamadas a procedimiento. En es-
te caso, la CPU tendrá que ejecutar varias instrucciones push10 los parámetros de la llamada a
función y guardar también el apuntador de instrucción en la pila, saltar a la primera instrucción
de la función y al regresar, descartar los parámetros y ejecutar varias instrucciones pop11 para
restaurar el apuntador de instrucciones.
Como puede verse, sería una muy mala optimización si un programador pone varias llamadas
a función dentro de un ciclo que va a repetirse tal vez, miles de veces. Lo adecuado sería hacer
uso de macros, al menos en aquellos ciclos que van a repetirse muchas veces. Incluso si se desea
ganar más velocidad debe de verse la posibilidad de eliminar los ciclos.
Bajo este esquema, lo normal es que el programa se ejecute bajo la supervisión de una
herramienta de perfilado que es la que aporta información sobre el desempeño de un programa
cuando éste se termine.
Después de analizar los datos obtenidos del perfilado, es fácil ver en donde es necesario
incidir para mejorar el desempeño del código, se puede ver, por ejemplo:
3. Después de hacer los cambios, se puede ejecutar nuevamente el perfilado y comparar los
resultados con el primero.
Debido a que las secciones de mayor interés están comúnmente anidadas, la sobrecarga
producida por las propias propias llamadas para calcular las medidas influye también en éstas.
por este motivo, la instrumentación se hace selectivamente y sus resultados deben analizarse e
interpretarse con sumo cuidado. Por estas razones el análisis de rendimiento puede convertirse
en un proceso muy complejo.
12
En un sistema basado en UNIX o GNU/Linux
CAPÍTULO 6. PROTECCIÓN Y SEGURIDAD 357
6.8.2. Monitoreo
Incluso en los mejores sistemas operativos habrá procesos que se queden “colgados”, esto
es, siguen consumiendo memoria y tiempo de CPU pero ya no están haciendo un trabajo útil.
Otras veces, algunos usuarios mal intencionados hacen ciclos de peticiones erróneas para ver
si es posible ganar privilegios de administrador, lo que ocasiona que muchas de las veces el
proceso encargado de manejarlas se congele.
El sistema operativo proporciona varias utilerías que permiten conocer qué procesos se es-
tán ejecutando, quién es el propietario, qué tiempo llevan ejecutándose y qué recursos están
consumiendo entre otra información.
En Unix y GNU/Linux se tienen las siguientes utilerías que se ejecutan a nivel de línea de
órdenes:
1. ps. Permite mostrar información relativa a los procesos que se están ejecutando actual-
mente en el sistema.
2. top. Permite mostrar en tiempo real los procesos que se están ejecutando actualmente, el
tiempo de ejecución, la cantidad de memoria que ocupan y el tiempo de procesador que
usan, entre otra información.
3. pstree. Muestra a los procesos que se están ejecutando en forma de árbol de modo que
puede verse fácilmente quienes son los procesos padre y quienes son los procesos hijo.
1. ping. Se usa para saber si un servidor puede responder peticiones de red. La mayoría de
las veces simplemente indica si una computadora o servidor se encuentra activo.
2. traceroute. Permite observar las computadoras o servidores por los que pasa un paquete
antes de llegar a su destino. Se usa también para encontrar o diagnosticar problemas en la
red.
3. dig. Permite hacer peticiones a un servidor de nombres, de esta forma sabemos si es po-
sible o no tener acceso a los servicios de internet mediante el nombre de dominio o si
pueden acceder a nuestros servidores mediante nuestro propio nombre de dominio.
Para un sistema Windows son las mismas órdenes, pero en vez de usar dig debe de usarse
nslookup. También traceroute cambia por tracert.
Los sistemas operativos proporcionan al administrador gran cantidad de información que
va guardándose en los registros del sistema. Esta información incluye todos los eventos que se
generaron desde el momento de arrancar el sistema hasta los generados por las aplicaciones. En
UNIX y GNU/Linux se guardan en el directorio /var/log.
En los sistemas Windows se usa una aplicación llamada registro de eventos que es quien
informa qué es lo que ha sucedido en el sistema.
Un buen administrador del sistema debe monitorear continuamente los logs del sistema para
detectar si existen errores del sistema o para prevenir o incluso detener un ataque cibernético en
potencia. Existen muchas herramientas que analizan automáticamente los logs generados por el
sistema y mediante un conjunto de heurísticas pueden determinar con cierto grado de exactitud
si estamos ante la presencia de un ataque o si el sistema está funcionando normalmente.
Obsérvese que syslog proporciona un informe detallado acerca del hardware que tiene el
equipo y su estado, por ejemplo si está habilitado o deshabilitado.
Otro archivo importante por revisar es el de accesslog. Este archivo contiene los accesos
realizados al sistema:
Nombre Puerto De Último
root tty1 mié ene 16 07:06:30 -0600 2008
www-data **Nunca ha entrado**
Debian-exim **Nunca ha entrado**
nalonzo :0 mié ene 23 03:35:09 -0600 2008
postgres **Nunca ha entrado**
identd **Nunca ha entrado**
lucy :0 mié oct 3 13:17:12 -0500 2007
Para obtener resúmenes de los informes es necesario hacer uso de utilerías llamadas anali-
zadores de logs. Podemos encontrar en la red una gran variadad de éstos, con diferentes capaci-
dades de resumen y de visualización. Existen también muchos analizadores que se especializan,
por ejemplo, en obtener estadísticas de acceso a los servidores WEB como AWStats o sobre el
uso de la red como ntop.
6.8.3. Evaluación
Después de haber obtenido las estadísticas de perfilado es conveniente hacer una evaluación
completa del sistema operativo. Esta evaluación puede incluir la comparación con otros siste-
mas para determinar las ventajas en ahorro de memoria, tiempo de CPU o desempeño de las
aplicaciones.
También es importante saber qué tipo de sistema operativo debe de usarse de acuerdo al
hardware que se tiene. No es lo mismo tener un hardware servidor dedicado a una computadora
personal. Los tipos de aplicaciones que se ejecutan no son los mismos. Incluso en ocasiones,
no es posible comparar el desempeño de juegos entre una computadora personal y una estación
dedicada.
La perspectiva del usuario es otro punto que debe considerarse adecuadamente. En la sección
5.6.2 en la página 287 se dio una lista de varios de los tipos de servicios que puede ofrecer un
servidor. Cada aplicación requiere diferentes recursos y depende mucho también del número de
usuarios a los que se requiere proporcionar el servicio. A mayor cantidad de usuarios, mayores
serán los requerimientos del hardware y por ende se requiere también un sistema operativo más
eficiente.
En resumen los puntos más importantes que deben tenerse en cuenta para seleccionar un
buen sistema operativo o aplicación son, entre otros:
2. Aplicaciones. Qué tipo de aplicaciones ejecutará nuestro hardware. Por ejemplo, los cálcu-
los científicos requieren más eficiencia de cálculo que la edición de un texto.
3. Interfaz con el usuario. Qué tan necesario es contar con una interfaz agradable al usuario.
En ocasiones se prefiere la rapidez a la facilidad de uso. Por ejemplo, un servidor de
páginas WEB.
7. Software propietario o software libre. ¿Qué tanto conviene comprar software propieta-
rio? ¿Es más barato el software libre? El hecho de decir que no se paga por el software
libre, no indica que es gratis.
Todo lo anterior se resume en el cálculo del costo total de propiedad que analizaremos en el
siguiente apartado.
1. ¿Cuántos ingenieros y personal de soporte técnico se requieren para poder operar de forma
eficiente y dar el servicio que los usuarios del sistema necesitan?
2. ¿Cuántos administradores de sistemas son necesarios para poder administrar y operar los
servidores que comprenden la nueva solución?
5. ¿Cuánto cobra el soporte o servicio del proveedor para que apoye en la solución de pro-
blemas de la aplicación?
7. ¿Qué alternativas ofrece el fabricante para poder acceder a nuevas versiones, actualizacio-
nes de seguridad, etc.?
Costo de Administración (Cadministracion ). Se define por el costo anual que genera todo
el personal (interno y/o externo) para poder mantener el funcionamiento diario de la solu-
ción. Que va desde la administración de usuarios y permisos, hasta las operaciones diarias
de mantenimiento de respaldos y verificación de logs, por citar algunos.
Para aclarar un poco más los costos de administración quedarían:
Cadministracion = Costo anual de un administrador o ingeniero (interno o externo) * número
de ingenieros de planta * número de años de la solución en funcionamiento * porcentaje
de tiempo dedicado a la solución .
Costo de Soporte a usuarios (Csoporte ). Está compuesto por todos los costos ocasionados
por cualquier tipo de soporte dado a los usuarios finales de la solución.
Csoporte = número de incidentes promedio por año * número de años de la solución en
funcionamiento * costo por hora de soporte * tiempo aproximado para dar el soporte
requerido.
Como puede verse se intentó incluir el mayor número de casos, pero pueden incluirse todavía
otros otros aspectos que puede incidir directamente el costo total de propiedad.
A continuación se resume la ecuación que permite calcular el costo total de propiedad y que
usando los mismos parámetros puede entonces servir para compararlo con otras soluciones.
Costo de soluciones de software = Cinicial + Cadministracion + Coperacion + Csoporte .
6.9. Problemas
6.1. Defina con sus propias palabras los término desempeño y seguridad.
6.4. Explique por qué existe un compromiso entre tamaño de programa y su velocidad de
ejecución.
6.5. Como programador, ¿Cuáles son las reglas de optimización que debe de manejar, tanto
para memoria como para velocidad?
6.9. Explique las órdenes que dispone UNIX/Linux para ver los recursos que consumen los
procesos en ejecución.
6.10. ¿Cómo se llama la herramienta de Windows para ver los procesos en ejecución y los
recursos que consumen?
6.11. ¿Cuáles son las utilerías que se usan para monitorear la red? Explique cada una de ellas.
6.14. Proporcione una definición de cada utilería para revisar los logs del sistema.
6.15. ¿Por qué es necesario hacer una evaluación del sistema operativo?
6.16. ¿Cuáles son los puntos más importantes que deben tenerse en cuenta para la selección
de un sistema operativo?
6.26. ¿Qué puntos debe cubrir el concepto de seguridad informática? Explique cada uno de
ellos.
6.27. ¿Cuáles son las amenazas de las tres metas de seguridad en sistemas de computación?
6.28. ¿Qué es un intruso? Defina las dos clasificaciones para los intrusos.
6.34. ¿A qué se refiere la ingeniería social? Explique los pasos que sigue esta técnica.
6.69. Indique los pasos más importantes que debe implementar cualquier sistema operativo
en lo que se refiere a seguridad y protección
6.75. Explique las dos clasificaciones generales para los sistemas criptográficos.
6.76. ¿Cómo se le llama al esquema que utiliza la misma clave para cifrar y descifrar el texto?
6.77. ¿Cómo se le llama al esquema que utiliza diferentes claves para cifrar y descifrar el
texto?
6.78. ¿Cómo se le llama al arte para descubrir las contraseñas utilizadas en el cifrado?
6.79. Explique los tres tipos de ataque para romper los códigos de cifrado.
6.80. ¿Cuáles son las características que debe de cumplir cualquier esquema de cifrado?
6.91. ¿Cuáles son las acciones que deben de llevarse a cabo para evitar en la medida de lo
posible intrusiones al sistema?
6.92. ¿Qué pasos se deben de seguir para poder detectar una intrusión?
6.95. ¿Cuáles son los objetivos que pretenden alcanzarse después de detectar una intromisión
al sistema?
[1] S. V. Adve and K. Gharachorloo. Shared memory consistency models: A tutorial. IEEE
Computer, 29(12):66–76, 1996.
[3] Ehab S. Al-Shaer. Distributed memory management: Design issues and future trends.
[5] A. W. Appel and K. Li. Virtual memory primitives for user programs. In Proceedings of
the 4th International Conference on Architectural Support for Programming Languages
and Operating System (ASPLOS), volume 26, pages 96–107, New York, NY, 1991. ACM
Press.
[6] P. Ashton, D. Ayers, and P. Smith. SunOS Minix: a tool for use in operating system
laboratories. Australian Computer Science Communications, 16(1,):259–269, 1994.
[8] S. Au and S. Dandamudi. The impact of program structure on the performance of sche-
duling policies in multiprocessor systems, 1996.
[12] Robert M. Barned and Russell J. Richards. Uniform driver interface (udi) reference im-
plementation and determinism. In RTAS ’02: Proceedings of the Eighth IEEE Real-Time
369
370 BIBLIOGRAFÍA
and Embedded Technology and Applications Symposium (RTAS’02), page 301, Washing-
ton, DC, USA, 2002. IEEE Computer Society.
[13] Steven M. Bellovin. Problem areas for the IP security protocols. In Proceedings of the
Sixth Usenix UNIX Security Symposium, 1996.
[14] Brian N. Bershad and Matthew J. Zekauskas. Midway: Shared memory parallel program-
ming with entry consistency for distributed memory multiprocessors. Technical Report
CMU-CS-91-170, Pittsburgh, PA (USA), 1991.
[15] Matt Bishop. A taxonomy of Unix system and network vulnerabilities. Technical Report
CSE-9510, Department of Computer Science, University of California at Davis, May
1995.
[16] David L. Black. Scheduling support for concurrency and parallelism in the mach opera-
ting system. IEEE Computer, 23(5):35–43, 1990.
[19] Bogdan Caprita, Wong Chun Chan, Jason Nieh, Clifford Stein, and Haoqiang Zheng.
Group ratio round-robin: O(1) proportional share scheduling for uniprocessor and multi-
processor systems.
[20] John B. Carter, John K. Bennett, and Willy Zwaenepoel. Techniques for redu-
cing consistency-related communication in distributed shared-memory systems. ACM
Transactions on Computer Systems, 13(3):205–243, 1995.
[22] Richard Chapman and W. Homer Carlisle. A Linux-based lab for operating systems and
network courses. Linux Journal, 41:??–??, 1997.
[23] Kellep Charles. Decoy systems: A new player in network security and computer incident
response.
[25] Jeff Chase, Hank Levy, and Ashutosh Tiwary. Using virtual addresses as object referen-
ces.
[26] Chandra Chekuri. Approximation algorithms for scheduling problems. Technical Report
CS-TR-98-1611, 1998.
[27] P. M. Chen and D. A. Patterson. Maximizing performance in a striped disk array. In Proc.
17th Annual Int’l Symp. on Computer Architecture, ACM SIGARCH Computer Architec-
ture News, page 322, 1990.
[28] S. Chen and D. Towsley. A performance evaluation of RAID architectures. IEEE Transac-
tions on Computers, 45(10):1116–1130, 1996.
[29] Shimin Chen and Mengzhi Wang. Transactional virtual memory with fine-grained range
lock support.
[30] Khien-Mien Chew and Avi Silberschatz. The recoverable-persistent virtual memory pa-
radigm. Technical Report CS-TR-93-08, 1, 1993.
[31] Mark Claypool, David Finkel, and Craig Wills. An open source laboratory for operating
systems projects. pages 145–148.
[32] Wiebren de Jonge, M. Frans Kaashoek, and Wilson C. Hsieh. The logical disk: A new
approach to . . .
[34] Yannick Deville. A low-cost usage-based replacement algorithm for cache memories.
SIGARCH Comput. Archit. News, 18(4):52–58, 1990.
[35] Jayanta K. Dey, James F. Kurose, Donald F. Towsley, C. M. Krishna, and Mahesh Girkar.
Efficient on-line processor scheduling for a class of IRIS (increasing reward with increa-
sing service.) real-time tasks. In Measurement and Modeling of Computer Systems, pages
217–228, 1993.
[36] Daniel W. Engels, Jon Feldman, David R. Karger, and Matthias Ruhl. Parallel processor
scheduling with delay constraints. In Twelfth Annual Symposium on Discrete algorithms,
pages 577–585, New York, NY, USA, 2001. ACM Press.
372 BIBLIOGRAFÍA
[37] Dawson R. Engler, M. Frans Kaashoek, and James O’Toole. Exokernel: An operating sys-
tem architecture for application-level resource management. In Symposium on Operating
Systems Principles, pages 251–266, 1995.
[38] Dror G. Feitelson, Larry Rudolph, Uwe Schwiegelshohn, Kenneth C. Sevcik, and Parkson
Wong. Theory and practice in parallel job scheduling. In Dror G. Feitelson and Larry
Rudolph, editors, Job Scheduling Strategies for Parallel Processing, pages 1–34. Springer
Verlag, 1997.
[39] Bill Fithen, Steve Kalinowski, Jeff Carpenter, and Jed Pickel. Infrastructure: A prerequi-
site for effective security. In LISA ’98: Proceedings of the 12th USENIX conference on
System administration, pages 11–26, Berkeley, CA, USA, 1998. USENIX Association.
[41] Laurent George, Nicolas Rivierre, and Marco Spuri. Preemptive and non-preemptive
real-time uniprocessor scheduling. Technical Report RR-2966.
[42] Kourosh Gharachorloo, Daniel Lenoski, James Laudon, Phillip B. Gibbons, Anoop Gup-
ta, and John L. Hennessy. Memory consistency and event ordering in scalable shared-
memory multiprocessors. In 25 Years ISCA: Retrospectives and Reprints, pages 376–387,
1998.
[44] Shantanu Goel and Dan Duchamp. Linux device driver emulation in mach. In USENIX
Annual Technical Conference, pages 65–74, 1996.
[47] Allan Heydon and J. D. Tygar. Specifying and checking UNIX security constraints. Com-
puting Systems, 7(1):91–112, 1994.
[49] W. Holland, G. Gibson, L. Reilly, and J. Zelenka. Raidframe: A rapid prototyping tool
for raid systems, 1996.
BIBLIOGRAFÍA 373
[50] Antonio Villalón Huerta. Seguridad en unix y redes. Antonio Villalón Huerta, 2000.
[51] Apple Computer Inc. Mac os x server fundamentals. Technology brief, 2007.
[52] Damir Isovic. Flexible scheduling for media processing in resource constrained real-time
systems.
[54] Neal S. Jamison. Computer security revisited: physical security. Sys Admin, 3(6):8–12,
1994.
[56] T. Johnson and K. Harathi. Interruptible critical sections. Technical Report 94–007, 1994.
[58] Daniel V. Klein. “foiling the cracker” – A survey of, and improvements to, password se-
curity. In Proceedings of the second USENIX Workshop on Security, pages 5–14, Summer
1990.
[59] Phillip Krueger and Davender Babbar. The effects of precedence and priority constraints
on the performance of scan scheduling for hypercube multiprocessors. Journal of Parallel
and Distributed Computing, 39(2):95–104, 1996.
[60] B. W. Lampson and D. D. Redell. Experience with processes and monitors in mesa. In
Proceedings of the 7th ACM Symposium on Operating Systems Principles (SOSP), pages
43–44, 1979.
[63] Ben Leslie, Nicholas FitzRoy-Dale, and Gernot Heiser. Encapsulated user-level device
drivers in the mungi operating system.
[64] Kai Li and Paul Hudak. Memory coherence in shared virtual memory systems. In Pro-
ceedings of the 5th ACM Symposium on Principles of Distributed Computing (PODC),
pages 229–239, New York, NY, 1986. ACM Press.
[66] C. L. Liu and James W. Layland. Scheduling algorithms for multiprogramming in a hard-
real-time environment. Journal of the ACM, 20(1):46–61, 1973.
[67] J. Mayo and P. Kearns. A secure-networked laboratory for kernel programming, 1997.
[68] Marshall K. McKusick, William N. Joy, Samuel J. Leffler, and Robert S. Fabry. A fast
file system for UNIX. Computer Systems, 2(3):181–197, 1984.
[69] L. W. McVoy and S. R. Kleiman. Extent-like performance from a UNIX file system. In
Proceedings of the USENIX Winter 1991 Technical Conference, pages 33–43, Dallas, TX,
USA, 21–25 1991.
[70] C. Mercer. Operating system resource reservation for real-time and multimedia applica-
tions, 1997.
[71] David Mosberger. Memory consistency models. Operating Systems Review, 27(1):18–26,
1993.
[73] Alec Muffett. Wan-hacking with autohack - auditing security behind the firewall.
[75] Peter Chubb National. Get more device drivers out of the kernel!
[76] M. N. Nelson. Physical memory management in a network operating system. Report No.
UCB/CSD 88/471, pages 1–2, 1988.
[77] N. M. Nelson. Virtual memory for the Sprite operating system. Technical Report UCB/
CSD 86/301, Berkeley, CA (USA), 1986.
[78] National Institute of Standards & Technology and National Security Agency. Federal
criteria for information technology security - volume ii: Registry of protection profiles.
[80] Peter Chubb Peterc. Linux kernel infrastructure for user-level device drivers.
BIBLIOGRAFÍA 375
[83] D. M. Ritchie. The evolution of the UNIX time-sharing system. BSTJ, 63, 8:1577–1594,
1984.
[84] D. M. Ritchie and K. Thompson. The UNIX time-sharing system. The Bell System
Technical Journal, 57(6 (part 2)):1905+, 1978.
[85] P. Robinson and M. Beigl. Trust context spaces: An infrastructure for pervasive security,
2003.
[86] Mendel Rosenblum and John K. Ousterhout. The design and implementation of a log-
structured file system. ACM Transactions on Computer Systems, 10(1):26–52, 1992.
[88] Emilia Rosti, Evgenia Smirni, Lawrence W. Dowdy, Giuseppe Serazzi, and Kenneth C.
Sevcik. Processor saving scheduling policies for multiprocessor systems. IEEE Transac-
tions on Computers, 47(2):178–189, 1998.
[89] Ellard Roush. Performance and the single/multi–processor operating system process
subsystem, 1995.
[90] R. Sandberg. The sun network filesystem: Design, implementation, and experience, 1986.
[91] Russel Sandberg, David Goldberg, Steve Kleiman, Dan Walsh, and Bob Lyon. Design
and implementation of the Sun Network Filesystem. In Proc. Summer 1985 USENIX
Conf., pages 119–130, Portland OR (USA), 1985.
[92] M. Satyanarayanan, Henry H. Mashburn, Puneet Kumar, David C. Steere, and James J.
Kistler. Lightweight recoverable virtual memory. ACM Transactions on Computer Sys-
tems, 12(1):33–57, 1994.
[93] J. Sgall. line scheduling – a survey. Lecture Notes in Computer Science. Springer-Verlag,
Berlin, 1997.
[94] Silberchatz. Sistemas Operativos, Conceptos y diseño. Mac Graw Hill, 1994.
376 BIBLIOGRAFÍA
[95] Gagne Silberchatz, Galvin. Fundamentos de Sistemas Operativos. Mc Graw Hill, 7th
edition, 2005.
[102] Diane Tang. Benchmarking filesystems. Technical Report TR-19-95, Harvard University,
Cambridge, MA, USA, October 1995.
[103] Avadis Tevanian, Jr., Richard F. Rashid, David B. Golub, David L. Black, Eric Cooper,
and Michael W. Young. Mach threads and the unix kernel: The battle for control. Tech-
nical Report CMU-CS-87-149, 1987.
[104] Stephen Tweedie. Journaling the Linux ext2fs filesystem. In LinuxExpo ’98, 1998.
[108] Hui Wu, Joxan Jaffar, and Roland H. C. Yap. A fast algorithm for scheduling instructions
with deadline constraints on RISC processors. In IEEE PACT, pages 281–290, 2000.
[109] Hui Wu, Joxan Jaffar, and Roland H. C. Yap. Instruction scheduling with timing cons-
traints on a single RISC processor with 0/1 latencies. In Principles and Practice of Cons-
traint Programming, pages 457–469, 2000.
[110] K. Yue and D. Lilja. Dynamic processor allocation with the Solaris operating system.
pages 392–397.
BIBLIOGRAFÍA 377
[111] Huican Zhu, Tao Yang, Qi Zheng, David Watson, Oscar H. Ibarra, and Terence R. Smith.
Adaptive load sharing for clustered digital library servers. Int. J. on Digital Libraries,
2(4):225–235, 2000.
[112] Moshe Zviran and William J. Haga. Password security: an empirical study. J. Manage.
Inf. Syst., 15(4):161–185, 1999.
Índice alfabético
378
ÍNDICE ALFABÉTICO 379
wmf, 244
wtmp, 330