Está en la página 1de 43

See discussions, stats, and author profiles for this publication at: https://www.researchgate.

net/publication/371530721

Conceptos básicos de sistemas operativos

Technical Report · June 2023

CITATIONS READS

0 2,919

1 author:

Manuel José Fernández Iglesias


atlanTTic - University of Vigo
242 PUBLICATIONS 1,268 CITATIONS

SEE PROFILE

All content following this page was uploaded by Manuel José Fernández Iglesias on 09 July 2023.

The user has requested enhancement of the downloaded file.


Conceptos básicos de sistemas operativos
Versión 1.01/ES – Junio 2023

Manuel José Fernández Iglesias


atlanTTic - Universidade de Vigo
Resumen

Presentamos los fundamentos y los conceptos básicos de los sistemas operativos, in-
cluida la gestión de procesos, la gestión de memoria, los sistemas de archivos, los sistemas
de entrada/salida, la seguridad y la protección, la virtualización, el rendimiento del sistema y
los sistemas operativos distribuidos. Se ofrece una visión general de cada tema y se analiza
su importancia en la informática moderna. Además, examinamos la arquitectura y los princi-
pios de diseño de cuatro sistemas operativos populares: Windows, Linux, macOS y Android.
Intentamos ofrecer una base sólida en relación con los conceptos esenciales de los siste-
mas operativos y su importancia en el mundo de las arquitecturas de ordenadores, así como
una comprensión de las características específicas y principios de diseño de los sistemas
operativos más populares.

Índice

1. ¿Qué es un sistema operativo? 3

2. Gestión de procesos 5

3. Gestión de memoria 13

4. Gestión de entrada y salida 16

5. Sistemas de ficheros 20

6. Seguridad y protección 24

7. Virtualización 26

8. Sistemas operativos distribuidos y computación en la nube 28

9. Análisis de rendimiento 30

Bajo licencia Atribución-NoComercial-SinDerivadas 4.0 Internacional (CC BY-NC-ND 4.0)


(la “Licencia”). Sólo es posible utilizar este material de acuerdo con la Licencia. Se puede distribuir libremente y
sin coste tal como está, en su lenguaje original (Ver licencia).
DOI: 10.17605/OSF.IO/38MKS

Versión 1.01/ES. Compilación: 9 de julio de 2023, 21:13 CET.

1
10. Casos de estudio 32
10.1. Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
10.2. Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
10.3. macOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
10.4. Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

11. Conclusión 38

2
1. ¿Qué es un sistema operativo?

Un sistema operativo es un software que gestiona el hardware del ordenador. Es un con-


junto de programas de propósito específico que se ejecutan en un sistema informático y que
le permiten funcionar correctamente. Estos programas realizan tareas básicas como reco-
nocer las entradas del teclado, mantener un registro de los archivos y carpetas almacenados,
enviar información a la pantalla y controlar los dispositivos periféricos.
El objetivo de un sistema operativo es proporcionar un entorno en el que las personas
usuarias puedan ejecutar programas de forma cómoda y eficaz. Se trata de programas esen-
ciales que gestionan el hardware del ordenador y proporcionan una interfaz fácil de usar para
ejecutar aplicaciones. Sirven de intermediario entre el hardware y el software de un sistema
informático. Los sistemas operativos tienen por tanto varios cometidos:
Se encargan de la gestión de los recursos del sistema, como por ejemplo el procesa-
dor, la memoria y los dispositivos de entrada y salida, asignando dichos recursos a las
distintas aplicaciones informáticas, garantizando que éstas no interfieran entre sí.
Abstraen el hardware del ordenador, evitando que usuarios y programadores tengan
que conocer sus detalles y proporcionando una interfaz sencilla y coherente para eje-
cutar aplicaciones, ocultando la complejidad del hardware subyacente.
Proporcionan seguridad y protección a las aplicaciones, ofreciendo mecanismos para
proteger los recursos y datos del sistema de accesos no autorizados y software mali-
cioso.
Proporcionan utilidades y servicios que facilitan a los usuarios la interacción con el
sistema y la ejecución de aplicaciones.
Las llamadas al sistema son construcciones simbólicas que permiten a los programas so-
licitar servicios y recursos al sistema operativo subyacente. En otras palabras, las llamadas
al sistema actúan como puente entre el espacio de usuario y el espacio del sistema opera-
tivo (cf. Fig. 1). Cuando un programa de usuario necesita realizar operaciones privilegiadas
o acceder a recursos del sistema, realiza una petición al sistema operativo a través de una
llamada al sistema. El núcleo del sistema operativo, que opera en un modo más privilegiado,
recibe y gestiona estas peticiones, realizando las operaciones necesarias en nombre de la
aplicación.
Algunos ejemplos comunes de llamadas al sistema incluyen aquellas para realizar opera-
ciones con archivos (por ejemplo, abrir, leer, escribir, cerrar archivos y manipular atributos de
archivos); para controlar procesos (por ejemplo, crear, terminar y gestionar procesos); para
gestionar memoria (por ejemplo, asignar y liberar memoria, mapear y desmapear áreas de
memoria); para interactuar con dispositivos de entrada/salida (por ejemplo, realizar opera-
ciones como leer o escribir en un dispositivo); comunicarse a través de una red (por ejemplo,
establecer conexiones de red, enviar y recibir datos); o intercambiar información entre proce-
sos (por ejemplo, sincronizar y comunicarse entre sí diferentes procesos).
Las llamadas al sistema proporcionan una capa de abstracción para los programas de
usuario, permitiéndoles acceder a los recursos y servicios del sistema de forma controlada y
segura. Proporcionan una interfaz estandarizada para que las aplicaciones interactúen con el
sistema operativo subyacente, ocultando las complejidades de las operaciones de bajo nivel
y proporcionando una interfaz de programación de alto nivel.

3
Figura 1: Las llamadas al sistema actúan como puente entre el espacio de usuario y el espacio del sistema
operativo.

Los sistemas operativos pueden clasificarse en varios tipos, como los sistemas de pro-
cesamiento por lotes, sistemas de tiempo compartido, sistemas operativos distribuidos, sis-
temas operativos de red, sistemas operativos de tiempo real y sistemas operativos móviles.
Cada tipo de sistema operativo está diseñado para un fin específico. Por ejemplo, los siste-
mas operativos de escritorio están diseñados para ordenadores personales y estaciones de
trabajo, como Windows, macOS y Linux. Proporcionan una interfaz gráfica de usuario y ad-
miten una amplia gama de aplicaciones. Por otro lado, los sistemas operativos de servidor
están diseñados para servidores y centros de datos, como Windows Server, Linux Server y
muchos otros sistemas operativos basados en Unix (por ejemplo, RedHat, Fedora, FreeBSD,
Solaris, etc.). Proporcionan funciones como soporte multiusuario, acceso remoto y gestión
de recursos.
Con el avance de las tecnologías informáticas, proliferaron los dispositivos móviles inteli-
gentes, como los smartphones y las tabletas. Con ellos, aparecieron los sistemas operativos
móviles, diseñados para estos dispositivos. Actualmente, los más populares son iOS/iPadOS
y Android. Ofrecen interfaces táctiles y soportan todo un ecosistema de aplicaciones y ser-
vicios móviles.
Los sistemas operativos embebidos están diseñados para dispositivos embebidos, co-
mo los dispositivos de Internet de las Cosas (IoT), los dispositivos vestibles, los sistemas de
automoción o el equipamiento médico. Algunos ejemplos son FreeRTOS, WearOS o Android
Things. Proporcionan capacidades de tiempo real y bajo consumo, entre otras característi-
cas.
Los sistemas operativos evolucionan con el tiempo, y su evolución está condicionada por
las tecnologías en uso en cada momento para la construcción de ordenadores. Las primeras
generaciones de sistemas operativos se desarrollaron en las décadas de 1950-1960, cuando
los ordenadores se basaban en tubos de vacío y más tarde en transistores, y se comunica-
ban con el mundo exterior mediante tarjetas perforadas. Los primeros sistemas operativos,
como GM-NAA I/O (Surhone, Tennoe y Henssonow, 2010) o IBSYS (Corporation, 1963), esta-
ban diseñados para grandes ordenadores y utilizaban el procesamiento por lotes. Las tareas

4
que debía realizar el ordenador se codificaban en un conjunto de tarjetas, y estas tarjetas se
cargaban en el ordenador. Las tareas fundamentales del sistema operativo consistían en leer
estas tarjetas y realizar las tareas codificadas en ellas de forma secuencial, presentando los
resultados en una impresora de línea.
La década de 1970-1980 se caracterizó por la introducción del circuito integrado en la fa-
bricación de ordenadores. Aparecieron el tiempo compartido y la interfaz de línea de coman-
dos, aparte del procesamiento por lotes. Además de los sistemas operativos para grandes
ordenadores, se diseñaron sistemas operativos como Unix (Ritchie y Thompson, 1984), CP/M
(Kildall, 1974) y MS-DOS (Corporation, 2002) pensando en los ordenadores personales y las
estaciones de trabajo personales.
En los años 1990-2000, con la popularización de los ordenadores y su introducción en
los entornos domésticos y de oficina, aparecieron las interfaces gráficas de usuario y siste-
mas operativos como Windows 95 (Coleman, 1995), Mac OS (Hertzfeld, 2004) y las distintas
distribuciones de Linux (Torvalds y Diamond, 2001).
Ya en la década 2010-2020, con la popularización de los dispositivos móviles inteligen-
tes y el aumento de la potencia de cálculo, aparecieron sistemas operativos móviles como
BlackberryOS (McFadden, 2013), iOS (Levy, 2014) o Android (Choffnes, 2020), junto con las
evoluciones de sistemas operativos de escritorio como Windows 10, macOS Big Sur o An-
droid 11, que introdujeron funcionalidades como asistentes virtuales, realidad aumentada y
aprendizaje automático.
En las siguientes secciones se describen con más detalle las funciones esenciales de
un sistema operativo. Estas funciones cubren las tareas de cualquier sistema operativo mo-
derno, es decir, gestionar los recursos del sistema (gestión de procesos, gestión de memo-
ria, gestión de entrada y salida), proporcionar una capa de abstracción para el hardware (las
funciones anteriores junto con la gestión de archivos), proteger los datos y los programas
(control de acceso, virtualización, autenticación, autorización) y facilitar la interacción con
los usuarios. Más adelante, se introduce el concepto de sistema operativo distribuido, así
como los conceptos fundamentales relacionados con el análisis del rendimiento. Por último,
se ofrece un breve resumen de cuatro de los sistemas operativos más populares, Windows,
Linux, macOS y Android, a modo de estudio de caso.

2. Gestión de procesos

Un proceso es un programa en ejecución. Se trata de una instancia de un programa in-


formático que está siendo ejecutada por el hardware del ordenador. Dicha instancia a su vez
puede estar compuesta por uno o varios hilos (cf. Fig.2).
La gestión de procesos es una parte fundamental de los sistemas operativos. El objetivo
de la gestión de procesos es crear, ejecutar y coordinar procesos. Un proceso tiene su propio
espacio de direcciones, es decir, su propia área de memoria para su código y datos, así como
otros recursos (por ejemplo, archivos, dispositivos a los que se accede, etc.). Cada proceso
se identifica por un identificador de proceso único y, como se ha mencionado anteriormente,
puede tener uno o más hilos, es decir, un proceso puede describirse como un contenedor para
uno o más hilos. Un hilo es una unidad ligera de ejecución dentro de un proceso. Pueden
existir varios hilos dentro del mismo proceso y compartir el mismo espacio de memoria y

5
Figura 2: Un proceso es un programa en ejecución. Un hilo es la unidad básica planificada por el sistema ope-
rativo.

recursos del sistema, por lo que los hilos de un proceso pueden comunicarse y compartir
datos directamente accediendo a la memoria compartida, así como utilizando primitivas de
sincronización como mutexes o semáforos, que se presentarán más adelante.
La creación y gestión de un proceso suele generar más sobrecarga que la creación y
gestión de un hilo. Cada proceso requiere un espacio de memoria y recursos del sistema in-
dependientes, lo que implica una sobrecarga de cambio de contexto. Los hilos, al ser ligeros,
tienen menos sobrecarga en términos de asignación de recursos y cambio de contexto. Por
otra parte, los procesos ofrecen un mayor grado de aislamiento frente a errores. Si un pro-
ceso falla o se produce un error, no afecta a los demás procesos. Los hilos de un proceso
comparten el mismo espacio de memoria, por lo que un error en un hilo puede afectar a los
demás hilos y a todo el proceso. Tanto los procesos como los hilos son conceptos impor-
tantes en la multitarea y la concurrencia. Los procesos proporcionan aislamiento y robustez,
mientras que los hilos permiten la ejecución concurrente dentro de un único proceso, permi-
tiendo compartir recursos de forma eficiente.
Existen varios estados en los que puede encontrarse un proceso durante su vida. Estos
estados son (cf. Fig.3):
Nuevo Cuando un proceso se crea por primera vez, se encuentra en el estado Nuevo. En es-
te estado, el sistema operativo asigna los recursos necesarios, inicializa el bloque de
control de procesos (Process Control Block, PCB) para mantener la información sobre
el proceso y crea una entrada (y un identificador de proceso) en la tabla de procesos del
sistema. El nuevo proceso se somete a varios pasos de inicialización, como la configu-
ración del contador de programa, la asignación de memoria y la inicialización de otras
estructuras de datos relevantes.
Listo Cuando un proceso está listo para ejecutarse, se encuentra en el estado Listo. El siste-
ma operativo selecciona un proceso de la cola de procesos preparados para ser ejecu-
tados y le asigna recursos. Por tanto, cuando un proceso está en estado Listo, es elegi-

6
Figura 3: Diagrama de estados de un proceso.

