1
INTRODUCCIÓN
Una computadora moderna consta de uno o más procesadores, una memoria principal, discos, im-
presoras, un teclado, un ratón, una pantalla o monitor, interfaces de red y otros dispositivos de en-
trada/salida. En general es un sistema complejo. Si todos los programadores de aplicaciones
tuvieran que comprender el funcionamiento de todas estas partes, no escribirían código alguno. Es
más: el trabajo de administrar todos estos componentes y utilizarlos de manera óptima es una tarea
muy desafiante. Por esta razón, las computadoras están equipadas con una capa de software llama-
da sistema operativo, cuyo trabajo es proporcionar a los programas de usuario un modelo de compu-
tadora mejor, más simple y pulcro, así como encargarse de la administración de todos los recursos
antes mencionados. Los sistemas operativos son el tema de este libro.
La mayoría de los lectores habrán tenido cierta experiencia con un sistema operativo como
Windows, Linux, FreeBSD o Mac OS X, pero las apariencias pueden ser engañosas. El progra-
ma con el que los usuarios generalmente interactúan se denomina shell, cuando está basado en
texto, y GUI (Graphical User Interface; Interfaz gráfica de usuario) cuando utiliza elementos
gráficos o iconos. En realidad no forma parte del sistema operativo, aunque lo utiliza para llevar
a cabo su trabajo.
La figura 1-1 presenta un esquema general de los componentes principales que aquí se anali-
zan. En la parte inferior se muestra el hardware, que consiste en circuitos integrados (chips), tarje-
tas, discos, un teclado, un monitor y objetos físicos similares. Por encima del hardware se encuentra
el software. La mayoría de las computadoras tienen dos modos de operación: modo kernel y modo
usuario. El sistema operativo es la pieza fundamental del software y se ejecuta en modo kernel
(también conocido como modo supervisor). En este modo, el sistema operativo tiene acceso
1
,2 INTRODUCCIÓN CAPÍTULO 1
completo a todo el hardware y puede ejecutar cualquier instrucción que la máquina sea capaz de
ejecutar. El resto del software se ejecuta en modo usuario, en el cual sólo un subconjunto de las
instrucciones de máquina es permitido. En particular, las instrucciones que afectan el control de la má-
quina o que se encargan de la E/S (entrada/salida) están prohibidas para los programas en modo
usuario. Volveremos a tratar las diferencias entre el modo kernel y el modo usuario repetidamente
a lo largo de este libro.
Lector de
correo Reproductor
Navegador electrónico de música
Web
Modo usuario
Programa de interfaz de usuario Software
Modo kernel Sistema operativo
Hardware
Figura 1-1. Ubicación del sistema operativo.
El programa de interfaz de usuario, shell o GUI, es el nivel más bajo del software en modo
usuario y permite la ejecución de otros programas, como un navegador Web, lector de correo elec-
trónico o reproductor de música. Estos programas también utilizan en forma intensiva el sistema
operativo.
La ubicación del sistema operativo se muestra en la figura 1-1. Se ejecuta directamente sobre
el hardware y proporciona la base para las demás aplicaciones de software.
Una distinción importante entre el sistema operativo y el software que se ejecuta en modo usua-
rio es que, si a un usuario no le gusta, por ejemplo, su lector de correo electrónico, es libre de con-
seguir otro o incluso escribir el propio si así lo desea; sin embargo, no es libre de escribir su propio
manejador de interrupciones de reloj, que forma parte del sistema operativo y está protegido por el
hardware contra cualquier intento de modificación por parte de los usuarios.
Algunas veces esta distinción no es clara en los sistemas integrados (a los que también se co-
noce como integrados o incrustados, y que podrían no tener modo kernel) o en los sistemas inter-
pretados (como los sistemas operativos basados en Java que para separar los componentes utilizan
interpretación y no el hardware).
Además, en muchos sistemas hay programas que se ejecutan en modo de usuario, pero ayudan
al sistema operativo o realizan funciones privilegiadas. Por ejemplo, a menudo hay un programa que
permite a los usuarios cambiar su contraseña. Este programa no forma parte del sistema operativo y
no se ejecuta en modo kernel, pero sin duda lleva a cabo una función delicada y tiene que proteger-
,SECCIÓN 1.1 ¿QUÉ ES UN SISTEMA OPERATIVO? 3
se de una manera especial. En ciertos sistemas, la idea se lleva hasta el extremo y partes de lo que
tradicionalmente se considera el sistema operativo (por ejemplo, el sistema de archivos) se ejecutan
en el espacio del usuario. En dichos sistemas es difícil trazar un límite claro. Todo lo que se ejecuta en
modo kernel forma, sin duda, parte del sistema operativo, pero podría decirse que algunos progra-
mas que se ejecutan fuera de este modo también forman parte del mismo sistema, o por lo menos es-
tán estrechamente asociados a él.
Los sistemas operativos difieren de los programas de usuario (es decir, de aplicación) en varias
cuestiones además del lugar en el que residen. En particular, son enormes, complejos y de larga du-
ración. El código fuente de un sistema operativo como Linux o Windows contiene cerca de cinco
millones de líneas de código. Para tener una idea de lo que esto significa, considere el trabajo de
imprimir cinco millones de líneas en un formato de libro: con 50 líneas por página y 1000 páginas
por volumen, se requerirían 100 volúmenes para listar un sistema operativo de este tamaño; es de-
cir, todo un librero. Imagine el lector que tiene un trabajo como encargado de dar mantenimiento a
un sistema operativo y que en su primer día su jefe le presenta un librero con el código y le dice:
“Apréndase todo esto”. Y ésta sólo sería la parte que se ejecuta en el kernel. Los programas de usua-
rio como la interfaz gráfica, las bibliotecas y el software de aplicación básico (como el Explorador
de Windows) pueden abarcar fácilmente de 10 a 20 veces esa cantidad.
En este punto, el lector debe tener una idea clara de por qué los sistemas operativos tienen una
larga vida: es muy difícil escribir uno y, por lo tanto, el propietario se resiste a tirarlo y empezar de
nuevo. En vez de ello, evolucionan durante periodos extensos. Windows 95/98/Me es, esencialmen-
te, un sistema operativo distinto de Windows NT/2000/XP/Vista, su sucesor. Tienen una apariencia
similar para los usuarios, ya que Microsoft se aseguró bien de ello, sin embargo, tuvo muy buenas
razones para deshacerse de Windows 98, las cuales describiremos cuando estudiemos Windows con
detalle en el capítulo 11.
El otro ejemplo principal que utilizaremos a lo largo de este libro (además de Windows) es
UNIX, con sus variantes y clones. También ha evolucionado a través de los años con versiones ta-
les como System V, Solaris y FreeBSD que se derivan del sistema original, mientras que Linux tie-
ne una base de código nueva, modelada estrechamente de acuerdo con UNIX y altamente compatible
con él. Utilizaremos ejemplos de UNIX a lo largo de este libro y analizaremos Linux con detalle en
el capítulo 10.
En este capítulo hablaremos brevemente sobre varios aspectos clave de los sistemas operativos,
incluyendo en síntesis qué son, cuál es su historia, cuáles son los tipos que existen, algunos de los
conceptos básicos y su estructura. En capítulos posteriores volveremos a hablar sobre muchos de
estos tópicos importantes con más detalle.
1.1 ¿QUÉ ES UN SISTEMA OPERATIVO?
Es difícil definir qué es un sistema operativo aparte de decir que es el software que se ejecuta en
modo kernel (además de que esto no siempre es cierto). Parte del problema es que los sistemas ope-
rativos realizan dos funciones básicas que no están relacionadas: proporcionar a los programadores
de aplicaciones (y a los programas de aplicaciones, naturalmente) un conjunto abstracto de recur-
sos simples, en vez de los complejos conjuntos de hardware; y administrar estos recursos de hard-
, 4 INTRODUCCIÓN CAPÍTULO 1
ware. Dependiendo de quién se esté hablando, el lector podría escuchar más acerca de una función
o de la otra. Ahora analizaremos ambas.
1.1.1 El sistema operativo como una máquina extendida
La arquitectura (conjunto de instrucciones, organización de memoria, E/S y estructura de bus) de
la mayoría de las computadoras a nivel de lenguaje máquina es primitiva y compleja de programar,
en especial para la entrada/salida. Para hacer este punto más concreto, considere la forma en que se
lleva a cabo la E/S de disco flexible mediante los dispositivos controladores (device controllers)
compatibles NEC PD765 que se utilizan en la mayoría de las computadoras personales basadas en
Intel (a lo largo de este libro utilizaremos los términos “disco flexible” y “diskette” indistintamen-
te). Utilizamos el disco flexible como un ejemplo debido a que, aunque obsoleto, es mucho más
simple que un disco duro moderno. El PD765 tiene 16 comandos, cada uno de los cuales se espe-
cifica mediante la carga de 1 a 9 bytes en un registro de dispositivo. Estos comandos son para leer
y escribir datos, desplazar el brazo del disco y dar formato a las pistas, así como para inicializar, de-
tectar, restablecer y recalibrar el dispositivo controlador y las unidades.
Los comandos más básicos son read y write (lectura y escritura), cada uno de los cuales re-
quiere 13 parámetros, empaquetados en 9 bytes. Estos parámetros especifican elementos tales co-
mo la dirección del bloque de disco a leer, el número de sectores por pista, el modo de grabación
utilizado en el medio físico, el espacio de separación entre sectores y lo que se debe hacer con una
marca de dirección de datos eliminados. Si el lector no comprende estos tecnicismos, no se preocu-
pe: ése es precisamente el punto, pues se trata de algo bastante oscuro. Cuando la operación se com-
pleta, el chip del dispositivo controlador devuelve 23 campos de estado y error, empaquetados en
7 bytes. Como si esto no fuera suficiente, el programador del disco flexible también debe estar cons-
tantemente al tanto de si el motor está encendido o apagado. Si el motor está apagado, debe encen-
derse (con un retraso largo de arranque) para que los datos puedan ser leídos o escritos. El motor
no se debe dejar demasiado tiempo encendido porque se desgastará. Por lo tanto, el programador se
ve obligado a lidiar con el problema de elegir entre tener retrasos largos de arranque o desgastar los
discos flexibles (y llegar a perder los datos).
Sin entrar en los detalles reales, debe quedar claro que el programador promedio tal vez no de-
see involucrarse demasiado con la programación de los discos flexibles (o de los discos duros, que
son aún más complejos). En vez de ello, lo que desea es una abstracción simple de alto nivel que se
encargue de lidiar con el disco. En el caso de los discos, una abstracción común sería que el disco
contiene una colección de archivos con nombre. Cada archivo puede ser abierto para lectura o escri-
tura, después puede ser leído o escrito y, por último, cerrado. Los detalles, tales como si la grabación
debe utilizar o no la modulación de frecuencia y cuál es el estado del motor en un momento dado,
no deben aparecer en la abstracción que se presenta al programador de aplicaciones.
La abstracción es la clave para lidiar con la complejidad. Las buenas abstracciones convierten
una tarea casi imposible en dos tareas manejables. La primera de éstas es definir e implementar las
abstracciones; la segunda, utilizarlas para resolver el problema en cuestión. Una abstracción que ca-
si cualquier usuario de computadora comprende es el archivo: es una pieza útil de información, co-
mo una fotografía digital, un mensaje de correo electrónico almacenado o una página Web. Es más
fácil lidiar con fotografías, correos electrónicos y páginas Web que con los detalles de los discos,