ble para ser programado por el sistema operativo para ejecutarse en el procesador. Sin
embargo, no significa necesariamente que el proceso se esté ejecutando activamente
en ese momento. El estado Listo implica que el proceso está en la cola de procesos en
espera de tiempo de procesador, y se ejecutará cuando el procesador esté disponible.
La principal diferencia entre un proceso en estado Nuevo y un proceso en estado Listo
radica en sus respectivas etapas dentro del ciclo de vida del proceso. El estado Nuevo
representa la etapa inicial en la que se crea un proceso y se prepara para su ejecución,
mientras que el estado Listo indica que el proceso está esperando en la cola a que el
procesador esté disponible para su ejecución. Un proceso se puede encontrar en este
último estado varias veces a lo largo de su vida.
En ejecución Cuando un proceso se está ejecutando, se encuentra en estado En ejecución.
Sólo puede haber un proceso en ejecución en un procesador a la vez. En procesadores
multinúcleo (multicore), puede haber un proceso en ejecución en cada núcleo en un
momento dado.
Bloqueado Cuando un proceso está esperando a que se produzca un evento, como por ejem-
plo la finalización de una operación de E/S, se encuentra en estado bloqueado. El pro-
ceso no es elegible para pasar a ejecución (estado anterior) hasta que se produzca y
resuelva el evento.
Terminado Cuando un proceso termina de ejecutarse, se encuentra en el estado Terminado.
El identificador del proceso se libera y sus recursos se reasignan.
En el contexto de los sistemas operativos, un proceso zombie es un término utilizado
para describir un proceso que ha finalizado su ejecución, pero aún tiene una entrada en la
tabla de procesos del sistema, y por tanto un identificador. Aunque el proceso ya no está en
ejecución, su entrada en la tabla de procesos sigue existiendo para permitir que el proceso
que lo creó (proceso padre) pueda obtener información sobre su estado de finalización. Estos
procesos zombie son generalmente inofensivos en términos de consumo de recursos, pero

7
es importante que el proceso que creó un proceso zombie realice las operaciones adecuadas
tras la terminación del mismo para evitar la acumulación de procesos zombie en el sistema.
Los algoritmos de planificación se utilizan para determinar qué proceso debe ejecutarse
a continuación. Algunos de los algoritmos de planificación más comunes son los basados
en el orden de llegada a la cola de procesos listos (First Come, First Served, FCFS); en algún
criterio de prioridad (p. ej., Shortest Job First, SJF, donde el proceso que solicita un tiempo
de procesador más corto se ejecuta primero); la programación por turnos (Round Robin),
donde los procesos se ejecutan de forma escalonada en el tiempo, de modo que cada uno
de ellos recibe una pequeña cantidad de tiempo (por ejemplo, 10 milisegundos) antes de ser
puesto de vuelta en la cola, y la programación de colas multinivel, donde se establecen varias
prioridades entre los procesos, ejecutándose primero los de la sub-cola de mayor prioridad.
La sincronización es el proceso de coordinar la ejecución de múltiples hilos o procesos
para que no interfieran entre sí. Esto se consigue mediante primitivas de sincronización co-
mo semáforos, bloqueos y barreras. La sincronización es necesaria cuando varios procesos
necesitan acceder a un recurso compartido, como un archivo o una base de datos.
La comunicación entre procesos (cf. Sect. 2) es el mecanismo que permite a los procesos
comunicarse entre sí y sincronizar sus acciones. La IPC es necesaria para que los procesos
coordinen sus actividades y compartan recursos. Esto puede lograrse mediante memoria
compartida, paso de mensajes o primitivas de sincronización como semáforos o mecanis-
mos de bloqueo o exclusión mutua (mutex).
Una zona de memoria compartida consiste en una región de memoria a la que pueden
acceder varios procesos o hilos simultáneamente. Permite a estos procesos o hilos compar-
tir datos eficientemente y comunicarse entre sí leyendo y escribiendo datos en dicha área de
memoria compartida. La memoria compartida se utiliza habitualmente en los mecanismos
de comunicación entre procesos (IPC) cuando los procesos necesitan sincronizarse o inter-
cambiar datos de forma rápida y eficiente. En lugar de utilizar métodos más lentos como el
paso de mensajes o el trasiego de información a través de archivos, los procesos pueden
acceder directamente a la zona de memoria compartida para compartir información.
Para crear una zona de memoria compartida, el sistema operativo proporciona llamadas
al sistema o interfaces específicas que permiten a los procesos asignar una porción de me-
moria y designarla como segmento de memoria compartida. El sistema operativo gestiona
la asignación, el acceso y la sincronización de la memoria compartida para garantizar la in-
tegridad y coherencia de los datos. Los procesos que deseen acceder a la zona de memoria
compartida deben asociarse a ella utilizando las llamadas al sistema o interfaces adecua-
das. Una vez conectados, los procesos pueden leer y escribir en la memoria compartida, lo
que permite compartir datos y comunicarse de forma eficiente.
De todos modos, es importante tener en cuenta suele ser necesario establecer otros me-
canismos de sincronización, como los mecanismos de exclusión mutua, el paso de men-
sajes o los semáforos, y con ello garantizar el acceso a la memoria compartida de forma
coordinada y segura. Sin una sincronización adecuada, el acceso concurrente a la memoria
compartida puede llevar a la corrupción de datos u otras inconsistencias.
Un mecanismo de exclusión mutua o mutex es una primitiva de sincronización que per-
mite que sólo un hilo o proceso acceda a la vez a un recurso compartido, como por ejemplo
la memoria o un fichero. Se utiliza para prevenir condiciones de carrera, donde múltiples hi-

8
los o procesos pueden intentar acceder y modificar el recurso compartido simultáneamente,
conduciendo a resultados impredecibles o incorrectos.
Un mutex suele tener dos estados: bloqueado y desbloqueado. Cuando un hilo o proceso
quiere acceder al recurso compartido, debe adquirir el mutex intentando bloquearlo. Si el
mutex está desbloqueado, el hilo o proceso adquiere con éxito el mutex y procede a acceder
al recurso compartido. Si el mutex ya está bloqueado por otro hilo o proceso, el hilo o proceso
que intenta adquirirlo será bloqueado o puesto en reposo hasta que el mutex esté disponible,
es decir, hasta que sea desbloqueado por el hilo o proceso que lo tenía. Una vez que un hilo
o proceso ha terminado de acceder al recurso compartido, libera el mutex desbloqueándolo,
permitiendo a otros hilos o procesos adquirirlo y acceder al recurso compartido de forma
mutuamente excluyente.
Un semáforo suele ser una variable entera que se utiliza para gestionar el acceso a un de-
terminado recurso o para controlar el flujo de ejecución de hilos o procesos. Existen dos tipos
de semáforos: semáforos binarios y semáforos de conteo. Los semáforos binarios se utili-
zan precisamente para implementar mutex. Tienen dos estados: bloqueado y desbloqueado,
permitiendo que sólo un hilo o proceso acceda a un recurso compartido a la vez. Cuando un
hilo o proceso quiere acceder al recurso, intenta adquirir el semáforo binario. Si el semáforo
está bloqueado, el hilo o proceso se bloquea hasta que el semáforo se desbloquee.
El código Java siguiente ilustra el uso de semáforos binarios para implementar un mutex.

1 // La clase Semaphore proporciona métodos para utilizar semáforos en Java


2 import java.util.concurrent.Semaphore;
3
4 class Resource {
5 private Semaphore mutex;
6
7 // constructor no-args. Inicializa un semáforo binario
8 public Resource() {
9 // Initialize the semaphore with a permit
10 // count of 1 (binary semaphore)
11 mutex = new Semaphore(1);
12 }
13

14 // useResource ilustra el uso de un recurso por parte


15 // de procesos o hilos concurrentes
16 // (en nuestro caso, un hilo Java)
17 //
18 // Un hilo adquiriría el semáforo para entrar en la mutex.
19 // El uso del recurso se simula deteniendo el hilo durante
20 // 2 segundos. Después de eso, el recurso es liberado.
21 public void useResource() {
22 try {
23 mutex.acquire(); // Adquiere el semáforo (lock)
24 // Sección crítica: acceso y uso del recurso compartido.
25 System.out.println("Recurso usado por el hilo: "
26 + Thread.currentThread().getName());
27 Thread.sleep(2000); // Simula el uso del recurso
28 } catch (InterruptedException e) {
29 e.printStackTrace();
30 } finally {
31 mutex.release(); // Liberamos el semáforo (unlock)
32 }
33 }

9
34 }
35
36 // Esta clase interna simula un hilo que necesita utilizar un recurso
37 class MyThread extends Thread {
38 // Este recurso se comparte entre hilos.
39 // Los objetos Resource pueden acceder al recurso
40 // compartido de uno en uno (ver clase Resource arriba)
41 private Resource resource;
42
43 // Crwea un hilo que usa un Resource
44 public MyThread(Resource resource) {
45 this.resource = resource;
46 }
47
48 // ejecutar este hilo significa intentar
49 // utilizar el recurso (compartido)
50 public void run() {
51 resource.useResource();
52 }
53 }
54
55 public class BinarySemaphoreExample {
56 public static void main(String[] args) {
57 Resource resource = new Resource();
58
59 // Crear varios hilos que utilicen el recurso compartido
60 Thread thread1 = new MyThread(resource);
61 Thread thread2 = new MyThread(resource);
62
63 thread1.start();
64 thread2.start();
65 }
66 }

En este ejemplo, tenemos una clase Resource que representa un recurso compartido.
La clase Resource utiliza un semáforo binario (objeto Semaphore con un valor 1 del atri-
buto permit) para asegurar que sólo un hilo puede acceder al recurso a la vez. El método
useResource() representa la sección crítica donde se accede y utiliza el recurso comparti-
do mediante mutex. La clase MyThread extiende Thread y toma un objeto Resource como
parámetro de su constructor. Cada hilo, cuando se inicia, invoca el método useResource()
del objeto Resource.
En el método main(), creamos dos hilos (hilo1 e hilo2) que comparten el mismo obje-
to Resource. Cuando los hilos se inician, intentarán adquirir el semáforo (mutex) usando
mutex.acquire(). Sólo un hilo adquirirá con éxito el semáforo, entrará en la sección críti-
ca para utilizar el recurso compartido. El otro hilo se bloqueará hasta que el semáforo sea
liberado con mutex.release().
Los semáforos de conteo pueden tener un valor inicial arbitrario mayor o igual que cero (en
el caso de Java, un valor mayor o igual que cero del atributo permit de un objeto Semaphore).
Se utilizan para controlar el acceso a un número finito de recursos idénticos. Cada vez que se
utiliza un recurso, la cuenta del semáforo disminuye. Si la cuenta llega a cero, indicando que
todos los recursos están actualmente en uso, cualquier hilo o proceso que intente adquirir
un recurso será bloqueado hasta que un recurso esté disponible (y el valor del atributo del
semáforo aumente con ello).

10
Es importante tener en cuenta que el uso adecuado y un diseño cuidadoso son claves
cuando se trabaja con semáforos, para evitar problemas como el abrazo mortal (donde los
hilos o procesos están permanentemente bloqueados) o la inanición (donde un hilo o proceso
no tiene nunca la oportunidad de adquirir un semáforo).
La gestión de procesos es un componente clave de los sistemas operativos modernos
que permite que varios programas se ejecuten simultáneamente en un ordenador. Los proce-
sos tienen diferentes estados, y los algoritmos de programación determinan qué proceso se
ejecutará a continuación. Los mecanismos de comunicación entre procesos (IPC) y la sincro-
nización son necesarias para que los procesos se comuniquen y coordinen sus actividades.
El código siguiente ilustra la comunicación entre procesos. Un proceso cliente establece una
conexión con un proceso servidor utilizando sockets. El cliente envía un mensaje de solicitud
al servidor, y el servidor recibe y procesa esa solicitud. A continuación, el servidor prepara un
mensaje de respuesta y lo devuelve al cliente. Finalmente, el cliente recibe la respuesta y la
imprime.
Tanto el proceso cliente como el proceso servidor se ejecutan en clases Java separadas.
La clase ServerProcess a continuación modela el comportamiento del proceso servidor:

1 import java.io.*;
2 import java.net.*;
3
4 class ServerProcess {
5 public static void main(String[] args) {
6 try {
7 // Crear un objeto Socket de servidor
8 ServerSocket serverSocket = new ServerSocket(8000);
9
10 System.out.println("El servidor está a la escucha de conexiones...");
11
12 while (true) {
13 // Aceptar una conexión de cliente
14 Socket clientSocket = serverSocket.accept();
15 System.out.println("Conexión aceptada de: "
16 + clientSocket.getInetAddress());
17
18 // Obtener el flujo de entrada del socket
19 InputStream inputStream = clientSocket.getInputStream();
20 BufferedReader in =
21 new BufferedReader(new InputStreamReader(inputStream));
22
23 // Recibir la solicitud del cliente
24 String request = in.readLine();
25 System.out.println("Solicitud recibida del cliente: " + request);
26
27 // Obtener el flujo de salida del Socket
28 OutputStream outputStream = clientSocket.getOutputStream();
29 PrintWriter out = new PrintWriter(outputStream, true);
30

31 // Procesar la solicitud y preparar la respuesta


32 String response = "¡Hola, cliente! Gracias por tu solicitud.";
33
34 // Enviar la respuesta al cliente
35 out.println(response);
36
37 // Cerrar la conexión con el cliente

11
38 clientSocket.close();
39
40 // Cerrar la conexión
41 serverSocket.close();
42 }
43 } catch (IOException e) {
44 e.printStackTrace();
45 }
46 }
47 }

A continuación, la clase ClientProcess modela el comportamiento del proceso cliente:

1 import java.io.*;
2 import java.net.*;
3
4 class ClientProcess {
5 public static void main(String[] args) {
6 try {
7 // Crea un objeto Socket
8 Socket clientSocket = new Socket("localhost", 8000);
9
10 // Obtener el flujo de salida del Socket
11 OutputStream outputStream = clientSocket.getOutputStream();
12 PrintWriter out =
13 new PrintWriter(outputStream, true);
14
15 // Enviar una solicitud al servidor
16 String request = "¡Hola servidor!";
17 out.println(request);
18
19 // Obtener el flujo de entrada del Socket
20 InputStream inputStream = clientSocket.getInputStream();
21 BufferedReader in =
22 new BufferedReader(new InputStreamReader(inputStream));
23
24 // Recibir la respuesta del servidor
25 String response = in.readLine();
26 System.out.println("Respuesta del servidor: " + response);
27
28 // Cerrar la conexión
29 clientSocket.close();
30 } catch (IOException e) {
31 e.printStackTrace();
32 }
33 }
34 }

En este escenario de comunicación cliente-servidor, los procesos necesitan comunicarse


para realizar tareas como la recuperación de datos, la ejecución de comandos o el intercam-
bio de información. El proceso cliente inicia la comunicación enviando una petición, y el pro-
ceso servidor responde a esa petición con la respuesta adecuada. Este tipo de comunicación
permite la computación distribuida, en la que diferentes procesos o sistemas trabajan juntos
para lograr un objetivo común.

12
Figura 4: Jerarquía de memoria.

El ejemplo de código Java anterior utiliza las clases Socket y ServerSocket para ma-
nejar la comunicación a través de una red TCP/IP. Un socket (Stevens, 1994) es un punto
de conexión software que permite a los procesos comunicarse entre sí a través de una red.
Sirve de interfaz para la comunicación en red, permitiendo el intercambio de datos entre apli-
caciones que se ejecutan en máquinas diferentes. Los sockets se identifican mediante una
dirección IP y un número de puerto. La dirección IP especifica la interfaz de red del ordenador
en el que se producirá la comunicación, y el número de puerto identifica la aplicación o servi-
cio específico que se ejecuta en esa máquina. Juntos, la dirección IP y el número de puerto
crean un punto de conexión único para el socket. Los sockets permiten que los procesos
establezcan conexiones, envíen y reciban datos, y cierren las conexiones cuando finaliza la
comunicación. Proporcionan un mecanismo flexible y estandarizado para la comunicación
en red, permitiendo que las aplicaciones se comuniquen sin problemas, incluso a través de
diferentes máquinas y plataformas. La interfaz de socket suele proporcionarla el sistema
operativo.

3. Gestión de memoria

En los sistemas informáticos modernos, la memoria se organiza de manera jerárquica,


desde una memoria caché conectada directamente al procesador o a cada núcleo en siste-
mas multinúcleo, incluso en el mismo chip, hasta la memoria principal. Entre ambos (el caché
de nivel 1 y la memoria principal) pueden existir uno o varios niveles adicionales de memoria
caché. La gestión de la memoria es el proceso de asignación y gestión de los recursos de
memoria en un sistema informático.
En general, el almacenamiento de un ordenador se organiza en una jerarquía de diferentes
niveles, desde el más pequeño y rápido hasta el más grande y lento (cf. Fig. 4):

13
Los registros son unidades de almacenamiento rápidas y de tamaño limitado dentro del
procesador (entre 8 y 64 registros de propósito general en los procesadores actuales) a los
que se puede acceder muy rápidamente. Normalmente, la anchura (es decir, el número de
bits) de cada registro depende de la arquitectura del procesador. Por ejemplo, una arquitec-
tura de 64 bits es capaz de procesar 64 bits de datos a la vez, y éste será el tamaño de los
registros de datos utilizados por ese procesador.
La memoria caché es una unidad de memoria rápida, de tamaño comparativamente pe-
queño, que se utiliza para almacenar instrucciones y datos a los que se accede con frecuen-
cia. Existen diferentes niveles de memoria caché, normalmente denominados cachés de nivel
1, nivel 2 y nivel 3 (L1, L2 y L3):
La caché L1 es la caché más cercana al procesador o núcleo y la más rápida (1 o 2
ciclos de reloj por acceso). Se divide en cachés separadas de instrucciones (L1i) y de
datos (L1d). El tamaño de la memoria caché L1 puede variar, pero suele oscilar entre 32
KB y 64 KB por núcleo para cada memoria caché (L1i y L1d).
La caché L2 es de mayor tamaño que la de nivel 1 y se encuentra entre la caché L1 y
la memoria principal. El tiempo de acceso varía entre 4 y 10 ciclos de reloj. Ayuda a
cerrar la brecha en los tiempos de acceso entre el procesador y la memoria principal. El
tamaño de la caché L2 puede oscilar entre unos pocos cientos de kilobytes (KB) y varios
megabytes (MB), siendo su tamaño típico entre 256 KB y 8 MB, según el procesador.
Algunos procesadores también incluyen un nivel adicional de caché conocido como
caché L3. La caché L3 es de mayor tamaño pero más lenta que la caché L2 (entre
10 y 30 ciclos de reloj por acceso). Sirve como un caché compartido entre múltiples
núcleos o un grupo de núcleos en un procesador. El tamaño de la memoria caché L3
puede variar significativamente, desde unos pocos megabytes (MB) hasta decenas de
megabytes (MB) o incluso alcanzar varios gigabytes (GB) en procesadores de servidor
de gama alta.
Es importante tener en cuenta que estos tamaños de caché son estimaciones generales
y pueden variar según el modelo, la arquitectura y la generación específicos del procesador.
Los tamaños de caché han aumentado con el tiempo a medida que los procesadores se
vuelven más avanzados, pero los tamaños exactos dependerán de las elecciones de diseño
específicas realizadas por el fabricante del procesador. Además, pueden existir otros tipos
de caché adicionales, como las cachés unificadas (que combinan instrucciones y datos) o
las cachés especializadas como por ejemplo los búferes de búsqueda de traducción (Trans-
lation Lookup Buffer, TLB), lo que afecta aún más el tamaño y la organización general de las
memorias caché.
Los tiempos de acceso a la caché son más rápidos que el acceso a datos en la memoria
principal debido a la proximidad de la caché al procesador y al uso de tecnologías de me-
moria más rápidas, como la SRAM (Static Random-Access Memory), en comparación con
la más lenta DRAM (Dynamic Random-Access Memory) utilizada en la memoria principal.
Estos tiempos de acceso a la caché desempeñan un papel fundamental en la mejora del ren-
dimiento global del sistema, ya que reducen la latencia de acceso a los datos e instrucciones
más utilizados. El objetivo de las cachés es almacenar un subconjunto de datos o instruccio-
nes a los que el procesador probablemente accederá en un futuro inmediato, minimizando
así la necesidad de acceder a los datos o instrucciones en la memoria principal, más lenta,
lo que contribuye a acelerar la ejecución de los programas.

14
Figura 5: Memoria virtual y paginación. En este ejemplo, el espacio de memoria virtual tiene 232 = 4GB y la
memoria física es de 228 = 256 MB. Cada página, tanto virtual como física, tiene 212 = 4 KB.

Los tiempos de acceso en el caso del almacenamiento secundario pueden variar en fun-
ción de diversos factores, como las características de rendimiento de cada unidad concreta,
la tecnología de interfaz (por ejemplo, SATA, NVMe) y el tamaño y la organización de los da-
tos a los que se accede. Además, los avances tecnológicos hacen que los tiempos de acceso
mejoren significativamente con el tiempo. En general, los discos de estad sólido (Solid-state
Disks, SSD) y las memorias flash proporcionan tiempos de acceso significativamente más
rápidos en comparación con los discos duros tradicionales, debido principalmente a la ausen-
cia de componentes mecánicos y al uso de almacenamiento en estado sólido. El resultado
es una recuperación de datos más rápida y una mayor capacidad de respuesta del sistema.
La memoria virtual es una técnica de gestión de memoria que permite al sistema opera-
tivo utilizar la memoria principal como si fuera más grande de lo que realmente es. Esto se
consigue creando un espacio de direcciones virtual para cada proceso, que puede ser mayor
que la cantidad de memoria física disponible. Para ello, la memoria virtual utiliza el espacio
de las memorias secundarias como una extensión de la memoria principal. Cuando un pro-
grama accede a la memoria, la unidad de gestión de memoria (Memory Management Unit,
MMU) del procesador traduce la dirección virtual a una dirección física.
La paginación es un esquema de gestión de memoria que divide la memoria física en blo-
ques de tamaño fijo denominados marcos o páginas físicas, y divide el espacio de direcciones
virtual en bloques de tamaño fijo denominados páginas (virtuales). La tabla de páginas con-
trola la correspondencia entre las páginas virtuales y los marcos físicos. Cuando un proceso
accede a una dirección virtual, la MMU traduce el número de página en un número de marco
utilizando la tabla de páginas, y añade un offset para obtener la dirección física. El offset co-
rresponde a los n bits menos significativos de la dirección física y la dirección virtual, por lo
que el tamaño de la página será de 2n palabras.
La traducción de direcciones es el proceso de asignación de direcciones virtuales a di-
recciones físicas. La MMU utiliza una tabla de páginas para realizar un seguimiento de las

15
asignaciones de direcciones virtuales a físicas (cf. Fig. 5). Una página es un bloque de me-
moria de tamaño fijo, y la tabla de páginas es una estructura de datos que asigna números de
páginas virtuales a números de páginas físicas. Cuando un programa accede a la memoria,
la MMU utiliza la tabla de páginas para traducir el número de página virtual en un número
de página física (e.g., 0xb5c34 a 0x1104 en Fig. 5), y añade un desplazamiento dentro de la
página para obtener la dirección física (e.g., 0x120 en Fig. 5).
La paginación tiene varias ventajas, entre ellas que proporciona protección de la memo-
ria. Cada página puede protegerse con sus propios permisos de acceso, evitando que los
procesos accedan a memoria a la que no deberían. Además, las páginas pueden intercam-
biarse entre la memoria principal y el almacenamiento secundario, lo que permite ejecutar
más programas de los que podría acoger la memoria física disponible. Finalmente, la me-
moria virtual facilita disponer de memoria compartida, ya que múltiples procesos pueden
compartir la misma página física, reduciendo la cantidad de memoria requerida por cada
proceso.
En definitiva, la gestión de memoria es el proceso de asignación y gestión de recursos de
memoria en un sistema informático. La memoria virtual es una técnica de gestión de memo-
ria que permite al sistema operativo utilizar la memoria principal como si fuera más grande
de lo que realmente es. La traducción de direcciones es el proceso de asignar direcciones
virtuales a direcciones físicas, y la paginación es un esquema de gestión de memoria que di-
vide la memoria física en bloques de tamaño fijo y divide el espacio de direcciones virtuales
en bloques de tamaño fijo.

4. Gestión de entrada y salida

Los sistemas de entrada/salida (E/S) son parte integrante de un sistema operativo, ya


que facilitan la comunicación entre el ordenador y sus periféricos. Los dispositivos de E/S
pueden incluir teclados, ratones, impresoras, unidades de disco y otros dispositivos.
Las operaciones de E/S se realizan normalmente mediante llamadas al sistema propor-
cionadas por el sistema operativo (cf. Fig. 6), de manera que el sistema operativo proporciona
una capa de abstracción que oculta los detalles específicos de cada periférico. Estas opera-
ciones pueden incluir la lectura y escritura de datos hacia y desde el dispositivo, así como el
control del propio dispositivo. Las operaciones se codifican de manera similar, independien-
temente de las características concretas de cada dispositivo, ocultando sus detalles físicos.
Los tiempos de acceso a la memoria son mucho más rápidos que la transferencia media
de E/S, en algunos casos varios órdenes de magnitud más rápidos. El almacenamiento en
búfer es una técnica utilizada por los sistemas de E/S para mejorar el rendimiento. En un sis-
tema de E/S con búfer, los datos se leen o escriben primero en un búfer de memoria antes de
ser transferidos hacia o desde el dispositivo. Esto permite al sistema operativo realizar otras
tareas mientras tiene lugar la operación de E/S, además de reducir el número de llamadas al
sistema necesarias para la operación.
Los controladores de dispositivos son componentes de software que proporcionan una
interfaz entre el sistema operativo y un dispositivo de E/S concreto. Los controladores de
dispositivo son responsables de traducir las peticiones del sistema operativo en comandos

16
Figura 6: Entrada/Salida y llamadas al sistema. El SO traduce las llamadas al sistema a una secuencia de instruc-
ciones, para interactuar con los dispositivos de E/S mor medio del controlador de dispositivo correspondiente.

que el dispositivo pueda entender, así como de gestionar cualquier error que pueda ocurrir
durante una operación de E/S.
Existen dos enfoques básicos para realizar operaciones de E/S, E/S asíncrona y E/S sín-
crona. En las operaciones de E/S síncronas, el sistema operativo espera a que la operación
de E/S se complete antes de permitir que un proceso continúe ejecutándose. Esto puede
llevar a un rendimiento general más lento, pero puede ser útil en situaciones en las que el
proceso depende de la finalización de la operación de E/S. Por otro lado, en las operaciones
de E/S asíncronas un proceso puede continuar ejecutándose mientras tiene lugar una opera-
ción de E/S. Esto puede resultar en un rendimiento global más rápido, pero requiere técnicas
de programación más complejas.
El código Java siguiente ilustra la realización de una operación de E/S síncrona.

1 import java.io.BufferedReader;
2 import java.io.FileReader;
3 import java.io.IOException;
4
5 public class SynchronousIOExample {
6 public static void main(String[] args) {
7 try {
8 BufferedReader reader =
9 new BufferedReader(new FileReader("input.txt"));
10 String line;
11 while ((line = reader.readLine()) != null) {
12 System.out.println(line);
13 }
14 reader.close();
15 } catch (IOException e) {
16 e.printStackTrace();
17 }

17
18 }
19 }

En este ejemplo, utilizamos BufferedReader para leer líneas de un fichero de forma


sincrónica. El programa lee cada línea del fichero y la imprime en la consola. El método
readLine() se bloquea hasta que se lee una línea o se llega al final del fichero.
A continuación ilustramos la E/S asíncrona con el código Java siguiente:

1 import java.io.IOException;
2 import java.nio.ByteBuffer;
3 import java.nio.channels.AsynchronousFileChannel;
4 import java.nio.channels.CompletionHandler;
5 import java.nio.file.Path;
6 import java.nio.file.StandardOpenOption;
7
8 public class AsynchronousIOExample {
9 public static void main(String[] args) {
10 try {
11
12 // Abrimos un canal asíncrono en modo lectura para el fichero
13 // de ejemplo (input.txt)
14 Path path = Path.of("input.txt");
15 AsynchronousFileChannel channel =
16 AsynchronousFileChannel.open(path, StandardOpenOption.READ);
17
18 // Creamos un buffer para leer la información del fichero
19
20 ByteBuffer buffer = ByteBuffer.allocate(1024);
21
22 // Leemos del canal asíncrono una secuencia de bytes
23 // en el buffer dado, comenzando en la posición de archivo dada
24 // (0 = desde el principio).
25 //
26 // Los métodos completed y failed son el manejador o gestor de
27 // finalización. Cuando la lectura acaba, se ejecuta uno de estos
28 // métodos, a modo de función de callback. Si todo fue bien, se
29 // ejecuta ’completed’. Si la transferencia finalizó por un error
30 // se ejecuta ’failed’. Este último método recibe como parámetro
31 // la excepción que se lanzó como consecuencia del error.
32 channel.read(buffer, 0, buffer,
33 new CompletionHandler<Integer, ByteBuffer>() {
34 // Callback para finalización correcta de la lectura.
35 public void completed(Integer result, ByteBuffer attachment) {
36 // Imprimimos los datos leídos del fichero
37 attachment.flip();
38 byte[] data = new byte[attachment.remaining()];
39 attachment.get(data);
40 String content = new String(data);
41 System.out.println(content);
42 attachment.clear();
43 // y cerramos el canal
44 try {
45 channel.close();
46 } catch (IOException e) {
47 e.printStackTrace();
48 }

18
49 }
50
51 // Callback para finalización por error de la lectura
52 public void failed(Throwable exc, ByteBuffer attachment) {
53 // Imprimimos la excepción que provocó el fallo de la
54 // transferencia asíncrona.
55 exc.printStackTrace();
56 // y cerramos el canal.
57 try {
58 channel.close();
59 } catch (IOException e) {
60 e.printStackTrace();
61 }
62 }
63 });
64 } catch (IOException e) {
65 e.printStackTrace();
66 }
67 }
68 }

En este ejemplo, utilizamos AsynchronousFileChannel para leer un archivo de forma


asíncrona. El método read() es no-bloqueante y retorna inmediatamente, permitiendo al
programa continuar la ejecución. Proporcionamos un objeto CompletionHandler que será
llamado cuando la operación de lectura se complete. El contenido del fichero se imprime en
la consola.
Como podemos ver en los ejemplos anteriores, en un sistema informático típico, cuando
un dispositivo de hardware necesita transferir datos hacia o desde la memoria, como normal
general se requiere la intervención del procesador. El procesador iniciaría la transferencia
de datos, leería o escribiría los datos hacia/desde el dispositivo y gestionaría el proceso de
transferencia de información. Este método consume recursos y dar lugar a transferencias de
datos más lentas.
El acceso directo a memoria resuelve este problema descargando al procesador de las
tareas necesarias para la transferencia de datos. Permite al dispositivo periférico acceder
directamente a la memoria del sistema y transferir datos sin necesidad de que intervenga
constantemente el procesador (cf. Fig. 7). Con DMA, el procesador configura la transferencia
de datos especificando las direcciones de origen y destino y el número de palabras a transfe-
rir. Después de la configuración inicial, el dispositivo de hardware toma el control y realiza la
transferencia de datos directamente desde o hacia la memoria, robando ciclos de memoria
al procesador.
Entre las ventajas del DMA, podemos citar la reducción de la sobrecarga del procesador.
Al permitir que los dispositivos accedan directamente a la memoria, el DMA reduce la car-
ga del procesador y lo libera para realizar otras tareas. Esto mejora el rendimiento general
del sistema y su capacidad de respuesta. Además, las transferencias de datos son más rá-
pidas. Dado que las transferencias de datos se producen directamente entre el periférico y
la memoria, se pueden alcanzar velocidades de transferencia más rápidas en comparación
con las transferencias tradicionales controladas por el procesador. El DMA mejora facilita la
planificación multitarea, ya que permite la transferencia concurrente de datos entre varios
dispositivos, desde varios procesos, y la memoria, lo que hace más eficiente la multitarea.

19
Figura 7: Acceso Directo a Memoria.

El DMA es especialmente útil en situaciones en las que es necesario transferir grandes


cantidades de datos entre dispositivos y memoria, como operaciones de E/S de disco, co-
municación en red o procesamiento de información audiovisual.

5. Sistemas de ficheros

Un sistema de ficheros es un método de almacenamiento y organización de archivos


informáticos que facilita el acceso y la recuperación de la información. En un sistema de
ficheros, un archivo o fichero es una representación abstracta de datos que se almacena en
un disco u otro medio de almacenamiento. En otras palabras, un archivo es una colección
de información relacionada que se guarda en un dispositivo de almacenamiento secundario
(cf. Sect. 3). Un archivo tiene un nombre, un tipo y un conjunto de atributos que describen las
propiedades del archivo, como su tamaño, la fecha de creación y los permisos o política de
acceso a la información almacenada en el mismo.
Los atributos de archivo son las características de un archivo que utiliza el sistema ope-
rativo para gestionarlo. Algunos atributos comunes incluyen:
Tamaño El tamaño del archivo, generalmente medido en bytes.
Permisos Los derechos de acceso que determinan quién puede leer, escribir y ejecutar el
archivo.
Fecha de creación Fecha y hora de creación del fichero.
Fecha de modificación Fecha y hora de la última modificación del contenido del fichero.
Propietario El usuario o grupo al que pertenece el fichero.
Los permisos de un archivo son un aspecto esencial del control de acceso en los sistemas
operativos, ya que garantizan que sólo los usuarios autorizados puedan acceder y modificar

20
los archivos. Gestionar correctamente los permisos de los archivos ayuda a mantener la con-
fidencialidad, integridad y seguridad de los datos dentro de un sistema.
El sistema común de permisos de archivos se basa en el concepto de listas de control
de acceso (Access Control Lists, ACL) o modos de permiso, que en la mayorías de los casos
incluyen cuatro categorías de permisos:
Lectura Concede la capacidad de leer el contenido de un archivo o ver el contenido del di-
rectorio.
Escritura Concede la capacidad de modificar o escribir en un archivo, o crear, borrar o re-
nombrar archivos dentro de un directorio.
Ejecución Concede la capacidad de ejecutar o correr un programa almacenado en un archivo
o acceder a un directorio y a su contenido.
Control total Concede todos los permisos, incluida la posibilidad de cambiar los permisos y
asumir la propiedad de un archivo o carpeta.
En el caso de sistemas operativos basados en el SO Unix, están presentes las tres pri-
meras categorías. Microsoft Windows añade además la categoría de conceder control total
sobre un archivo o carpeta.
Los permisos se gestionan normalmente a nivel del sistema de archivos, y cada archivo
tiene un conjunto de permisos asociados. Cuando se crea un archivo, el sistema operativo
asigna permisos por defecto basados en la configuración del sistema o en los permisos he-
redados del directorio en el cual está almacenado el archivo.
Por norma general, los permisos de los ficheros están asociados un tipo de entidad:
Usuario Un usuario registrado en el sistema. En el caso de sistemas basados en Unix, se
trata del usuario propietario del fichero. El propietario tiene el nivel más alto de con-
trol y puede modificar los permisos, cambiar la propiedad y realizar todas las acciones
permitidas por la configuración de permisos. En Microsoft Windows es posible asignar
permisos a otros usuarios individuales por parte del administrador del sistema.
Grupo Un grupo es un conjunto de usuarios. Los archivos pueden asignarse a un grupo es-
pecífico, y los permisos de grupo determinan el nivel de acceso de los miembros del
grupo. En general, los sistemas operativos suelen incluir grupos predefinidos (adminis-
tradores, usuarios en determinado dominio de red, etc.) o la capacidad de definir roles
(cf. Sect. 6) para controlar el acceso a ficheros y otros recursos.
Otros Cualquier usuario que no sea el propietario o miembro del grupo entra en la categoría
otros. Estos permisos definen el nivel de acceso para todos los usuarios restantes.
En los sistemas operativos basados en Unix, la configuración de permisos para cada en-
tidad (propietario, grupo, otros) se representa mediante una combinación de los indicadores
de lectura (r), escritura (w) y ejecución (x). La configuración de permisos suele mostrarse co-
mo una serie de símbolos o números octales, como rw-r--r-- / 644 or rwxr-x--- / 750,
respectivamente.
Un directorio o carpeta es un archivo especial que contiene una lista de otros archivos y
directorios. Las estructuras de directorios se utilizan para organizar archivos en una estruc-
tura jerárquica en forma de árbol (cf. Fig. 8). En otras palabras, un directorio es un contenedor
de archivos y otros directorios. El directorio de nivel superior se conoce como directorio raíz,
y todos los demás directorios se encuentran dentro del directorio raíz o de sus subdirecto-
rios. En algunos sistemas operativo, como por ejempño Microsoft Windows, las estructuras
de directorios se organizan en unidades de disco, que pueden representar unidades físicas

21
Figura 8: Estructura de directorios típica de los sistemas operativos basados en Unix.

de almacenamiento secundario o unidades virtuales (unidades de disco de red, cuentas de


almacenamiento en la nube, dispositivos IoT, etc.).
Las operaciones con archivos incluyen crear, abrir, leer, escribir y borrar archivos. Al tra-
tarse en definitiva de operaciones de E/S (cf. Sect. 4), estas operaciones suelen realizarse
mediante las llamadas al sistema proporcionadas por el sistema operativo. Cuando se abre
un archivo, el sistema operativo crea un descriptor de archivo que se utiliza para representar
el archivo en la memoria. Los descriptores de fichero se utilizan para realizar operaciones en
el fichero, como leer y escribir datos.
Los métodos de asignación de archivos determinan cómo se almacenan los archivos en
un disco u otro medio de almacenamiento secundario. En los sistemas operativos modernos,
existen dos métodos comunes de asignación de archivos:
La asignación enlazada, donde los archivos se almacenan como una lista enlazada de
bloques en el disco. Este método es flexible y facilita el crecimiento de los archivos,
pero puede provocar tiempos de acceso más lentos y espacio desaprovechado.
La asignación indexada, mediante la cual los ficheros se almacenan utilizando un blo-
que índice que contiene punteros a los bloques que componen el fichero. Este método
es eficaz para acceder a archivos grandes, pero puede suponer un desperdicio de es-
pacio para archivos pequeños.
Un ejemplo de sistema operativo que utiliza la asignación enlazada para almacenar archi-
vos en disco es el Sistema de Archivos Unix (Unix File System, UFS), comúnmente utilizado
en sistemas operativos tipo Unix. Los archivos se almacenan como una lista enlazada de
bloques en el disco, donde cada archivo se divide en bloques de tamaño fijo, normalmente
denominados bloques de disco o sectores. No es necesario que los bloques sean contiguos,
sino que se enlazan mediante punteros para formar una cadena.
Supongamos que tenemos un archivo que necesita ser almacenado en el disco. El siste-
ma de ficheros asigna un bloque de disco, llamémoslo Bloque A, para almacenar la primera

22
Figura 9: Ejemplo de asignación enlazada. El archivo archivo.txt utiliza los bloques de disco 124, 505, 412,
703. Cada bloque incluye, además de otra información y los datos del archivo, una referencia al bloque siguiente.

parte del fichero. Si el tamaño del fichero supera el tamaño de un único bloque de disco, se
asignan bloques adicionales. El Bloque A tendrá un puntero al siguiente bloque, llamémosle
Bloque B, contendrá la siguiente parte del archivo y un puntero al siguiente bloque, el Bloque
C. Este proceso continúa hasta que se almacena todo el archivo, y el último bloque de la lista
enlazada tendrá un puntero nulo que indica el final del archivo (cf. Fig. 9). Al leer el fichero, el
sistema operativo comienza en el primer bloque y sigue la lista enlazada de bloques hasta
llegar al final del fichero.
Un ejemplo de sistema operativo que utiliza la asignación indexada para almacenar ar-
chivos en el disco es el sistema de archivos FAT (File Allocation Table). FAT se ha utiliza-
do ampliamente en varios sistemas operativos, incluidas versiones anteriores de Microsoft
Windows como Windows 95, Windows 98 y Windows ME. Todavía se utiliza hoy día para
garantizar compatibilidad en dispositivos de almacenamiento como pendrives o tarjetas de
memoria. En la asignación indexada, se utiliza un bloque de índice independiente, denomina-
do tabla de asignación o tabla de índices, para realizar un seguimiento de los bloques asig-
nados a un archivo. Cada archivo tiene su propio bloque de índice, que contiene entradas
correspondientes a los bloques de disco que componen el archivo.
El sistema de archivos FAT asigna un bloque de índice para cada fichero y lo asocia con el
mismo. Este bloque de índice contiene entradas para almacenar los números de bloque de
disco donde se almacenan los datos del archivo. Cuando se escriben datos en el archivo, el
sistema de archivos asigna bloques de disco y actualiza el bloque de índice con los números
de bloque correspondientes. Por ejemplo, el bloque índice puede tener entradas que apunten
al Bloque 1, Bloque 4, Bloque 7, etc. (cf. Fig. 10). Para leer el archivo, el sistema operativo
recupera el bloque índice y utiliza las entradas para localizar los bloques que contienen los
datos del archivo.
En conclusión, un sistema de archivos es un método para almacenar y organizar archivos
informáticos, y los archivos tienen un nombre, un tipo y un conjunto de atributos que descri-

23
Figura 10: Ejemplo de asignación indexada. En este caso, la lista de bloques de archivos se almacena en una
tabla (Tabla de Asignación de Ficheros, File Allocation Table, FAT). En su implementación más sencilla, hay una
entrada en la FAT para cada bloque del disco.

ben sus propiedades. Se utiliza una estructura de directorios para organizar los archivos en
una estructura jerárquica en forma de árbol, y las operaciones de archivo incluyen la creación,
apertura, lectura, escritura y eliminación de archivos. Por último, los métodos de asignación
de archivos determinan cómo se almacenan en un disco u otro medio de almacenamiento.

6. Seguridad y protección

La seguridad y la protección de datos son componentes esenciales de un sistema operati-


vo, ya que se encargan de proteger el sistema y sus recursos frente a accesos no autorizados,
modificaciones no deseadas y el borrado o la destrucción de información. Los sistemas ope-
rativos emplean diversos mecanismos de seguridad para ofrecer protección frente a posibles
amenazas, que pueden proceder de diversas fuentes, como virus, programas maliciosos, pi-
ratas informáticos y usuarios no autorizados. Los mecanismos de seguridad más comunes
en un sistema operativo son los cortafuegos, el software antivirus, el cifrado y el control de
acceso.
Los cortafuegos son módulos de software o una mezcla de elementos de hardware y soft-
ware utilizados para supervisar y controlar el tráfico de red. Los cortafuegos pueden utilizarse
para impedir el acceso no autorizado a un sistema y bloquear el tráfico malicioso de ame-
nazas conocidas. Por otro lado, el software antivirus está diseñado para detectar, prevenir y
eliminar malware. Un antivirus escanea archivos y programas en busca de firmas de malware
conocidas, y también supervisa la actividad del sistema en busca de comportamientos sos-
pechosos. Para ser eficaces, los programas antivirus necesitan una actualización continua
de las firmas de malware para hacer frente a las nuevas amenazas.

24
El cifrado es una técnica para proteger los datos codificándolos de tal manera que só-
lo las entidades autorizadas puedan descifrarlos. El cifrado puede utilizarse para proteger
datos tanto en reposo (es decir, almacenados en un disco duro) como en tránsito (es decir,
transmitidos a través de una red). Cuando se cifra un archivo, su contenido se transforma en
texto cifrado, que aparece como una forma codificada o ininteligible de los datos originales.
El cifrado garantiza que, aunque el archivo cifrado caiga en malas manos o sea interceptado
durante la transmisión, los datos sigan siendo inaccesibles sin la clave de descifrado adecua-
da. Los algoritmos de cifrado pueden utilizar el cifrado de clave simétrica (Schneier, 1995), en
el que se utiliza la misma clave tanto para el cifrado como para el descifrado, o el cifrado de
clave asimétrica (Trappe y Washington, 2014), que implica un par de claves: una clave pública
para el cifrado y una clave privada para el descifrado.
Para cifrar un archivo, el algoritmo de cifrado toma el archivo original como entrada junto
con la clave de cifrado, y realiza una serie de operaciones matemáticas para generar el texto
cifrado. El archivo cifrado resultante sólo puede descifrarse a su forma original utilizando la
clave de descifrado correspondiente. Con el cifrado de clave asimétrica, cualquiera puede
cifrar un archivo (utilizando la clave pública del destinatario), pero sólo el destinatario puede
descifrarlo (utilizando su clave privada).
Los mecanismos de control de acceso se utilizan para controlar el acceso a los recursos
del sistema. Pueden utilizarse para restringir el acceso a determinados archivos, carpetas o
aplicaciones (véase la sección 5), y también para limitar las acciones que los usuarios pueden
realizar con estos recursos.
Las listas de control de acceso (access control lists, ACL) y el control de acceso basado
en roles (role-based access contro, RBAC) son dos mecanismos comunes utilizados para
la autorización. Las ACL permiten a los administradores especificar qué usuarios o grupos
tienen acceso a recursos específicos, mientras que RBAC asigna permisos en función del rol
o las funciones asignadas a un usuario dentro de la organización.
Por ejemplo, MS Windows implementa un mecanismo RBAC. El control de acceso se
basa en funciones y no en usuarios individuales. A los usuarios se les asignan roles, y a
los roles se les conceden permisos o privilegios específicos. Esto permite un enfoque más
centralizado y flexible del control de acceso. Con RBAC, se identifican los diferentes roles
dentro del sistema. Por ejemplo, las funciones podrían ser administrador, usuario e invitado.
A cada usuario individual se le asignaría un rol específico. Por ejemplo, al usuario Alice se le
puede asignar el rol administrador, mientras que a Bob se le asigna el rol usuario.
Cada función tiene permisos o privilegios asociados. Por ejemplo, el rol de administra-
dor puede tener la capacidad de modificar la configuración del sistema, instalar software y
gestionar cuentas de usuario, mientras que el rol de usuario puede tener permisos más res-
tringidos. El sistema aplica un control de acceso basado en los roles asignados. Cuando un
usuario intenta realizar una acción o acceder a un recurso, el sistema comprueba el rol del
usuario y verifica si el rol tiene los permisos necesarios para realizar la acción solicitada.
RBAC ofrece varias ventajas, como una administración simplificada, una mayor seguridad
y una mejor separación de roles. Permite una gestión más sencilla de los permisos y reduce
el riesgo de conceder privilegios innecesarios a usuarios individuales.
La autenticación y la autorización también son componentes importantes de la seguridad
y la protección. La autenticación es el proceso de verificar la identidad de un usuario, mientras

25
Figura 11: Modelos de virtualización. (a) Virtualización completa. (b) Para-virtualización, donde el sistema ope-
rativo huésped está embebido con el hipervisor. (c) Contenedorización.

que la autorización es el proceso de conceder o denegar el acceso a un recurso basándose


en la identidad y los permisos de un usuario.

7. Virtualización

La virtualización es el proceso de crear una versión virtual de algo, como una máquina
virtual (VM), un almacenamiento virtual o una red virtual. En el contexto de los sistemas ope-
rativos, la virtualización se refiere a la creación de múltiples máquinas virtuales en un único
ordenador físico, en el que cada máquina virtual ejecuta su propio sistema operativo.
Existen dos tipos principales de virtualización: la virtualización y la contenedorización.
Dentro de la virtualización, podemos distinguir entre virtualización completa y para-virtualización.
En la virtualización completa, la máquina virtual está completamente aislada de la máquina
física, sin que el sistema operativo virtual sepa que en realidad se está ejecutando en un en-
torno virtual. Esto permite ejecutar una amplia gama de sistemas operativos en el mismo
hardware físico y facilita la migración de máquinas virtuales entre distintos ordenadores fí-
sicos. Esto proporciona una forma muy flexible y eficaz de consolidar las cargas de trabajo,
optimizar la utilización de los recursos y mejorar la escalabilidad y la gestión de los servido-
res.
Los hipervisores son el instrumento más popular para implantar la virtualización (cf. Fig.
11). El hipervisor es una aplicación software que crea una capa de virtualización para permitir
que varios sistemas operativos invitados (como Windows, Linux, etc.) se ejecuten en un único
servidor físico. En el caso de la virtualización completa, los sistemas operativos invitados no
son conscientes de que se están ejecutando en un entorno virtualizado, y funcionan como si
se estuvieran ejecutando directamente en el hardware físico.

26
Para ejecutar sistemas operativos virtualizados mediante un hipervisor, primero instala-
ríamos el hipervisor directamente en el hardware del servidor físico. El hipervisor será el soft-
ware responsable de gestionar y asignar los recursos físicos del servidor. Mediante la interfaz
de gestión del hipervisor, se crean máquinas virtuales, cada una de las cuales representa una
instancia independiente del sistema operativo huésped. A las VMs se les asignan recursos
de hardware virtuales, incluyendo procesadores virtuales, memoria, almacenamiento e inter-
faces de red.
En cada máquina virtual se instala el sistema operativo huésped deseado. El hipervisor
intercepta y virtualiza las instrucciones enviadas por los sistemas operativos huésped al hard-
ware físico. Proporciona una capa de abstracción que traduce las instrucciones virtualizadas
a las llamadas apropiadas al hardware físico subyacente. El hipervisor gestiona dinámica-
mente la asignación de recursos físicos a las máquinas virtuales en función de sus nece-
sidades y de la disponibilidad de recursos. Garantiza un reparto equitativo de los recursos
y también puede implementar funciones como la priorización de recursos, el equilibrio de
carga y la alta disponibilidad.
Cada máquina virtual está aislada de otras máquinas virtuales que se ejecutan en el mis-
mo servidor. Este aislamiento impide que una máquina virtual afecte a la estabilidad o segu-
ridad de otra. Además, se pueden utilizar funciones de seguridad como el arranque seguro o
módulos de plataforma segura (Trusted Platform Module, TPM) virtualizados (Tough y Ngu-
yen, 2011) para mejorar la seguridad de las máquinas virtuales.
La paravirtualización, por su parte, requiere modificaciones en el sistema operativo hués-
ped para que pueda ejecutarse en un entorno virtual. Esto puede mejorar el rendimiento, ya
que el sistema operativo huésped es consciente de que se está ejecutando en un entorno
virtual y puede realizar optimizaciones en consecuencia. Los sistemas operativos huésped
modificados tienen acceso directo al hipervisor y pueden realizar hiperllamadas para opera-
ciones privilegiadas. Esto reduce la necesidad de emular las instrucciones privilegiadas, lo
que consume mucho tiempo y recursos.
En general, la virtualización ofrece una serie de ventajas, entre ellas se consigue una me-
jor utilización del hardware, ya que permite ejecutar varias máquinas virtuales en una única
máquina física, lo que a su vez facilita una mejor utilización de los recursos de hardware y
una reducción de los costes. Además, las máquinas virtuales se pueden migrar fácilmente
entre máquinas físicas, lo que facilita su ampliación o reducción en función de la demanda,
aportando flexibilidad. Como las máquinas virtuales pueden aislarse entre sí, se proporcio-
na una capa adicional de seguridad para las aplicaciones y los datos críticos. Finalmente, la
virtualización da soporte a la gestión centralizada de las máquinas virtuales, lo que facilita
el despliegue y la gestión de múltiples sistemas operativos y aplicaciones, simplificando la
propia gestión.
Actualmente, la solución de virtualización más popular es VMware, ampliamente utilizada
en entornos empresariales para la virtualización de servidores. En cuanto a las plataformas
de paravirtualización, una de las más populares es Xen, un hipervisor de código abierto que
admite paravirtualización. Otras plataformas de virtualización destacadas son Hyper-V de
Microsoft, KVM de Linux y VirtualBox de Oracle, mientras que otras plataformas de para-
virtualización incluyen KVM con extensiones de paravirtualización y Parallels Desktop para
macOS.
Los contenedores son una forma de virtualización ligera que permite ejecutar aplicacio-
nes en entornos aislados. La contenedorización es el proceso de creación y gestión de estos

27
contenedores. Los contenedores proporcionan un entorno autocontenido y fácil de trasladar
para que las aplicaciones se ejecuten, garantizando que tengan todas las dependencias y
recursos necesarios para funcionar correctamente. Básicamente, un contenedor encapsula
determinada aplicación y sus dependencias en un único paquete, que incluye las bibliotecas,
los módulos ejecutables y los archivos de configuración necesarios para que la aplicación se
ejecute correctamente.
La contenedorización se basa en motores de contenedores, que proporcionan las herra-
mientas necesarias para crear, desplegar y gestionar contenedores. Estos contenedores se
pueden replicar, mover y escalar fácilmente en diferentes sistemas informáticos, lo que los
hace altamente portátiles y eficientes. En la actualidad, Docker es el motor de contenedores
más popular.
Una de las principales ventajas de los contenedores es su ligereza. A diferencia de las
máquinas virtuales tradicionales, que requieren un sistema operativo independiente para ca-
da instancia, los contenedores comparten el núcleo del sistema operativo anfitrión, lo que se
traduce en una menor sobrecarga de recursos y tiempos de arranque más rápidos. Esto hace
que los contenedores sean ideales para desplegar y escalar aplicaciones en una variedad de
escenarios, como arquitecturas de microservicios o entornos de computación en la nube.

8. Sistemas operativos distribuidos y computación en la nu-


be

Un sistema operativo distribuido es un sistema operativo que se ejecuta en varios orde-


nadores y les permite trabajar juntos como un único sistema informático. Permite compartir
recursos, información y servicios en una red de ordenadores interconectados, a la vez que
ofrecer transparencia a usuarios y aplicaciones, ocultando las complejidades de la infraes-
tructura distribuida subyacente. Esto incluye transparencia en términos de acceso a recursos,
localización de recursos y mecanismos de comunicación. Los sistemas operativos distribui-
dos pueden soportar una combinación de diferentes plataformas hardware y software, per-
mitiendo que máquinas con diferentes arquitecturas y sistemas operativos colaboren en el
entorno distribuido.
De hecho, uno de los principales objetivos de un sistema operativo distribuido es com-
partir eficazmente los recursos. Permite a múltiples usuarios y aplicaciones acceder y utili-
zar recursos compartidos como archivos, impresoras, almacenamiento y potencia de cálculo
distribuidos por la red. Los sistemas operativos distribuidos proporcionan mecanismos de
comunicación y coordinación entre diferentes procesos o componentes que se ejecutan en
diferentes máquinas. Esto incluye la comunicación entre procesos (IPC), con mecanismos
como las llamadas a procedimientos remotos (RPC), el paso de mensajes y otros mecanis-
mos de sincronización, para garantizar una ejecución ordenada y la coherencia de los datos.
Las llamadas a procedimientos remotos (Remote Procedure Calls RPC) son un mecanismo
que permite a un proceso invocar un procedimiento o función que se está ejecutando en otro
ordenador como si fuera una llamada a un procedimiento local. Proporciona una abstracción
de alto nivel para la comunicación entre procesos. El paso de mensajes consiste en enviar y
recibir mensajes entre procesos, dentro de una misma máquina o en ordenadores diferentes
conectados a una red. Los mensajes pueden enviarse de forma sincrónica (bloqueándose

28
hasta que el destinatario recibe el mensaje) o asincrónica (sin bloquearse). Los sockets (cf.
Sect. 2), son un mecanismo IPC en red que permite a los procesos que se ejecutan en diferen-
tes máquinas comunicarse a través de una red, para intercambiarse mensajes. Proporcionan
una forma flexible y estandarizada de intercambiar datos a través de la red.
De todos modos, los sistemas distribuidos son propensos a los fallos, ya sean estos fallos
de hardware, problemas de red o errores de software. En consecuencia, un sistema opera-
tivo distribuido incorpora mecanismos de tolerancia a fallos como redundancia, replicación
y técnicas de detección y recuperación de errores para garantizar una alta disponibilidad y
fiabilidad.
Los sistemas operativos distribuidos están diseñados para escalar horizontalmente aña-
diendo más máquinas a la red. Pueden gestionar cargas de trabajo crecientes distribuyendo
las tareas entre varios ordenadores, mejorando así el rendimiento y adaptándose a demandas
crecientes de cómputo o almacenamiento. Los sistemas operativos distribuidos emplean
técnicas de equilibrio de carga para distribuir las cargas de trabajo uniformemente a través
de la red con el fin de garantizar una utilización óptima de los recursos y evitar que una sola
máquina se convierta en un cuello de botella.
La seguridad es un aspecto crucial de los sistemas operativos distribuidos. Proporcionan
mecanismos de autenticación, control de acceso, integridad de datos y confidencialidad pa-
ra proteger el sistema y sus recursos de accesos no autorizados, ataques y violaciones de
datos.
Un ejemplo de sistema operativo distribuido es Google File System (GFS). Se trata de un
sistema de archivos distribuido desarrollado por Google para gestionar el almacenamiento
y procesado de datos a gran escala en clusters de computadoras. GFS proporciona una ca-
pa de abstracción que proporciona una visión unificada de los recursos de almacenamiento
subyacentes, distribuidos entre varios equipos. Permite a las aplicaciones acceder a los ar-
chivos almacenados en el sistema distribuido y manipularlos como si estuvieran en una sola
máquina.
Los sistemas operativos distribuidos proporcionan la base para construir y gestionar la
infraestructura distribuida y escalable que alimenta los servicios de computación en nube.
Permiten una utilización eficiente de los recursos, soportan la tolerancia a fallos y garantizan
una coordinación y comunicación sin fisuras entre los distintos componentes de la nube. La
computación en nube (Armbrust y col., 2010) consiste en acceder y utilizar recursos infor-
máticos (p. ej., servidores, almacenamiento, bases de datos y aplicaciones) a través de la
red. La computación en nube ofrece escalabilidad, flexibilidad y rentabilidad, ya que los usua-
rios pueden asignar y ajustar dinámicamente los recursos en función de sus necesidades.
La computación en nube suele basarse en sistemas operativos distribuidos para gestionar y
coordinar la infraestructura y los recursos subyacentes. Se encargan de tareas como el equi-
librio de carga, la asignación de recursos, la replicación de datos y la tolerancia a fallos, que
son esenciales para ofrecer servicios en nube fiables y escalables.
En un entorno de computación en nube, pueden emplearse múltiples sistemas operativos
distribuidos en diferentes capas de la infraestructura. Por ejemplo, un proveedor de nube pue-
de utilizar un sistema operativo distribuido para gestionar los servidores físicos subyacentes,
mientras que las tecnologías de virtualización y los sistemas de archivos distribuidos pueden
utilizarse para gestionar las máquinas virtuales y el almacenamiento en la nube.

29
9. Análisis de rendimiento

El rendimiento de un sistema operativo se refiere a la velocidad y eficiencia con la que


éste y su hardware y software asociados pueden realizar diversas tareas (Menasce, Almeida
y Dowdy, 2002). El rendimiento del sistema puede medirse utilizando una serie de paráme-
tros, como el tiempo de respuesta, el rendimiento, la utilización y la disponibilidad. Las herra-
mientas de monitorización del sistema, como los contadores de rendimiento, los monitores
de recursos y las herramientas de creación de perfiles, pueden proporcionar mediciones de-
talladas de varios parámetros del sistema y métricas de rendimiento. Estas herramientas
pueden rastrear el uso del procesador, la utilización de la memoria, la E/S del disco y la activi-
dad de la red, permitiéndole analizar el rendimiento del sistema e identificar cuellos de botella
o áreas de mejora.
El tiempo de respuesta en un sistema informático suele medirse utilizando diversas mé-
tricas. La más sencilla sería medir directamente el tiempo real transcurrido desde el inicio
hasta la finalización de una tarea u operación específica. Proporciona una medida global del
tiempo de respuesta, pero puede verse influido por factores externos como la carga del sis-
tema, la latencia de la red y los retrasos de E/S. Otra métrica utilizada a menudo es el tiempo
de procesador, que mide la cantidad de tiempo que el procesador pasa ejecutando una tarea
o proceso específicos. Incluye tanto el tiempo de usuario (tiempo dedicado a ejecutar código
a nivel de usuario) como el tiempo de sistema (tiempo dedicado a ejecutar código del núcleo
del sistema operativo, en nombre de la tarea medida). El tiempo de procesador es útil para
evaluar la eficiencia computacional de un programa o proceso.
Los Benchmarks y cargas de trabajo sintéticas consisten en pruebas estandarizadas di-
señadas para medir el rendimiento de un sistema o componente en condiciones específicas.
Suelen incluir tareas que simulan cargas de trabajo reales y miden el tiempo de respuesta
como métrica de rendimiento. Algunas de las más populares son:
El paquete de pruebas SPEC CPU (Henning, 2006), que mide el rendimiento de un pro-
cesador ejecutando un conjunto de cargas de trabajo de cálculo intensivo estandari-
zadas. Incluye pruebas tanto de un único hilo como de varios, lo que proporciona una
evaluación completa del rendimiento de un procesador.
Geekbench (McIntosh y Curtsinger, 2011) es un banco de pruebas multiplataforma que
mide el rendimiento de los procesadores, de los procesadores gráficos y de los sub-
sistemas de memoria. Proporciona una puntuación unificada que refleja el rendimiento
global del sistema en diferentes supuestos de tareas y cargas de trabajo.
Linpack (Dongarra y col., 1979) se utiliza para medir el rendimiento en coma flotante
de un sistema informático. Resuelve un sistema denso de ecuaciones lineales y pro-
porciona una medida de las capacidades de cálculo del sistema, especialmente para
aplicaciones científicas y de ingeniería.
SPECjvm (Fumero, De Moor y Smith, 2002) es un conjunto de pruebas diseñado especí-
ficamente para evaluar el rendimiento de las máquinas virtuales Java (JVM). Incluye un
conjunto de cargas de trabajo que simulan aplicaciones Java del mundo real, cubriendo
áreas como bases de datos, gráficos y tareas computacionales.
El benchmark TPC-C (Transaction Processing Performance Council (TPC), 2012) se uti-
liza ampliamente para evaluar el rendimiento de los sistemas de bases de datos. Simula
una carga de trabajo de procesamiento de transacciones en línea (Online Transaction

30
Processing, OLTP) con múltiples usuarios simultáneos, midiendo la capacidad del sis-
tema para gestionar operaciones transaccionales de bases de datos.
El benchmark STREAM (McCalpin, 1994) mide el ancho de banda de memoria de un sis-
tema informático. Evalúa la capacidad del sistema para mover datos entre la memoria
y el procesador, proporcionando información sobre el rendimiento de la memoria para
aplicaciones intensivas en datos.
Apache JMeter (Apache Software Foundation, 2021) es una popular herramienta de
código abierto utilizada para pruebas de carga y análisis de rendimiento de aplicaciones
web. Permite simular el tráfico de usuarios, medir los tiempos de respuesta y analizar
el rendimiento de servidores y aplicaciones web en distintos escenarios.
En algunos casos, el rendimiento de un sistema puede evaluarse en función de las per-
cepciones y opiniones de los usuarios. Se pueden utilizar encuestas, paneles de usuarios y
mecanismos de retroalimentación para recopilar medidas subjetivas del tiempo de respues-
ta y la satisfacción de los usuarios. Las encuestas de satisfacción de los usuarios evalúan
la satisfacción general de los usuarios con el rendimiento del sistema. Suelen incluir pregun-
tas sobre la velocidad percibida, la capacidad de respuesta, la fiabilidad y la facilidad de uso.
Pueden utilizarse preguntas de escala Likert o respuestas abiertas para recabar opiniones
de los usuarios y sugerencias de mejora. Las encuestas de finalización de tareas se centran
en tareas o actividades específicas realizadas por los usuarios en el sistema informático.
Se pide a los usuarios que valoren su experiencia basándose en factores como el tiempo
de realización de la tarea, la facilidad de ejecución, la eficiencia percibida y el nivel de frus-
tración encontrado durante la tarea. Las encuestas sobre gestión de errores y excepciones
recogen opiniones sobre la forma en que el sistema gestiona los errores y las excepciones.
Los usuarios pueden aportar información sobre su experiencia con los mensajes de error, las
caídas del sistema, los mecanismos de recuperación de errores y la claridad y utilidad de la
información proporcionada.
Por su parte, las encuestas sobre la experiencia del usuario (UX) recogen opiniones sobre
la experiencia general del usuario, incluidos los aspectos relacionados con el rendimiento.
Estas encuestas abarcan una amplia gama de factores, como la capacidad de respuesta del
sistema, la fluidez de la interacción, la latencia percibida y la estabilidad percibida del siste-
ma. Relacionadas con estas encuestas, en las encuestas sobre la capacidad de respuesta
percibida se pide a los usuarios que evalúen su percepción de la velocidad, el retardo y la
fluidez del sistema durante diversas actividades, como el inicio de aplicaciones, la apertura
de archivos o la interacción con la interfaz de usuario.
Supervisar el rendimiento del sistema es esencial para garantizar su funcionamiento ópti-
mo e identificar posibles cuellos de botella o problemas de rendimiento. Es importante tener
en cuenta que la medición del tiempo de respuesta puede verse influida por varios factores,
como la carga del sistema, la latencia de la red, las capacidades del hardware y las optimi-
zaciones del software. Por lo tanto, es crucial tener en cuenta múltiples métricas y técnicas
de medición para obtener una comprensión global del tiempo de respuesta en un sistema
informático.
Ajustar el rendimiento del sistema implica realizar ajustes en varios componentes del sis-
tema para optimizar el rendimiento. Esto puede incluir la optimización de recursos de hardwa-
re como el procesador, la memoria y los dispositivos de almacenamiento, así como ajustes y
configuraciones del sistema. Las técnicas más comunes de ajuste del rendimiento incluyen
el equilibrio de carga, el almacenamiento en caché y la optimización de las operaciones de

31
E/S. Uno de los principales retos a la hora de ajustar el rendimiento del sistema es equilibrar
las demandas de recursos que compiten entre sí. Por ejemplo, aumentar el número de pro-
cesos que se ejecutan en un sistema puede aumentar el rendimiento general, pero también
puede provocar una disminución del tiempo de respuesta y un aumento de los conflictos por
la utilización de recursos compartidos.
Otra consideración importante en el rendimiento del sistema es la escalabilidad, es decir,
la capacidad del sistema para manejar cargas de trabajo crecientes sin una disminución co-
rrespondiente del rendimiento. La escalabilidad puede lograrse mediante diversas técnicas,
como la adición de más recursos de hardware, la optimización del software y la implemen-
tación de técnicas de equilibrio de carga.

10. Casos de estudio

Los sistemas operativos son el software que controla y gestiona los recursos de hardware
y software de un ordenador o dispositivo móvil. Son responsables de gestionar la ejecución
de las aplicaciones, proporcionar acceso a los dispositivos de entrada/salida y garantizar la
seguridad y estabilidad del sistema. Windows, Linux, macOS y Android se encuentran entre
los sistemas operativos más populares en uso hoy en día. Cada uno de estos sistemas ope-
rativos tiene su propia arquitectura y principios de diseño que le permiten realizar funciones
específicas y satisfacer las diferentes necesidades de los usuarios.
Windows es un sistema operativo ampliamente utilizado desarrollado por Microsoft. Está
diseñado para ser fácil de usar y ofrece una amplia gama de funciones y aplicaciones tanto
para uso personal como profesional. Windows utiliza una arquitectura de núcleo monolítico,
que proporciona acceso directo al hardware y permite un alto rendimiento.
Linux es un sistema operativo de código abierto basado en el sistema operativo Unix. Es
conocido por su flexibilidad, fiabilidad y seguridad. Linux utiliza una arquitectura modular, con
un pequeño núcleo y muchos componentes de software individuales que pueden añadirse o
eliminarse según sea necesario.
macOS es un sistema operativo propietario desarrollado por Apple Inc. Está diseñado
para proporcionar una integración perfecta entre hardware y software, y es conocido por su
interfaz fácil de usar y sus sólidas funciones de seguridad. macOS utiliza una arquitectura de
núcleo híbrida, que combina elementos de las arquitecturas monolítica y de micronúcleo.
Android es un sistema operativo móvil desarrollado por Google. Está diseñado para fun-
cionar en una amplia gama de dispositivos, como teléfonos inteligentes, tabletas y televisores
inteligentes. Android utiliza una versión modificada del kernel de Linux.
En los apartados siguientes presentamos una breve descripción de las características
más relevantes de estos sistemas operativos.

10.1. Windows

Windows es una familia de sistemas operativos desarrollados y mantenidos por Micro-


soft. La primera versión de Windows, Windows 1.0, se lanzó en 1985, y la última, Windows
11, en 2021. Windows se utiliza en una amplia gama de dispositivos, incluidos ordenadores

32
Figura 12: Arquitectura básica en capas de Windows.

personales, tabletas, teléfonos inteligentes y servidores. Originalmente fue diseñado como


una interfaz gráfica de usuario (GUI) sobre MS-DOS. Todas las características de MS-DOS se
integraron más tarde en el lanzamiento de Windows 95, versión que se convirtió en un gran
éxito y dio lugar a la transición al concepto de Windows que conocemos en la actualidad.
Windows utiliza una arquitectura en capas, en la que cada capa proporciona un conjunto
diferente de servicios y abstracciones (cf. Fig. 12. La capa de hardware proporciona acceso
a los recursos de hardware del ordenador, incluidos el procesador, la memoria, el almacena-
miento y los dispositivos de E/S. Por su parte, la capa de kernel se encarga de los servicios
básicos del sistema operativo, como la gestión de procesos, la gestión de memoria, la ges-
tión de E/S y la seguridad. El kernel también proporciona un conjunto de llamadas al sistema
que permiten a las aplicaciones acceder a estos servicios.
Sobre el kernel se encuentra la capa ejecutiva, que proporciona un conjunto de servicios
sobre el kernel, incluyendo la API de Windows (Interfaz de Programación de Aplicaciones)
y varios subsistemas para ejecutar aplicaciones, como el subsistema Win32 para ejecutar
aplicaciones de escritorio tradicionales y el .NET Framework para ejecutar código gestionado.
El registro de Windows es una base de datos maestra que se utiliza para almacenar todas las
configuraciones del ordenador. Es responsable de almacenar toda la información del usuario
con sus contraseñas, y la información relacionada con los dispositivos. El registro también
tiene un editor que le permite ver todas las claves y valores o incluso los controladores de
dispositivo.
Finalmente, la capa de interfaz de usuario proporciona la interfaz gráfica con la que inter-
actúan los usuarios, incluidos el menú Inicio, la barra de tareas y otros elementos de dicha
interfaz. La interfaz de Windows no se convirtió en una capa claramente separada de la ca-
pa ejecutiva, de modo que pudiera incluso intercambiarse, hasta la versión 8 del sistema
operativo, aunque ya se empezaron a incluir mejoras significativas en el interfaz gráfico con
Windows XP, cuando apareció el menú de inicio, la barra de tareas, la bandeja del sistema y
el explorador de windows.

33
Windows incluye su propia versión del terminal o símbolo del sistema, una especie de
interfaz de texto que se utiliza para ejecutar comandos o scripts, denominados archivos por
lotes (batch files). También se puede utilizar para funciones administrativas y para solucio-
nar problemas del sistema operativo. Las últimas versiones del sistema operativo incluyen
PowerShell, un intérprete de comandos desarrollado por Microsoft que también proporciona
potentes capacidades de scripting.
Windows se basa en una estructura de directorios para almacenar los distintos tipos de
archivos del usuario, cuyo origen se puede rastrear hasta el propio MS-DOS. Permite definir
unidades lógicas y paquetes (cabinet drawers, con extensión .cab), así como estructuras de
directorios llamados folders (carpetas). También proporciona una papelera de reciclaje donde
se pueden almacenar todos los archivos borrados.
Además, Windows incluye una serie de funciones de seguridad integradas, como el con-
trol de cuentas de usuario (User Accounts Control, UAC) y el antivirus Windows Defender,
para ayudar a proteger contra el malware y otras amenazas a la seguridad. Estas funciones
están integradas en el núcleo y en las capas ejecutivas del sistema operativo y proporcionan
un conjunto de API que los desarrolladores pueden utilizar para crear aplicaciones seguras.

10.2. Linux

Linux es un sistema operativo libre y de código abierto basado en el sistema operativo


Unix. Fue creado en 1991 por Linus Torvalds diseñado para desarrolladores de GNU, aunque
ahora se utiliza en una amplia gama de dispositivos, desde servidores a teléfonos inteligen-
tes. Es un sistema abierto, y cualquiera puede utilizarlo según sus especificaciones. Como
consecuencia de ello, existen multitud de distribuciones de este sistema operativo promovi-
das por entidades muy diversas y bajo muy diversas filosofías (p. ej., Ubuntu, Fedora, CentOS,
Debian, Arch Linux, openSUSE, Linux Mint. . . ). Linux es conocido por su estabilidad, seguri-
dad y flexibilidad, y se ha convertido en una opción popular tanto para uso personal como
empresarial.
Al igual que Unix, Linux se basa en una arquitectura de núcleo modular. El núcleo de Linux
es responsable de proporcionar los servicios básicos del sistema operativo, como la ges-
tión de procesos, la gestión de memoria, la gestión de E/S y el soporte de controladores de
dispositivos. Además, pueden cargarse en el núcleo piezas de código independientes para
ampliar su funcionalidad o añadir soporte para dispositivos de hardware o características
específicas. Estos módulos, conocidos como Loadable Kernel Modules (LKM) proporcionan
una forma de añadir nuevos controladores, sistemas de archivos, protocolos de red y otras
funcionalidades al núcleo Linux sin necesidad de reconstruir y reemplazar todo el núcleo.
Este enfoque modular permite una mayor flexibilidad, ya que los módulos pueden cargarse
o descargarse según sea necesario, reduciendo la necesidad de un núcleo específico para
cada configuración posible.
Además del núcleo, Linux incluye un conjunto de utilidades y bibliotecas de espacio de
usuario que proporcionan servicios y abstracciones adicionales. Estas utilidades incluyen la
biblioteca GNU C (glibc), que proporciona un conjunto de funciones C estándar y llamadas al
sistema, y el intérprete de comandos Bash, que proporciona una interfaz de línea de coman-
dos para interactuar con el sistema.

34
Linux también incluye una serie de subsistemas y servicios que se basan en el núcleo
y las utilidades del espacio de usuario. Estos subsistemas incluyen el sistema X Window,
que proporciona una interfaz gráfica de usuario, y varios servicios de red, como el servidor
web Apache y el servicio de compartición de archivos Samba. Linux también ofrece diversos
entornos de escritorio y gestores de ventanas, como GNOME, KDE o XFCE, que permiten a
los usuarios elegir la interfaz que mejor se adapte a sus preferencias.
Linux también proporciona un terminal, cuyo intérprete de comandos (llamado shell) es
facilmente intercambiable. La shell más comúnmente utilizada es Bash, pero hay muchas
otras. La shell elegida define cómo se comportará y cómo se verá la terminal cuando se
ejecute.
Una de las características únicas de Linux es su compatibilidad con una amplia gama
de arquitecturas de hardware, como x86, ARM y MIPS. Esto es posible gracias al uso de un
diseño modular, que permite compilar el núcleo sólo con los controladores y subsistemas
necesarios para una plataforma de hardware concreta.
Un ejemplo de la arquitectura de Linux en acción es su compatibilidad con contenedores.
Linux incluye una serie de características, como namespaces y cgroups, que permiten aislar
los procesos entre sí y controlar el uso de recursos. Estas características han sido aprove-
chadas por las tecnologías de contenedores, como Docker y Kubernetes, para proporcionar
una forma ligera y portátil de empaquetar y desplegar aplicaciones.
Además, la arquitectura de Linux lo ha convertido en una opción popular para sistemas
integrados y dispositivos IoT. El diseño modular del núcleo y la compatibilidad con una amplia
gama de arquitecturas de hardware facilitan la personalización y optimización del sistema
operativo para dispositivos específicos.
A diferencia de Windows, que se basa principalmente en paquetes instaladores indepen-
dientes, las distribuciones Linux suelen utilizar sistemas de gestión de paquetes, como APT
(Advanced Package Tool) o YUM (Yellowdog Updater, modificado), que simplifican la instala-
ción de software, las actualizaciones y la gestión de dependencias.
Linux tiene una estructura de archivos completamente diferente a la de Windows y ma-
cOS. Fue desarrollado con un código base diferente. Almacena los datos en forma de árbol,
con un único árbol de archivos, donde todas las unidades y dispositivos se montan sobre
este árbol.
Linux tampoco tiene un registro específico propio. Toda la configuración de las aplica-
ciones se almacena programa a programa, incluso para cada usuario, en el mismo formato
jerárquico para el almacenamiento del resto de los archivos. No existe una base de datos
centralizada para almacenar estos detalles.

10.3. macOS

macOS es un sistema operativo propio desarrollado por Apple Inc. Es conocido por su
facilidad de uso, su diseño elegante y su integración con otros dispositivos y servicios de
Apple. Lanzado por primera vez en 1984 como un sistema propietario de Apple, fuertemente
ligado a su hardware, comenzó siendo una interfaz gráfica de usuario. En 2001 cambió su
concepción, convirtiéndose en un sistema operativo basado en Unix con Mac OS X, basado
en el micronúcleo Mach y un sistema operativo basado en Unix BSD llamado Darwin. Dar-

35
win proporciona las tecnologías y funcionalidades básicas de macOS, incluidos el núcleo, el
sistema de archivos, las redes y los servicios de sistema de bajo nivel. Esta base basada en
Unix aportó varias ventajas a macOS, como una mayor estabilidad, seguridad y compatibili-
dad con el software Unix estándar. En 2005, el diseño y la estructura de macOS cambiaron a
una arquitectura basada en Intel x86, y ya en 2020 a una arquitectura propia basada en ARM.
En la actualidad se utiliza en los ordenadores de sobremesa y portátiles de Apple, incluidos
el iMac, el MacBook y el Mac Pro. Se ha desarrollado también una versión totalmente gráfica
para teléfonos inteligentes denominada iOS/iPadOS).
Como acabamos de indicar, macOS se basa en la actualidad en el sistema operativo Unix,
como Linux, y utiliza una arquitectura de núcleo híbrida. Esto significa que algunos servicios
del kernel se proporcionan en el espacio de usuario, mientras que otros se proporcionan en
el espacio del kernel. Este enfoque híbrido permite a macOS ofrecer un equilibrio entre rendi-
miento y seguridad.
El núcleo de macOS es responsable de proporcionar los servicios básicos del sistema
operativo, como la gestión de procesos, la gestión de memoria, la gestión de E/S y la com-
patibilidad con controladores de dispositivos. macOS también incluye un conjunto de biblio-
tecas y marcos de trabajo en el espacio de usuario, como los marcos de trabajo Cocoa y
Carbon, que proporcionan funciones adicionales para el desarrollo de aplicaciones.
Una de las características exclusivas de macOS es el uso de la interfaz Aqua, que propor-
ciona una interfaz gráfica de usuario elegante e intuitiva. macOS también incluye una serie de
aplicaciones integradas, como el gestor de archivos Finder y el navegador web Safari. macOS
proporciona también una aplicación de terminal al estilo Unix. Aunque Bash sigue disponible
en macOS, las nuevas cuentas de usuario creadas tras la actualización de Catalina tienen
Z-shell configurado como shell por defecto.
La estructura de archivos de macOS es el típico árbol de los sistemas operativos tipo Unix,
con directorios específicos de macOS (p. ej., /Applications, /Developer, /Library, /System) que
dejan entrever las características específicas de la arquitectura de los ordenadores de Apple.
Por ejemplo, macOS almacena todos los ajustes de las aplicaciones en una serie de archivos
.plist, almacenados en diversas carpetas de preferencias (/Preferences). Los archivos .plist,
exclusivos de macOS, contienen todas las propiedades de cada aplicación.
macOS es conocido por sus funciones de seguridad, como su función Gatekeeper, que
restringe la instalación de software de fuentes desconocidas, y su función de cifrado File-
Vault, que proporciona cifrado de todo el disco.
Podemos destacar su compatibilidad con la virtualización. macOS incluye el marco Hy-
pervisor, que permite ejecutar máquinas virtuales en un Mac. Esta función es especialmente
útil para los desarrolladores que necesitan probar sus aplicaciones en varias versiones de
macOS o en otros sistemas operativos. macOS ofrece también la posibilidad de enlazar in-
terfaces de red virtuales.
Además, la arquitectura de macOS lo ha convertido en una opción popular para los pro-
fesionales creativos, como diseñadores y músicos, que confían en la integración de la plata-
forma con otros dispositivos y servicios de Apple. Por ejemplo, macOS incluye el software de
producción musical GarageBand y el de edición de vídeo Final Cut Pro.
En general, la arquitectura de macOS está diseñada para ofrecer un equilibrio entre rendi-
miento, seguridad y facilidad de uso, al tiempo que proporciona integración con otros dispo-
sitivos y servicios de Apple.

36
Figura 13: Arquitectura básica en capas de Android.

10.4. Android

Android es un sistema operativo móvil basado en el núcleo de Linux, diseñado princi-


palmente para teléfonos inteligentes y tabletas. Fue desarrollado por Google y lanzado por
primera vez en 2008. Android es conocido por su naturaleza de código abierto, su interfaz de
usuario personalizable y su amplio ecosistema de aplicaciones.
El sistema operativo Android utiliza una versión modificada del kernel de Linux, que pro-
porciona los servicios básicos del sistema operativo, como la gestión de procesos, la gestión
de memoria y el soporte de controladores de dispositivos. Además del núcleo, Android utiliza
una arquitectura en capas con múltiples componentes de software que interactúan entre sí
para ofrecer una experiencia completa del sistema operativo (cf. Fig. 13.
La capa base de la arquitectura de Android es la capa de abstracción de hardware (Hard-
ware Abstraction Layer, HAL), que proporciona una interfaz estandarizada para interactuar
con componentes de hardware como la cámara, el GPS y los sensores. Por encima de la
HAL están las bibliotecas nativas C/C++, que proporcionan funcionalidades de bajo nivel co-
mo el renderizado de gráficos y la comunicación de red.
Sobre las bibliotecas nativas está Android Runtime (ART), que se encarga de ejecutar las
aplicaciones escritas en los lenguajes de programación Java o Kotlin. ART utiliza la compila-
ción ahead-of-time (AOT) para optimizar el rendimiento de estas aplicaciones.
La siguiente capa es el Framework, que proporciona un conjunto de componentes pre-
construidos para crear aplicaciones. Esto incluye componentes de interfaz de usuario como
botones y campos de texto, así como componentes de gestión de datos como bases de
datos y proveedores de contenido.
Por último, en la parte superior de la pila está la capa de Aplicación, que consiste en las
aplicaciones orientadas al usuario que se instalan en el dispositivo. Estas aplicaciones pue-
den descargarse de Google Play Store o de otras fuentes de terceros.

37
La arquitectura de Android lo convirtió en una opción popular para los fabricantes de
dispositivos que desean crear versiones personalizadas del sistema operativo para sus dis-
positivos. Su naturaleza abierta y flexible permite a los fabricantes adaptar y personalizar
sus smartphones en mayor medida en comparación con ecosistemas cerrados como iOS.
Android admite una amplia gama de opciones de personalización, como lanzadores perso-
nalizados, widgets, temas y tiendas de aplicaciones de terceros, lo que da a los usuarios
más control sobre sus dispositivos. De hecho, la entrada de Android en el mercado de los
smartphones introdujo un nuevo nivel de competencia, desafiando a actores establecidos
como Apple o Microsoft. La disponibilidad de múltiples smartphones con Android de distin-
tos fabricantes ofreció a los consumidores una gama más amplia de opciones en cuanto a
aplicaciones, niveles de precios y características de los dispositivos.
En general, la arquitectura de Android está diseñada para ofrecer un sistema operativo
personalizable y de código abierto que pueda ejecutarse en una amplia gama de dispositivos.
La arquitectura en capas de Android proporciona una base sólida para crear aplicaciones
complejas y permite a los desarrolladores crear soluciones innovadoras para dispositivos
móviles.

11. Conclusión

Los sistemas operativos son componentes esenciales de los sistemas informáticos mo-
dernos, ya que constituyen la columna vertebral que permite la ejecución de aplicaciones de
software y la gestión de recursos de hardware. En estas notas hemos tratado de cubrir los
fundamentos de los sistemas operativos, incluida la gestión de procesos, la gestión de me-
moria, los sistemas de archivos, los sistemas de entrada/salida, la seguridad y la protección,
la virtualización, el rendimiento del sistema y los sistemas operativos distribuidos.
También hemos analizado la arquitectura y los principios de diseño de cuatro sistemas
operativos populares: Windows, Linux, macOS y Android. Comprender las características úni-
cas y los principios de diseño de cada uno de estos sistemas es crucial tanto para los de-
sarrolladores como para los usuarios, ya que les permite crear software optimizado para la
plataforma y seleccionar el sistema operativo que mejor se adapte a sus necesidades.
A continuación proponemos una breve lista de referencias bibliográficas que pueden ser
útiles para proporcionar una base sólida en el campo de los sistemas operativos.
Operating System Concepts, de Abraham Silberschatz, Peter B. Galvin y Greg Gagne (Sil-
berschatz, Galvin y Gagne, 2008), está ampliamente considerado como una introduc-
ción exhaustiva a los sistemas operativos. Abarca un amplio abanico de temas, como
la gestión de procesos, la gestión de memoria o los sistemas de archivos, entre otros.
También ofrece ejemplos reales y casos prácticos que ayudan a comprender mejor los
conceptos.
Modern Operating Systems, de Andrew S. Tanenbaum y Herbert Bos (Tanenbaum y Bos,
2014), ofrece una introducción clara y práctica a los sistemas operativos modernos.
Abarca conceptos clave como la gestión de procesos, la gestión de memoria, los sis-
temas de archivos y las redes. También incluye contenido interesante sobre avances y
tendencias en sistemas operativos.
Sistemas operativos: Three Easy Pieces, de Remzi H. Arpaci-Dusseau y Andrea C. Arpaci-
Dusseau (Arpaci-Dusseau y Arpaci-Dusseau, 2015) adopta un enfoque único para en-

38
señar conceptos de sistemas operativos centrándose en los principios fundamentales.
Abarca temas como la virtualización, la concurrencia, los sistemas de archivos y la
seguridad. También proporciona ejercicios prácticos y ejemplos para mejorar la com-
prensión de los distintos temas.
Operating Systems Design and Implementation, de Andrew S. Tanenbaum y Albert S.
Woodhull (Tanenbaum y Woodhull, 2006), profundiza en los aspectos de diseño e im-
plementación de los sistemas operativos. Explora diversas características de los sis-
temas operativos, como procesos, hilos, gestión de memoria y sistemas de archivos.
También incluye amplios ejemplos de código y ejercicios para reforzar el aprendizaje.
Operating System Concepts Essentials, de Abraham Silberschatz, Peter B. Galvin y Greg
Gagne (Silberschatz, Galvin y Gagne, 2013), es una versión condensada del exhausti-
vo libro .Operating System Conceptsreferenciado al principio de esta lista. Esta edición
esencial ofrece una presentación más concisa de los conceptos fundamentales. Cubre
los temas clave de los sistemas operativos, proporcionando una comprensión sólida
en un formato más compacto.
De todos modos, aunque los libros son recursos valiosos que, en el caso de los sistemas
operativos, recogen aproximaciones teóricas y prácticas bien asentadas entre la comunidad
científica e ingenieril, la práctica y la exploración de ejemplos prácticos son igualmente im-
portantes para reforzar la comprensión de los sistemas operativos. Puede ser beneficioso
complementar su lectura con recursos en línea, tutoriales y ejercicios prácticos para profun-
dizar y asentar los conocimientos adquiridos en este campo.
En cualquier caso, es importante verificar la credibilidad y calidad de los recursos en línea
elegidos. Es aconsejable recurrir a fuentes acreditadas, como instituciones académicas, do-
cumentación oficial y expertos reconocidos en la materia. Además, combinar los recursos en
línea con la práctica, la experimentación con sistemas operativos y la ejecución de pequeños
proyectos mejorará la comprensión de los fundamentos de los sistemas operativos.
Además de los enlaces que aparecen en otras partes de este documento, a continuación
proponemos una pequeña selección de sitios en Internet relevantes para adquirir y poner en
práctica los fundamentos de los sistemas operativos. Estos sitios en línea proporcionan una
variedad de recursos, incluyendo tutoriales, notas de clase, ejercicios prácticos y ejemplos ,
para facilitar el aprendizaje de los fundamentos de los sistemas operativos.
GeeksforGeeks es una popular plataforma que ofrece tutoriales muy completos y ar-
tículos sobre diversos temas de informática, incluidos los sistemas operativos. Abarcan
conceptos fundamentales, algoritmos, estructuras de datos y preguntas de preparación
para entrevistas de trabajo y exámenes relacionadas con los sistemas operativos.
Tutorialspoint ofrece una sección dedicada a los sistemas operativos que cubre los
conceptos básicos junto con temas avanzados. El contenido incluye tutoriales fáciles
de entender, explicaciones de conceptos clave y ejemplos prácticos.
Operating System Concepts es un recurso en línea desarrollado por los autores del libro
de texto Operating System Concepts que acabamos de referenciar. El sitio web ofrece
presentaciones de clase, ejercicios prácticos y recursos adicionales para complemen-
tar el aprendizaje.
Operating Systems - University of California, Berkeley. Esta página web de la Universidad
de California en Berkeley, proporciona acceso a los apuntes, tareas y recursos del curso
de sistemas operativos (CS162). Abarca varios temas relacionados con los sistemas
operativos, con explicaciones detalladas y ejemplos.

39
opensource.com es un sitio mantenido por Red Hat, In. que ofrece una colección de
artículos y tutoriales relacionados con los sistemas de código abierto, entre ellos los
sistemas operativos. Abarca una amplia gama de temas sobre Linux, BSD y otros sis-
temas operativos alternativos. Los artículos y recursos ofrecen información sobre el
funcionamiento interno, las características y el desarrollo de estos sistemas operati-
vos.

Referencias
Apache Software Foundation (2021). Apache JMeter. Apache Software Foundation. URL: https:
//jmeter.apache.org/.
Armbrust, Michael y col. (2010). “A View of Cloud Computing”. En: Communications of the
ACM 53.4, páginas 50-58. DOI: 10.1145/1721654.1721672.
Arpaci-Dusseau, Remzi H. y Andrea C. Arpaci-Dusseau (2015). Operating Systems: Three Easy
Pieces. Arpaci-Dusseau Books.
Choffnes, William (2020). Dive into Android: The Ultimate Guide for New Android App Develo-
pers. United States: Independently Published.
Coleman, Adrian (1995). Inside Windows 95. Redmond, WA: Microsoft Press.
Corporation, IBM (1963). IBM 7090/7094 IBSYS Operating System Version 13. System Monitor
(IBSYS). C28-6248-7. IBM Corporation, Programming Publications.
Corporation, Microsoft (2002). MS-DOS and PC-DOS: A Business User’s Guide. Redmond, WA:
Microsoft Press.
Dongarra, Jack J. y col. (1979). “Linpack Users’ Guide”. En: Society for Industrial and Applied
Mathematics (SIAM) 9.1, páginas 1-26. DOI: 10.1137/0919001.
Fumero, Augusto, Oded De Moor y Tim Smith (2002). “SPECjvm2002 Benchmark”. En: Pro-
ceedings of the 2002 International Conference on Parallel Architectures and Compilation
Techniques (PACT). IEEE, páginas 209-220. DOI: 10.1109/PACT.2002.1106002.
Henning, John L. (2006). “SPEC CPU2006 Benchmark Descriptions”. En: ACM SIGARCH Com-
puter Architecture News 34.4, páginas 1-17. DOI: 10.1145/1186736.1186738.
Hertzfeld, Andy (2004). Revolution in The Valley: The Insanely Great Story of How the Mac Was
Made. Sebastopol, CA: O’Reilly Media.
Kildall, Gary (1974). “The CP/M Operating System: A Simple Operating System for Microcom-
puters”. En: Dr. Dobb’s Journal 1.1. Accessed: May 17, 2023, páginas 6-8. URL: https://
archive.org/details/drdobbs_journal_vol_01.
Levy, Steven (2014). The Insanely Great Story of How the iPhone Was Invented. New York, NY:
Grove Press.
McCalpin, John D. (1994). “Memory Bandwidth and Machine Balance in Current High Perfor-
mance Computers”. En: IEEE Computer Society Technical Committee on Computer Archi-
tecture (TCCA) Newsletter 19.2, páginas 1-6. URL: https : / / www . cs . virginia . edu /
stream/.
McFadden, Klint (2013). BlackBerry Planet: The Story of Research in Motion and the Little De-
vice That Took the World by Storm. Toronto, ON: ECW Press.
McIntosh, John y Charlie Curtsinger (2011). “Geekbench: A Cross-Platform Benchmark for
Processor Performance”. En: Proceedings of the 2011 Workshop on Experimental Compu-
ter Science. ACM, páginas 1-8. DOI: 10.1145/1999776.1999778.
Menasce, Daniel A., Virgilio A. F. Almeida y Lawrence W. Dowdy (2002). Performance by De-
sign: Computer Capacity Planning by Example. Prentice Hall. ISBN: 9780130906731.

40
Ritchie, Dennis M. y Ken Thompson (1984). The UNIX Programming Environment. Englewood
Cliffs, NJ: Prentice Hall.
Schneier, Bruce (1995). Applied Cryptography: Protocols, Algorithms, and Source Code in C.
Hoboken, NJ: Wiley. ISBN: 978-0471117094.
Silberschatz, Abraham, Peter B. Galvin y Greg Gagne (2008). Operating System Concepts. Wi-
ley.
— (2013). Operating System Concepts Essentials. Wiley.
Stevens, W. Richard (1994). TCP/IP Illustrated, Volume 1: The Protocols. Addison-Wesley Pro-
fessional. ISBN: 978-0201633467.
Surhone, Lambert M, Mariam T Tennoe y Susan F Henssonow, edición (2010). GM-Naa I/O.
VDM Publishing.
Tanenbaum, Andrew S. y Herbert Bos (2014). Modern Operating Systems. Pearson.
Tanenbaum, Andrew S. y Albert S. Woodhull (2006). Operating Systems Design and Imple-
mentation. Pearson.
Torvalds, Linus y David Diamond (2001). Just for Fun: The Story of an Accidental Revolutionary.
New York, NY: HarperBusiness.
Tough, Nick y Tim Nguyen (2011). “Trusted Platform Module: Basics and Overview”. En: Inter-
national Journal of Information Security 10.2, páginas 73-89. DOI: 10.1007/s10207-011-
0129-2.
Transaction Processing Performance Council (TPC) (2012). “TPC Benchmark C (TPC-C)”. En:
Transaction Processing Performance Council (TPC). URL: http://www.tpc.org/tpcc/
default.asp.
Trappe, Wade y Lawrence C. Washington (2014). Introduction to Cryptography with Coding
Theory. London: Pearson. ISBN: 978-0131862395.

41

View publication stats

También podría gustarte