Вы находитесь на странице: 1из 97

Sistemas distribuidos: procesos, comunicación, memoria y

sistemas de archivos.
Implementaciones de SD: Windows, Linux y Mac.
Software Libre.

Marcos Collado Gonzalez, David de la Fuente Seco de Herrera, José Antonio Ginzo López,
Almudena Muñoz Campos y Javier Vela Galindo
Universidad de Alcalá de Henares

E-mail: Meg_87@msn.com, daviddelafuente575m@hotmail.com, javier.vela@uah.es y


gost2005@gmail.com y almudena.munozc@alu.uah.es

Resumen.

En este informe se trata el apasionante mundo de los sistemas distribuidos, abarcando


los procesos y su comunicación, la memoria y el sistema de archivos. Se habla tanto de las
implementaciones en Windows, como Linux y Mac.

De los procesos se explica su diseño e implantación, y se habla sobre las técnicas y


modelos para asignar los procesos a los procesadores. También se comentan distintos
mecanismos de comunicación entre procesos en este tipo de sistemas.

Respecto a los sistemas de archivos distribuidos, se comenta la capacidad de conexión


que ofrecen entre ordenadores, compartiendo archivos unos con otros. Se comentan en
profundidad los tipos de métodos para resolver los diversos problemas que pueden causar
algunos de los aspectos de los sistemas de archivos, tal y como son los temas de
transparencia, tratamiento de replicas, etc.

Se trata el tema de los sistemas de memoria distribuida que permite virtualizar una
memoria a través de una red dándole a la memoria direcciones virtuales que hacen posible
que otros equipos accedan a ella a través de la red.

Sobre las distintas implementaciones, se detallan cada uno de los puntos anteriormente
mencionados, así como la arquitectura y el sistema de login y seguridad.

Por último, en este informe se da un repaso al creciente panorama del software libre y
de código abierto. Estos movimientos, son a día de hoy una de las grandes apuestas no solo
de una comunidad de usuarios sino de grandes empresas que ven como el software libre
puede darles unas ventajas y cubrir unas necesidades que no les dan los productos con
software propietario.
1 Introducción

Un sistema operativo es un conjunto de programas, rutinas, funciones de software, etc. que


hace de interfaz entre el usuario y el hardware de una computadora. Sus objetivos principales son
facilitar el uso de una computadora y ofrecer un entorno adecuado para le ejecución de
programas en una computadora

Los sistemas operativos controlan diferentes procesos de la computadora. Un proceso


importante es la interpretación de los comandos que permiten al usuario comunicarse con la
computadora. Algunos intérpretes de instrucciones están basados en texto y exigen que las
instrucciones sean tecleadas. Otros están basados en gráficos, y permiten al usuario comunicarse
señalando y haciendo clic en un icono con el ratón.

Los sistemas operativos pueden ser monotarea o multitarea. Los sistemas operativos
monotarea sólo pueden, en principio, manejar un solo proceso en un instante dado.

Todos los Sistemas Operativos modernos son multitarea y pueden ejecutar varios procesos
simultáneamente. En la mayoría de las computadoras sólo hay una CPU. Un sistema operativo
multitarea crea la ilusión de que varios procesos se ejecutan simultáneamente en la CPU.

Un SD esta formado por un conjunto de procesadores, posiblemente heterogéneos, sin


memoria ni reloj común, que se encuentran conectados a través de una red de interconexión. En
un SD, hay aplicaciones distribuidas, que están formadas por un conjunto de procesos que se
ejecutan en uno o más computadores y que colaboran y se comunican entre ellos mediante el
intercambio de mensajes. Uno de los aspectos más importantes, por tanto, de un SD es la
posibilidad de comunicar diferentes procesos entre sí con independencia del lugar donde se
ejecuten.

Existen tres modelos de computadora en los que se pueden ejecutar procesos concurrentes:

• Multiprogramación con un único procesador. Todos los procesos son ejecutados


sobre un único procesador. No hay concurrencia real, porque el sistema operativo va
distribuyendo los procesos.

• Multiprocesador. Conjunto de procesadores que comparten memoria principal. Existe


una concurrencia real porque pueden coincidir las fases de procesamiento de distintos
procesos.

• Multicomputadora. Tiene memoria distribuida y está formada por una serie de


computadoras completas. Cada una se llama nodo y están interconectadas. Es posible
la ejecución simultánea de procesos sobre los diferentes procesadores.

Por tanto, será real cuando haya más de un procesador. La ejecución de procesos concurrentes
se justifica por:

• Facilitar la programación

• Acelerar los cálculos

• Posibilitar el uso interactivo

• Permitir un mejor aprovechamiento de recursos

-2-
La tarea del sistema de archivos en los sistemas distribuidos es almacenar los programas y los
datos y tenerlos disponibles para cuando sea requerido su uso. La mayoría de los aspectos de los
sistemas distribuidos de archivos son similares a los de los sistemas con un solo procesador.

En el caso de un sistema distribuido es importante distinguir entre servicio de archivos y


servidor de archivos. El primero de ellos es la especificación de los servicios que el sistema de
archivos ofrece a sus clientes

En segundo lugar, un servidor de archivos es un proceso que se ejecuta en alguna maquina y


ayuda a implantar el servicio de archivos. Un sistema puede tener uno o varios de estos
servidores, pero los clientes no deben conocer el número de servidores de archivos, su posición o
función.

En Windows, los procesos se comunican para pedirse servicios unos a otros mediante el
envío de mensajes, pudiendo asegurar la correcta llegada de estos gracias a la comunicación
síncrona, en la cual el proceso emisor se bloquea hasta que el receptor recibe el mensaje. El
sistema de archivos principal de Windows es el NTFS, que proporciona ventajas frente a los
otros sistemas de archivos más anticuados, como la seguridad del sistema, la cuál proporciona la
confianza de no perder los datos de nuestro sistema frente a problemas que puedan ocurrir en el
computador. El sistema de seguridad proporciona a Windows una estancia segura en el sistema
que nos protege de los diferentes ataques maliciosos y el sistema Login proporciona un acceso
al sistema seguro mediante un identificador de usuario y una contraseña, por lo que se pueden
asignar diferentes privilegios y restricciones a los usuarios del sistema, proporcionando una
mayor versatilidad al sistema operativo.

LINUX es un sistema operativo que puede utilizarse en muchas plataformas informáticas,


pero esencialmente en las PC Intel. El sistema lo diseñaron cientos de programadores
informáticos repartidos por todo el mundo. Con ello se pretendía realizar una réplica de UNIX,
sin programas registrados de por medio, para que todos los usuarios que así lo desearan pudieran
utilizarlo.

LINUX empezó siendo un pasatiempo para Linus Torvalls, cuando éste se encontraba
estudiando en la Universidad de Helsinki (Finlandia). Su idea era crear un sustituto del sistema
operativo Minix, un sistema parecido a UNIX pero compatible con los PC basados en Intel.

Comenzó su trabajo en 1991 cuando liberó la versión 0.02 y continuó hasta que en 1994
liberó el Kernel de LINUX , versión 1.0.

Por último, nos haremos algunas preguntas relativas al software libre como: ¿Qué es el
software libre? ¿Qué diferencias existen entre la programación libre y la propietaria? ¿Cuáles son
las motivaciones de las personas que participan de forma gratuita en el desarrollo del software
libre? ¿Cómo se coordina un proyecto de software libre? Estas y otras cuestiones son las que
vamos a abordar en este documento.

Veremos también como cambio la forma de programar siendo en un principio libre, para
poder compartir los logros y descubrimientos de uno con los demás, al igual que los demás
científicos en sus respectivas áreas. Los intereses que hay detrás de ese cambio y lo que propicio
el nacimiento del software libre como lo conocemos actualmente, así como su implantación y
crecimiento.

-3-
2 Sistemas distribuidos

[1][2] Un SD presenta una serie de ventajas que hacen muy atractivo su uso:

Ventajas

• Posibilidad de compartir recursos: El mejor ejemplo es el de la impresora. Un SD


permite compartir recursos hardware, software o datos.

• Capacidad de crecimiento: Es fácil que un SD crezca para adaptarse a mayores


demandas. Solo hace falta conectar más ordenadores.

• Alto rendimiento: El empleo de múltiples procesadores hace posible la construcción


de un sistema de altas prestaciones que permite ofrecer servicio concurrente a
múltiples usuarios y del que pueden beneficiarse las aplicaciones con algoritmos
paralelizables.

• Fiabilidad y disponibilidad: El hecho de tener muchos ordenadores, ofrece una alta


disponibilidad. Por ejemplo, es posible tener un sistema de ficheros duplicados en
varios nodos (ordenadores), de modo que si un nodo falla, se pueda seguir dando el
servicio. Estoy sería imposible de hacer en un sistema centralizado.

Desventajas

• Necesidad de un software más complejo: el desarrollo y la gestión de la concurrencia


hacen que el desarrollo de aplicaciones distribuidas sea más complejo que el de las
centralizadas, y por ende más propenso a errores.

• Problemas de fiabilidad: debido a la introducción de redes también son posibles


problemas de distintos protocolos en cada nodo. (Especialmente mezclando maquinas
big endian con little endian).

• Seguridad y confidencialidad: La mayoría de la información dentro del mismo


sistema, viaja sin cifrar. Esto puede hacer que personas no autorizadas, accedan a
información no autorizada. Son necesarios mecanismos de seguridad.

2.1 Redes e interconexión de redes

[1] Si los ordenadores están en red, los usuarios tienen la posibilidad de intercambiar
información. A través de diferentes sistemas de comunicación entre procesos, la funcionalidad en
una máquina independiente se puede ampliar a un sistema distribuido.

Los SOD necesitan de grandes estándares para trabajar y sobre todo de ajustes a las
necesidades principales de cada red y sus usuarios. Este concepto propone que cualquier
ordenador debe poder convertirse en parte del sistema.

La ventaja de un SD es que muchas de las funciones mencionadas pueden efectuarse a


grandes distancias. Dos personas en diferentes zonas geográficas pueden trabajar en un mismo
proyecto como si estuvieran en local.

Las redes son las que permiten la comunicación de los procesos, a su vez, se convierten en el
cuello de botella de estos sistemas. Un SD debe ser diseñado en función de su alcance (WAN o
LAN) y una serie de propiedades interesantes de conocer:

-4-
• Tasa de transferencia: Mide la velocidad en que los datos se intercambian entre 2
ordenadores. (KB/s o MB/s)

• Latencia: Es la medida de tiempo que se tarda en transferir un mensaje vacío.

• Tiempo de transferencia: Se calcula como: Latencia + (Tamaño mensaje/Tasa de


transferencia). En un SD la mayoría de los mensajes son pequeños, por tanto, la
latencia es un valor más importante (de optimizar) que la tasa de transferencia, que
solo la notaremos para transferencias de archivos grandes.

• Paquetes / segundo: Es la cantidad de paquetes que se transmiten en un segundo.

• Capacidad de crecimiento: Es interesante saber que ocurre cuando aumentamos el


número de nodos. En el caso de Ethernet, el número de colisiones aumenta a medida
que aumenta el número de ordenadores. Por tanto, se marca como límite un número
de 1024 nodos en un mismo dominio de colisión.

• Calidad de servicio: por calidad se entiende la capacidad del sistema por asegurar
unas capacidades mínimos. Es decir, por ejemplo, un ancho de banda y latencias
mínimos garantizados. Esta característica es muy importante para aplicaciones que
necesiten un flujo continuo de datos.

• Fiabilidad: Es importante conocer la fiabilidad del entorno, para implementar


sistemas detección de errores o no.

• Seguridad: determina los mecanismos que se usan para asegurar la protección del
sistema. Si un componente falla debería haber otro que sea capaz de reemplazarlo
inmediatamente y no afectar al rendimiento del sistema.

El tipo de red es muy variado, dependiendo de la clasificación elegida de la red:

• Por alcance: WPAN, LAN, MAN o WAN.

• Por el medio de la conexión: Cable(coaxial, par trenzado, fibra óptica ...) o Aire(Wifi,
radio, bluetooth, infrarrojos, láser ...)

• Por relación funcional: Cliente/Servidor o Igual/Igual(P2P)

• Por el tipo de transmisión: simple, dúplex(alternando o half) y dúplex(simultaneo o


full)

• Por topología de la red: por la forma de interconectar los ordenadores. Bus, estrella,
Mixta (bus y estrella), Anillo, Doble anillo, árbol, malla o totalmente conexa.

2.2 Protocolos de comunicación

[1] Un mensaje es un objeto lógico que se intercambia entre dos o más procesos. Es necesario
dividir el mensaje en paquetes. El paquete es la unidad mínima de información. El tamaño del
paquete viene dado por el hardware. Es necesario el empleo de protocolos para una
comunicación satisfactoria, esto es un conjunto de reglas e instrucciones que gobiernan el
intercambio de paquetes y mensajes. Los protocolos suelen estructurarse como una pila de
protocolos. Desempeñando funciones como:

-5-
• Fragmentación y ensamblado de mensajes: La obligación de tener que dividir los
mensajes en paquetes, hace que emisor y receptor tengan que implementar
mecanismos para fragmentar en paquetes y para recomponer el mensaje.

• Encapsulado: Cada capa envuelve la información en unas cabeceras. A medida que


bajamos una capa, el paquete recibe nuevas encapsulaciones., Al recibirlo se hace la
operación inversa, y se desencapsula en cada capa.

• Control de conexión: Hay 2 tipos de conexión. Orientada a conexión (con acuso de


recibo o ACK) y no orientado a conexión.

• Control de Flujo: Esta función la desempeña el receptor para marcar el ritmo de la


transferencia. De esta forma evita que el emisor, le inunde de mensajes.

• Control de Errores: Se trata de controlar los mensajes perdidos y pedir el reenvío si se


trata del tipo orientado a conexión.

• Direccionamiento: Mediante algoritmos de encaminamiento, el direccionamiento


permite que los mensajes alcancen al receptor.

2.3 Tipos de sistemas distribuidos

[1] Existen varios tipos de sistemas que ofrecen soporte a aplicaciones distribuidas:

Sistemas operativos de red: Es lo más habitual en ordenadores personales, maquinas


independientes, cada uno con su SO que cumple unos protocolos de comunicación.

Sistemas operativos distribuidos: distintas maquinas con un SO distribuido que debe cumplir
lo siguiente:

• Hacer creer a los usuarios que están en un sistema centralizado. Visión única del
sistema o Transparencia (todos los recursos que están dentro del sistema son visto
como locales a pesar de que realmente los recursos son remotos y existe toda una
abstracción de compartición de recursos.).

• La transferencia debe ser: de acceso, posición, migración, concurrencia, replicación,


fallos y crecimiento.

• Además de la transparencia, debe cumplir: Fiabilidad (Deben ser confiables (hacer lo


que el usuario quiere) y estables.), Rendimiento, Capacidad de crecimiento (El
sistema debe añadir o eliminar los nuevos ordenadores que vayan apareciendo como
si se tratase de sumar o restar recursos. Todo esto proceso de manera transparente al
usuario.), Flexibilidad (describe su capacidad para soportar cambios, actualizaciones
y mejoras que le permitan irse desarrollando al mismo ritmo de la evolución
tecnológica. aquí entra la discusión de si un SOD debe ser un núcleo monolítico (más
rápido pero menos susceptible a cambios). O un micro núcleo estructurado en
módulos.

Middlewares: CORBA, DCOM... Es un software / librería que se monta normalmente en


sistemas operativos de red para ofrecer una serie de servicios y protocolos estandarizados que
faciliten la construcción de SD. Ofrece transparencia, etc....

-6-
2.4 Modelos de computación distribuida

[1] A continuación se describen los servicios:

Modelo cliente-servidor: Es el modelo más utilizado para realizar aplicaciones distribuidas.


Existe un proceso servidor y uno o varios procesos clientes. Este modelo se utiliza en muchos
servicios de Internet como HTTP, FTP, DNS... Este concepto también puede aplicarse a los
ordenadores servidor o cliente, cuyo nombre se debe a que la ejecución de la mayoría de sus
procesos son de tipo servidor o de tipo cliente.

Peer-to-peer: En el modelo cliente-servidor hay una clara diferenciación. El servidor ofrece a


los clientes servicios y los clientes utilizan estos servicios. En sistemas P2P los procesos que
participan en la comunicación realizan los mimos papeles: de cliente y de servidor. Este sistema
está más asociado a lo que es la informática distribuida, ya que se olvida de la centralización y
tiene un sistema más dinámico y descentralizado.

Cluster: es un conjunto de ordenadores conectados por una red de alta velocidad (Gigabit
Ethernet, Myrineto InfiniBand). Los computadores individuales pueden ser PC convencionales
que se instalan en un rack. Todos los ordenadores trabajan como un único recurso de
computación, mostrándose como un único sistema. El objetivo de la computación de altas
prestaciones es ofrecer un modelo para alta productividad y para el procesamiento de
aplicaciones paralelas. La productividad se refiera a ser capaz de realizar el mayor número de
trabajos en el menor tiempo posible. En un cluster todos los ordenadores comparten los discos y
los distintos ordenadores que lo forman están continuamente monitorizando para detectar
posibles fallos de hardware. Si se detecta un fallo, se planifica el trabajo del nodo erróneo en otro
ordenador, de forma que el usuario no percibe la parada del servicio. Los cluster se realizan
mediante un middleware que gestiona todo. Un cluster puede ser homogéneo (misma
arquitectura, SO...) o heterogéneo (distintos entornos, middlewares más complejos).

Grid: El concepto de grid, es similar al concepto de cluster. La principal diferencia con un


entorno cluster, es que en un entorno grid, los diferentes computadores del grid no pertenecen a
un mismo dominio de administración y por tanto están sujetos a diferentes políticos de uso y de
administración. La primera mención, y su definición viene dada por Ian Foster: "Un sistema que
coordina recursos, que no están sujetos a un control centralizado usando interfaces y protocolos
estándares, abiertos y de propósito general para proveer de servicios relevantes"

2.5 Procesos

2.5.1 Hilos o Threads

En la mayoría de sistemas distribuidos, cada proceso tiene un espacio de direcciones y un hilo


de control, pero con frecuencia un proceso puede tener varios hilos que comparten un mismo
espacio de direcciones y que se ejecutan de manera cuasi-paralela. Esto hace que la se tenga un
mejor rendimiento y desempeño. Solo en un multiprocesador se pueden ejecutar los hilos de
forma paralela

Los hilos son pequeños microprocesos que se ejecutan de forma estrictamente secuencial,
tiene un contador de programa y una pila para llevar un registro a su posición. Los hilos pueden
crear hilos hijos y se pueden bloquear en espera de que se terminen sus llamadas al sistema.

Los distintos hilos de un proceso no son tan independientes como los procesos, ya que todos
los hilos de un proceso tienen el mismo espacio de direcciones por lo que comparten también las

-7-
mismas variables globales. Un hilo puede tener acceso a cada dirección virtual o a leer, escribir o
limpiar la pila de otro hilo, pero no existe protección entre hilos ya que es imposible y no es
necesaria.

Como los procesos tradicionales, los hilos pueden tener los siguientes estados:

• En ejecución: un hilo en ejecución posee la CPU y esta activo.

• Bloqueado: un hilo bloqueado espera que otro elimine el bloqueo.

• Listo: un hilo listo esta programado para su ejecución, la cual se producirá cuando llegue
su turno.

• Terminado: un hilo terminado es aquel que ha hecho su salida, pero que todavía no es
recogido por su padre.

1.1.1 Diseño

Un conjunto de primitivas relacionadas con los hilos disponibles para los usuarios se llama un
paquete de hilos. Según el manejo de los hilos se tienen hilos estáticos e hilos dinámicos.

En un diseño estático:

• Se elige el número de hilos al escribir el programa o durante su compilación.

• Cada uno de ellos tiene asociada una pila fija.

• Se logra simplicidad pero también inflexibilidad.

En un diseño dinámico:

• Se permite la creación y destrucción de los hilos durante la ejecución.

• La llamada para la creación de hilos determina:

o El programa principal del hilo.

o Un tamaño de pila.

o Una prioridad de planificación, etc.

• La llamada generalmente regresa un identificador de hilo:

o Se usará en las posteriores llamadas relacionadas al hilo.

• Un proceso:

o Se inicia con un solo hilo.

o Puede crear el número necesario de hilos.

Los hilos pueden concluir de dos maneras, por cuenta al terminar su trabajo, o por
eliminación desde el exterior. Estos comparten una memoria común que contiene los datos que
los distintos hilos comparten. El acceso generalmente se controla mediante regiones críticas

-8-
1.1.2 Implantación

Existen dos métodos para la implantación de un paquete de hilos: en el espacio del usuario y
en el espacio del núcleo. La implantación de los hilos en el espacio del usuario consiste en
colocar el paquete de hilos en el espacio del usuario sin que el núcleo sepa de su existencia.

La ventaja de tener un paquete de hilos implantado en el espacio del usuario es que se puede
implantar en un sistema operativo que no tiene que soportar dichos hilos. Estas implantaciones
tienen la misma estructura general en la cual los hilos se ejecutan en la parte superior de un
sistema al tiempo de ejecución que es una colección de procedimientos que manejan los hilos.
Otra ventaja es que cada proceso tiene su algoritmo de planificación adaptado.

Esta implantación también tiene problemas. El primero de ellos es la implantación de las


llamadas al sistema con bloqueo ya que un hilo que lea un entubamiento que haga que provoque
un bloqueo afectara al objetivo de permitir que cada hilo utilice la llamada con bloqueo pero
evitando que un hilo bloqueado afecte a los demás.

Otro problema son los fallos de página ya que si un hilo causa un fallo de página, el núcleo
bloquea todo el proceso hasta que se incluya la página necesaria, aunque se puedan correr otros
hilos.

Otro problema si un hilo comienza su ejecución, los demás hilos de ese proceso no pueden
ejecutarse hasta el que hilo entregue la CPU.

Otro problema, tal vez el peor, es la falta de hilos en aplicaciones donde los hilos se bloquean
a menudo.

La implantación de hilos en el espacio del núcleo consiste en hacer una llamada al núcleo
cuando un hilo desea crear o destruir un hilo y se realiza entonces la creación o destrucción. Para
controlar todos los hilos, el núcleo tiene una tabla con una entrada por cada hilo con los
registros, estado, prioridades y demás información del hilo. Esta información es la misma que en
el cado de los hilos a nivel usuario. Un problema de esta implantación es el gran costo de
creación y destrucción de hilos en el núcleo, pero alguno sistemas utilizan el reciclaje de hilos
que consiste en marcar como no ejecutable un hilo al destruirlo sin afectar a las estructuras del
núcleo y posteriormente al tener que crear un hilo se reactiva el hilo marcado como no
ejecutable.

Los hilos del núcleo no requieren llamadas al sistema sin bloqueo, ni generan bloqueos
cuando se utiliza la espera ocupada.

La principal desventaja es el gran coste de llamada a un sistema de manera que si las


operaciones con los hilos son comunes, tendremos un gran coste de llamadas.

Los objetivos de las activaciones del planificador son imitar las funciones de los hilos del
núcleo pero con el mejor desempeño y flexibilidad de los paquetes de hilos implantados en el
espacio de usuario.

1.1.3 Procesos estándar frente a los hilos

En los sistemas distribuidos se emplean hilos con la RPC. Los hilos se inventaron como
alternativa de menor coste que la RPC. Puesto que la RPC tiene un mayor coste se investigo para
intentar aligerarlas y se encontraron dos técnicas:

-9-
• La primera técnica de Bershad consiste en iniciar un hilo servidor que exporta su interfaz
al núcleo. La interfaz define los procedimientos, parámetros, etc. Después se inicia el hilo
cliente, se exporta la interfaz y se le asigna un identificador. El núcleo sabe que el cliente llamara
al servidor y crea una estructura de datos de la cual una es una pila de argumentos compartida
por el cliente y el servidor y que se asocia de manera lectura/escritura en ambos espacios de
direcciones.

• Otra técnica se basa en la idea de que al bloquearse un hilo servidor que espera una
solicitud, esta no tiene que tener información importante referente al contexto, por lo tanto
cuando un hilo termina de atender una solicitud, desaparece y se descartan su pila y la
información del contexto. Después al llegar un mensaje a la maquina servidora el núcleo crea un
nuevo hilo para la solicitud, se asocia el mensaje con el espacio de direcciones del servidor y se
configura la pila el nuevo hilo. Este esquema se conoce como recepción implícita.

Este método tiene ciertas ventajas respecto al RPC convencional. La primera ventaja es que
los hilos no tienen que bloquearse a la espera de trabajo. La segunda ventaja es que la creación
de un hilo es menos costosa que la reutilización de un hilo. Y la última ventaja es que se ahorra
tiempo no copiando los mensajes recibidos a un buffer dentro del hilo servidor

2.5.2 Diseños de un Sistema Distribuido

Los sistemas distribuidos tienen varios procesadores, por lo que vamos a analizar como se
pueden organizar. Existen varios modelos que explicaremos en los siguientes apartados.

1.1.4 El modelo de estación de trabajo

Este sistema es directo, está formado por estaciones de trabajo repartidas y conectadas
mediante una red de área local LAN. Estas estaciones pueden estar inactivas. Los usuarios
disponen de una cantidad fija de poder de cómputo exclusiva y un alto grado de autonomía para
asignar los recursos de su estación de trabajo.

Cada estación de trabajo puede disponer de un disco rígido. En las estaciones sin disco el
sistema se debe cargar desde un servidor, el cual también mandara las respuestas a las solicitudes
realizadas por esa estación. Este tipo de estaciones son más baratas, tienen mayor facilidad para
el mantenimiento del hardware y del software, y son más simétricas y flexibles. El problema es
que los servidores se pueden convertir en cuellos de botella.

En las estaciones con disco podemos dividirlo de varias formas. En el primer esquema
tenemos un disco para la paginación con unos archivos de tipo borrador, reduciríamos la carga de
la red pero necesitaríamos muchos discos por lo que supondría un alto costo. Otro esquema sería
tener un disco para la paginación, archivos de tipo borrador y archivos binarios ejecutables, con
este esquema conseguiríamos reducir más la carga en la red, pero aumentaríamos su costo ya que
necesitamos actualizar los binarios. El siguiente esquema consiste en tener un disco para la
paginación, un borrador, archivos binarios y ocultamiento de archivos, con este esquema
reduciríamos aun más la carga de red y de los servidores de archivos, pero tendríamos dos
grandes problemas, el alto coste y la consistencia de la cache. La última opción es tener el
sistema de archivos completo, obteniendo una escasa carga en la red, y sin la necesidad de tener
servidores de archivo, pero perderíamos transparencia.

1.1.5 El modelo de la pila de procesadores

En este modelo los procesadores se asignan dinámicamente a los usuarios según la demanda.
A los usuarios se les dan terminales gráficas de alto rendimiento, ya que la mayoría de usuarios

- 10 -
buscan una interfaz gráfica de calidad eficiente. Estos procesadores se utilizan compartidamente
entre todos los usuarios, los cuales pueden obtener datos de la CPU durante periodos cortos, y
luego regresan a la pila para ser utilizados por otros usuarios.

Estel modelo es más eficiente que el modelo de búsqueda de estaciones inactivas.

1.1.6 El modelo híbrido

Este modelo combina los dos modelos anteriores. Consta de estaciones de trabajo y una pila
de procesadores. El trabajo interactivo se ejecuta en cada estación de trabajo, y el no interactivo
o más pesado en la pila de procesadores, obteniendo una respuesta más rápida, un diseño sencillo
y un uso de los recursos adecuado.

1.1.7 El problema de las estaciones de trabajo inactivas

Una estación de trabajo se considera inactiva cuando nadie toca el ratón o el teclado durante
un tiempo, o cuando tiene procesos iniciados por el usuario.

Para encontrar una estación inactiva usamos dos algoritmos.

El primero son los algoritmos controlados por el servidor. Este algoritmo convierte la
estación inactiva en servidor potencial, comunicando que está disponible dando su nombre,
dirección y propiedades. Cuando dos usuarios quieren acceder al mismo tiempo a la máquina
inactiva, solo progresa la primera solicitud detectada, después se quita la estación como inactiva,
y el usuario ya puede iniciar el proceso remoto.

El segundo son los algoritmos controlados por el cliente. El cliente envía la solicitud con las
aplicaciones que desea, la memoria necesaria, y los requerimientos necesarios. Al obtener la
respuesta se elige la estación y se configura.

Otro aspecto clave es como ejecutar un proceso remoto de forma transparente. Para poder
ejecutar un proceso en la estación remota, debemos conseguir un desplazamiento del código, y
configurar el proceso remoto para que vea el mismo ambiente y se ejecute de la misma forma
que en el caso local. Si trabajamos sobre el servidor de archivos se envían las solicitudes de
disco al servidor. Sin embargo, si trabajamos con discos locales, las solicitudes se envían a la
máquina de origen para ejecutarlas,

Las operaciones de lectura del teclado y la escritura en pantalla, nunca deben ser ejecutadas
en una maquina remota, sino en la máquina de origen.

Para solicitar el estado de una maquina deben realizarse en la maquina donde se ejecuta el
proceso.

Las llamadas al sistema relacionadas con el tiempo son un serio problema debido a las
dificultades de sincronización.

Cuando regrese el poseedor de la maquina, podríamos no hacer nada contra la idea de


estaciones de trabajo personales. También se podría eliminar el proceso intruso abruptamente,
perdiendo trabajo y produciendo el caos; o podríamos eliminarlo ordenadamente salvando el
procesamiento y preservando la integridad del sistema de archivos. Otra solución es emigrar el
proceso a otra estación.

- 11 -
2.5.3 Asignación de Procesadores

En un sistema distribuido hay varios procesadores organizados con distintos modelos, por lo
que debemos asignar correctamente cada proceso a cada procesador. Para ello utilizaremos una
serie de algoritmos, para optimizar una serie de objetivos diferentes en cada sistema. Estos
objetivos son minimizar el tiempo de promedio de respuesta, minimizar la tasa de respuesta, y
evitar o maximizar el tiempo inactivo de la CPU.

Podemos dividir estos algoritmos en dos categorías, no migratorio y migratorio. En el no


migratorio el proceso creado se coloca en una máquina y no se mueve de ahí hasta que termina.
En el migratorio el proceso se puede mover entre máquinas.

1.1.8 Diseño de Algoritmos

Para diseñar los algoritmos debemos tener en cuenta una serie de criterios.

Los algoritmos deterministas son útiles cuando sabemos de antemano el comportamiento de


los procesos. Cuando desconocemos la carga debemos utilizar los algoritmos heurísticos.

Los algoritmos centralizados reúnen la información en un procesador, la desventaja es que


este se puede sobrecargar y perder información si se produce algún error. Seria mejor el uso de
algoritmos distribuidos, el problema es que los algoritmos propuestos descentralizados carecen
de robustez.

Otro aspecto es la política de transferencia, se debe decidir donde ejecutaremos el proceso si


en la máquina donde se origino o en otra, para ello podemos usar información local o global. Los
algoritmos locales no son óptimos, y los globales son mejores pero consumen demasiados
recursos.

El último punto a tener en cuenta es la política de localización. Una máquina que libera un
proceso tiene que decidir donde enviarlo, para ello busca emisores sobrecargados y receptores
subcargados.

1.1.9 Implantación de Algoritmos

Los algoritmos parten de que conocen su propia carga y pueden informar de su estado. Hay
varios métodos para medir la carga. Uno es contar el número de procesos. Otro solo cuenta los
procesos en ejecución. El último mide la fracción de tiempo que la máquina esta ocupada.

En la implantación, nos surge otro punto importante, el costo excesivo. Los algoritmos
teóricos no tienen en cuenta el consumo de recursos cuando buscamos medidas y desplazamos
los procesos. Estos algoritmos deberían considerar el tiempo de la máquina, el uso de la memoria
y el ancho de banda de la red.

Otro aspecto importante es la complejidad del software. A la hora de medir la calidad de los
algoritmos no lo tienen en cuenta.

También debemos considerar la estabilidad del sistema, ya que el sistema nunca se equilibra
porque se ejecutan los algoritmos en forma asíncrona. Los algoritmos de intercambio son
equilibrado si se intercambia cuando las tablas no están en actualizándose.

- 12 -
1.1.10 Ejemplos de algoritmos

Algoritmo determinista mediante gráficas:

El objetivo de este algoritmo es minimizar el tráfico en la red, cuando tenemos que asignar
varios procesos a un procesador. Para ello utilizaremos una gráfica, que represente el sistema,
divida en subgráficas teniendo en cuenta las restricciones de la memoria y el procesador. Cada
subgráfica representa la unidad de asignación. El algoritmo debe buscar tráfico intenso dentro de
la unidad de control y escaso entre las unidades de asignación. La desventaja de este algoritmo es
que necesita saber los requerimientos de la CPU y la memoria, y el tráfico entre procesos

Algoritmo centralizado:

Este algoritmo evita maximizar el uso de la CPU, asignando de manera justa la capacidad. A
diferencia del algoritmo determinista, este algoritmo es heurístico y no necesita saber la
información a priori.

La asignación de procesadores se realiza mediante una tabla de usos coordinada por una
máquina central. En esta tabla se crea una entrada por cada estación de trabajo inicializada a
cero, los eventos significativos se mandan al coordinador para actualizar la tabla. En la tabla
guardamos los puntos de penalización de cada usuario. Si el usuario ejecutara procesos en
máquinas de otros usuarios se le sumarian puntos, y si tuviera solicitudes no atendidas se le
restarían puntos. En el caso de que no hubiera solicitudes pendientes ni procesadores ocupados,
la entrada de la tabla de usos se desplaza un número de puntos hacia el “0”, hasta alcanzarlo.

Cuando un procesador se libera, gana la solicitud pendiente con menor puntuación, de esta
forma un usuario que no use muchos procesadores y tenga solicitudes pendientes, ganara a otro
que use muchos procesadores, repartiendo la capacidad equitativamente.

Si la máquina donde creamos el proceso, quiere moverlo a otra procesador, le manda una
petición el coordinador de la tabla de usos, si hay un procesador libre y ningún usuario lo quiere
se le asigna, y si no la solicitud es negada y se registra.

Este algoritmo recibe el nombre de arriba y abajo, por el movimiento de puntos.

Algoritmo Jerárquico:

El problema del anterior algoritmo es que el procesador central se sobrecarga y puede fallar
todo el sistema. Para solucionar esto utilizamos los algoritmos jerárquicos.

Este algoritmo divide a los procesadores en jerarquías lógicas con distintos niveles. Cada
grupo de procesadores tiene una máquina coordinadora, que tiene el registro de las máquinas
ocupadas e inactivas. Para mantener el flujo de la información controlada, cada procesador se
comunica con unos pocos subordinados y uno superior. De esta forma en el caso de falla de un
procesador superior, uno subordinado se puede hacer cargo. Para hacer esta jerarquía más solida
se debe poner un grupo de equipos en la parte superior del árbol, por si alguno del grupo falla,
los demás puedan ascender a un subordinado. Si un coordinador no tiene suficientes
procesadores para hacerse cargo de la solicitud, la manda hacia su superior, y así sucesivamente
hasta satisfacer la solicitud. El procesador que satisface la solicitud la debe partirla y distribuirla
entre sus subordinados, hasta llegar al nivel inferior. El número asignado de procesadores se
comunica al administrador y se señalan como ocupados.

- 13 -
Este algoritmo da problemas cuando hay varias solicitudes en las distintas etapas del
algoritmo de asignación, pudiendo producir bloqueos ya que el número ocupado de procesadores
puede no estar actualizado.

Algoritmo Distribuido Heurístico iniciado por el emisor (Eager):

Este algoritmo reparte los procesos en cada máquina hasta alcanzar un cierto valor. Envía
mensajes a una maquina cualquiera desde la que se origina el proceso, para averiguar si la carga
está por debajo de un valor, si es menor se envía el proceso a esa máquina y si no se repite en
cada una de las máquinas hasta encontrar una. En el caso de que no encontrara ninguna máquina
disponible, el proceso se ejecuta en la máquina donde se genero el proceso.

En estaciones con mucha carga, las pruebas serian constantes y el costo aumentaría.

Algoritmo Distribuido Heurístico Iniciado por el Receptor

Este algoritmo es complementario al anterior, solo que este se inicia por un receptor
subcargado. Al terminar un proceso se establece si tiene carga suficiente, sino tiene se solicita
trabajo a las otras máquinas, sino encuentra más trabajo vuelve a intentarlo más tarde. Las
ventajas de este algoritmo es que no sobrecarga el sistema en momentos críticos

Podríamos hacer un algoritmo que combinara estos dos últimos, para que cuando el sistema
este cargado reparta el trabajo, y lo pida cuando tiene poco.

Algoritmo de Remates

Este algoritmo utiliza en modelo económico creado por Ferguson, con compradores y
vendedores, y la ley de la oferta y la demanda. En nuestro caso los compradores serían los
procesos, y los vendedores los procesadores. El precio de los procesadores viene establecido
según sus características y servicios. Estos precios se anuncian en un archivo a los procesos.

Cuando el proceso quiere iniciar un proceso hijo, busca los procesadores que ofrezcan el
servicio deseado, establece que procesadores están libres, elige el mejor candidato y genera una
oferta al procesador elegido.

El procesador reúne todas las ofertas recibidas y eligen la mejor, comunicándoselo a los
procesos. Después actualizan los precios, con la cifra pagada por el último cliente.

2.5.4 Planificación de Procesadores

Cada procesador realiza su planificación local cuando tiene ejecutados varios procesos.
Cuando tenemos varios procesos relacionados, y se ejecutan en distintas máquinas este tipo de
planificación no es eficiente, ya que la comunicación entre los procesos no se ejecutaría
simultáneamente.

El algoritmo de Ousterhout, utiliza el concepto de coplanificación. Tiene en cuenta los


patrones de comunicación para garantizar que se ejecuten simultáneamente todos los miembros
del grupo. Para ello emplea una matriz conceptual, en la que las filas son los espacios de tiempo,
y las columnas son las tablas de procesos de cada procesador. Todos los procesadores deben
utilizar un algoritmo de planificación round robin, para que durante un período de tiempo fijo los
procesadores ejecuten el proceso en el espacio “0”, después en el espacio “1”, y así
sucesivamente, manteniendo sincronizados los intervalos de tiempo.

- 14 -
Para que la comunicación sea optima, todos los miembros del grupo se deben colocar
paralelamente, en el mismo número espacio de tiempo pero en procesadores distintos.

Ousterhout, realizo una serie de cambios en esta planificación para mejorar la eficacia. Uno
cambio es separar la matriz en renglones concatenados, dejando una ventana de entradas en el
reglón, ocupando la entrada justo a la izquierda de la ventana y dejando libre la entrada del
extremo izquierdo. De esta forma cuando tengamos suficientes entradas, los procesos son
asignados a las entradas vacías, o desplazamos la ventana a la derecha y repetimos el proceso.

2.6 Comunicación de procesos en sistemas distribuidos

2.6.1 Tipos de comunicación

[1] Hemos dicho que las redes nos permiten el paso de mensajes entre ordenadores. Existen
dos enfoques de comunicación:

Mecanismos de bajo nivel: En este esquema el programador se encarga de establecer los


protocolos de comunicación, la forma de representación de datos, etc.... Ejemplo de estos tipos
que veremos más adelante son los sockets, comunicación por variables de entorno, comunicación
mediante señales, comunicación mediante entrada/salida y técnicas IPC como cola de mensajes,
semáforos o memoria compartida.

Mecanismo de alto nivel: son abstracciones que facilitan la programación ya que el


programador no debe preocuparse de aspectos de bajo nivel como son, el paso de mensajes.
Ejemplos de estos tipos que veremos más adelante son RPC y D-Bus.

1.1.11 Sockets

Un socket es una abstracción que representa un extremo en la comunicación bidireccional


entre dos procesos. Ofrece una interfaz para acceder a los servicios de red en el nivel de
transporte del protocolo TCP/IP. Se puede decir que los sockets constituyen la interfaz de
programación más básica para el desarrollo de aplicaciones en Internet.

Utilizando esta interfaz, dos procesos que desean comunicarse, crean cada uno de ellos un
socket o extremo de comunicación. Cada socket se encuentra asociado a una dirección y permite
enviar o recibir datos a través de él.

Tipos de sockets

[1] Existen dos tipos de sockets que determinan el tipo de comunicación empleada:

• Sockets de tipo stream: (SOCK_STREAM): Con este tipo de sockets la comunicación es


orientada a conexión. El intercambio de datos utilizando sockets de este tipo es fiable y
además se asegura el orden en la entrega de los mensajes. El canal de comunicaciones puede
verse como un flujo de bytes en el que no existe separación entre los distintos mensajes. Esto
quiere decir que el emisor puede enviar por ejemplo 1KB y el receptor puede recibirlo de
100 bytes en 100 bytes. Cuando se emplea el dominio PF_INET, este tipo de sockets
corresponde al de la capa de transporte TCP.

• Sockets de tipo datagrama: (SOCK_DGRAM): Este tipo de sockets se corresponde con una
comunicación no orientada a conexión. Los mensajes en este caso se denominan datagramas
y tienen un tamaño máximo de 64 KB. No se asegura fiabilidad, los datagramas se pueden

- 15 -
perder y tampoco se asegura la entrega ordenada de los mismos. En este caso, si existe
separación entre cada uno de los distintos datagramas. Cuando se emplea el dominio
Internet, los sockets de este tipo permiten acceder a servicios del protocolo de transporte
UDP.

Pueden existir problemas en el envío de datos, debido a las distintas arquitecturas. Unas
maquinas pueden representar los enteros en little endian y otras maquinas hacerlo en big endian.
Antes de entregar el dato a las funciones send() y después del recv() debemos utilizar las
siguientes funciones:

1.1.12 A través de variables de entorno

Solo es posible de padres a hijos. Se utiliza el mecanismo de fork para la creación de hijos
con variables establecidas por los padres.

1.1.13 Mediante una señal

Solo indica que algo ha ocurrido y solo lleva como información un número de señal.

La señal es un evento que debe ser procesado y que puede interrumpir el flujo normal de un
programa.

Las señales se asocian a una función que procesa el evento que ha ocurrido. También pueden
ser ignoradas.

1.1.14 Mediante entrada salida

La forma más simple de IPC en Linux son los pipes o tuberías, han estado presentes desde los
primeros orígenes del sistema operativo UNIX y proporcionan un método de comunicaciones en
un sentido (unidireccional, semiduplex) entre procesos.

Una tubería (pipe) es simplemente un método de conexión que une la salida estándar de un
proceso a la entrada estándar de otro. Para esto se utilizan “descriptores de archivos” reservados,
los cuales en forma general son:

• 0: entrada estándar (stdin).

• 1: salida estándar (stdout).

• 2: salida de error (stderr).

Este mecanismo es ampliamente usado, incluso en la línea de comandos UNIX (en la shell):

1.1.15 Mediante técnicas IPC u otras

Aquí se incluyen mecanismos como semáforos, memoria compartida y cola de mensajes.


Éstos poseen una serie de características comunes que se pueden resumir en los siguientes
puntos:

• Una estructura con información acerca de qué se está haciendo con dicho mecanismo.

• Una estructura que define los permisos de los usuarios y grupos de usuarios que
pueden acceder al mecanismo IPC.

- 16 -
• Una clave de acceso o llave.

• Un conjunto de funciones que permitirán realizar un control sobre el mecanismo en


cuestión. Este conjunto se puede dividir en tres subconjuntos:

o La familia get, para crear o buscar un mecanismo.

o La familia ctl, para realizar operaciones de control y suprimir mecanismos.

o Un conjunto de funciones particulares a cada mecanismo (msgsnd, shmat,


etc.)

1.1.16 Colas de mensajes

Una cola de mensajes funciona como una FIFO, pero con algunas diferencias. Generalmente,
los mensajes son sacados de la cola en el orden en que se pusieron. Sin embargo, hay maneras de
sacar cierto mensaje de la cola antes de que alcance llegar al inicio de la cola.

Un proceso puede crear una nueva cola de mensajes, o se puede conectar a una ya existente.
De esta forma, dos procesos pueden compartir información mediante la misma cola de mensajes.

Una vez que se crea una cola de mensajes, esta no desaparece hasta que se destruya. Todos
los procesos que alguna vez la usaron pueden finalizar, pero la cola todavía existirá. Una buena
costumbre sería usar el comando ipcs para verificar si existe alguna cola de mensajes que ya no
esté en uso y destruirla con el comando ipcrm.

1.1.17 Semáforos

Un semáforo es un mecanismo de comunicación con el cual no se mueven datos, puesto que


solo se puede consultar y modificar su valor al tener un carácter puramente informativo.

Dijkstra define un semáforo como una variable entera positiva o nula sobre la que sólo se
pueden realizar dos operaciones: wait (también denominada P) y signal (también denominada V).
La operación wait decrementa el valor del semáforo siempre que éste tenga un valor mayor que
0; por lo tanto esta operación se utiliza para adquirir el semáforo o para bloquearlo en el caso de
que valga 0. La operación signal incrementa el valor del semáforo y por tanto se utiliza para
liberarlo o inicializarlo.

Ambas operaciones deben ser atómicas para que funcionen correctamente; es decir que una
operación wait no puede ser interrumpida por otra operación wait o signal sobre el mismo
semáforo, y lo mismo ocurre para la operación signal. Este hecho garantiza que cuando varios
procesos compitan por la adquisición de un semáforo, sólo uno de ellos va a poder realizar la
operación.

Además, se ha de indicar que este mecanismo memoriza las peticiones de operaciones wait no
satisfechas y despierta por tanto a los procesos en espera.

1.1.18 Memoria compartida

Memoria compartida es una región de memoria que puede ser accedida por múltiples
procesos. Por ejemplo, si declaramos un vector de 1000 bytes en un programa, sólo puede
acceder a él ese programa. Si declaramos un segmento de memoria compartida de 1000 bytes,

- 17 -
muchos procesos pueden realizar operaciones de lectura y escritura sobre esa memoria
compartida.

La ventaja principal de la memoria compartida es que un programa la ve exactamente de la


misma forma que si fuera memoria normal. Además, las operaciones de lectura y escritura son
muy rápidas. Su utilización es relativamente simple. De la misma forma que las colas de
mensajes, cada segmento de memoria compartida tiene asociado una clave. Esta identifica de
forma unívoca el segmento de memoria compartida, y cualquier proceso que desee acceder a él
necesita conocer la clave.

En general, la memoria compartida se emplea cuando se necesita transferir gran cantidad de


datos en un corto período de tiempo.

1.1.19 Llamadas a procedimientos remotos (RPC)

Las llamadas a procedimientos remotos (RPC, Remote Procedure Call) representan un


híbrido entre las llamadas a procedimientos y el paso de mensajes. Las RPC constituyen el
núcleo de muchos sistemas distribuidos y llegaron a su culminación con DCE(Distributed
Computing Environment). Actualmente han evolucionado hacia la invocación de métodos
remotos como los utilizados en CORBA y RMI de Java. En una llamada a RPC, el programador
no debe preocuparse de que forma se realiza la comunicación entre los procesos, simplemente
realiza llamadas a procedimientos que serán ejecutados en ordenadores remotos.

Este proceso se realiza mediante stubs o suplentes. Se puede resumir mediante los siguientes
pasos:

1. El procedimiento cliente llama al stub del cliente.

2. El stub del cliente construye un mensaje y lo registra en el núcleo.

3. El núcleo envía el mensaje al núcleo remoto.

4. El núcleo remoto proporciona el mensaje al stub del servidor.

5. El stub del servidor, desempaqueta los parámetros y llama al servidor.

6. El servidor realiza el trabajo y regresa el resultado al stub.

7. El stub del servidor registra el resultado en el núcleo.

8. El núcleo remoto envía el dato al núcleo.

9. El núcleo del cliente da el mensaje al stub del cliente

10. El stub del cliente desempaqueta el resultado y regresa al procedimiento cliente.

De forma transparente, RPC trataría de solucionar todos los problemas de representación de


datos, causados por trabajar en distintas arquitecturas. (comentado antes en socket) RPC utiliza
estándares de representación como XDR (External Data Representation).

Este tipo de llamadas remotas tiene un nuevo problema, son el problema con los punteros,
estos procedimientos presentan problemas ya que una dirección de memoria sólo tiene sentido en
el espacio de direcciones local. Algunas implementaciones de RPC prohíben el uso de punteros

- 18 -
en RPC. Otras por su parte se encargan de enviar la información a la que apuntan los punteros.
Normalmente, en RPC, solo es posible enviar datos, no direcciones de memoria.

1.1.20 D-Bus

D-Bus (Desktop Bus) es un sistema de comunicación entre procesos (IPC), para aplicaciones
de software con el fin de comunicarse entre sí. D-Bus es desarrollado como parte del proyecto
freedesktop.org.

Es particular de Linux, y lo veremos en el apartado correspondiente a la implementación


Linux.

1.1.21 Comunicación de grupos

En el modelo cliente-servidor se habla de comunicaciones uno-uno. también son posibles las


comunicaciones en grupo, esto se basa en la utilización de primitivas de comunicación que
permiten el radiado de mensajes(mediante multicast o broadcast). Se trata de una conversación
uno a muchos, en la que el proceso envía un mismo mensaje a un grupo de procesos. En una
operación multicast, el emisor envía el mensaje a un subconjunto de todos los procesos del
grupo, en cambio por broadcast, es recibido por todos los procesos del grupo.

Esto es útil tanto para servidor como para clientes. Determinados servidores pueden anunciar
sus servicios por broadcast, mediante los clientes pueden pedir servicios a todos los servidores.

Existen diferentes tipos de radiado, cada uno con sus características propias:

• Radiado no fiable: en este tipo de radiado no hay garantía de que el mensaje se


entregue a todos los miembros del grupo.

• Radiado fiable: Se asegura que el mensaje es recibido por todos los miembros del
grupo en funcionamiento.

• Radiado atómico: El protocolo asegura que todos los miembros del grupo reciben los
mensajes de diferentes nodos en el mismo orden.

El modelo de comunicación en grupos se ha implementado en algunos sistemas como ISIS y


HORUS. La implementación de este tipo de primitivas se suele realizar mediante operaciones
punto a punto, lo cual representa un mecanismo muy poco fiable ya que pueden aparecer dos
problemas de fiabilidad: algunos mensajes se pueden perder y el proceso emisor puede fallar
después de realizados algunos envíos. En este caso, algunos de los procesos, no recibirán el
mensaje.

2.6.2 Sincronización de sistemas distribuidos

En un sistema distribuido la sincronización de procesos es más complicada que en entornos


centralizados debido a que los procesos no comparten memoria ni reloj. En el punto anterior,
hemos visto que podemos comunicar los procesos mediante uso de sockets, RPC ... pero
seguimos teniendo el problema de que cada ordenador tiene su propio reloj. Por ello, vamos a
estudiar la forma de ordenar los eventos que ocurren en un sistema.

Es fundamental la forma en que los procesos se sincronizan y cooperan entre sí. Los SOD
continúan necesitando gestionar los problemas relativos a la exclusión mutua, regiones críticas y

- 19 -
la sincronización. En sistemas de una CPU estos problemas se resuelven con métodos como
semáforos y monitores. Estas soluciones no son válidas para SOD.

En los relojes físicos para sistemas donde es importante la hora real del reloj, (como sistemas
de tiempo real), se precisan relojes físicos externos o desarrollar algún tipo de algoritmo.

1.1.22 Conceptos previos

Relojes Lógicos y Físicos

Los ordenadores poseen un circuito que guarda el tiempo conocido. Esto se consigue con un
cristal que oscila al aplicarle una tensión.

Cada cristal tiene 2 registros, un contador y un mantenedor. Cada oscilación decrementa en 1


al contador. Si el contador llega a 0 se genera una interrupción y se carga en el contador el valor
del mantenedor. Con esto se puede conseguir un reloj que provoca un número determinado de
interrupciones por segundo. Los relojes físicos son relojes que, deben ser iguales (es decir, estar
sincronizados) y no deben desviarse del tiempo real más allá de cierta magnitud.

Relojes vectoriales

Mattern y Fidge desarrollaron relojes vectoriales para vencer la deficiencia de los relojes de
Lamport, del hecho que no podemos deducir que un reloj vectorial para un sistema de N
procesos es un vector de N enteros.

Cada proceso mantiene su propio reloj vectorial Vi, que utiliza para colocar marcas de tiempo
en los sucesos locales. Como las marcas de tiempo de Lamport, cada proceso adhiere el vector de
marcas de tiempo en los mensajes que envía al resto, y hay unas reglas sencillas para actualizar
los relojes.

Los vectores de marcas de tiempo tienen la desventaja, comparados con las marcas de tiempo
de Lamport, de precisar una cantidad de almacenamiento y de carga real de mensajes que es
proporcional a N, el número de procesos. Charron Bost mostró que, si somos capaces de decir N
es inevitable. Sin embargo, existen técnicas para almacenar y transmitir cantidades más pequeñas
de datos, a costa del procedimiento precisado para reconstruir los vectores completos. Raynal y
Singha dan cuenta de algunas de estas técnicas. También describen la noción de relojes
matricules, en que los procesos mantienen estimaciones de los vectores de tiempo de otros
procesos así como las suyas propias.

2.6.3 Algoritmos

Algoritmo de Lamport

En un sistema centralizado la ordenación de eventos es un problema trivial puesto que existe


un reloj físico común que permite determinar qué evento ocurrió antes que otro. Esto no ocurre
en un sistema distribuido, ya que cada ordenador tiene su propio reloj. Una forma de ordenar un
SD que carece de reloj global es utilizar el concepto de relojes lógicos propuesto por Lamport en
1978. Este concepto se basa en la relación de precedencia. Se puede demostrar que esta relación
transitiva.

Lamport señalo que la sincronización es posible y no tiene porque ser absoluta, solo es
necesaria la sincronización cuando 2 procesos interactúan. Si una maquina tiene un receptor
UTC, todas las maquinas deben sincronizarse con ella. Si ninguna maquina lo tiene cada
maquina lleva el registro de su propio tiempo y se mantiene el tiempo de todas las máquinas tan

- 20 -
cercano como sea posible. Si dos relojes se alejan en la dirección opuesta: en un instante dt,
después de la sincronización podrían estar tan alejados como: 2 * r * dt. Para garantizar que no
difieran más de d. Se deben volver a sincronizar (en software) al menos cada d / 2 r segundos.
Donde r es la tasa máxima de alejamiento que acota el error, especificado por el fabricante.

Algoritmo de Cristian, Berkeley, algoritmos con Promedio y varias fuentes


externas de tiempo.

Se utilizan en sistemas que tienen un receptor UTC (también llamado despachador del
tiempo), el objetivo del algoritmo de Cristian es sincronizar todas las maquinas con ella.

Cada maquina periódicamente envía mensajes al servidor para solicitar la hora en un tiempo
no mayor que d / 2 * r (en el punto anterior esta indicado que es d y que es r). El despachador de
tiempo responde con un mensaje que contiene el tiempo actual. El emisor podría poner la hora
que le dice el despachador pero hay que tener en cuenta varias cosas:

1. El tiempo del receptor UTC o puede ser menor que el del emisor.

2. Puede haber grandes saltos en el tiempo que provocarían errores (por ejemplo, en la
detección del momento en que ha ocurrido el evento de un proceso).

3. Se deben tener en cuenta más factores de latencia como el tiempo de transmisión o el


número de interrupciones de las maquinas, (un gran número de interrupciones puede
producir latencias).

Teniendo en cuenta todos estos factores se debe calcular, si el emisor debe ir adelantándose
o retrasándose muy lentamente para evitar problemas.

En el algoritmo de Cristian, el servidor de tiempo es pasivo. En el algoritmo de Berkeley,


el servidor de tiempo es activo y realiza un muestreo periódico de todas las máquinas para
preguntarles el tiempo. Con base en las respuestas, calcula un tiempo promedio y le indica a
todas las demás máquinas que avancen su reloj a la nueva hora o que disminuyan la velocidad
del mismo hasta lograr el máximo acercamiento a la media.

Algoritmos con promedio consiste en promediar los valores de todas las demás máquinas.
Una ligera variación es descartar primero los m valores más grandes y los m valores más
pequeños, y promediar el resto. El hecho de descartar los valores más extremos se puede
considerar como autodefensa contra m relojes fallidos que envían mensajes sin sentido.

Además estos algoritmos pueden tener en cuenta el tiempo de transmisión y/o la topología
de la red.

Se necesitan varias fuentes externas de tiempo para los sistemas que requieren
sincronización en extrema precisa con UTC, es posible equiparlos con varios receptores de reloj.
Sin embargo debido a las fluctuaciones se hace necesario trabajar con rangos válidos, lo que
requiere un acuerdo entre las máquinas conectadas a ellas. Cada maquina transmite su rango de
forma periódica ninguna maquina obtiene la hora al instante, así que habrá que tener en cuenta
las latencias de transmisión/recepción y el número de puertos que atraviesan los paquetes.

2.6.4 Garantizar la exclusión mutua

[2] Los sistemas operativos necesitan gestionar los recursos que están en regiones críticas.
Cuando un proceso requiere actualizar estructuras de datos que están compartidas, primero debe
entrar en una región crítica, si ningún otro proceso puede entrar en esa región esta garantizada la

- 21 -
exclusión mutua. En sistemas operativos comunes, las regiones críticas se protegen mediante
semáforos, monitores .... En SOD la solución es más compleja.

1.1.23 Algoritmo centralizado

Como si de un sistema monoprocesador se tratase, se elige un proceso coordinador.

Supongamos que viene un proceso A que necesita un recurso, el proceso le pide permiso al
coordinador, donde indica la región crítica. Suponemos que la sección critica esta libre y se le
concede el permiso.

Si ahora viene otro proceso B, este pide permiso al proceso coordinador para la misma región
crítica. El proceso coordinador podría denegarle la entrada o bien abstenerse de responder.

Cuando el primer proceso haya terminado se lo dice al coordinador para que libere su región,
si anteriormente el proceso coordinador se abstuvo de responder, el proceso B habrá quedado a la
espera, por tanto entraría en la sección crítica. Si se le denegó el acceso al proceso B
explícitamente entonces el propio proceso B deberá a volver a intentarlo periódicamente. En
ambos casos, cuando ve el permiso, puede entrar a la región crítica.

El algoritmo garantiza la exclusión mutua, y además el orden en el que se atienden las


peticiones es natural y justo. No hay inanición (espera indefinida). Este esquema también es fácil
de implantar y sólo requiere tres mensajes por cada uso de una región crítica (solicitud,
otorgamiento, liberación).

El único problema de este método centralizado es que el coordinador es un punto débil que si
falla puede caer todo el sistema si no se tiene un buen algoritmo de elección que lo sustituya.

1.1.24 Algoritmo distribuido

El algoritmo anterior es en ocasiones inaceptables, por ellos investigadores han buscando


algoritmos que consigan la exclusión mutua de manera distribuida. El artículo de 1978 de
Lamport relativo a la sincronización de los relojes presentó el primero de ellos. Ricart y
Agrawala (1981) lo hicieron más eficiente.

La idea básica del algoritmo de Ricart y Agrawala es que el proceso que requiere entrar as su
sección crítica envía un mensaje a todos los procesos y entra únicamente cuando recibe un
reconocimiento de todos ellos

Tan pronto llegan todos los permisos, puede entrar a la región crítica. Cuando sale de ella,
envía mensajes OK a todos los procesos en su fila y elimina a todos los elementos de la fila.

Los inconvenientes de este algoritmo es que al hacer que todos los procesos tomen decisiones
de si un proceso debe entrar o no a una sección crítica, hace que el sistema sea más sensible a
fallos.

1.1.25 Algoritmo de Anillo de Ficha

Los procesos se colocan formando un anillo lógico, es decir, cada proceso debe saber quien es
su sucesor y predecesor. Al comenzar se le da al proceso 0 una ficha y se va transfiriendo al
siguiente.

- 22 -
Cada vez que un proceso consigue la ficha de su vecino comprueba si su vecino intenta entrar
en una región crítica, si su vecino no quiere entrar se continuaría pasando la ficha. En cambio si
su vecino tiene intención de entrar, se le permite entrar, hace el proceso necesario y sale,
finalmente recibes la ficha. Se continua pasando la ficha con la condición de ningún proceso
entre en una sección critica con una ficha usada.

Puede pasar que la ficha se pierda, y es difícil detectar su perdida, la cantidad de tiempo entre
las apariciones sucesivas de la ficha en la red no está acotada, por ello es difícil decidir si está
perdida o demorada en algún proceso que no la libera. El error de un proceso es detectado
cuando su vecino intenta sin éxito pasarle la ficha. Por tanto, se lo debe eliminar del grupo y
pasar la ficha al siguiente proceso activo.

1.1.26 Análisis de los tres algoritmos

El algoritmo centralizado es el más sencillo y también el más eficiente. Solo requiere de tres
mensajes para entrar y salir de una región crítica. Solicitud, otorgación y liberación. El algoritmo
distribuido necesita n-1 mensajes de solicitud, uno en cada uno de los demás procesos y n-1
mensajes de otorgación para un total de 2*(n-1). Este número es variable con el algoritmo de
anillo de Ficha. Si todos los desean entrar constantemente a la sección crítica, entonces cada paso
de la ficha provocará una entrada y una salida, para un promedio de un mensaje por cada sección
crítica a la que se ha entrado. En el otro extremo, a veces la ficha podría circular durante horas
sin que ningún proceso se interese en ella.

Los retrasos en cada algoritmo son variados, desde que se solicita la entrada hasta que se
concede. En el algoritmo centralizado es el tiempo de 2 mensajes. En el distribuido se tardaría
2*(n-1) y por último en el de anillo de Ficha de 0(teniendo la ficha) a n-1(perdiendo la ficha
recientemente).

Por último, los tres algoritmos sufren en caso de fallos. Se pueden evitar medidas especiales y
complejidad adicional, para evitar que un fallo haga que todo el sistema se venga abajo. Es un
poco irónico que los algoritmos distribuidos sean aun más sensibles a los fallos que los
centralizados. En un sistema tolerante a fallos, ninguno de éstos sería adecuado, pero si los fallos
son poco frecuentes, todos son aceptados.

2.6.5 Algoritmos de Elección

La mayoría de los algoritmos distribuidos necesitan de una especie de proceso coordinador.


Es así por que es necesario que exista un proceso especial. Si todos los procesos fuesen
idénticos, sin característica que los distinga. Los algoritmos de elección se encargan de elegir
quien va ser el proceso que va a realizar alguna función especial. Supondremos que cada proceso
conoce el número de proceso de todos los demás. Lo que el proceso desconoce es si los procesos
están activos o inactivos. El objetivo de un algoritmo de elección es garantizar que al inicio de
una elección, ésta concluya con el acuerdo de todos los procesos con respecto a la identidad del
nuevo coordinador.

1.1.27 El algoritmo del grandulón

El algoritmo del grandulón , diseñado por García-Molina (1982). Cuando un proceso observa
que su coordinador no le responde, el proceso procede de la siguiente manera: le envía un
mensaje a todos los demás procesos, si responde un proceso con un PID mayor el proceso ha
proceso habrá terminado su trabajo. Si ningún otro proceso responde, el proceso asume el rol de
coordinador.

- 23 -
En cualquier momento, un proceso puede recibir un mensaje de elección de uno de sus
compañeros con un número menor. Cuando llega dicho mensaje, el receptor envía de regreso un
mensaje OK al emisor para indicar que está vivo y que tomará el control. El receptor realiza
entonces una elección, a menos que ya esté realizando alguna. En cierto momento, todos los
procesos se rinden, menos uno, el cual se convierte en el nuevo coordinador. Anuncia su victoria
al enviar un mensaje a todos los procesos para indicarles que a partir de ese momento es el nuevo
coordinador. El mensaje se va propagando hacia el más “grande”.

1.1.28 Un algoritmo de anillo

Este algoritmo se basa en el uso de un anillo, sólo que a diferencia del anillo anterior, éste no
utiliza una ficha. Supongamos que los procesos tienen un orden, de manera que cada proceso
sabe quien es su sucesor. Si un proceso se percata de que el coordinador no responde construye
un mensaje de elección con su propio número de proceso y envía el mensaje a su sucesor. Si éste
está inactivo, el emisor pasa sobre el sucesor y va hacia el siguiente número del anillo o al
siguiente de éste, hasta que localiza un proceso en ejecución. En cada paso, el emisor añade su
propio número de proceso a la lista del mensaje.

Si el mensaje vuelve a su origen(cuando el mensaje de entrada contenga su propio número de


proceso). . En este punto, el mensaje escrito cambia a coordinador y circula de nuevo, esta vez
para informar a todos los demás quién es el coordinador y quiénes son los miembros del nuevo
anillo. Una vez vuelve el mensaje por segundo vez el coordinador elimina el mensaje y todos se
ponen a trabajar.

2.6.6 Transacciones Atómicas y el Modelo de Transacción

Como observamos el programador debe enfrentarse directamente con los problemas de la


exclusión mutua y la prevención de bloqueos. Por tanto se desarrollan librerías con mayor nivel
de abstracción que permite a los programadores centrarse más en la lógica del problema y
oculten algunos aspectos técnicos y por supuesto, que permita la ejecución en paralelo de los
procesos.

La transacción atómica es un bloque de código que o se ejecuta completamente o no se


ejecuta, si por ejemplo llamas por teléfono a un banco para realizar una transferencia bancaria
pero en mitad de la conversación la línea se corta, entonces si la operación fuese atómica la
transferencia no se debería hacer ya que la transacción no ha llegado hasta el final.

Es necesario un modelo de transacción porque el sistema consta de varios procesos


independientes que pueden fallar aleatoriamente, este modelo debe manejar de forma
transparente los errores, y dejar el sistema como estaba en caso de errores.

2.6.7 Bloqueos en Sistemas Distribuidos

Los interbloqueos en SOD pueden llegar a ser más desastrosos que en sistemas operativos no
distribuidos. Ya que la información sobre el interbloqueo esta dispersa son más difíciles de
evitar, prevenir, detectar y solucionar. Las estrategias más comunes son:

• Algoritmo del avestruz: o Ignorar el problema.

• Detección: Permitir que ocurran los bloqueos, detectarlos e intentar recuperarse de


ellos.

- 24 -
• Prevención: Hacer que los bloqueos sean imposibles desde el punto de vista
estructural.

• Evitarlos: Evitar los bloqueos mediante la asignación cuidadosa de los recursos.

Evidentemente el algoritmo del avestruz no merece grandes consideraciones.

En los sistemas distribuidos resulta muy difícil implantar algoritmos para evitar los bloqueos
porque se requiere saber de antemano la proporción de cada recurso que necesitará cada proceso.
(a la práctica es complicado saberlo).

Por tanto las únicas técnicas viables para evitar el bloqueo son la detección y la prevención.

1.1.29 Detección Distribuida de Bloqueos

Cuando se detecta un bloqueo en un sistema operativo convencional se resuelve eliminando


uno o más procesos. Cuando se detecta un bloqueo en un sistema basado en transacciones
atómicas se resuelve abortando una o más transacciones, para ello el sistema restaura el estado
que tenía antes de iniciar la transacción. La transacción puede volver a comenzar.

No es tan grave la eliminación de una transacción como el eliminar un proceso.

Detección Centralizada de Bloqueos

Cada maquina que forma parte del SOD realiza una gráfica con sus recursos propios además
hay coordinador central que mantiene una gráfica mediante la unión de todas las gráficas
individuales.

Cuando el coordinador detecta un bucle elimina uno de los procesos para romper el bloqueo.

Para ello la información de control se debe transmitir explícitamente, bien sea que cada
maquina envié periódicamente datos al coordinador o cuando el coordinador lo pida.

Detección Distribuida de Bloqueos

Un algoritmo común es el de Chandy-Misra-Haas. Los procesos pueden solicitar varios


recursos al mismo tiempo, en vez de uno cada vez. Un proceso puede esperar a uno o más
recursos simultáneamente(el recurso puede ser local o remoto).

Por ejemplo. Si el proceso A se bloquea debido al proceso B. Se envía una señal a todos los
procesos que están bloqueando el recurso que quiere A. El mensaje consta de tres números: El
ID del proceso recién bloqueado, el ID del proceso que envía el mensaje y el ID del proceso al
cual se envía. Al llegar el mensaje el receptor (el proceso B entre otros) verifica si él mismo
espera a algunos procesos, en cuyo caso el mensaje se actualiza, se conserva el primer campo, se
reemplaza el segundo por su propio número de proceso y el tercero por el número del proceso al
cual espera. Este mensaje en este caso se le devuelve a A y a todos los que hayan quedado
bloqueados por su culpa. Si el mensaje vuelve al emisor original(esto se sabe con el primer
campo) entonces existe un ciclo y el sistema está bloqueado.

Para deshacer el bloqueo una forma es que el proceso que inicio el mensaje y lo volvió se
ofrezca para suicidarse, se suicidaran tantos procesos sean necesarios para resolver el bloqueo.

- 25 -
1.1.30 Prevención Distribuida de Bloqueos

La prevención consiste en un diseño exhaustivo del sistema para que los bloqueos sean
imposibles estructuralmente. Las técnicas suelen ser permitir a los procesos que solo conserven
un recurso a la vez, entonces hacer que cada proceso libere sus recursos cuando solicite uno
nuevo. Además se debe exigir a los procesos que soliciten todos sus recursos desde un principio
(cuando se crea el proceso).

También necesitamos un servidor de tiempo global, y que el SOD utilice un modelo de


transacciones atómicas, de esta manera se puede asociar a cada transacción una marca de tiempo
global al momento de su inicio y no pueden haber parejas de transacciones con igual marca de
tiempo asociada.(ya lo respalda la transacción atómica).

Cuando un proceso está a punto de bloquearse en espera de un recurso que está utilizando
otro proceso se verifica cuál de ellos tiene la marca de tiempo mayor (es más joven), solo se
puede permitir la espera solo si el proceso en estado de espera tiene una marca inferior (más
viejo) que el otro. Si miramos la secuencia de ejecución observamos que las marcas aparecen en
forma creciente y los ciclos son imposibles.

2.7 Sistemas de archivos

Un sistema distribuido es conjunto de ordenadores conectados mediante una red de


comunicaciones, por lo tanto, un sistema de archivos distribuidos es un sistema distribuido
donde todos los usuarios interconectados comparten recursos.

Para definir su estructura debemos definir los siguientes términos:

1. Servicio: entidad de software que corre en una o más maquinas.

2. Servidor: software del servicio ejecutado en una sola maquina.

3. Cliente: proceso que puede invocar a un servicio empleando un conjunto de operaciones.

Empleando los anteriores términos podemos definir un sistema de archivos como sistema que
proporciona servicios de archivos a los clientes, es decir los clientes van a poder realizar un
conjunto de operaciones de archivos como crear, borrar, leer y escribir que son auditadas por el
sistema.

En este sistema diferenciamos dos términos:

1. Servicio de archivos: Es la especificación de los archivos que el sistema de archivos ofrece


a sus clientes, la cuál describe las primitivas disponibles, los parámetros que utilizan y las
acciones que realizan. Es la interfaz del sistema de archivos con los clientes.

2. Servidor de archivos: Es un proceso que se ejecuta en las máquinas y ayuda a implantar el


servicio de archivos. Un sistema de archivos puede tener varios servidores de archivos para
ofrecer cada uno de los servicios de archivos, pero estos servidores serán vistos como uno solo
por el usuario para mantener la transparencia del sistema.

- 26 -
2.7.1 Diferencia entre archivo local y remoto

En un sistema de archivo distribuido no debería diferenciar desde el punto de vista del cliente
entre archivos ubicados en el disco duro de la maquina (Archivos Locales) y archivos
compartidos en la red (Archivos Remotos) ya que la tarea de localización de donde se encuentra
el archivo se tiene que encargar el sistema de archivos distribuidos. Esto facilita la movilidad de
los usuarios dentro de una red de comunicación.

2.7.2 Diseño de los sistemas de archivos distribuidos

Un sistema de archivos distribuido consta de dos partes:

1. El servicio de archivos, el cuál se encarga de las operaciones en los archivos individuales,


como pueden ser la escritura, la lectura o la adición.

2. El servicio de directorios, cuya función es la de crear y administrar directorios, añadir y


eliminar archivos de los directorios, etc. , es decir, mantener los directorios actualizados. Los
directorios pueden dividirse a su vez en subdirectorios en lo que se conoce como sistema
jerárquico de archivos.

2.7.3 Nomenclatura

La nomenclatura es un mapeo entre objetos lógicos y físicos. Cuando un usuario quiere


referirse a un archivo, lo hace mediante un nombre textual, el cuál se mapea en un identificador
numérico de menor nivel que a su vez también se mapea en bloques de disco. Este mapeo
proporciona a los usuarios una abstracción de un archivo que oculta los detalles de cómo y donde
se almacena el archivo dentro del disco.

En un sistema de archivos convencional, el rango del mapeo es una dirección dentro del
disco, en cambio, en un sistema de archivos distribuidos este rango se aumenta para incluir la
máquina específica donde se almacena el archivo.

Ya que tratamos a los archivos como abstracciones, se produce la replicación de archivos.


Dado un nombre de archivo, el mapeo devuelve un conjunto de ubicaciones de las réplicas de
estos archivos.

1.1.31 Transparencia e independencia de ubicación (Transparencia de migración)

En la transparencia de ubicación, el nombre de un archivo no indica la ubicación del


almacenamiento físico del archivo. Esta proporciona a los usuarios del sistema distribuido una
forma conveniente de compartir datos. Así, los usuarios pueden compartir archivos
nombrándolos de forma transparente a la ubicación, como si fueran locales. La transparencia de
ubicación puede lograrse en dos niveles: en un nivel superior, ocultando la distribución a los
usuarios y en un nivel inferior, haciendo que el sistema sea transparente para los programas, lo
que es mucho más difícil. Este último nivel de transparencia se puede lograr implementando una
interfaz de llamadas al sistema de modo que no sea visible la existencia de más de un
procesador.

En la independencia de la ubicación, el nombre del archivo no necesita modificarse cuando


cambia la ubicación del archivo. Esto proporciona una mejor abstracción de los archivos. Los
archivos pueden ser vistos como contenedores de datos lógicos, los cuáles no están ligados a una
ubicación física. Un esquema de memoria independiente de la ubicación es un mapeo dinámico,

- 27 -
ya que permite mapear el nombre del mismo archivo en diferentes ubicaciones en dos momentos
diferentes.

Estas dos definiciones son relativas al nivel de nomenclatura descrito, ya que los archivos
tienen nombres diferentes en niveles diferentes. En la práctica, se suelen utilizar mapeo estático
transparente de la ubicación para nombres a nivel de usuario. En él, los archivos están asociados
con un conjunto de bloques de disco y se pueden mover entre máquinas, ocasionando una acción
automática, iniciada por el sistema operativo.

La transparencia y la independencia de ubicación ofrecen al usuario una apariencia del


sistema como un sistema monoprocesador con una sola CPU, una sola memoria, sistema de
archivos, etc. , ya que los archivos son compartidos entre todos los nodos del sistema y los
usuarios de estos nodos no pueden diferenciar si los archivos son de uno u otro nodo, ya que
todos estos aparecen como archivos locales de la máquina.

1.1.32 Esquemas de nomenclatura

Existen tres enfoques principales para los esquemas de nomenclatura:

1. En el enfoque más sencillo, a los archivos se les asigna un nombre único en el sistema
fruto de la combinación entre el nombre de su anfitrión y el nombre local. Dadas estas
características, este enfoque no es transparente ni independiente a la ubicación. El sistema se
estructura como una colección de unidades aisladas que son sistemas completos de archivos
normales.

2. En el segundo enfoque se proporcionan medios para ligar directorios remotos a directorios


locales, dando la apariencia de un árbol coherente de directorios. Los componentes están
integrados para soportar un compartimiento transparente, aunque esta integración está limitada y
no es uniforme, debido a que cada máquina puede ligar diferentes directorios remotos a su árbol.
Es una estructura compleja y difícil de mantener debido a que cualquier directorio remoto puede
adjuntarse en cualquier lugar del árbol de directorios local, lo que puede provocar que la
jerarquía resultante sea no estructurada.

3. En el tercer enfoque podemos lograr una integración total utilizando una sola estructura de
nombre global la cual abarca todos los archivos del sistema. Esta estructura es similar a la
estructura de un sistema de archivos convencional, aunque es muy difícil de implementar en la
práctica.

1.1.33 Técnicas de implementación

La implementación de una nomenclatura transparente es necesaria una provisión para el


mapeo de un nombre de archivo en la ubicación asociada. Para mejorar la disponibilidad de la
información de mapeo, empleamos métodos como la replicación o el uso de cachés locales.

La replicación del mapeo hace imposible una actualización simple de la información, y para
superar este obstáculo introducimos identificadores de archivos de bajo nivel independientes de
la ubicación, estos indican a qué unidad pertenece el archivo, rompiendo la transparencia de
ubicación pero manteniendo la independencia. Estos identificadores pueden replicarse y
colocarse en caché libremente. El uso de estos identificadores en árboles de directorios hace que
toda la jerarquía sea invariante bajo la migración de sus componentes.

La implementación de estos identificadores de bajo nivel consiste en usar nombres


estructurados, cadenas de bits que tienen dos partes. La primera parte identifica la unidad a la
que pertenece el archivo y la segunda parte identifica el archivo particular dentro de la unidad.

- 28 -
1.1.34 Semántica de archivos compartidos

Si dos usuarios comparten el mismo archivo hay que definir la semántica de la escritura y la
lectura de ese archivo para evitar problemas. Esta semántica se puede lograr si sólo existe un
servidor de archivos y los clientes no oculten sus archivos, donde las instrucciones de leer y
escribir las gestiona el servidor y las procesa de forma secuencial. Este método tiene un
problema porque todas las operaciones de lectura y escritura aumentaran el tráfico
indiscriminadamente en la red ya que todas ellas tienen que pasar por el servidor. Este problema
se puede solucionar creando copias de los archivos en las cachés de los clientes con la ventaja de
ganar en rapidez pero creando el problema de consistencia que hablaremos más adelante.

Para solucionar este problema existe la semántica de sesión que funciona de manera que cada
vez que se cierra un archivo que ha sido modificado por un cliente éste envía una copia al
servidor del archivo modificado, pero con un inconveniente que si dos clientes están
simultáneamente modificando el mismo archivo, solamente se modificará el archivo que el
cliente lo cierre antes ya que se enviará una copia el servidor y la otra copia del archivo que el
cliente está modificando la tomará como obsoleta.

Existe la semántica UNIX que a cada archivo abierto se le asocia un apuntador que indica la
posición actual del archivo. La instrucción de lectura toma los datos a partir de esa posición y la
escritura los deposita ahí. Este apuntador es compartido por todos los procesos así resuelve el
problema de la modificación de un archivo simultanea por dos clientes.

Otra forma de abordar el problema de la modificación de archivos es realizando transacciones


que contienen lecturas o escrituras en uno o más archivos. Este método garantiza que todas las
llamadas a la transacción se realizaran de forma secuencial y sin interferencias. Si dos a más
transacciones se realizan al mismo tiempo, este método garantiza que el resultado será el mismo
que si se ejecutasen en cierto orden secuencial.

2.7.4 Acceso a archivos remotos

1.1.35 Acceso

Cuando un proceso en una máquina manda la solicitud a un servidor para acceder a un


archivo o proceso almacenado en este lo realiza mediante un mecanismo de servicio remoto. La
información pasa de un proceso a otro mediante los parámetros y el resultado es devuelto al
proceso solicitante. El usuario no se preocupa de la transferencia de mensajes ni de la E/S en esas
solicitudes. En este punto vamos a definir dos mecanismos de servicio remoto:

1. Llamada a procedimientos remotos (RPC): Una RPC es una solicitud que realiza un
proceso a otro proceso de otro nodo para pedir un determinado servicio. Estas llamadas deben ser
transparentes, el procedimiento llamante no debe saber que el procedimiento llamado se
encuentra en otro nodo del sistema. Las RPC’s realizan un acceso a disco por cada solicitud de
acceso.

2. Uso de cachés: realiza un acceso a caché de la maquina del usuario y si no lo encuentra


se lleva una copia de la solicitud del archivo desde el servidor al cliente. La idea es retener los
bloques de disco que se accedió recientemente de manera que los accesos repetidos puedan
manejarse de manera local.

1.1.36 Ubicación de Cachés

Existen dos tipos de ubicación de cachés:

- 29 -
1. Cachés de disco: ubicadas en el disco duro, poseen la ventaja que si ocurre un fallo no se
pierden los datos.

2. Cachés de Memoria: ubicadas en la memoria principal, poseen varias ventajas:

1. Permiten estaciones de trabajo sin discos.

2. Acceso más rápido que las de disco.

3. Si utilizamos cachés de servidores y de usuario ubicadas en memoria principal podemos


crear un solo mecanismo de uso de cachés para que sea utilizado tanto por servidores como por
usuarios como ocurre en la empresa Sprite.

1.1.37 Política de actualización de cachés

Podemos definir tres políticas de actualización:

1. Política de escritura directa

Si un usuario modifica los datos ubicados en su caché, esta política requiere que se acceda
inmediatamente a la copia maestra del servidor y se modifiquen también. La gran ventaja de esta
política es la poca perdida de información si el sistema falla.

2. Política de escritura demorada

Política de actualización similar a la anterior donde sus actualizaciones en el servidor se


realizan en un momento posterior a la modificación del usuario.

Las ventajas son la rapidez en los accesos de escritura en caché y solo es necesario escribir en
el servidor la última actualización. El inconveniente es la perdida de datos en caso de fallo.

3. Política de escritura al cierre

Variante de la escritura demorada que consiste en escribir los datos en el servidor cuando se
cierra el archivo en la maquina del cliente. Esta política posee grandes beneficios para el tráfico
de la red cuando los archivos están abiertos durante periodos largos y se modifican con
frecuencia.

1.1.38 Consistencia

Problemática al decidir un cliente si sus datos ubicados en caché están o no desactualizados y


si lo estuviesen ya no podría acceder a ellos. Por lo tanto existen dos enfoques para verificar la
validez de los datos de la caché:

1. Enfoque iniciado por el cliente: el cliente realiza una comunicación con el servidor para
verificar si sus datos son consistentes con la copia maestra. Es verificación se puede realizar a
intervalos fijos de tiempo dependiendo de su frecuencia puede ser carga tanto para la red como
para el servidor.

2. Enfoque iniciado por el servidor: el servidor registra las partes de los archivos ubicados
en las cachés de los clientes. Existe el problema de inconsistencia potencial que ocurre cuando
dos clientes diferentes colocan un archivo en caché que el servidor lo resuelve deshabilitando el
uso de cachés que resulta la conmutación a un modo de servicio remoto.

- 30 -
2.7.5 Servidores

1.1.39 Servidores

Existen dos enfoques para la información desde el punto de vista del servidor:

1. Servidor de archivos con estado: realiza un seguimiento a cada archivo al que cada
cliente está accediendo, esta información se va almacenando en memoria principal.

2. Servidor de archivos sin estado: no guarda la información de las operaciones que realizan
los clientes con los archivos ya que lo considera redundante y lo hace mucha más seguro que el
anterior ya que ante una caída los fallos desde el punto de vista del cliente no se notan porque el
cliente sigue retransmitiendo su solicitud si el cliente no recibe respuesta.

1.1.40 Replicación de archivos

La replicación de archivos se basa en la técnica de realizar varias copias de los archivos y


colocarlas en varios servidores de archivos independientes. Esta técnica es útil para mejorar la
disponibilidad, y si realizamos múltiple replicas en maquinas cercanas, obtenemos como
resultado un tiempo de servicio mas corto. Al tener varias copias de un archivo, si un servidor
deja de funcionar no perdemos la disponibilidad a ese archivo, ya que podremos acceder a otra
copia suya disponible en otro servidor.

Respecto al desempeño también es aconsejable realizar replicas de archivos, así se reparte el


trabajo entre distintos servidores, ya que si necesitamos un archivo, el sistema escogerá la réplica
en el servidor con menos carga de trabajo, evitando así el cuello de botella en nuestro sistema.

Es deseable ocultar a los usuarios la existencia de estas réplicas para mantener la


transparencia, por lo tanto, a niveles superiores es invisible y a niveles inferiores deben
distinguirse mediante nombres diferentes en ese nivel.

El problema asociado con las réplicas es su actualización, ya que cualquier cambio de un


archivo debe verse reflejado en todas sus réplicas, por lo que si modificamos un archivo
deberemos modificar todas y cada una de sus réplicas para mantener todos los sistemas de
archivos actualizados.

Para la actualización de estas réplicas utilizamos distintos protocolos de actualización, como


puede ser el protocolo de réplica de la copia primaria, el cuál nombra a un servidor como
primario, que se ocupa de la modificación local de los archivos y del envío de comandos a los
demás servidores para su modificación.

2.7.6 Sistema de ejemplo NFS

Un ejemplo representativo de un sistema de archivos distribuido es el NFS, una


implementación de un sistema software para el acceso de archivos remotos entre redes locales.
NFS considera los sistemas de archivos diferentes entre máquinas interconectadas. Su objetivo es
permitir el compartimiento, en forma cliente-servidor, entre los sistemas de archivos de
cualquiera de las máquinas interconectadas de una forma transparente. Esta forma de trabajar es
válida para entornos UNIX/Linux. De momento NFS no permite la interoperabilidad con
determinados sistemas de archivos Windows.

Para que un directorio remoto sea accesible de forma transparente desde una máquina, el
cliente de la máquina ha de realizar un montaje. El montaje es una operación en la cuál un

- 31 -
directorio remoto se monta sobre un directorio de un sistema de archivos local. El directorio
montado se ve como un subárbol integral del sistema de archivos local, reemplazando al
subárbol descendiente desde el directorio local. Este directorio local se convierte en el nombre de
la raíz del directorio que se acaba de montar. A partir de este momento, los usuarios de la
máquina podrán acceder a los archivos del directorio remoto de una forma totalmente
transparente.

Figura 1. Montaje de directorios

En algunas versiones de NFS existe una forma distinta de montaje, el montaje en cascada, el
cuál permite montar un sistema de archivos sobre otro no local, con la única condición de que
este último haya sido un sistema de archivos montado remotamente.

Figura 2. Montaje de directorios en cascada

En la especificación de NFS existen dos tipos de servicios, los de montaje y los de acceso a
archivos remotos. Para estos servicios se especifican dos protocolos diferentes, un protocolo de
montaje y un protocolo NFS. Estos protocolos pueden verse como conjuntos de RPC (Bloques
de construcción empleados en accesos transparentes a archivos remotos).

El protocolo de montaje establece la conexión lógica entre un servidor y un cliente. En la


operación de montaje se incluye el nombre del directorio remoto a montar y el nombre del
servidor que lo almacena.

El protocolo NFS proporciona las RPC para operaciones sobre archivos remotos que permiten
la búsqueda, el acceso y la manipulación de archivos dentro de directorios.

- 32 -
La arquitectura de NFS consta de tres capas principales:

1. La primera capa es la interfaz del sistema de archivos, formada por las llamadas sistema
open, read, write y close y los descriptores de archivo.

2. La segunda capa es la VFS (capa del sistema de archivos virtual), y sirve para separar las
operaciones genéricas del sistema de archivos de su implementación y para distinguir archivos
remotos de los locales (pudiéndose dividir también estos últimos según sus tipos en el sistema de
archivos).

3. La tercera y última capa es la encargada de implementar el protocolo NFS antes descrito,


por eso esta capa se denomina capa de servicio NFS.

Figura 3. Arquitectura de un sistema NFS

2.8 Memoria

2.8.1 Introducción

Las arquitecturas de computación paralela pueden verse como una extensión de las
arquitecturas convencionales que permitan la cooperación y la comunicación entre elementos de
proceso. Existen dos facetas diferentes en las arquitecturas de computación paralela: por una
parte, el modelo de programación, que consiste en la imagen conceptual de la máquina que el
programador utiliza en la codificación. Por otra parte, la capa de abstracción de comunicaciones
se encarga de resolver la comunicación y la sincronización de los procesos paralelos a través de
un conjunto de primitivas.

Estas primitivas pueden estar implementadas a nivel hardware, a nivel del sistema operativo o
a nivel de un software de usuario especifico para cada máquina que relacione el modelo de
programación con las primitivas de comunicación.

La principal ventaja del modelo de espacio de memoria compartido es que pueden aplicarse
los mismos principios utilizados en la programación de sistemas de tiempo compartido. Desde el
punto de vista del programador, no existe ninguna diferencia entre la sincronización de los
diferentes procesos cuando se ejecutan en un sistema multitarea y cuando se ejecutan en un
sistema multiprocesador, ya que la sincronización se consigue accediendo a posiciones de
memoria de un espacio común de direcciones.

- 33 -
2.8.2 Sistemas de memoria compartida distribuida

Los sistemas de memoria compartida distribuida (DSM, distributed shared memory)


suministran un espacio de direcciones virtual entre los procesadores aunque éstos estén
débilmente acoplados. Las principales ventajas de los sistemas DSM son su facilidad de
programación, al utilizar el modelo de variables compartidas; la portabilidad de las aplicaciones;
el bajo coste asociado a los sistemas débilmente acoplados; y finalmente su mayor escalabilidad
respecto a los sistemas fuertemente acoplados, ya que no existen componentes hardware
comunes entre los diferentes nodos, sino que la escalabilidad depende del ancho de banda de la
red de comunicaciones.

2.8.3 Ventajas / desventajas de la memoria distribuida

Ventajas:

• Ilusión de una memoria física compartida, sin cuellos de botella.

• Escalabilidad (podemos extender el sistema sin mucho problema).

• Menor coste.

Desventajas:

• Topología de red muy importante.

• Administración de la red.

Los sistemas DSM pueden clasificarse en las siguientes arquitecturas:

• DVSM (Distributed Virtual Shared Memory): En esta clase de sistemas, la capa de


software que suministra un espacio compartido de direcciones está soportada a nivel de sistema
operativo o de compilador.

• NUMA (Non Uniform Memory Access). En los sistemas NUMA, cada nodo contiene
uno o varios procesadores con caches privadas y un módulo de memoria que almacena una parte
de memoria del espacio compartido de direcciones.

• CC-NUMA (Cache-coherent Non Uniform Memory Access). Los sistemas CC-NUMA


buscan reducir el tiempo de acceso a los datos residentes en un nodo remoto utilizando caches
que almacenen datos remotos.

• COMA (Cache Only Memory Architecture). Los sistemas COMA son sistemas en los
que el tiempo de acceso a una posición de memoria no depende exclusivamente de su dirección.
En los sistemas COMA, los módulos de memoria se comportan como grandes caches que
almacenan el conjunto de trabajo utilizado por cada procesador.

2.8.4 Arquitectura DVSM

Los sistemas DVSM se caracterizan por suministrar un espacio compartido de direcciones


mediante mecanismos software. Si el sistema operativo es el encargado de gestionar el espacio
compartido, la memoria compartida se implementa como una extensión del sistema de memoria

- 34 -
virtual. Al extenderse el mecanismo de paginación utilizado en los sistemas de memoria virtual a
un sistema multiprocesador, se mantienen algunas de sus características, entre las que se cuenta
el intercambio de páginas como unidad de coherencia. En el caso de que sea el compilador el
encargado de suministrar un espacio compartido de direcciones, éste deberá detectar todas las
referencias al espacio común de direcciones y sustituirlas por llamadas a rutinas que se
encarguen del mantenimiento de la coherencia entre los datos.

Los sistemas DVSM permiten la migración y réplica de páginas entre nodos mientras se
mantiene la coherencia de los datos.

DVSM que incorporó como principal novedad la utilización de diferentes protocolos de


coherencia para cada tipo de dato presente en la memoria compartida. La incorporación de
modelos de consistencia más relajados permitía reducir el tiempo de latencia en la red. Para
conseguir esto, las aplicaciones llevaban anotaciones adicionales que describían el patrón de
acceso a dichos datos.

2.8.5 Arquitectura NUMA

En un sistema multicomputador con memoria compartida físicamente distribuida entre los


nodos, el tiempo de acceso a los datos es diferente según si dichos datos se encuentran en la
porción de memoria correspondiente al nodo local o en un nodo remoto. En los sistemas NUMA,
dicha falta de uniformidad en el acceso se hace visible explícitamente al programador, lo que
permite controlar a través de mecanismos software la localización de los datos.

En los sistemas NUMA, cada nodo contiene uno o varios procesadores con caches privadas y
un módulo de memoria que almacena una parte de terminada del espacio compartido de
direcciones. Esta parte del espacio de direcciones puede accederse desde cualquier nodo, aunque
el tiempo de acceso variará según si el acceso se produce desde el nodo local o desde un nodo
remoto. Estos sistemas no necesitan mecanismos para mantener la coherencia de los datos, ya
que sólo existe una copia de cada uno de ellos, y su ubicación es centralizada. Por otra parte, la
dirección de memoria especifica el nodo en donde se almacena dicha página. Este nodo recibe el
nombre de nodo “hogar” (home node).

Pese a la simplicidad de implementación de esta clase de sistemas, su rendimiento se ve


seriamente perjudicado debido a la latencia de la red de comunicaciones. Para minimizar el
número de accesos remotos, debe prestarse especial atención a la distribución inicial de las
páginas de memoria en cada uno de los nodos, una tarea que depende del patrón de acceso a la
memoria de la aplicación. Esta tarea debe ser llevada a cabo por el sistema operativo, por el
compilador o por el programador, lo que incrementa el coste de desarrollo. También puede
mejorarse la localización incorporando elementos hardware, a través del uso de caches
consistentes. Esta última posibilidad ha dado lugar a las arquitecturas CC-NUMA.

2.8.6 Arquitectura CC-NUMA

Los sistemas CC-NUMA (cache coherent nonuniform memory access) buscan reducir el
tiempo de acceso a los datos residentes en un nodo remoto utilizando en cada nodo una cache de
tercer nivel (L3). Esta cache recibe el nombre de “cache remota” (RC) ya que almacena copias de
datos remotos que han sido utilizados. El uso de la cache remota permite aumentar el porcentaje
de accesos resueltos de forma local. Estos sistemas también se denominan RC-NUMA.

La arquitectura CC-NUMA, al igual que la arquitectura NUMA, utiliza memoria físicamente


distribuida entre los nodos. En las máquinas CC-NUMA, cada nodo posee una parte del espacio

- 35 -
compartido de direcciones y una memoria cache que puede utilizarse para replicar ítems
presentes en cualquier otro nodo. Dado que la memoria física está uniformemente repartida entre
los nodos y además su tamaño es igual al de la memoria direccionable, basta con analizar la
dirección solicitada para determinar en qué nodo reside el bloque que contiene al dato. Cuando
se produce un fallo en la cache local del nodo, el dato se solicita a la memoria local del nodo o a
la memoria de otro nodo, de acuerdo con su dirección física. Si el dato en la cache se modifica,
se hace necesario actualizar la memoria del nodo en donde resida ese dato. Esto implica que la
cantidad de datos que pueden replicarse localmente (para hacer más eficiente su acceso) se ve
limitado por el tamaño de la cache (SRAM) de cada nodo, lo que no permite utilizar memoria
normal (DRAM) para almacenar copias de los datos. Por otra parte, el rendimiento de las
máquinas CC-NUMA depende de forma crítica de la distribución inicial de los datos en las
diferentes memorias locales, ya que una distribución incorrecta generaría muchas más solicitudes
remotas que locales. Esto también sucede si cada nodo accede a subconjuntos de datos de muy
diferente tamaño. La solución a los problemas derivados de una partición incorrecta de los datos
pasa por la migración de páginas. Dicho mecanismo, del que se encarga el sistema operativo,
permite cambiar la localización física de los datos en función de la ejecución. Sin embargo, este
mecanismo es lento, complejo y funciona sólo a granularidad de página, no de bloque.

2.8.7 Arquitectura COMA

Los sistemas COMA (Cache Only Memory Architecture) son sistemas en los cuales el tiempo
de acceso a una posición de memoria no depende de su dirección. Para conseguir este objetivo,
en las arquitecturas COMA los módulos de memoria se comportan como caches de gran tamaño
denominadas “memorias de atracción” (AM). Como se ha visto en la sección anterior, el
rendimiento de los sistemas CC-NUMA se ve perjudicado por el hecho de que los datos situados
en nodos remotos no pueden ser almacenados en la memoria local, lo que restringe la cantidad
total de datos que pueden replicarse desde los nodos remotos en un instante dado. Por lo tanto, el
rendimiento de los sistemas CC-NUMA, al igual que sucede en los sistemas NUMA, se ve
perjudicado si se produce una incorrecta distribución inicial de los datos.

En las arquitecturas COMA no existe un dueño fijo para cada bloque de datos, sino que los
bloques “migran” hacia los nodos que los requieran. De esta manera, cada nodo atrae hacia su
memoria de atracción la parte del espacio de direcciones que utiliza, denominada “conjunto de
trabajo” (working set). Al inicio del proceso, cada memoria local contiene una parte del espacio
de direcciones compartido de la aplicación. Si a lo largo de la ejecución de la aplicación un nodo
solicita un dato que está almacenado en la memoria de atracción de otro nodo, el bloque que lo
contiene “migra” a la memoria del nodo que ha hecho la solicitud.

A diferencia de la arquitectura CC-NUMA, en la que el almacenamiento de la copia principal


de un bloque de datos se realiza en un nodo fijo, la arquitectura COMA permite que cada bloque
de datos resida allí donde se lo esté utilizando, al almacenarlo en las memorias de atracción local
Este sistema presenta varias ventajas respecto a la arquitectura CC-NUMA. En primer lugar,
soluciona uno de los problemas clásicos de CC-NUMA, el relativo a la distribución inicial entre
los nodos de los datos que componen el espacio compartido de direcciones. En CC-NUMA, una
distribución correcta de los datos es fundamental para reducir la tasa de fallos remota, sobre todo
en escritura. En este caso, una escritura provocada por un nodo distinto del propietario del
bloque escrito generará siempre un acceso remoto al objeto de actualizar el bloque. Esto hace que
la distribución inicial de los datos influya de forma decisiva en el rendimiento. Puede darse la
circunstancia de que el conjunto de bloques al que accede un nodo a lo largo de la ejecución de
la aplicación sea mayor que la capacidad de la memoria local, por lo que necesariamente parte
del conjunto de trabajo que utiliza ese nodo deberá accederse de forma remota. La arquitectura
COMA soluciona este problema permitiendo que las copias de cada bloque migren hacia el nodo
que la esté utilizando en cada momento.

- 36 -
Mantenimiento de la coherencia

El encargado del mantenimiento de la coherencia en los sistemas COMA es un módulo


denominado “controlador de coherencia”. Dicho controlador se encarga de mantener la
coherencia de los datos presentes en la memoria de atracción, así como de resolver los accesos a
nodos que no están presentes en la AM local. Para facilitar la replicación de los datos en los
sistemas COMA se define para cada bloque una única copia “principal” o “maestra”, de la cual
se obtienen las copias utilizadas por los restantes nodos. Por otra parte, el nodo que posee en su
memoria de atracción la copia maestra de un bloque es el nodo propietario de dicho bloque.

Si un nodo solicita para lectura un bloque que no se encuentra en la AM local, el controlador


de coherencia se encarga de localizar la copia maestra de dicho bloque en el sistema y solicitar
una copia. De esta manera, el bloque es replicado en la memoria de atracción local. Si el nodo
local debe realizar nuevos accesos en lectura a ese bloque, dichos accesos podrán resolverse de
forma local. Además de satisfacer las operaciones de lectura y escritura, el controlador de
coherencia del nodo local se encargará de administrar el espacio disponible en la memoria de
atracción. Un problema surge cuando la memoria de atracción está llena y se requiere espacio
adicional para almacenar un bloque solicitado por el nodo local. En este caso pueden darse dos
circunstancias: que en la AM local existan copias de bloques cuyos propietarios sean remotos, o
que el nodo local sea propietario de todos los bloques presentes en su AM.

Localización de bloques

Dado que las memorias de atracción se comportan como memorias cache, la dirección de un
bloque no indica su localización, sino que sólo sirve como un identificador del bloque. La
memoria de atracción contiene etiquetas que almacenan el identificador y el estado del bloque
asociado a cada uno de los marcos de bloque que componen la memoria. Dado que el
identificador no indica la localización del bloque, es necesario disponer de algún mecanismo que
permita a cada controlador de coherencia localizar un bloque determinado. El mecanismo de
localización está ligado a la topología de la red de interconexión.

Reemplazo de bloques

Dado que las memorias de atracción funcionan como memorias cache, cuando se pretende
introducir un nuevo bloque y el conjunto correspondiente de la memoria de atracción local está
lleno, debe desalojarse un bloque. Esta operación de desalojo de un bloque para introducir otro
se denomina reemplazo. En las memorias cache se garantiza que la jerarquía de memoria inferior
tendrá espacio suficiente para almacenar el bloque desalojado de la cache.

El problema en los sistemas COMA es más complejo, ya que no existe un nivel de memoria
inferior al que las memorias de atracción puedan recurrir. En su lugar, el controlador de
coherencia deberá seleccionar una memoria de atracción remota y enviarle el bloque. Cuando un
nodo desee efectuar una operación de reemplazo y el bloque a desalojar (llamado “bloque
víctima”) haya sido modificado, el nodo tiene la seguridad de que ese bloque no puede
descartarse. Sin embargo, a diferencia de lo que ocurre en las memorias cache, un bloque no
modificado no puede sobrescribirse sin más, ya que puede suceder que dicho bloque sea la
última copia presente en el sistema. Para garantizar que nunca se sobrescriba la última copia de
un bloque, se etiqueta una de ellas como la “copia maestra”. Si el bloque a descartar no es la
copia maestra, el nodo tiene la seguridad de que existen otras copias en el sistema. De no ser así,
deberá ponerse en marcha el mecanismo de reemplazo. En general, los algoritmos de reemplazo
complican enormemente el funcionamiento de los protocolos de coherencia en los sistemas
COMA.

- 37 -
2.8.8 Replicación

Hay dos razones principales para la replicación de datos:

Confiabilidad:

Continuidad de trabajo ante caída de la réplica.

Mayor cantidad de copias mejor protección contra la corrupción de datos

Rendimiento:

El SD escala en número. Escala en área geográfica (disminuye el tiempo de acceso al dato).


Consulta simultánea de los mismos datos.

Requisitos a considerar:

• Transparencia: clientes no conscientes de la replicación.

• Coherencia: diferencias en la respuesta entre las réplicas.

Transparencia de replicación

• La replicación puede ser manejada por el cliente (no transparente).

• La transparencia se logra con un frontal interpuesto.

• Las operaciones retornan un sólo valor o fallan.

• Normalmente solo se ve una copia

Precio a pagar por la replicación de datos:

Problemas de Consistencia

En general lograr escalabilidad va en relación a la perdida de rendimiento. Como técnicas


para facilitar la escalabilidad se utiliza la replicación y el caching. Ubicar copias de datos u
objetos cercanos a los procesos que los usan mejora el rendimiento por la reducción del tiempo
de acceso y resuelve el problema de escalabilidad.

Problemas:

La actualización de las réplicas consume más ancho de banda de la red.

Mantener múltiples copias consistentes resulta a su vez un serio problema de escalabilidad y


mas en un contexto de consistencia estricta.

La idea es que la actualización se realice con una única operación atómica. Se necesitan
sincronizar todas las réplicas.

El problema es que por un lado la replicación tiende a resolver el problema de la escalabilidad


(aumenta el rendimiento); por otro mantener consistentes las copias requiere sincronización
global. La cura puede ser peor que la enfermedad.

- 38 -
Modelos de Consistencia

Un modelo de consistencia es esencialmente un contrato entre procesos y el almacenamiento


de datos. Es decir: si los procesos acuerdan obedecer ciertas reglas, el almacenamiento promete
trabajar correctamente. Normalmente un proceso que realiza una operación de lectura espera que
esa operación devuelva un valor que refleje el resultado de la última operación de escritura sobre
el dato. Los modelos de consistencia se presentan divididos en dos conjuntos:

• Modelos de consistencia centrados en los datos.

• Modelos de consistencia centrados en el cliente.

Modelos de Consistencia Centrados en Datos

Organización general de un almacenamiento lógico de datos, físicamente distribuidos y


replicados a través de múltiples procesos.

Consistencia Estricta

El modelo de consistencia más restrictivo es llamado consistencia estricta y es definido por la


siguiente condición:

Cualquier lectura sobre un item de dato x retorna un valor correspondiente con la más
reciente escritura sobre x.

Consistencia Débil

Antes de realizar un acceso ordinario a una variable compartida, deben terminar con éxito
todas las adquisiciones anteriores del proceso en cuestión. Antes de permitir la realización de una
liberación, deben terminar las (L/E) anteriores del proceso. Los accesos de adquisición y
liberación deben ser consistentes con el procesador.

Consistencia Secuencial

La consistencia secuencial es una forma ligeramente más débil de la consistencia estricta.


Satisface la siguiente condición: El resultado de una ejecución es el mismo si las operaciones
(lectura y escritura) de todos los procesos sobre el dato fueron ejecutadas en algún orden
secuencial y las operaciones de cada proceso individual aparecen en esta secuencia en el orden
especificado por su programa.

a) Un dato almacenado secuencialmente consistente.

b) Un dato almacenado que no es secuencialmente consistente.

Consistencia Causal

El modelo de consistencia causal es un debilitamiento de la consistencia secuencial. Se hace


una diferenciación entre eventos que están potencialmente relacionados en forma causal y
aquellos que no. las operaciones que no están causalmente relacionadas se dicen concurrentes.

La condición a cumplir para que un datos sean causalmente consistentes es:

Escrituras que están potencialmente relacionadas en forma causal deben ser vistas por todos
los procesos en el mismo orden. Escrituras concurrentes pueden ser vistas en un orden diferente
sobre diferentes máquinas. Esta secuencia es permitida con un almacenamiento causalmente

- 39 -
consistente, pero no con un almacenamiento secuencialmente consistente o con un
almacenamiento consistente en forma estricta.

Consistencia PRAM

Para cada posición de memoria existe un acuerdo local acerca del orden de las escrituras en
ella. Las escrituras en diferentes posiciones no tienen que ser vistas en el mismo orden por los
diferentes procesos.

Consistencia First Input First Output

Condición necesaria:

Escrituras realizadas por un proceso único son vistas por los otros procesos en el orden en que
son hechas, pero escrituras desde diferentes procesos pueden ser vistas en diferente orden por
diferentes procesos.

2.8.9 Memoria compartida basada en objetos

Una alternativa al uso de páginas es tomar el objeto como base de la transferencia de


memoria. Aunque el control de la memoria resulta más complejo, el resultado es al mismo
tiempo modular y flexible, y la sincronización y el acceso se pueden integrar limpiamente. Otra
de las restricciones de este modelo es que todos los accesos a los objetos compartidos han de
realizarse mediante llamadas a los métodos de los objetos, con lo que no se admiten programas
no modulares y se consideran incompatibles.

2.8.10 Memoria compartida basada en páginas

El esquema de DSM propone un espacio de direcciones de memoria virtual que integre la


memoria de todas las computadoras del sistema, y su uso mediante paginación. Las páginas
quedan restringidas a estar necesariamente en un único ordenador. Cuando un programa intenta
acceder a una posición virtual de memoria, se comprueba si esa página se encuentra de forma
local. Si no se encuentra, se provoca un fallo de página, y el sistema operativo solicita la página
al resto de computadoras. El sistema funciona de forma análoga al sistema de memoria virtual
tradicional, pero en este caso los fallos de página se propagan al resto de ordenadores, hasta que
la petición llega al ordenador que tiene la página virtual solicitada en su memoria local. A
primera vista este sistema parece más eficiente que el acceso a la memoria virtual en disco, pero
en la realidad ha mostrado ser un sistema demasiado lento en ciertas aplicaciones, ya que
provoca un tráfico de páginas excesivo.

3 Implementación Windows

3.1 Arquitectura

3.1.1 Diseño

Windows NT tiene una arquitectura cliente-servidor. El sistema tiene distintas entidades


servidoras para servir a los clientes. El principal objetivo de este diseño es tener un núcleo con
módulos integrados lo más pequeño posible, que pudieran ejecutar en modo privilegiado las

- 40 -
llamadas al sistema, también llamado modo kernel. Las otras peticiones se mandan a otras
entidades para su ejecución en modo no privilegiado, ó modo usuario. De esta forma el núcleo
del sistema tendría una base compacta, robusta y estable. Este núcleo que se ejecuta en modo
privilegiado, se denomina Executive, y los no privilegiados se llaman subsistemas protegidos.

Las llamadas al sistema por parte de los programas de los usuarios, en Windows NT se
denominan API Win32. Algunas llamadas son atendidas por el Executive y otras son desviadas
hacia otro subsistema.

Al tener un núcleo rodeado de subsistemas que se ejecutan en modo usuario, podemos añadir
nuevos subsistemas sin producir ningún tipo de confrontación. En Windows NT han surgido tres
modelos que analizaremos en el punto siguiente.

3.1.2 Modelos

Han surgido tres modelos distintos en Windows NT: el modelo Cliente-Servidor, el modelo
de Objetos, y el modelo de Multiprocesamiento Simétrico.

El Modelo Cliente-Servidor

Este modelo establece un kernel que se encarga de recibir peticiones de procesos clientes y
pasárselas a otros procesos servidores, ejecutándose en modo usuario. Windows NT introduce
en el núcleo aquellos servicios que sólo pueden ser ejecutados en modo kernel. El resto de
servicios los asciende hacia subsistemas servidores que se ejecutan en modo usuario,
independientes entre sí, y que se dividen entre máquinas distintas, dando el soporte a un sistema
distribuido.

El Modelo de Objetos

Este modelo contempla los recursos como objetos. Cada objeto tiene una identidad propia
para ser único y poder distinguirse de los demás, y también tiene una serie de atributos, y
métodos que modifican los atributos. Mediante el envió de mensajes los objetos interaccionan.
Los dispositivos hardware también son tratados como objetos.

El Modelo de Multiprocesamiento Simétrico

Un Sistema Operativo multiproceso puede ser simétrico (SMP) o asimétrico (ASMP). En los
simétricos, como Windows NT, cualquier CPU puede ejecutar cualquier proceso aunque no sea
del sistema operativo. En los asimétricos una CPU será exclusiva para el uso del Sistema
Operativo, y las demás para la ejecución de programas del usuario. Los sistemas simétricos
tienen un mejor balance de la carga y son más tolerables a fallos, que los sistemas asimétricos.

3.1.3 Arquitectura

Como dijimos anteriormente, la arquitectura de Windows NT es altamente modular y se basa


en dos capas principales, usuario y núcleo.

1.1.41 Capa Modo Usuario

Cuyos programas y subsistemas están limitados a los recursos del sistema a los que tienen
acceso. Este modo se divide en procesos del sistema, en aplicaciones, en subsistemas de entorno,
en servicios, y por al API de funciones NTDLL.DLL

- 41 -
Los Subsistemas Protegidos

Los Subsistemas Protegidos, son procesos servidores que se ejecutan en modo usuario. Se
inician al arrancar el sistema operativo. Hay dos tipos:

• Integral: es un servidor que ejecuta una función crítica del sistema operativo.
Tenemos los siguientes:

o El Subsistema de Seguridad. Este subsistema interacciona con el proceso de


inicio y el llamado monitor de referencias de seguridad con lo que se
construye el modelo de seguridad en Windows NT. Consta de dos
subcomponentes:

- La autoridad de seguridad local: es el corazón del subsistema y


gestiona la política de seguridad local. Se encarga de dar los permisos
de acceso, de comprobar que el usuario que solicita conexión tiene
acceso al sistema, de verificar todos los accesos sobre los objetos y de
controlar la política de auditorías. Las auditorías facilitan poder
monitorizar todos los acontecimientos del sistema por parte del
administrador.

- El administrador de cuentas: mantiene una base de datos con las


cuentas de los usuarios y proporciona los servicios de validación de
usuarios requeridos por el subcomponente anterior.

o El Subsistema de Entorno. Da soporte a aplicaciones procedentes de sistemas


operativos distintos, adaptándolas para poder ejecutarlas bajo Windows NT.
Hay tres subsistemas de este tipo:

- El Subsistema Win32. Atiende a las aplicaciones nativas de Windows


NT y a los programas que no son Win32, evalúa su tipo y los manda al
subsistema correspondiente.

- El Subsistema POSIX. La norma POSIX (Portable Operating System


Interface for Unix) fue pensada para conseguir la portabilidad de las
aplicaciones entre distintos entornos UNIX. Se trata de un conjunto de
23 normas, conocidas también como POSIX.0 a POSIX.22, de las
cuales el subsistema POSIX soporta la POSIX.1, que define un
conjunto de llamadas al sistema en lenguaje C. El subsistema sirve las
llamadas interaccionando con el Executive. Se encarga también de
definir aspectos específicos del SO UNIX

- El Subsistema OS/2. Este subsistema da soporte a las aplicaciones


OS/2 y proporciona la interfaz gráfica y las llamadas al sistema; las
llamadas son resueltas con la ayuda del Executive

• Entorno: falta por completar.

1.1.42 Capa Modo núcleo

Tiene acceso total a la memoria del sistema y a los dispositivos externos. Los núcleos de los
sistemas operativos de esta línea son todos conocidos como núcleos híbridos. Este modo esta

- 42 -
formado por una librería dinámica HAL, por los servicios del sistema ( NT NATIVE API), por
un kernel encargado de la gestión del procesador, por ventanas y gráficos, por subprocesos del
sistema, y por el Executive.

El Executive

El Executive y el núcleo de Windows NT no es lo mismo. El Executive tiene varios


componentes de software, ejecutándose en modo privilegiado, y uno de ellos es el núcleo. Estos
componentes son independientes entre sí, y se comunican a través de interfaces bien definidas. El
Executive está compuesto por los siguientes módulos:

• Administrador de objetos, es el encargado de destruir, crear y gestionar todos los objetos


del Executive. Solo administra los objetos comunes de los Sistemas Operativos del entorno.

• Administrado de Procesos, se encarga junto con el Administrador de Objetos de crear,


eliminar y gestionar los procesos y subprocesos. Reparte el tiempo de CPU entre los
subprocesos, y suministra las relaciones básicas entre procesos y subprocesos, dejando el resto a
cada subsistema.

• Administrador de Memoria Virtual, se encarga de la política de gestión de la memoria

• Facilidad de Llamada a Procedimiento Local, se encarga de recibir y mandar las


peticiones a procedimiento local entre los clientes y los subsistemas servidores.

• Administrador de Entrada/Salida, está formado por una serie de subcomponentes: el


administrador del sistema de ficheros, el servidor y redirector de red, los drivers de dispositivo
del sistema y el administrador de caches. El administrador de E/S se encarga de la comunicación
entre los drivers, implementando una interfaz para tratar los drivers de la misma manera. Trabaja
conjuntamente con el administrador de memoria virtual proporcionándola la entrada y salida
asíncrona/síncrona, los archivos asignados en memoria y la cache de los ficheros.

- El administrador de caches gestiona los buffers, y estudia las estadísticas sobre


la carga del sistema para poder variar su tamaño dinámicamente. Actúa como
supervisor de accesos, y es capaz de generar los mensajes de auditorías. Da
soporte al subsistema de seguridad con el que interacciona.

• El Núcleo ( Kernel) se trata de un micro-kernel, se encarga de la gestión del procesador,


cambiando el proceso en ejecución y sincronizando el multiprocesador. Gestiona las
interrupciones, excepciones y traps. Ofrece diferentes objetos necesarios en otros ámbitos del
sistema operativo (temporizadores, mutexes, semáforos...) Independiza al resto de componentes
del sistema operativo de la arquitectura hardware, en especial del procesador

• Nivel de Abstracción de Hardware (HAL), es una librería dinámica de funciones


(HAL.DLL). Dichas funciones permiten gestionar el DMA, controlar la cache de datos e
instrucciones, controlar los errores en el hardware, controlar las interrupciones, y gestionar los
buses. Con ese nivel se consigue independizar el resto de los componentes del sistema de la
arquitectura hardware

• Llamadas a Procedimientos Locales y Remotos. Windows implementa el mecanismo de


llamada al procedimiento remoto RCP, para conectar clientes y servidores conectados a la misma
red. Cuando el cliente y el servidor estén en la misma máquina la llamada será un procedimiento
local LPC.

- 43 -
- RPC, este mecanismo RPC permite a un proceso cliente acceder a una función
situada en el espacio virtual de direcciones de otro proceso servidor situado en
otra máquina de una manera totalmente transparente.

- LPC, son una versión de las RCP. Se usan cuando el proceso necesita servicios
de un subsistema protegido, intentando descubrir el funcionamiento.

3.2 Procesos

Primero vamos hacer una definición general de proceso. Un proceso es el conjunto formado
por un programa (instrucciones y datos) más el contexto (permisos, prioridades, estados, etc.)
necesario para su correcta ejecución en el entorno de un sistema operativo Un proceso no es
ejecutable y dispone de un espacio de direcciones propio y aislado, una serie de recursos y una
serie de subprocesos. Los procesos en Windows NT se dividen en subprocesos (hilos) que
ejecutan el código en paralelo. Todos los procesos tienen al menos un subproceso.

Un subproceso ejecuta el código colocado en el espacio de direcciones del proceso, ya que el


proceso no lo puede ejecutar por sí mismo. Los subprocesos se asocian con unas instrucciones,
una pila, una cola de entrada de mensajes y unos registros. La cola de mensajes puede ser
enviada por otros procesos o por el Sistema Operativo.

Al crear un proceso se crea un subproceso primario. Podemos llamar a los subprocesos como
“hebras de ejecución”. Los procesos son como el soporte por donde corren los subprocesos. El
tiempo del CPU se divide entre los subprocesos.

Un proceso termina o “muere”, cuando todos sus subprocesos han terminado. El espacio de
direcciones virtuales de un proceso es de 4Gb. Los procesos pueden crear subprocesos, estando
su número fijado por el sistema.

3.2.1 Planificación del Tiempo de la CPU

La planificación que usa Windows NT es de anillo circular o round robin. Esta planificación
organiza formando anillos los subprocesos que van a ser ejecutados y asignados a cada
procesador, y la CPU se dedica a cada uno durante un intervalo de tiempo. El tiempo máximo
que dedica se denomina quantum y lo establece el Administrador del Sistema.

Cuando un subproceso consume su quantum, la CPU lo pondrá en espera, y ejecutara el


siguiente anillo. En el caso de que un subproceso este en espera de alguna entrada o salida, el
sistema pasara a la ejecución del siguiente anillo.

Todos los procesos y subprocesos tienen nivel de prioridad asignado. En Windows hay 32
niveles. Siendo 0 la de nivel inferior, de la 1 a la 15 son prioridades dinámicas y de la 16 a la 31
son prioridades estáticas o de tiempo real.

Cada nivel de prioridad es redondeado por una cola circular, en donde se encuentran los
subprocesos con esa prioridad. El Executive reparte primero el tiempo de la CPU en el anillo de
mayor prioridad no vacío. Cuando todos los subprocesos estén dormidos, el Executive ejecuta el
siguiente anillo usando la misma regla. Esta planificación tiene una política expulsiva, ya que si
llega un subproceso de prioridad superior, el Executive lo suspenderá sin agotar su quantum y
ejecutara el último que llego asignándole un quantum completo.

- 44 -
3.2.2 Prioridad de Proceso y Subproceso

Podemos dividir la prioridad en cuatro clases distintas:

• Clase Desocupado, valor de prioridad 4. En esta clase se encuentran los procesos que se
ejecutan periódicamente.

• Clase Normal, valor de prioridad 7 ó 9. Esta clase es asociada por defecto a los procesos. El
Executive les da valor 7 cuando se ejecutan en segundo plano, y 9 cuando pasan a primer plano,
por eso tiene una prioridad dinámica.

• Clase Alta, valor de prioridad 13. Esta clase corresponde a procesos como el Task Manager
o Administrador de Tareas. Este proceso permanece dormido casi todo el tiempo, hasta que el
usuario lo activa, parando el subproceso en ejecución y ejecutando el subproceso de proceso del
Task Manager.

• Clase Tiempo real, valor de prioridad 13. Es la prioridad más alta, y no es recomendable
usarla sin un control absoluto, ya que, tiene mayor prioridad que muchos procesos del sistema,
como el controlador del teclado…

La prioridad un proceso varía entre cuatro clases, mientras que la de un subproceso varia en el
rango [1,31]. Primeramente la prioridad de un subproceso corresponde con la del proceso padre
que lo creo, pero podemos modificar este valor si el subproceso llama a la función: BOOL
SetThreadPriority (HANDLE hThread, int nPriority);

Mediante suma y resta de la prioridad del padre obtenemos todo el rango de prioridades, de
esta manera el Executive calcula las prioridades de los subprocesos.

La ventaja de este sistema es que si un proceso cambia su clase de prioridad durante su vida,
sus subprocesos hijos tendrían las prioridades automáticamente actualizadas.

3.2.3 Creación de Procesos

La llamada al sistema que crea un proceso es una de las más complejas de todo el API
Win32. Un proceso se crea cuando un subproceso de otro proceso hace una llamada a:

BOOL CreateProcess (LPCTSTR lpszImageName, LPCTSTR lpszCommandLine,


LPSECURITY_ATTRIBUTES lpsaProcess, LPSECURITY_ATTRIBUTES lpsaThread, BOOL
fInheritHandles, DWORD fdwCreate, LPVOID lpvEnvironment, LPTSTR lpszCurDir,
LPSTARTUPINFO lpsiStartInfo, LPROCESS_INFORMATION lppiProcInfo);

El Executive crea un espacio virtual de 4 Gb para el proceso, y el subproceso primario. Un


subproceso tiene acceso a los objetos creados por el proceso al que pertenece.

Las clases de prioridad del proceso se llaman: IDLE_PRIORITY_CLASS (desocupado),


NORMAL_PRIORITY_CLASS (normal), HIGH_PRIORITY_CLASS (alta),
REALTIME_PRIORITY_CLASS (tiempo real) si el proceso va a ser dormido al crearse, usando
CREATE_SUSPENDED

Cada vez que el Executive crea un objeto, le asocia un contador de uso. Cuando un proceso
distinto usa un mismo objeto, incrementa el contador en 1, y cuando un proceso libera un objeto,
decrementa el contador en 1. Cuando el contador de uso de un objeto es 0, el Executive destruye
el objeto.

- 45 -
Cuando CreateProcess devuelve el control, los objetos proceso y subproceso primario tienen
sus respectivos contadores con valor 2. Para que el Executive pueda destruirlos, habrán de ser
liberados dos veces: una, cuando ellos mismos terminen, y otra, cuando el proceso padre los
libere cerrando los descriptores. Es muy importante cerrar estos descriptores para poder destruir
los objetos sino la memoria se desbordaría... La función para cerrar descriptores es BOOL
CloseHandle (HANDLE hobject);

3.2.4 Destrucción de Procesos

La función para finalizar el proceso es:

VOID ExitProcess (UINT fuExitCode);

Esta función devuelve un código, para indicar si ha finalizado con éxito o no. Cuando
terminamos el proceso todos sus subprocesos terminan, se cierran los objetos abiertos por el
proceso, se pone en el código de salida como terminado y el estado del objeto pasa a estar
señalado.

3.2.5 Creación de Subprocesos

Creamos un subproceso cuando otro subproceso realiza la siguiente llamada:

HANDLE CreateThread (LPSECURITY_ATTRIBUTES lpsa, DWORD cbStack,


LPTHREAD_START_ROUTINE lpStartAddr, LPVOID lpvThreadParm, DWORD fdwCreate,
LPDWORD lpIDThread);

El subproceso recién creado iniciará su ejecución inmediatamente antes del retorno de


CreateThread (a menos que hayamos especificado el indicador CREATE_SUSPENDED).

3.3 Comunicación entre procesos

3.3.1 Comunicación orientado al intercambio de mensajes

En esta comunicación intervienen 2 agentes, el cliente y el servidor. El cliente envía un


mensaje al servidor cuando necesita un servicio. El servidor realiza el trabajo indicado y
devuelve los datos solicitados (o un código de error, en el caso de que no pueda realizar el
servicio indicado) al cliente.

Las principales ventajas de este modelo son su sencillez, lo que provoca la fácil
implementación en cualquier sistema operativo, y la eficiencia, que asegura una correcta
comunicación entre servidor y cliente.

Las llamadas que utilizan cliente y servidor para comunicarse son send(destino, mensaje) y
receive (emisor, mensaje).

Estas primitivas de transferencia reciben el nombre de primitivas con bloqueo o primitivas


síncronas, en las cuales el emisor y el receptor se bloquean hasta que el mensaje se envíe en su
totalidad.

Una alternativa a esto son las primitivas sin bloqueo o primitivas asíncronas, en las cuales el
emisor es no bloqueante y el receptor bloqueante. Esto permite al emisor seguir operando en vez
de quedarse parado hasta que se envía el mensaje. La única desventaja es que el emisor debe

- 46 -
tener cuidado de no modificar el buffer de mensajes hasta que el mensaje sea enviado, lo que se
puede conseguir guardando una copia del mensaje enviado o notificando al proceso de la llegada
íntegra del mensaje mediante una interrupción.

3.3.2 Sincronización

La sincronización es la forma más sencilla de comunicación entre procesos en Windows, la


cuál se define como la habilidad de un hilo para parar voluntariamente su ejecución y esperar a
que otro hilo lleve acabo alguna operación.

Los sistemas operativos multitarea deben proporcionar a los hilos una manera de esperar a
que otro hilo haga algo, una vez que ese hilo haya terminado la ejecución, indicará al hilo que
está esperando que él ya ha terminado su ejecución y este podrá continuar con su trabajo.

En Windows, las características de espera e indicación están implementadas como parte de la


arquitectura de objeto, los cuales son:

1. Objeto proceso 2. Objeto hilo 3. Objeto fichero

4. Objeto evento 5. Objeto par de cuentas 6. Objeto semáforo

7.Objeto timer (temporizador) 8. Objeto mutante

Cualquiera de estos objetos de sincronización puede estar en uno de estos 2 estados en un


instante de tiempo: señalado (cuándo termina el último hilo del proceso) y no señalado. Cuando
un objeto entra en el estado de señalado (colocado por parte del kernel), los hilos que esperan son
liberados de esa espera inmediatamente.

Un hilo también puede notificar asincrónicamente a otro hilo para que cese su actividad, lo
que se define como alerta en el ejecutor de Windows.

3.4 Sistemas de memoria

3.4.1 Servicios de la Administración de la Memoria

La parte de Windows NT que soporta la gestión de la memoria se denomina Gestor de


Máquina Virtual (VMM), y reside en el Executive por encima del núcleo y se ejecuta en modo
supervisor. En Windows NT se utiliza memoria virtual paginada. En algunas máquinas se
combina paginación con segmentación. El tamaño de la página depende de la máquina.

3.4.2 Memoria Virtual Reservada y Comprometida

Hay dos tipos de memoria virtual no utilizada:

• Memoria virtual reservada.

• Memoria virtual comprometida y no usada.

La memoria virtual reservada ocupa parte del espacio de dirección virtual del programa, ya
que un componente la ha ocupado de manera activa, aunque no este siendo utilizada.

- 47 -
La memoria virtual comprometida, pero no usada, se produce cuando los componentes no
están haciendo una buena elección en las marcas de memoria. No hay nada que evite que un
componente se apropie bien de memoria virtual reservada o comprometida para evitar un
colapso.

3.4.3 Archivos Asignados en Memoria

Estudiemos ahora cómo el SO utiliza esta facilidad para cargar el código de un ejecutable y
sus bibliotecas DLL asociadas.

Un archivo asignado en memoria es cualquier archivo para el que se ha reservado una región
del espacio de direcciones virtuales de un proceso. Puede estar asignado el archivo completo o
sólo una parte del mismo.

El VMM no asigna ninguna página física para el archivo asignado en memoria. El proceso
entiende que en ciertas direcciones de su espacio tiene cargado el fichero, así que cuando acceda
a alguna se producirá un fallo de página. Es entonces cuando el VMM le asigna algunas páginas
físicas y las copia desde el disco.

En la gestión del VMM de los archivos asignados en memoria, el archivo de intercambio es el


propio archivo asignado en memoria.

Cuando se arranca un proceso con su código grabado en un fichero, el VMM asigna


automáticamente dicho fichero en el espacio de direcciones del proceso. También asigna todas
las bibliotecas incluidas explícitamente y todas aquellas a las que se hace referencia en el código.
Dentro del ejecutable existe una tabla llamada tabla de activación imagen, incluida por el
enlazador, cuyas entradas contienen las funciones de biblioteca que se llaman durante el código.
Una vez que se cargan bibliotecas en el espacio, el VMM completa la tabla escribiendo para cada
entrada la dirección que ocupa la correspondiente función en el espacio del proceso. Por tanto,
cada llamada a función implica una búsqueda en la tabla.

Supongamos ahora que se arranca una segunda instancia del mismo proceso. Entonces el
VMM pagina en el espacio de direcciones del nuevo proceso el fichero y las DLL, pero no
vuelve a asignar páginas físicas, sino que ambas instancias comparten todo, al menos en
principio. La ventaja de esto es ahorrar memoria, pero el inconveniente es que si uno de los
procesos modificara alguna variable global de su segmento de datos, el otro proceso la tendría
también modificada.

Para solucionar el problema, Windows NT tiene la propiedad de copiar antes de escribir. El


VMM intercepta cualquier instrucción de escritura en el archivo mapeado en memoria por parte
de las instancias. Cuando ocurre, asigna una o varias páginas físicas para la instancia escritora, y
copia los contenidos de las páginas originales en las nuevas y entonces esa instancia posee su
propia región del archivo, de datos y pila para modificarlos.

En la tabla de activación imagen, el VMM asigna las DLL por defecto en direcciones fijas
dentro del espacio de direcciones del proceso, de esta manera, varias instancias del proceso
pueden compartir la misma tabla por lo que resulta más eficiente que todos los procesos tengan
las DLL asignadas en las mismas direcciones.

3.4.4 Protección

Existen dos mecanismos de memoria virtual:

- 48 -
- El primero consiste en que a nivel de usuario, el procesador no permite acceder a más de
una parte del mapa de memoria, mientras que a nivel de núcleo se pueden direccionar todo el
mapa de la memoria virtual. La MMU genera una excepción de violación de memoria en caso de
que en el nivel de usuario se genere una dirección no permitida.

- El segundo mecanismo consiste en que la tabla de páginas de cada programa en ejecución se


selecciona mediante el RIED (registro de identificador de espacio de direccionamiento) con lo
que se consigue que cada programa en ejecución disponga de su propio espacio virtual y no
pueda acceder al espacio de los otros procesos. La MMU al mismo tiempo realiza la traducción
de cada dirección y comprueba que no sobrepase el límite.

3.4.5 Funciones del Bloque (Heap)

Los bloques de memoria son muy útiles cuando no necesitamos usar la memoria virtual.
Podemos tener estructuras de datos diferentes en bloques separados de memoria, de forma que si
se produce un fallo en la manipulación de estructuras de un tipo, este no repercuta en las demás.
Una ventaja es que la memoria se gestiona con más eficiencia, ya que al borrar estructuras y
escribir otras no se provoca ninguna fragmentación interna dentro del bloque. Otra ventaja es que
disminuyen los fallos de página ya que las estructuras en un mismo bloque seguramente
comparten la misma página, por lo que podríamos acceder a todas las de un mismo bloque con
sólo un fallo de página.

3.4.6 Espacio de Direcciones

Todo proceso que se crea en Windows NT posee un espacio de direcciones virtuales de 4 Gb


exclusivos de él. Ningún otro podrá acceder a esas direcciones, ya que no las conoce. Para un
proceso, todo lo que ve es suyo, y ve virtualmente 4 Gb. Los 2 Gb superiores están reservados al
sistema operativo, así como los 64 Kb primeros y los 64 Kb últimos de los 2 Gb inferiores. El
resto de los 2 Gb inferiores son para uso del proceso.

Diferenciamos varias zonas en el espacio de direcciones:

- Direcciones para las DLL del sistema (NTDLL, KERNEL32, USER32, GDI32 ...).

- Direcciones para las DLL propias de la aplicación.

- Bloques y pilas de los subprocesos.

- Imagen del archivo ejecutable: código, datos, cabecera, información del depurador y tabla
de activación imagen.

Además, cada proceso posee su propia tabla de páginas, a dos niveles. El objetivo de esa tabla
es devolver su dirección física asociada una dirección virtual. A veces la dirección virtual no
tiene correspondencia en memoria física. Entonces se dice que se ha producido un fallo o defecto
de página

3.4.7 Conversión de Direcciones

1.1.43 Tablas de páginas de procesos y del sistema

La tabla de páginas es una estructura de información que contiene la información de donde


están las páginas de un programa en ejecución y se almacena en la memoria principal. Esta tabla
permite saber si una pagina esta en la memoria principal o si esta en un marco, en que marco

- 49 -
especifico reside. Para saber esta información, cada elemento de la tabla tiene un bit para indicar
si la pagina esta en memoria principal o el número de marco en el que se encuentra.

Los programas están compuestos por varios elementos, por lo que se utilizan tablas de varios
niveles. El tamaño de las tablas esta almacenado por lo que se pueden detectar violaciones de
memoria si ese valor no coincide.

1.1.44 Conversión de los directorios de páginas

La asignación de memoria y la creación de la tabla de direcciones son trabajo del sistema


operativo. En cambio la MMU es la que se encarga de traducir las direcciones. Esta traducción
debe ser muy rápida para que pueda competir con un sistema sin memoria virtual.

3.5 Sistemas de archivos

El sistema de archivos NTFS es el más utilizado actualmente en Windows. Este sistema


recibió varias influencias en su creación de dos sistemas de archivos existentes: FAT para MS-
DOS y el sistema HPFS para OS/2.

3.5.1 Características de NTFS

A continuación vamos a explicar las principales características del sistema de archivos NTFS:

1. Recuperabilidad: NTFS proporciona la característica de recuperación del sistema basada


en el modelo de procesamiento de transacciones, técnica que gestiona la modificación en una
base de datos de manera que los fallos no afecten a su integridad. Si un fallo del sistema
interrumpe la transacción, la parte que ya se ha realizado debe de cancelarla y dejar la base de
datos en el estado anterior.

2. Seguridad: La seguridad es una característica muy importante de un sistema de archivos.


En NTFS se deriva al modelo de objetos de Windows NT. Los archivos abiertos se implementan
como objetos de archivos que tienen un descriptor de seguridad que asegura que ningún proceso
puede acceder a un archivo a menos que disponga de los permisos otorgados por el
administrador del sistema o por el propietario del archivo. Por lo tanto antes de un proceso pueda
abrir un manejador a cualquier tipo de objeto, el sistema comprueba que tienen la autorización
adecuada.

3. Redundancia de datos: Si se produce un corte de electricidad o un fallo en el sistema


NTFS no puede garantizar la recuperación completa de los datos por consiguiente las
aplicaciones deben aplicar redundancia de datos para proporcionar un nivel de protección
superior.

4. Tolerancia de Fallos: El modelo de controladores en niveles permite la tolerancia a fallos


de disco, formado por un controlador tolerante de fallos que se comunica con el controlador de
disco duro para escribir los datos en el disco. El controlador tolerante puede duplicar los datos en
otro disco de manera que siempre se pueda encontrar una copia redundante.

5. Flujos de datos múltiples: Cada unidad de información asociada con un archivo se


implementa con un atributo de archivo donde éste está formado por un único flujo. Esta
implementación permite añadir varios atributos a un archivo y por lo tanto más flujos. Cada
flujo tiene su propio bloque de archivo independiente para bloquear rangos y permitir el acceso
concurrente.

- 50 -
3.5.2 Estructura Interna

El funcionamiento interno se basa en la ejecución de controladores de dispositivos que se


ejecutan en modo kernel. El funcionamiento es el siguiente:

El entorno de Windows llama a los servicios del sistema que a su vez localizan los
controladores y los utilizan, dichos controladores se pasan información entre sí por medio del
administrador de E/S del ejecutivo de Windows NT. El controlador NTFS interactúa con otros
tres componentes:

1. Servicio de archivo de registro: proporciona servicios necesarios para mantener un


registro con todas las escrituras efectuadas.

2. Administrador de Caché: suministra servicios de caché y otros controladores de sistemas


de archivos.

3. Administrador de memoria virtual: cuando un programa trata de acceder a una parte del
archivo que no está cargado en caché, el administrador de memoria llama a NTFS para acceder al
controlador de disco y obtener el contenido del archivo.

NFTS participa en el modelo de objetos de Windows NT implementando archivos como


objetos y permiten que los archivos puedan compartirse y estén protegidos por el gestor de
objetos. El esquema está compuesto por estructuras de datos que enlazan con un manejador de
archivo con la estructura de disco del sistema de archivos.

Figura 5. Estructura de datos de NTFS

3.5.3 Estructura en disco

En este apartado vamos a explicar cómo organizado y almacenado en el disco duro los
archivos y sus atributos.

- 51 -
1. Volumen: Es la partición lógica de un disco creada cuando se da formato a un disco. En
los volúmenes de NTFS se almacenan todos los datos del sistema de archivos como los mapas de
bits y directorios incluso el sector de arranque del disco.

2. Bloques: Es la unidad fundamental de asignación de disco, su tamaño varía con el


tamaño del volumen. NTFS solo hace referencia a los bloques y no a los sectores para mantener
su independencia frente a los distintos tamaños del sector. NTFS hace referencia a las posiciones
físicas de un disco mediante los números de bloque lógico (LCN). Para convertir un LCN en una
dirección física se multiplica LCN por el factor bloque de manera que se obtiene el
desplazamiento en el volumen en bytes físicos.

3. Tabla de archivos maestra (MFT): La tabla de archivos maestra es la parte más


importante de los volúmenes NTFS implementada como una matriz de registros de archivos que
contiene una fila por cada archivo. Además cada volumen NTFS incluye un conjunto de archivos
de metadatos que contienen la información necesaria para implementar la estructura del sistema
de archivos.

Figura 6. Tabla de archivos maestra (MFT)

4. Referencia de archivos: Una referencia a un archivo está compuesta por un numero de


archivo que se corresponde con la posición del registro de archivo en la MTF menos 1 y por un
número de secuencia de la referencia de archivo que se incrementa cada vez que se reutiliza la
posición del registro de archivo.

5. Registro de archivos: NTFS almacena los archivos como una colección de pares
atributo/valor. Cada atributo se almacena como un flujo de bytes independiente de un archivo.
NTFS proporciona las siguientes operaciones sobre atributos: crear, eliminar, leer y escribir.

3.6 Sistemas de login y seguridad

3.6.1 Características

Windows proporciona un conjunto de servicios de seguridad completo y configurable, cuyas


características principales son:

1. El inicio de sesión seguro, el cuál requiere que los usuarios se identifiquen con un
identificador y una contraseña individual para acceder al sistema.

- 52 -
2. El control de acceso direccional, que permite al propietario de un recurso definir quien
puede accede a él y que puede hacer con él, pudiendo otorgar distintos permisos para los
distintos tipos de acceso.

3. La auditoria de seguridad, la cuál es capaz de detectar y registrar los sucesos relacionados


con la seguridad y todos los intentos de crear, acceder o eliminar recursos del sistema.

4. La protección de memoria, cuya labor es impedir que los procesos puedan acceder sin
autorización a la memoria virtual de otro proceso.

3.6.2 Componentes de seguridad del sistema

Los componentes y bases de datos de seguridad del sistema son los siguientes:

1. Monitor de referencias de seguridad (SRM): El SRM es un componente del ejecutivo de


Windows responsable de efectuar las comprobaciones de seguridad de acceso sobre los objetos,
manipular los privilegios de los usuarios y generar los mensajes de la auditoría de seguridad.

2. Servidor de autenticación de seguridad local (LSA): Es un proceso en modo usuario que


ejecuta la imagen LSASS, responsable de las directivas de seguridad del sistema local,
autentificación de usuarios y envío de mensajes de la auditoría de seguridad al Registro de
sucesos.

3. Base de datos de directivas del LSA: Contiene la configuración de las directivas de


seguridad del sistema. Almacena información como los dominios que están autorizados a realizar
autenticación de inicios de sesión, quien tiene permiso para acceder al sistema, quién tiene
privilegios y qué tipo de auditoría de seguridad se va a realizar.

4. Servidor de administración de cuentas de seguridad (SAM): Es el conjunto de subrutinas


responsable de administrar la base de datos que contiene los nombres de usuarios y los grupos
definidos en la máquina local o en un dominio.

5. Base de datos SAM: Contiene los usuarios y grupos definidos, junto con sus
contraseñas y demás atributos.

6. Paquete de autentificación predeterminado: Es una biblioteca de enlace dinámico


encargada de implementar la autenticación en Windows. Comprueba si el nombre de usuario y la
contraseña concuerda con los datos en la base SAM y es así devuelve información sobre ese
usuario.

7. Proceso de inicio de sesión: Proceso en modo usuario que ejecuta WinLogon.exe, el


cuál es responsable de capturar el nombre de usuario y la contraseña, enviarlos al LSA para
comprobarlos y crear el proceso inicial de la sesión del usuario.

8. Servicio de inicio de sesión por red: Servicio en modo usuario que responde a las
peticiones de inicio de sesión por red.

Durante la inicialización del sistema, el SRM (modo kernel) crea un puerto donde se conecta
con el LSA (modo usuario), y este crea otro puerto a su vez donde se conecta el SRM,
produciendo el establecimiento de puertos de comunicación privados. Cuando los dos están
conectados, dejan de escuchar en los demás puertos, lo que provoca que ningún otro proceso
pueda conectarse a ninguno de estos puertos durante la iniciación con intenciones maliciosas.

- 53 -
Figura 8. Componentes de seguridad de Windows

3.6.3 Protección de los objetos y descriptores de seguridad y control de acceso

Para controlar quien puede manipular un objeto, el sistema de seguridad debe asegurar la
identidad del usuario que esta accediendo al objeto. Es por esto por lo que es necesario un inicio
de sesión con autenticación, ya que es necesario definir qué objetos son accesibles para uno u
otro usuario. El administrador de objetos y el sistema de seguridad son los responsables de
determinar si se le debe entregar o no un recurso a un proceso que lo está solicitando.

Para controlar quién tiene acceso a un objeto Windows utiliza los descriptores de seguridad,
los cuales están formados por:

1. El SID del propietario, el cuál es un identificador de seguridad del propietario.

2. El SID del grupo, que es el identificador del grupo principal del objeto.

3. Lista de control de acceso discrecional (DACL), la cuál especifica quién tiene acceso al
objeto.

4. Lista de control de acceso del sistema (SACL), encargada de especificar qué operaciones
de qué usuarios deben registrarse en el registro de auditoría de seguridad.

Las listas de control de acceso (ACL) se descomponen en una cabecera ACL y 0 o varias
estructuras de entrada de control de acceso (ACE). Si una ACL no tiene ninguna ACE quiere
decir que ningún usuario tiene acceso a ese objeto.

3.6.4 WinLogon e inicio de sesión

WinLogon es el proceso encargado de gestionar las interacciones de usuario relacionadas con


la seguridad. Sus labores son coordinar el inicio de sesión, iniciar el escritorio de usuario,
gestionar la terminación de la sesión, las contraseñas, etc.

Este proceso se ocupa de que las operaciones de seguridad queden invisibles a cualquier otro
proceso activo, para evitar una posible intrusión de estos que provocaría un fallo en el sistema.

En el inicio de sesión, WinLogon tiene un papel importante. Cuando un usuario pulsa SAS
(Ctrl.,Alt, Supr) se inicia la sesión, acto seguido WinLogon cambia a un escritorio seguro y
solicita el nombre de usuario y la contraseña, cuando se han introducido, WinLogon llama al
LSA pasándole la información de inicio de sesión y especificándole cuál es el paquete que debe
recibirse para efectuar la autentificación. El paquete de autorización MSV1_0 (Llamado por el

- 54 -
LSA) toma la información de nombre de usuario y contraseña y envía una petición al SAM para
recibir información de la cuenta. Este paquete comprueba si hay restricciones de cuentas, si el
usuario no puede iniciar sesión debido a las restricciones de la base de datos SAM, la llamada de
inicio de sesión falla y se devuelve al LSA un estado de fallo.

Después, MSV1_0 compara la contraseña y el nombre de usuario con los almacenados en


SAM, si la información coincide, MSV1_0 genera un identificador único para la sesión de inicio,
el ID de usuario, genera también la sesión de inicio llamando al LSA con este identificador y le
pasa la información necesaria para crear un testigo de acceso para el usuario.

Si el inicio de sesión solicitado no coincide con el acceso permitido, finaliza el intento de


creación de la sesión, devolviéndole un error a WinLogon.

4 Implementación Linux

4.1 Arquitectura

La arquitectura del sistema operativo LINUX se divide en tres niveles:

1. El nivel de usuario, donde se ejecutan todos los procesos de usuario , sin capacidad para
ejecutar las instrucciones más privilegiadas del procesador.

2. El nivel del núcleo , es el privilegiado del procesador donde pueden ejecutarse todas sus
instrucciones sin restricciones.

3. El nivel del hardware, correspondiente al hardware especifico conectado en el sistema.

La comunicación entre los procesos de usuario y el núcleo se realiza a través de la


librería del sistema, que genera una interrupción software ( trap ) cada vez que se realiza una
llamada al sistema para obtener un servicio del núcleo.

Respecto a la estructura interna del núcleo , LINUX fue desarrollado sobre un sistema
basado en un procesador bastante lento como el i386, lo que impuso la utilización de una
arquitectura monolítica tradicional.

4.1.1 El Kernel

Estructura del Kernel:

Interrupciones de
Llamadas al sistema
dispositivo y de sistema
Corres- Manejo Creación y
Manejo de Nombres Fallos
Sockets ponden- de terminación
terminales de archivo pag
cia señales de procesos
Tty Protocolos de red Sistemas Memori
Tty cocinada de a Calendarización de
cruda archivos virtual procesos

- 55 -
Caché
Disciplinas Caché
Enrutamiento de
de Línea de búfer
páginas
Controladores de
Dispositivos por Controladores de
dispositivo de Despacho de procesos
caracteres dispositivo de red
discos

Hardware

A la izquierda tenemos los dispositivos de caracteres pueden usarse de dos maneras, para
captar cada pulsación de tecla o capturar líneas enteras.

El software de red suele ser modular y reconoce diferentes dispositivos y protocolos. La capa
que esta arriba de los controladores de red tiene una función de enrutamiento asegurándose de
que el paquete correcto se envié al dispositivo o protocolo correcto. Linux contiene toda la
funcionalidad de un enrrutador de Internet dentro del kernel.

Mas arriba esta la pila de protocolos que incluyen IP y TCP y posiblemente otros protocolos.
Superpuesta a toda la red está la interfaz de sockets, que permite a los programas crear sockets
para redes y protocolos específicos y recibir a cambio un descriptor de archivo para cada socket,
el cuál podrán usar después.

Encima de los controladores de discos están la caché de buffer y el caché de páginas del
sistema de archivos, puede tomarse cualquier pagina de memoria para cualquiera de las dos
funciones, dependiendo de lo que mas se necesite.

Arriba del cache de buffer están los sistemas de archivos. Linux maneja multiples sistemas de
archivos incluyendo el sistema rápido de archivos de Berkeley, el sistema de archivos con
estructura de registro y diversos sistemas de archivos System V.. Todos estos comparten el
mismo cache de buffer.

Encima de los sistemas de archivos esta la asignación de nombres de archivos, administración


de directorios, administración de enlaces duros y enlaces simbólicos y otras propiedades del
sistema de archivos que son iguales para todos los sistemas de archivos.

Encima del cache de paginas esta el sistema de memoria virtual. Aquí se encuentra toda la
lógica de paginación ,como el algoritmo de reemplazo de paginas.

Encima de esto ultimo vine el código para establecer la correspondencia de archivos en la


memoria virtual y el código de alto nivel para manejar los fallos de página. Este código
determina que debe hacerse cuando se presenta un fallo de pagina. Primero verifica si la
referencia a memoria es valida y, de serlo, determina donde esta la pagina requerida y como
puede obtenerse.

La última columna se ocupa de la administración de procesos. Arriba del despachador está el


calendarizador de procesos, que escoge el proceso que se ejecutará a continuación. Si los
subprocesos se administran en el kernel, la administración de subprocesos también se efectúa
aquí.

Arriba del calendarizador se encuentra el código para procesar señales y enviarlas al destino
correcto, así como el código para crear y terminar procesos.

- 56 -
La capa superior es la interfaz del sistema todas las llamadas llegan aquí y se dirigen a uno de
los módulos que están más abajo. En la parte derecha de la capa más alta está la entrada para
interrupciones de sistema y de dispositivo, lo que incluye señales, fallos de página, todo tipo de
excepciones del procesador y las interrupciones de E/S.

4.2 Procesos

4.2.1 Procesos

Linux es un sistema multiprogramacion, gracias a esto en Linux se puede ejecutar procesos


independientes al mismo tiempo. En linux se puede ejecutar docenas de procesos en segundo
plano, llamados demonios que normalmente se inician al arrancar el sistema. Un ejemplo de
demonio muy representativo es el cron que se activa cada minuto para ver si tiene trabajo, si lo
tiene lo efectúa, seguidamente se desactiva hasta la siguiente verificación.

La creación de procesos en Linux es sencilla, se realiza con la llamada al sistema fork, con el
cual se crea una copia del proceso original, al proceso que se bifurco se le denomina padre y al
nuevo proceso hijo.

Los procesos hijos, constan de un Identificador llamado PID, cuando se crea el proceso el
padre recibe el PID del hijo, el PID es como si fuese su nombre, de esa manera el sistema sabe
que proceso tiene que ejecutar en cada momento.

Los procesos en Linux pueden comunicarse entre sí empleando una forma de transferencia de
mensajes. Es posible crear un canal entre dos procesos en el que un proceso pueda escribir un
flujo de bytes para que el otro lo lea. Estos canales se denominan canalizaciones.

Otra forma de comunicación entre procesos es mediante interrupciones de software .Los


procesos se pueden enviar señales entre ello, ademas, los procesos pueden indicarle al sistema
que quieren que suceda cuando les llegue una señal, las opciones son, ignorarla, atraparla o dejar
que la señal atrape el proceso.

Llamadas al sistema para administración de procesos:

Llamada al sistema Descripción


pid = fork () Crea un proceso hijo idéntico al padre
Pid = waitpid(pid, &statloc, opcs) Espera a que un hijo termine
s = execve(name, argv, environp) Sustituye la imagen del núcleo de un proceso
exit(status) Termina la ejecución de proceso y devuelve el estado
s = sigaction(sig, &acf, &oldact) Define la acción a efectuar al recibir señales
s = sigretum(&context) Regresa después de una señal
s = sigprocmask(how, &set, &old) Examina o modifica máscara de señal
s = sigpending(set) Obtiene el conjunto de señales bloqueadas
s = sigsuspend(sigmask) Sustituye máscara de señal y suspende el proceso
s = kill(pid, sig) Envía una señal a un proceso
residual = alarm(seconds) Pone el reloj de alarma
s = pause( ) Suspende el invocador hasta la siguiente señal

- 57 -
Llamadas de subprocesos más usadas:

Llamada de Descripcion
subprocesos
pthread_create Crea un subproceso nuevo en el espacio de direcciones del invocador
pthread_exit Termina el subproceso invocador
pthread_join Espera a que un subproceso termine
pthread_mutex_init Crea un nuevo mutex
pthread_mutex_destroy Destruye un mutex
pthread_mutex_lock Cierra el bloqueo de un mutex
pthread_mutex_unlock Abre el bloqueo de un mutex
pthread_cond_init Crea una variable de condición
pthread_cond_destroy Destruye una variable de condición
pthread_cond_wait Espera a una variable de condición
pthread_cond_signal Libera un subproceso que espera a una variable de condición

El kernel tiene dos estructuras relacionadas con procesos, la tabla de procesos y la estructura
de usuario. La tabla de procesos contiene información de todos los procesos y la estructura de
procesos pagina a disco cuando el proceso no esta en memoria.

La tabla de procesos se puede agrupar en las siguientes categorías:

1. Parámetros de Calendarizacion: Indica la prioridad del proceso y el tiempo consumido


por este, así como determina que proceso se ejecutara a continuación.

2. Imagen de memoria: con apuntadores a los segmentos de texto, datos y pila o, si se usa
paginación, a sus tablas de página.

3. Señales: Son mascaras que indican que señales se ignoran, atrapan, bloquean y se
entregan.

4. Datos diversos. Estado actual, suceso que esta esperando ,PID, PID del padre e
identificación de usuario y grupo

La información contenida en la estructura de usuario es la siguiente:

1. Registros de máquina, Cuando se produce una interrupción por un salto al kernel aquí es
donde se guardan los registros de maquina

2. Estado de llamada al sistema. Información de la llamada al sistema

3. Tabla de descriptores de archivo

4. Contabilidad. Apuntador a una tabla que lleva el control de usuario y el tiempo de CPU
consumido por el proceso.

5. Pila del kernel. Una pila fija utilizada por la parte de kernel del proceso.

- 58 -
4.2.2 Subprocesos

En linux existe una nueva llamada al sistema llamada clone. Su formato de invocación es:

pid = clone(funcion,apunt_pila,indicadores_compart,arg);

Esto crea un nuevo subproceso ya sea en el proceso actual o en uno nuevo, dependiendo de
indicadores_compart. Si el nuevo subproceso está en el proceso actual, compartirá el espacio de
direcciones con los subprocesos existentes y las siguientes escrituras de cualquier byte del
espacio de direcciones, sera visible para los demás subprocesos del proceso. Si no se comparte el
espacio de direcciones, el nuevo subproceso recibirá una copia exacta de dicho espacio, pero las
siguientes escrituras efectuadas por el nuevo subproceso no serán visibles para los subprocesos
anteriores. Esto último es lo mismo que la llamada a fork.

En ambos casos el nuevo subproceso comienza a ejecutar lo indicado en el parametro


función, que se invoca con arg como unico parametro.

El parametro indicadores_compart es un mapa que define cinco bits. Cada bit controla un
aspecto del comportamiento y cada uno puede encenderse o apagarse.

Significado cuando esta


Indicador Significado cuando esta apagado
encendido
Clone_VM Crea nuevo subproceso Crea nuevo proceso
Clone_FS Compartir umask,raiz y dir trabajo No Compartirlos
Compartir los descriptores de
Clone_FILES Copiar los descriptores de archivo
archivo
Compartir tabla de manejo de
Clone_SIGHAND Copiar la tabla
señales
Subproceso nuevo recibe PID
CLONE_PID Subproceso nuevo con PID propio
antiguo

4.2.3 Calendarización en linux

En Linux la calendarizacion se se basa en subprocesos. Linux distingue tres clases de


procesos para fines de calendarizacion:

1. FIFO en tiempo real

2. Turno circular en tiempo real

3. Tiempo compartido

Los procesos FIFO en tiempo real tienen la prioridad más alta y sólo pueden ser expropiados
por un subproceso FIFO en tiempo real que recién haya quedado listo. Los subprocesos de turno
circular en tiempo real son iguales a los FIFO en tiempo real, excepto que pueden ser
expropiados por el reloj.

- 59 -
Cada subproceso tiene una prioridad de calendarización. El valor predeterminado es 20, pero
se puede alterar utilizando la llamada al sistema nice (valor).

Además de una prioridad, cada subproceso tiene asociado un cuanto. El cuanto es el número
de tics de reloj durante los cuales puede ejecutarse el proceso como máximo. De manera
predeterminada el reloj opera a 100HZ, asi que cada tic es 10 ms y se llama jiffy.

Cuando se toma una decisión de calendarizacion, se escoge el subproceso de mayor prioridad.


Después dicho subproceso se ejecuta, su cuanto se decrementa en 1 en cada tic de reloj. Se le
quita la CPU a un subproceso si se presenta cualquiera de las siguientes condiciones:

1. Su cuanto llega a 0.

2. El subproceso se bloquea por E/S, por un semáforo o por otra cosa.

3. Un subproceso que estaba bloqueado y tienen mayor prioridad queda listo para
ejecutarse.

Un subproceso muy dedicado al computo por lo reglar agotara rápido su cuanto y lo tendrá a
0 cuando se restablezcan los cuantos, así que recibirá un cuanto igual a su prioridad. Un
subproceso dedicado a la E/S podría tener una buena cantidad de cuanto sobrante y, por tanto,
recibirá un cuanto más grande la siguiente vez. Si en un subproceso no se usa nice, la prioridad
será 20, así que el cuanto se convertirá en 20 jiffies = 200 ms.

4.3 Comunicación entre procesos

1.1.45 Sockets

Los sockets aparecieron en 1981 en la versión BSD 4.2 de UNIX. La interfaz de sockets esta
disponible en prácticamente en todos los sistemas Linux. Se puede decir que los sockets
constituyen la interfaz de programación más básica para el desarrollo de aplicaciones en Internet.

Utilizando esta interfaz, dos procesos que desean comunicarse, crean cada uno de ellos un
socket o extremo de comunicación. Cada socket se encuentra asociado a una dirección y permite
enviar o recibir datos a través de él.

En el caso del interfaz de Linux, hay dos dominios, cada dominio representa una familia de
protocolos. Los dominios más habituales son:

• Dominio UNIX (PF_UNIX): que se utiliza para comunicación entre procesos del
mismo computador.

• Dominio Internet (PF_INET): que se emplea para la comunicación de procesos que


ejecutan en ordenadores conectados por medio de protocolos TCP/IP.

Tipos de sockets

Existen dos tipos de sockets que determinan el tipo de comunicación empleada:

• Sockets de tipo stream: (SOCK_STREAM): Con este tipo de sockets la comunicación es


orientada a conexión. El intercambio de datos utilizando sockets de este tipo es fiable y
además se asegura el orden en la entrega de los mensajes. El canal de comunicaciones puede
verse como un flujo de bytes en el que no existe separación entre los distintos mensajes. Esto

- 60 -
quiere decir que el emisor puede enviar por ejemplo 1KB y el receptor puede recibirlo de
100 bytes en 100 bytes. Cuando se emplea el dominio PF_INET, este tipo de sockets
corresponde al de la capa de transporte TCP.

• Sockets de tipo datagrama: (SOCK_DGRAM): Este tipo de sockets se corresponde con una
comunicación no orientada a conexión. Los mensajes en este caso se denominan datagramas
y tienen un tamaño máximo de 64 KB. No se asegura fiabilidad, los datagramas se pueden
perder y tampoco se asegura la entrega ordenada de los mismos. En este caso, si existe
separación entre cada uno de los distintos datagramas. Cuando se emplea el dominio
Internet, los sockets de este tipo permiten acceder a servicios del protocolo de transporte
UDP.

Pueden existir problemas en el envío de datos, debido a las distintas arquitecturas. Unas
maquinas pueden representar los enteros en little endian y otras maquinas hacerlo en big endian.
Antes de entregar el dato a las funciones send() y después del recv() debemos utilizar las
siguientes funciones:

Antes de enviar, lo pasamos a un formato estándar de red:

• unsigned short htons(unsigned short). (Host to Network Short)

• unsigned long htonl(unsigned long). (Host to Network Long)

Después de recibir, lo deshacemos y lo concretamos de nuevo, al formato de la maquina:

• unsigned short ntohs(unsigned short). (Network to Host Short)

• unsigned short ntohl(unsigned short). (Network to Host Long)

1.1.46 A través de variables de entorno

Solo es posible de padres a hijos. Se utiliza el mecanismo de fork para la creación de hijos
con variables establecidas por los padres.

1.1.47 Mediante una señal

Solo indica que algo ha ocurrido y solo lleva como información un número de señal.

La señal es un evento que debe ser procesado y que puede interrumpir el flujo normal de un
programa.

Las señales se asocian a una función que procesa el evento que ha ocurrido. También pueden
ser ignoradas.

Adjuntamos una tabla con las señales especificadas en Linux.

1.1.48 Mediante entrada salida

La forma más simple de IPC en Linux son los pipes o tuberías, han estado presentes desde los
primeros orígenes del sistema operativo UNIX y proporcionan un método de comunicaciones en
un sentido (unidireccional, semiduplex) entre procesos.

- 61 -
Una tubería (pipe) es simplemente un método de conexión que une la salida estándar de un
proceso a la entrada estándar de otro. Para esto se utilizan “descriptores de archivos” reservados,
los cuales en forma general son:

• 0: entrada estándar (stdin).

• 1: salida estándar (stdout).

• 2: salida de error (stderr).

Este mecanismo es ampliamente usado, incluso en la línea de comandos (en la shell). Por
ejemplo:

ls | sort | lp

Lo anterior es un ejemplo de “pipeline”, donde se toma la salida de un comando ls como


entrada de un comando sort, quien a su vez entrega su salida a la entrada de lp. Los datos corren
por la tubería semi-duplex, viajando (virtualmente) de izquierda a derecha por la tubería.

Cuando un proceso crea una tubería, el kernel instala dos descriptores de archivos para que
los use la tubería. Un descriptor se usa para permitir un camino de entrada a la tubería (write),
mientras que la otra se usa para obtener los datos de la tubería (read).

1.1.49 Mediante técnicas IPC u otras

Aquí se incluyen mecanismos como semáforos, memoria compartida y cola de mensajes.

1.1.50 Colas de mensajes

Un proceso puede crear una nueva cola de mensajes, o se puede conectar a una ya existente.
De esta forma, dos procesos pueden compartir información mediante la misma cola de mensajes.

Las operaciones más comunes sobre las colas de mensajes son:

• msgget(): devuelve el identificador para una cola de mensajes. La función devuelve el


identificador de la cola de mensajes asociada a key. Se crea una nueva cola de
mensajes si key tiene el valor IPC_PRIVATE, o si key no es IPC_PRIVATE pero no
existe ninguna cola de mensajes asociada a key, y IPC_CREAT se inserta en msgflg.

• msgsnd(): Envía un mensaje a la cola asociada al identificador del sistema


referenciado por el parámetro msqid. El argumento msgp es un puntero al comienzo
de la zona de memoria de usuario donde está almacenado el mensaje a enviar, el
mensaje debe poseer un campo de comienzo del tipo long en el que se indica el tipo
del mensaje, el siguiente campo deberá contener el mensaje propiamente dicho

• msgrcv(): toma un mensaje de la cola especificada por el parámetro msqid y lo copia


en la zona de memoria apuntada por msgp. El mensaje recibido tiene una estructura
análoga a la del mensaje enviado por emisor. El argumento msgtyp se utiliza para
especificar el tipo de mensaje a recibir.

- 62 -
• msgctl(): La función msgctl permite realizar operaciones de control en la cola de
mensajes especificada por el parámetro msqid. La operación se especifica mediante el
argumento cmd. Permite eliminar la cola.

1.1.51 Semáforos

Un semáforo es un mecanismo de comunicación con el cual no se mueven datos, puesto que


solo se puede consultar y modificar su valor al tener un carácter puramente informativo.

El mecanismo IPC de semáforos implementado en UNIX es una generalización más compleja


del concepto descrito por Dijkstra, ya que va a permitir manejar un conjunto de semáforos
mediante el uso de un identificador asociado y realizar operaciones wait y signal que actualizan
de forma atómica todos los semáforos asociados bajo un mismo identificador. Esta complejidad
en la utilización de los semáforos, se justifica mediante la imposibilidad de resolver una cierta
categoría de problemas con los semáforos manipulados individualmente, por medio únicamente
de las operaciones wait y signal.

Operaciones sobre semáforos:

• semget(): obtiene el identificador de un conjunto de semáforos. La función devuelve


el identificador del conjunto de semáforos asociado al valor del argumento key. Un
nuevo conjunto de nsems semáforos se crea si key tiene el valor IPC_PRIVATE, o si
key no vale IPC_PRIVATE, no hay un conjunto de semáforos asociado a key, y el bit
IPC_CREAT vale 1 en semflg

• semop(): operaciones con semáforos. Esta función ejecuta operaciones en los


miembros seleccionados del semaforo indicado por semid.

• semctl(): operaciones de control de semáforos. La función realiza la operación de


control especificada por cmd en el conjunto de semáforos (o en el semáforo semnum-
avo del grupo) identificado por semid. El primer semáforo del conjunto está indicado
por el valor 0 para semnum.

1.1.52 Memoria compartida

Memoria compartida es una región de memoria que puede ser accedida por múltiples
procesos.

Operaciones con memoria compartida:

• shmget() se usa para obtener un id para una clave asociada. Este id es similar al id de
cola de mensajes y se usa como parámetro en otras llamadas al sistema relacionadas
con memoria compartida. La llamada shmget() también se usa para crear segmentos
de memoria compartida.

• shmctl() se usa para realizar operaciones de control sobre la memoria compartida,


entre ellas, la de eliminar segmentos de memoria compartida del sistema.

• shmat() devuelve un puntero que referencia al segmento de memoria compartida. Este


puntero se emplea para acceder al segmento de memoria compartida para realizar
tanto operaciones de lectura como escritural.

• shmdt() se emplea para desconectar del segmento de memoria compartida.

- 63 -
1.1.53 D-Bus

D-Bus (Desktop Bus) es un sistema de comunicación entre procesos (IPC), para aplicaciones
de software con el fin de comunicarse entre sí. D-Bus es desarrollado como parte del proyecto
freedesktop.org.

D-Bus es un mecanismo de comunicación entre procesos (IPC) consistente en tres capas:

• Una biblioteca, libdbus, que permite a dos aplicaciones conectarse e intercambiar


mensajes.

• Un demonio ejecutable que funciona como bus de mensajes, construido sobre


libdbus, al cual pueden conectarse varias aplicaciones. El demonio puede encaminar
mensajes desde una aplicación a ninguna o más aplicaciones.

• Bibliotecas adaptadas (wrappers en inglés) para su uso en frameworks concretos.

Los dos principales puntos de uso de D-Bus son los siguientes:

• Comunicación entre aplicaciones de escritorio en la misma sesión, facilitando la


integración de aplicaciones dentro de un mismo entorno de escritorio y el tratamiento
de asuntos relativos al ciclo de vida de procesos.

• Comunicación entre el sistema operativo y la sesión de escritorio, incluyendo dentro


del sistema operativo al núcleo y algunos demonios o procesos.

Funcionamiento

Toda aplicación que utilice D-Bus contiene objetos, normalmente definidos (aunque no es
necesario) como GObject, QObject, objetos C++ u objetos Python. Cuando se recibe un mensaje
a través de una conexión D-Bus, este se envía a un objeto específico, no globalmente a la
aplicación. De esta forma, D-Bus se apoya en componentes software, y de cara al usuario parece
como si un objeto fuera serializado a través de la conexión IPC, sin importar si existe o no un
objeto al otro lado de la comunicación.

Para permitir la especificación de destino a los mensajes, debe existir un medio para indicar
esa referencia. En muchos lenguajes de programación, esto recibe el nombre de puntero o
referencia. Sin embargo, estas referencias se implementan como direcciones de memoria
relativas al espacio de direcciones de la aplicación, lo cual no puede intercambiarse de una
aplicación a otra.

Para resolver esto, D-Bus introduce un nombre para cada objeto. Dicho nombre se muestra
como una ruta del sistema de ficheros. Por ejemplo, un objeto podría llamarse
/org/kde/kspread/sheets/3/cells/4/5. Resulta aconsejable utilizar rutas fácilmente inteligibles por
humanos, si bien los desarrolladores son libres de crear objetos con nombres como
/com/mycompany/c5yo817y0c1y1c5b si así lo desean.

Los nombres de objetos D-Bus se aglutinan en espacios de nombres para asegurar que
módulos distintos de código se mantengan separados. Los espacios de nombres generalmente
están prefijados en función de los componentes utilizados por los propios programadores (por
ejemplo, /org/kde).

- 64 -
4.4 Memoria

La memoria en linux tiene 2 componentes principales. El sistema de gestión de memoria


física que se encarga de asignar y liberar paginas, grupos de paginas y bloques pequeños de
memoria. El otro componente es la memoria virtual.

4.4.1 Memoria física

En la memoria física el kernel en si es permanente ninguna de sus partes se pagina a disco. El


resto de la memoria esta disponible para paginas de usuario , el cache de buffer empleado por el
sistema de archivos, el cache de paginación y otros usos.

Además Linux maneja módulos que se cargan de forma dinámica y, por lo regular, son
controladores de dispositivos. Su tamaño puede ser arbitrario y a cada uno se le puede asignar un
área de memoria de kernel contigua. Debido a esto Linux administra la memoria física de tal
forma que pueda obtener un trozo de memoria de tamaño arbitrario cuando quiera. El algoritmo
que se usa se llama algoritmo del amigo.

El algoritmo del amigo aparea unidades adyacentes de memoria asignable. Cada región de
memoria asignable tiene una compañera adyacente y siempre que dos regiones compañeras
asignadas quedan libres, se combinan para formar una región mas grande. Esa región tiene una
compañera con la que puede combinarse para forma una región mayor. Si una solicitud de
memoria pequeña no puede satisfacerse asignando una región libre pequeña existente, una región
libre mayor se subdividirá en dos compañeras para satisfacer la solicitud.

Ejemplo del algoritmo del amigo:

Las funciones del núcleo no tienen que usar el asignador básico para reservar memoria, sino
que utilizan otros subsistemas de gestión. Los subsistemas de memoria mas importantes son: el
de memoria virtual, el asignador de variable kmalloc y los dos caches de datos persistentes del
núcleo (El cache de buffers y el cache de paginas).

Tanto el asignador de paginas con el kmalloc estan protegidos contra interrupciones. Las
rutinas de interrupción emplean una prioridad atómica que garantizan que la solicitud se
satisfará, o si ya no hay memoria, fallara de inmediato. Los procesos de usuario normales que
requieren una asignación de memoria comenzaran a intentar encontrar memoria existente que
pueda liberarse y no podrán avanzar hasta que no haya memoria disponible.

Las regiones de memoria tomadas por el asignador kmalloc se reservan de forma permanente
hasta que son liberadas de forma explicita. El kmalloc no puede recuperar estas regiones como
respuesta a una escasez de memoria.

Existen otros 3 subsistemas que realizan su propia gestión de paginas físicas:

1. El cache de buffer: orientado a bloques y es el mecanismo principal para efectuar E/S


con esos dispositivos.

- 65 -
2. El cache de paginas : Almacena paginas enteras del contenido de los archivos y no esta
limitado a los dispositivos por bloques

3. El sistema de memoria virtual : Administra el contenido del espacio de direcciones


virtual de cada proceso.

4.4.2 Memoria virtual

El sistema de memoria virtual de Linux se encarga de mantener el espacio de direcciones


visible para cada proceso. Este sistema crea paginas de memoria virtual por solicitud y gestiona
la carga de dichas paginas.

El administrador de memoria mantiene 2 vistas distintas: Como un conjunto de regiones


individuales y como un conjunto de paginas.

Cada área se describe en el kernel con una entrada vm_area_struct. La entrada vm_area_struct
indica las propiedades del área que incluyen el modo de protección (escritura\ lectura o solo
lectura), si esta fija en memoria o no y la dirección en la que crece. Todas las entradas de
vm_area_struct de un proceso se enlazan en una lista ordenada por dirección virtual que permite
hallar todas las páginas. Cuando la lista crece demasiado se crea un árbol para acelerar las
búsquedas.

La entrada vm_area_struct también registra si el área es privada con el proceso o se comparte


con uno o mas procesos. Después de un fork Linux crea una copia de la lista del área para el
proceso hijo, pero hace que tanto el padre como el hijo apunten a las mismas tablas de paginas,
las áreas se marcaran como lectura/escritura pero las paginas solo de lectura. Si se intenta escribir
en una pagina se produce un fallo de protección y el kernel proporciona al proceso una copia de
la pagina y la marca como lectura/escritura.

Vm_area_struct también registra si el área tiene o no asignado almacenamiento de respaldo en


disco y en caso de tenerlo donde. Otras áreas como la pila, no tienen asignado un almacén de
respaldo sino hasta que se hace necesario paginarlas a disco.

En Linux el sistema de paginación se puede dividir en dos partes, el algoritmo de política que
decide cuales de las paginas deben pasarse a disco y cuales deben escribirse, y por otro lado, el
mecanismo de paginación, que lleva a cabo la transferencia.

En la política de paginación de Linux se emplea un reloj, de múltiples pasadas y cada página


tiene una edad que se ajusta en cada pasada de reloj. El mecanismo de paginación apoya la
paginación tanto a dispositivos y particiones de intercambio como a archivos normales. Los
bloques de dispositivos de intercambio se asignan según un mapa de bits de bloques usados, que
se mantiene en memoria física en todo momento.

Linux utiliza para su propio uso una región constante. Las entradas de tablas de páginas que
corresponden a estas paginas del núcleo se marcan como protegidas, este área de memoria virtual
del núcleo contiene dos regiones:

1. Un área estática que contiene referencias de tabla de paginas a cada pagina de memoria
física disponible en el sistema, de modo que haya una traducción sencilla de direcciones físicas a
virtuales cuando se ejecute código del núcleo

2. La otra región no se reserva para algún propósito especifico. El núcleo puede modificar
las entradas de tabla de páginas dentro de este intervalo de direcciones de modo que apunten a
cualquier otra área de memoria que se desee. El núcleo contiene 2 funciones que permiten a los

- 66 -
procesos usar esta memoria virtual, por un lado vmalloc que asigna un numero arbitrario de
paginas de memoria física y las hace corresponder con una sola región de memoria virtual del
núcleo, lo que permite la asignación de trozos de memoria grandes aun no habiendo suficientes
paginas físicas adyacentes libres para satisfacer la solicitud. La función vremap hace que una
secuencia de direcciones virtuales apunte a un área de memoria utilizada por un driver de
dispositivo para E/S con correspondencia en la memoria.

4.5 Sistemas de archivos

4.5.1 Tipos de sistemas de archivos

Los tipos de sistemas de archivos más conocidos para Linux son: ext2, ext3, ext4, XFS,
ReiserFS y JFS.

1.1.54 ext2

ext2 (second extended filesystem o "segundo sistema de archivos extendido") es un sistema


de archivos para el kernel Linux. Fue diseñado originalmente por Rémy Card. La principal
desventaja de ext2 es que no implementa el registro por diario (en inglés Journaling) que sí
implementa su sucesor ext3, el cual es totalmente compatible.

El sistema de ficheros tiene un tipo de tabla FAT de tamaño fijo, donde se almacenan los i-
nodos. Los i-nodos son una versión muy mejorada de FAT, donde un puntero i-nodo almacena
información del archivo (ruta o path, tamaño, ubicación física). En cuanto a la ubicación, es una
referencia a un sector del disco donde están todos y cada una de las referencias a los bloques del
archivo fragmentado. Estos bloques son de tamaño especificable cuando se crea el sistema de
archivos, desde los 512 bytes hasta los 4 kB, lo cual asegura un buen aprovechamiento del
espacio libre con archivos pequeños.

Los límites son un máximo de 2 TB de archivo, y de 4 TB de partición.

1.1.55 ext3

ext3 (third extended filesystem o "tercer sistema de archivos extendido") es un sistema de


archivos con registro por diario (journaling). Es el sistema de archivo más usado en
distribuciones Linux, aunque en la actualidad está siendo remplazado por su sucesor, ext4.

La principal diferencia con ext2 es el registro por diario. Un sistema de archivos ext3 puede
ser montado y usado como un sistema de archivos ext2. Otra diferencia importante es que ext3
utiliza un árbol binario balanceado (árbol AVL) e incorpora el asignador de bloques de disco
Orlov.

1.1.56 ext4

ext4 (fourth extended filesystem o «cuarto sistema de archivos extendido») es un sistema de


archivos con registro por diario (en inglés Journaling), anunciado el 10 de octubre de 2006 por
Andrew Morton, como una mejora compatible de ext3. El 25 de diciembre de 2008 se publicó el
kernel Linux 2.6.28, que elimina ya la etiqueta de "experimental" de código de ext4.

Las principales mejoras son:

- 67 -
• Soporte de volúmenes de hasta 1024 PiB.

• Soporte añadido de extent.

• Menor uso del CPU.

• Mejoras en la velocidad de lectura y escritura.

1.1.57 XFS

XFS es un sistema de archivos de 64 bits con journaling de alto rendimiento creado por SGI
(antiguamente Silicon Graphics Inc.) para su implementación de UNIX llamada IRIX. En mayo
del 2000, SGI liberó XFS bajo una licencia de código abierto.

XFS se incorporó a Linux a partir de la versión 2.4.25, cuando Marcelo Tosatti (responsable
de la rama 2.4) lo consideró lo suficientemente estable para incorporarlo en la rama principal de
desarrollo del kernel. Los programas de instalación de las distribuciones de SuSE, Gentoo,
Mandriva, Slackware, Fedora Core, Ubuntu y Debian ofrecen XFS como un sistema de archivos
más. En FreeBSD el soporte para solo-lectura de XFS se añadió a partir de Diciembre de 2005 y
en Junio de 2006 un soporte experimental de escritura fue incorporado a FreeBSD-7.0-
CURRENT.

1.1.58 ReiserFS

ReiserFS es un sistema de archivos de propósito general, diseñado e implementado por un


equipo de la empresa Namesys, liderado por Hans Reiser.

Actualmente es soportado por Linux y existen planes de futuro para incluirlo en otros
sistemas operativos. También es soportado por Windows (de forma no oficial), aunque por el
momento de manera inestable y rudimentaria (ReiserFS bajo windows).

A partir de la versión 2.4.1 de Linux, ReiserFS se convirtió en el primer sistema de ficheros


con journal en ser incluido en el núcleo estándar. También es el sistema de archivos por defecto
en varias distribuciones, como SuSE (excepto en openSuSE 10.2 cuyo formato por defecto es
ext3), Xandros, Yoper, Linspire, Kurumin Linux, FTOSX, Libranet y Knoppix.

1.1.59 JFS

Journaling File System (JFS) es un sistema de archivos de 64-bit con respaldo de


transacciones creado por IBM. Está disponible bajo la licencia GNU GPL. Existen versiones
para AIX, eComStation, OS/2, sistemas operativos Linux y HP-UX.

Fue diseñado con la idea de conseguir "servidores de alto rendimiento y servidores de


archivos de altas prestaciones, asociados a e-business". Según se lee en la documentación y el
código fuente, va a pasar un tiempo antes de que la adaptación a Linux este finalizada e incluida
en la distribución estándar del kernel. JFS utiliza un método interesante para organizar los
bloques vacíos, estructurándolos en un árbol y usa una técnica especial para agrupar bloques
lógicos vacíos.

JFS fue desarrollado para AIX. La primera versión para Linux fue distribuida en el verano de
2000. La versión 1.0.0 salió a la luz en el año 2001. JFS está diseñado para cumplir las
exigencias del entorno de un servidor de alto rendimiento en el que sólo cuenta el
funcionamiento. Al ser un sistema de ficheros de 64 bits, JFS soporta ficheros grandes y

- 68 -
particiones LFS (del inglés Large File Support), lo cual es una ventaja más para los entornos de
servidor.

4.6 Sistemas de login y seguridad

4.6.1 Autenticación clásica

En un sistema Unix habitual cada usuario posee un nombre de entrada al sistema o login y
una clave o password; ambos datos se almacenan generalmente en el fichero /etc./passwd. Este
archivo contiene una línea por usuario (aunque hay entradas que no corresponden a usuarios
reales, como veremos a continuación) donde se indica la información necesaria para que los
usuarios puedan conectar al sistema y trabajar en él, separando los diferentes campos mediante
“:”.

En primer lugar aparecen el login del usuario y su clave cifrada; a continuación tenemos dos
números que serán el identificador de usuario y el de grupo respectivamente. El quinto campo,
denominado GECOS es simplemente información administrativa sobre la identidad real del
usuario, como su nombre, teléfono o número de despacho. Finalmente, los dos últimos campos
corresponden al directorio del usuario (su $HOME inicial) y al shell que le ha sido asignado.

Al contrario de lo que mucha gente cree, Unix no es capaz de distinguir a sus usuarios por su
nombre de entrada al sistema. Para el sistema operativo lo que realmente distingue a una persona
de otra (o al menos a un usuario de otro) es el UID del usuario en cuestión; el login es algo que
se utiliza principalmente para comodidad de las personas.

En el fichero de claves van a existir entradas que no corresponden a usuarios reales, sino que
son utilizadas por ciertos programas o se trata de cuentas mantenidas por motivos de
compatibilidad con otros sistemas; típicos ejemplos de este tipo de entradas son lp, uucp o
postmaster. Estas cuentas han de estar bloqueadas en la mayoría de casos, para evitar que alguien
pueda utilizarlas para acceder a nuestro sistema: sólo han de ser accesibles para el root mediante
la orden su.

Para cifrar las claves de acceso de sus usuarios, el sistema operativo Unix emplea un
criptosistema irreversible que utiliza la función estándar de C crypt(3), basada en el algoritmo
DES. Esta función toma como clave los ocho primeros caracteres de la contraseña elegida por el
usuario (si la longitud de ésta es menor, se completa con ceros) para cifrar un bloque de texto en
claro de 64 bits puestos a cero; para evitar que dos passwords iguales resulten en un mismo texto
cifrado, se realiza una permutación durante el proceso de cifrado elegida de forma automática y
aleatoria para cada usuario, basada en un campo formado por un número de 12 bits (con lo que
conseguimos 4096 permutaciones diferentes) llamado salt. El cifrado resultante se vuelve a cifrar
utilizando la contraseña del usuario de nuevo como clave, y permutando con el mismo salt,
repitiéndose el proceso 25 veces. El bloque cifrado final, de 64 bits, se concatena con dos bits
cero, obteniendo 66 bits que se hacen representables en 11 caracteres de 6 bits cada uno y que,
junto con el salt, pasan a constituir el campo password del fichero de contraseñas, usualmente
/etc./passwd. Así, los dos primeros caracteres de este campo estarán constituidos por el salt y los
11 restantes por la contraseña cifrada.

SALT: PASSWORD CIFRADO:

Como hemos dicho antes, este criptosistema es irreversible. Entonces, ¿cómo puede un
usuario conectarse a una máquina Unix? El proceso es sencillo: el usuario introduce su

- 69 -
contraseña, que se utiliza como clave para cifrar 64 bits a 0 basándose en el salt, leído en
/etc./passwd, de dicho usuario. Si tras aplicar el algoritmo de cifrado el resultado se corresponde
con lo almacenado en los últimos 11 caracteres del campo password del fichero de contraseñas,
la clave del usuario se considera válida y se permite el acceso. En caso contrario se le deniega y
se almacena en un fichero el intento de conexión fallido.

4.6.2 Problemas del modelo clásico

Los ataques de texto cifrado escogido constituyen la principal amenaza al sistema de


autenticación de Unix; a diferencia de lo que mucha gente cree, no es posible descifrar una
contraseña, pero es muy fácil cifrar una palabra junto a un determinado salt, y comparar el
resultado con la cadena almacenada en el fichero de claves. De esta forma, un atacante leerá el
fichero /etc./passwd (este fichero ha de tener permiso de lectura para todos los usuarios si
queremos que el sistema funcione correctamente), y mediante un programa adivinador (o
crackeador) como Crack o John the Ripper cifrará todas las palabras de un fichero denominado
diccionario, comparando el resultado obtenido en este proceso con la clave cifrada del fichero de
contraseñas; si ambos coinciden, ya ha obtenido una clave para acceder al sistema de forma no
autorizada.

4.6.3 Funcionamiento de la autenticación básica en Linux

En todo sistema Linux hay tres archivos que ofrecen el nivel mas básico de autenticación para
el sistema local:

 /etc./passwd  /etc./shadow

 /etc./group

Cada usuario del sistema tiene un identificador de usuario único, el UID, asociado a su
nombre de usuario (OBSERVACIÓN: es posible atribuir dos nombres de usuario a un mismo
UID, creando una misma cuenta con dos nombres que pueden ser usados para hacer login). Cada
usuario pertenece por lo menos a un grupo de usuarios, y cada grupo tiene un identificador único
de grupo (GID) asociado al nombre del grupo.

El archivo /etc./passwd es un archivo de texto simple. Puede ser editado con cualquier editor
de texto ejecutado como root, y contiene siete campos para cada usuario, separados por dos
puntos:

• el nombre de usuario • el nombre completo del usuario e


informaciones adicionales
• un x minúsculo (usualmente)
• el directorio home del usuario
• el ID del usuario (UID)
• el shell por defecto del usuario
• el grupo por defecto del usuario

El shell por defecto es particularmente importante para cuentas del sistema. Muchas
herramientas del sistema y algunos aplicativos exigen su propias cuentas de usuario para ser
ejecutadas correctamente. Mientras, usted no querrá que alguna persona sea capaz de hacer login
en nombre de esa tarea. Siendo así, un shell falso (generalmente /bin/false) es usado. Si no
hubiese un shell válido, el usuario no puede hacer login.

En un pasado remoto y casi olvidado, el archivo /etc./passwd también contenía las


contraseñas de los usuarios en texto puro. A medida que las redes crecieron, quedo claro que

- 70 -
algún tipo de forma segura de almacenar contraseñas en un formato que no pudiese ser leído era
una necesidad absoluta, y como de costumbre, un incidente de seguridad convenció a alguien de
esa necesidad. En 1987, Julianne Haugh tuvo su sistema invadido y escribió la suite Shadow
Password original, que contenía los comandos login, passwd y su. Las contraseñas shadow
forman parte de Linux desde 1992, y las suite creció y hoy agrupa treinta comandos.

El concepto básico del sistema shadow es fácil de entender. Inicialmente la solución fue
bastante sencilla y eficaz, bastando hacer un hash de las contraseñas y almacenar ese hash;
cuando un usuario se autentica, se hace un hash de la contraseña tecleada y, si los hashes
combinaran, la contraseña es, obviamente, la misma. Al pasar el tiempo, el poder computacional
creció y quedó mas fácil de romper incluso las contraseñas con hash; con eso Linux y otros
sistemas UNIX migraron para sistemas de criptografía mas fuertes (normalmente el MD5).
Además del nombre de usuario y de la contraseña con hash, el archivo /etc./shadow también
contiene informaciones sobre el envejecimiento de la contraseña.

4.6.4 Shadow Password

Otro método cada día más utilizado para proteger las contraseñas de los usuarios el
denominado Shadow Password u oscurecimiento de contraseñas. La idea básica de este
mecanismo es impedir que los usuarios sin privilegios puedan leer el fichero donde se almacenan
las claves cifradas; en el punto anterior hemos comentado que el fichero /etc./passwd tiene que
tener permiso de lectura para todo el mundo si queremos que el sistema funcione correctamente.
En equipos con oscurecimiento de contraseñas este fichero sigue siendo legible para todos los
usuarios, pero a diferencia del mecanismo tradicional, las claves cifradas no se guardan en él,
sino en el archivo /etc./shadow, que sólo el root puede leer. En el campo correspondiente a la
clave cifrada de /etc./passwd no aparece ésta, sino un símbolo que indica a determinados
programas (como /bin/login) que han de buscar las claves en /etc./shadow, generalmente una x:

toni:x:1000:100:Antonio Villalon,,,:/export/home/toni:/bin/sh

El aspecto de /etc./shadow es en cierta forma similar al de /etc./passwd que ya hemos


comentado: existe una línea por cada usuario del sistema, en la que se almacena su login y su
clave cifrada. Sin embargo, el resto de campos de este fichero son diferentes; corresponden a
información que permite implementar otro mecanismo para proteger las claves de los usuarios, el
envejecimiento de contraseñas o Aging Password, del que hablaremos a continuación:

toni:LEgPN8jqSCHCg:10322:0:99999:7:::

Desde hace un par de años, la gran mayoría de Unixs del mercado incorporan este
mecanismo; si al instalar el sistema operativo las claves aparecen almacenadas en /etc./passwd
podemos comprobar si existe la orden pwconv, que convierte un sistema clásico a uno
oscurecido. Si no es así, o si utilizamos un Unix antiguo que no posee el mecanismo de Shadow
Password, es muy conveniente que consigamos el paquete que lo implementa (seguramente se
tratará de un fichero shadow.tar.gz que podemos encontrar en multitud de servidores, adecuado a
nuestro clon de Unix) y lo instalemos en el equipo. Permitir que todos los usuarios lean las
claves cifradas ha representado durante años, y sigue representando, uno de los mayores
problemas de seguridad de Unix; además, una de las actividades preferidas de piratas novatos es
intercambiar ficheros de claves de los sistemas a los que acceden y crackearlos, con lo que es
suficiente una persona que lea nuestro fichero para tener en poco tiempo una colonia de intrusos
en nuestro sistema.

- 71 -
4.6.5 Envejecimiento de contraseñas

En casi todas las implementaciones de Shadow Password actuales se suele incluir la


implementación para otro mecanismo de protección de las claves denominado envejecimiento de
contraseñas (Aging Password). La idea básica de este mecanismo es proteger los passwords de
los usuarios dándoles un determinado periodo de vida: una contraseña sólo va a ser válida
durante un cierto tiempo, pasado el cual expirará y el usuario deberá cambiarla.

4.6.6 Permisos UGO

El sistema de permisos en Linux se basa en un esquema de usuarios/grupos que lo convierte


en la base principal de la seguridad en Linux, a estos usuarios y grupos se les asignan distintos
derechos sobre los archivos y directorios. Linux implementa el llamado sistema UGO (User,
group, owner). Con solo una máscara de 9 bits, es posible definir permisos sobre todo el sistema
de ficheros. Esto es muy eficiente, especialmente para comprobación de permisos, pero como
veremos más adelante puede ser insuficiente en entornos distribuidos.

En el caso de archivos los permisos que pueden darse o quitarse son: (r) lectura, (w) escritura
y (x) ejecución.

En el caso de directorios los permisos son: (r) para listar los archivos, (w) para escribir, crear
o borrar archivos y (x) para acceder a archivos del directorio.

Los permisos de un archivo pueden ser modificados por el dueño o por el administrador del
sistema. Podemos ver los permisos utilizando el comando "ls -l", y podemos modificarlos con
"chmod". Los permisos se pueden especificar en octal o con una o más letras para identificar al
usuario (u para el usuario, g para el grupo, o para los demás usuarios y a para todos), un +, un - o
un = y después letras para identificar los permisos (r, w o x).

El dueño de un archivo pueden ser modificados sólo por el administrador del sistema con el
programa chown. Un usuario que pertenezca a varios grupos puede cambiar el grupo de uno de
sus archivos a alguno de los grupos a los que pertenezca con el programa chgrp.

El comando chmod tiene una notación en octal, donde el leer=4, escribir el 2 y ejecutar el 1.
Sus combinaciones son las siguientes:

0 = Ningún permiso (Lectura = 0 + Escritura = 0 + Ejecución = 0)

1 = Permiso de Ejecución (Lectura = 0 + Escritura = 0 + Ejecución = 1)

2 = Permiso de Escritura (Lectura = 0 + Escritura = 2 + Ejecución = 0)

3 = Permiso de Escritura y Ejecución (Lectura = 0, Escritura = 2, Ejecución = 1)

4 = Permiso de Lectura (Lectura = 4 + Escritura = 0 + Ejecución = 0)

5 = Permiso de Lectura y Ejecución (Lectura = 4 + Escritura = 0 + Ejecución = 1)

6 = Permiso de Lectura y Escritura (Lectura = 4 + Escritura = 2 + Ejecución = 0)

7 = Permiso de Lectura, Escritura y Ejecución (Lectura = 4 + Escritura = 2 + Ejecución = 1)

- 72 -
4.6.7 Listas de control de acceso en Linux

Puede llegar a resultar insostenible un sistema Linux con múltiples usuarios en lo que a
permisos de fichero se refiere. En resumidas cuentas, el método UGO (User Group Other) es
muy eficiente y es un buen sistema si tenemos un sistema monousuario, pero cuando tenemos
varios usuarios, se dificulta su mantenimiento, además de degradar la seguridad. Las listas de
control de acceso (ACL) facilitan la tarea de administración, ya que aunque son más complejas,
son más potentes.

La gran mayoría de distribuciones actuales ya soportan ACL. Se puede comprobar si tienes


soporte con este comando: "grep POSIX_ACL /boot/config-`uname -r`". Si no tenemos soporte,
debemos actualizar el kernel o recompilarlo.

Una vez que tengamos soporte ACL necesitaremos configurar /etc/fstab. Los sistemas de
ficheros montados con acl tendrán la palabra clave "acl" en options y remontar el sistema de
ficheros.

Teniendo un sistema de ficheros montado con ACL, podemos usar en él, las siguientes
herramientas de gestión ACL:

• chacl: Permite cambiar, examinar o eliminar ACL.

• getfacl: Permite examinar acl para encontrar archivos o directorios.

• setfacl: Establece ACL a fichero o directorio.

Un ejemplo para ver los permisos ACL:

# getfacl /var/www group::r-x

getfacl: Removing leading “/” from mask::r-x


absolute path names
other::r-x
# file: var/www
default:user::rwx
# owner: root
default:user:www-data:r-x
# group: root
default:group::r-x
user::rwx
default:mask::r-x
user:www-data:r-x
default:other::r-x

Como se puede ver, esto puede ser es bastante mas complejo. Ya no tenemos la terna
usuario/grupo/otros, sino que tenemos una lista de usuarios/grupos y luego el resto de los
usuarios. Cada una de las líneas, que se identifica con un permiso se denomina “ACE” o “ACL
Entry”. Estas ACE pueden referirse a “usuarios propietarios” o “usuarios nombrados”, siendo
estos últimos los que se los nombra directamente en cada ACE.

Como podemos ver, cada permiso, viene caracterizado mediante 3 campos separados por “:”,
algo tipo: “tipo:usuario:permiso”, donde el tipo pueden ser:

• “u” o user, el permiso se aplica a un usuario

- 73 -
• “g” o group, el permiso se aplica a un grupo

• “o” u other, el permiso se aplica al resto de los usuarios que no aparezcan en ninguna
entrada en la lista de permisos ACL.

• “m” o mask, es una máscara de permiso. Se aplica sobre el permiso asignado a un


usuario/grupo nombrado para obtener el permiso efectivo.

• Otra peculiaridad a destacar, es el permiso que tiene la etiqueta “default”.

Esta entrada nos indica que todas las carpetas que se creen dentro de la carpeta que tiene este
permiso, lo mismo que todos los ficheros que se creen, tendrán como permiso ACL heredado esta
entrada, es decir, en este caso, el “user” tendrá permiso de lectura y ejecución sobre todo lo que se
cree dentro de esa carpeta. Un ejemplo para especificar un ACL para el fichero "index.htm":

chacl u::r--,g::r--,o::---,u:visitante:r--,m::rw- index.htm

El dueño del archivo tendría lectura, su grupo solo lectura y el resto nada. Además, el usuario
"visitante" tiene permisos de lectura y escritura. La máscara de derechos efectivos es la unión de
todos los permisos ya existentes de UGO para un fichero o directorio. Se obtiene al añadir un
usuario a la ACL. Es interesante definir el ACE "default" en directorios, para definir el ACL por
defecto de los nuevos ficheros que se crearán en ese directorio.

Realmente, para especificar la lista ACL, se usa “setfacl” con el parámetro "-m". Pero “chacl”
es también perfectamente válido. También es posible especificar los permisos de un usuario
determinado en formato octal. (como en UGO).

4.6.8 Pluggable Authentication Modules (PAM)

PAM (Pluggable Authentication Module) no es un modelo de autenticación en sí, sino que se


trata de un mecanismo que proporciona una interfaz entre las aplicaciones de usuario y diferentes
métodos de autenticación, tratando de esta forma de solucionar uno de los problemas clásicos de
la autenticación de usuarios: el hecho de que una vez que se ha definido e implantado cierto
mecanismo en un entorno, es difícil cambiarlo. Mediante PAM podemos comunicar a nuestra
aplicaciones con los métodos de autenticación que deseemos de una forma transparente, lo que
permite integrar las utilidades de un sistema Unix clásico (login, ftp, telnet...) con esquemas
diferentes del habitual password: claves de un solo uso, biométricos, tarjetas inteligentes...

PAM viene 'de serie' en diferentes sistemas Unix, tanto libres como comerciales (Solaris,
FreeBSD, casi todas las distribuciones de Linux...), y el nivel de abstracción que proporciona
permite cosas tan interesantes como kerberizar nuestra autenticación (al menos la parte servidora)
sin más que cambiar la configuración de PAM, que se encuentra bien en el fichero /etc./pam.conf
o bien en diferentes archivos dentro del directorio /etc./pam.d/; en el primero de los dos casos, por
ejemplo en Solaris, el fichero de configuración de PAM está formado por líneas de la siguiente
forma:

servicio tipo control ruta_módulo argumentos_módulo

La arquitectura PAM ha venido a solucionar diferentes problemas históricos de la


autenticación de usuarios en entornos Unix - especialmente en entornos complejos, como sistemas
distribuidos o reinos Kerberos; proporciona una independencia entre los servicios del sistema y
los mecanismos de autenticación utilizados, beneficiando tanto al usuario como a los
administradores Unix. Desde 1995, año en que se adoptó la solución propuesta por Sun

- 74 -
Microsystems hasta la actualidad, cada vez más plataformas integran PAM por defecto, con lo que
se ha convertido en el estándar de facto en la autenticación dentro de entornos Unix.

5 Implementación MAC

5.1 Sistema de archivos

Finder es la aplicación ejecutada en el sistema operativo Mac OS X responsable de la gestión


total de los archivos de usuario, discos, red y el lanzamiento de otras aplicaciones. Como tal,
Finder actúa como el shell en otros sistemas operativos, pero usando una interfaz gráfica de
usuario. Experimentó una reescritura completa para pasar a estar basado en UNIX en Mac OS X.

Finder es el primer programa con el que un usuario interactúa después de arrancar un Mac.

Finder mantiene una vista del sistema de archivos que es representada usando la apariencia del
escritorio, es decir, los archivos y los directorios son representados como iconos, los volúmenes se
muestran en el escritorio, y hay una papelera a la cual los archivos pueden ser arrastrados para
marcarlos como borrados.

Finder 1.0 a 4.1

El Finder original, usado con el (Sistema de Ficheros de Macintosh), siempre incluía una
carpeta vacía en el nivel de la raíz de cada disco. Una nueva carpeta vacía se creaba siempre que
esa carpeta era renombrada y utilizada. Las carpetas no se podían colocar como subcarpetas en el
Finder 1.0-4.1. En efecto, las "carpetas" bajo MFS eran algo virtual que se elaboraba y era
mantenido por Finder, y no reflejaban la organización de los datos en el disco.

Finder también proporcionaba una "carpeta papelera": la única manera de suprimir un archivo
era arrastrarlo a la carpeta papelera, y entonces vaciar la carpeta. Sin embargo, la carpeta papelera
era también una elaboración virtual, y no estaba reflejada en el disco. La lista de archivos en la
papelera se llevada a cabo solamente en memoria. Finder, por lo tanto, vaciaba la papelera antes
de que terminara, incluso antes de ejecutar cualquier otra aplicación. Si se producía un error, los
elementos que habían estado en la papelera aparecían en su lugar original.

El Finder original trabajaba a baja velocidad en el copiado de archivos, que conducía a docenas
de intercambios en disco en la unidad sencilla original de Macintosh. Aunque gran parte de este
problema se podría atribuir a la pequeña cantidad de memoria disponible en el Macintosh 128K,
Apple intentó tratar el problema con el Finder 1.1. Sin embargo, sería el Finder 4.1 de abril de
1985 el que mejoraría realmente la velocidad del Finder y las nuevas características añadidas,
incluyendo la orden de "Nueva carpeta" y una orden de "Apagado" en el nuevo menú "Especial",
que también proporcionaba acceso al "MiniFinder". MiniFinder era una interfaz simplificada que
mantenía documentos y aplicaciones de uso frecuente y los lanzaba mucho más rápidamente, lo
que ayudaba a mejorar algo la lentitud en el cambio entre aplicaciones.

Finder 5.x [editar]

Apple substituyó el MFS por el HFS (Sistema de Ficheros Jerárquico), como parte del Finder
5.0 que fue introducido junto con el primer disco duro de Mac, el Hard Disk 2.0.

Finder Software 6.x

- 75 -
Las primeras versiones del Finder mostraron problemas para manejar más de un programa
simultáneamente, debido a la naturaleza monotarea del Mac OS original. El System Software 5.x
incluía la versión 6.0 del Finder, con la novedad del Multifinder, el cual permitía la multitarea
cooperativa. Era posible activarlo mediante el Panel de Control y sus efectos se aplicaban en el
siguiente reinicio del sistema. El System Software 6.0.x introduce el Finder 6.1.x, además de una
versión muy mejorada de MultiFinder, entre otros añadidos.

El primer Finder del Mac OS permitía un "Escritorio Universal", que unía los contenidos de la
carpeta invisible "Desktop Folder" en la raíz de cada disco montado. Esto significaba que los
ficheros que se arrastraban desde un disco al escritorio no siempre se copiaban al disco duro del
Mac, y desaparecía cuando el disco en cuestión era expulsado.

Finder desde la 7.0 hasta 9.2

En 1991 Apple lanza el System 7, una versión muy significativa de su sistema operativo.
Como otros componentes del sistema, el Finder recibe una importante puesta a punto, reescrito
totalmente usando el lenguaje de programación C++. MultiFinder deja de ser una opción, pasando
a estar siempre activo. Las ventanas del Finder se colorean, y las listas se amplían incluyendo
"disclosure triangles" que permite al usuario adentrarse en el sistema sin tener que abrir mas
ventanas. El icono de la papelera mejora la apariencia, siendo esta más refinada, y la función de
Color ya presente en System 6 (para Macintosh en Color únicamente), que permitía al usuario
asignar un color a los ficheros, se amplía para poder asignar etiquetas. Estas etiquetas poseen un
nombre y un color que pueden ser personalizados por un usuario. La renovada búsqueda del
Finder también encuentra ficheros según sus etiquetas. Finalmente la papelera pasa a tener un
directorio real, con lo que no se vacía después de cada reinicio de sistema.

El Finder 7.0 desvela la funcionalidad de alias la cual permite acceder a ficheros en múltiples
ubicaciones mediante ficheros que apuntan a otros ficheros (similar a los enlaces simbólicos en
unix, o los Accesos directos de Windows). Además el comando Devolver, a partir de esta versión,
se puede usar como alternativa para expulsar tanto disquetes como CD-ROMs.

Aunque muchos más cambios sucederían a lo largo de los siguientes años, el Finder permanece
relativamente inalterado hasta la llegada del Mac OS 8 en 1997. El Finder 8.0 es la primera
versión con capacidad multihilo. Por primera vez copiar un fichero o vaciar la papelera no
bloqueaban otros usos y aplicaciones.

El Finder 8.1, lanzado a comienzos de 1998, introduce un uso más eficiente del sistema de
ficheros HFS+. Finder 9, lanzado en octubre de 1999, incluye el soporte para múltiples usuarios,
actualizaciones, y el modo Classic Support Mode. Otras novedades en Finder 9 son la posibilidad
de usar ficheros grandes de más de 2GB, cifrado, llavero de claves, compartición de impresoras
USB, y (desde la 9.1) grabación de CDs. Fue la última gran actualización para el Finder clásico.

Finder desde la 10.0 hasta la 10.2.1

El nuevo Finder del Mac OS X no fue una actualización del anterior Finder, sino una versión
completamente rescrita que tomaba prestados conceptos del gestor de ficheros de NeXTSTEP.

La versión 10.0 carecía de muchas de las características que se podían encontrar en su


predecesor. El escritorio universal había desaparecido, y resultó reemplazado por un escritorio que
presentaba sólo los contenidos de la carpeta Escritorio del usuario. El soporte para etiquetas, y
casi todas las formas de almacenar metadatos, así como las ventanas emergentes, impresoras de
escritorio, el comando Devolver y otras funciones, ya no estaban. Además, en la versión 10.0, la
Papelera se había eliminado del Escritorio y ya no formaba parte del Finder, ya que ésta pasa a
integrarse en el Dock de sistema (El panel inferior).

- 76 -
En esta versión también desaparece la representación de ventanas Spatial (Espaciado), con la
que en cada ubicación del disco duro se abría una única ventana separada, en favor del sistema de
navegación al estilo NeXTSTEP. Además se introduce una barra altamente personalizable que se
podía mostrar en la parte superior de cada ventana del Finder, y el heredero de la vista "Como
columnas" de NeXT, que mostraba la jerarquía del sistema de archivos en una serie de paneles de
izquierda a derecha. Los usuarios podían especificar (si querían) cual de los discos montados en el
sistema aparecerían en el Escritorio.

La versión 10.2 reintroduce las "Carpetas y ventanas con resorte", aunque no incluyendo todas
las funciones que ya existían en los Finder anteriores. Esta versión añade la habilidad de navegar y
descargar de servidores FTP (pero no subir), desde el propio Finder, gracias al sistema interno que
maneja el protocolo FTP, permitiendo que un servidor remoto pueda parecer (aparentemente)
como una carpeta local más.

Continuando la tradición del Finder 1.0, la versión incluida con el Mac OS X muestra un
sistema de archivos al usuario que en parte es una ilusión, no mostrando la jerarquía real interna.
También cuando, por ejemplo, se ejecuta una consola de Unix, los nombres de ficheros se
muestran en formato POSIX, incluso si el sistema de ficheros que está leyendo es HFS. Debido a
que los ficheros Unix no pueden contener el carácter "/" en el nombre, e históricamente los
usuarios de Macintosh clásico han podido usarlo (aunque no ":") en el sistema de ficheros HFS, el
Finder intercambia estos dos caracteres. Cuando un usuario escribe Entrada/Salida, este se adapta
al nombre en POSIX Entrada:Salida. Adicionalmente el Finder no permite la entrada de ciertos
caracteres de control (como salto de línea) incluso cuando el sistema de archivos si lo soporta.
Tanto la consola como el Finder permiten un uso completo de los caracteres Unicode.

Finder 10.3

Con la llegada de Mac OS X v10.3, la nueva versión de Finder incluida recupera elementos
clásicos mientras se renueva, sin cambios radicales, la interfaz de usuario.

Finder 10.4

Mac OS X v10.4 introduce nuevos cambios al Finder, incluyendo una función de presentación
(similar a su contraparte en el Explorador de Windows). De esta forma se pueden ver las fotos e
imágenes a pantalla completa directamente desde el Finder. Spotlight, es otro concepto que se
reinventa: el acceso de teclado comando-F ahora muestra una ventana de búsqueda basada en
criterios. Estos criterios se pueden guardar en una Carpeta inteligente que muestra y actualiza en
tiempo real los resultados de la búsqueda.

Finder 10.5

Leopard, la nueva versión de Mac OS X, actualiza nuevamente el Finder. Presenta una interfaz
parecida a iTunes 7, incluyendo una presentación de archivos y fotos como si fuesen carátulas. El
nuevo Finder estrena una nueva barra organizadora, se mejora la integración con Spotlight, y
Quick Look (una nueva función del sistema) permite ver que hay dentro de los archivos sin
necesidad de abrirlos. Además, posee un nuevo tema visual unificado.

Finder 10.6

En Snow Leopard se ha reescrito nuevamente el Finder de forma que soportará procesos a 64


bits.

- 77 -
5.2 Arquitectura

Para que sea más fácil la comprensión de la arquitectura del Mac Os expondremos
primeramente un gráfico de la estructura del Mac Os, en este caso nos centraremos en el Mac Os
X ya que son las últimas versiones y las que están ahora en uso. Posteriormente pasaremos una
explicación de las capas que tenemos en el gráfico.

Figura 1.- Esquema de la arquitectura del Mac OS

El Mac OS X posee una arquitectura modular que se construye a partir de cuatro componentes
básicos: el sistema operativo central Darwin, un conjunto de estructuras de aplicaciones, sistemas
de gráficos basados en estándares y la interfaz de usuario Aqua.

• Aqua: es la interfaz de usuario creada por Apple para el Mac OS X.

• Estructuras: el Mac OS X incorpora un conjunto de estructuras de aplicaciones que


permite trabajar con desarrolladores de diferentes comunidades. Cocoa es un conjunto de
estructuras orientadas a objetos diseñado para agilizar el desarrollo de aplicaciones, ya que
permite añadir potentes interfaces de usuario gráficas de Aqua al software UNIX existente y crear
aplicaciones completamente nuevas desde cero. Carbon está concebido para simplificar la
migración a aquellos desarrolladores que desean realizar una transición de sus aplicaciones del
Mac OS 9 al Mac OS X. Java permite el desarrollo y la ejecución de programas multiplataforma
Java 2 Edición Estándar en Mac OS X, incluidos los que están programados con Java Developer
Kit (JDK) 1.4.1.

• Gráficos: el sistema de gráficos del Mac OS X se compone de tres potentes tecnologías


basadas en estándares que están totalmente integradas en el sistema operativo y proporcionan
servicios a nivel de sistema. Quartz 2D es una librería de generación de gráficos de alto
rendimiento basada en el estándar multiplataforma PDF (Portable Document Format) de Adobe.
Permite visualizar e imprimir gráficos y textos suavizados de alta calidad y proporciona soporte de
última generación para las tipografías OpenType, PostScript y TrueType. OpenGL es el estándar
del mercado para visualizar formas y texturas tridimensionales. El Mac OS X incorpora una
implementación totalmente estandarizada, optimizada e integrada. El software para medios

- 78 -
digitales QuickTime provee un entorno totalmente estandarizado para crear, reproducir y generar
vídeo (MPEG-4), audio (AAC o Codificación de Audio Avanzada) e imágenes (JPEG 2000 y
otros formatos).

• Darwin: El kernel

El kernel de Mac OS X, Darwin, en realidad es un microkernel Mach 3.0 enlazado con BSD
versión 4.4, por tanto, es fruto de proyectos de software libre.

Ambos proyectos en los que se basa Darwin tienen licencia BSD. Este tipo de licencia permite
modificar el software y generar productos derivados con cualquier tipo de licencia. Darwin es un
sistema operativo completo, comparable a Linux o FreeBSD, en el que puede utilizarse el entorno
de líneas de comando, red, librerías y kernel con el que están familiarizados los usuarios de
UNIX.

Dentro de Darwin tenemos el núcleo xnu

XNU consta de seis componentes principales:

Mach: Realiza las operaciones críticas de un microkernel, como son la gestión de procesador,
la gestión de memoria, la gestión de procesos y hilos (protección de memoria), soporte para el
reloj real-time y el soporte para depuración del kernel.

El espacio de memoria del kernel XNU está compartido con una parte de BSD y con Kernel
Extensions.

BSD: Es una capa que se encuentra por encima de Mach que permite a los programadores usar
las llamadas al sistema POSIX de los sistemas UNIX. Estas funciones nos permiten entre otras
cosas la gestión de procesos por ID, dar permisos a estos procesos, gestión de señales, o el uso de
sockets BSD. La principal ventaja que aporta BSD es que permite migrar fácilmente aplicaciones
UNIX a Mac OS X.

Kernel Extensions: Pequeños módulos C que extienden la funcionalidad del núcleo de Mac
OS X. Estos módulos se pueden cargar y descargar dinámicamente. También son conocidos como
kexts.

I/O Kit: (gestión de entrada y salida). Se encuentra dentro de la capa Mach. Tiene las
siguientes características y las siguientes cualidades, posteriormente veremos la explicación más
detallada de estas características.

• Numerosas familias de dispositivos (ATA / ATAPI, FireWire, gráficos, HID, Red, PCI,
USB, HID, ...)

• Conexiones plug and play

• Gestión de energía

• multitarea preventiva, roscado, multiprocesamiento simétrico, la protección de memoria y


gestión de datos

• juego dinámico y carga de los conductores (tipos de bus múltiple)

• base de datos para el seguimiento y mantenimiento de información detallada sobre los


objetos de una instancia (la E / S de Registro)

- 79 -
• Base de datos de todos los I / O Kit de clases disponibles en un sistema

• API extensa

• los mecanismos de interfaces de usuario para las aplicaciones y los controladores de


espacio para comunicarse con el I / O Kit de

• La pila

I/O Kit Proporciona un framework C++ para el desarrollo de drivers de dispositivos mediante
kexts. En concreto, usa un subconjunto del lenguaje C++ llamado Embedded.

El I/O Kit está formado por tres componentes principales:

Familias: Apple proporciona familias para protocolos como USB, SCSI y FireWire, así como
para dispositivos de almacenamiento y frame buffers.

Nubs: Es un objeto que representa un dispositivo o servicio lógico (p.e. un bus, un disco, una
partición de disco o el teclado).

Drivers: Es un objeto que se encarga de gestionar una determinada pieza hardware,


implementando las operaciones de E/S para ese dispositivo. Mac OS X ya proporciona una
colección de drivers que gestionan los dispositivos más comunes, como puedan ser discos duros o
teclados.

File System: El sistema de ficheros de XNU se basa en el diseño de VFS (Virtual File
System), el cual se caracteriza porque nos permite añadir fácilmente nuevos sistemas de ficheros,
así como añadir capas a un sistema de ficheros existentes.

Mac OS X viene con los sistemas de ficheros HFS, HFS+, UFS (Universal File System) e ISO
9660. Anteriormente se ha explicado con más detenimiento el sistema de ficheros, por tan aquí
simplemente es una pequeña mención para explicar el esquema de arquitectura propuesto

Networking: Mac OS X lleva implementada la pila de red en el núcleo, el cual también tiene
un sistema extensible que nos permite añadir nuevos protocolos llamado NKE

5.3 Sistema de login y seguridad

Los procesos requieren un acceso elevado(lo que se conoce como administrador en Windows).
El acceso restringido a los archivo del sistema es responsable de gran parte de la seguridad. Sin
embargo, el sistema permite modificaciones cuando es requerido. El ejemplo más obvio es el
software instalador, el cual requiere de una autorización administrativa para instalar software que
afecta a más de un usuario. La arquitectura de seguridad integrada en el Mac OS X es una de las
principales razones por las que los sistemas Mac Os están libres de malware.

Mac Os X introdujo soporte seguro para aplicaciones y procesos firmados. Las aplicaciones y
procesos firmados incluyen una firma digital, la cual es usada por el sistema para verificar la
autenticidad y la integridad del software y sus recursos. El código es verificado tanto en el disco
como cuando se está ejecutando. De este modo, si alguna parte del código de la aplicación o el
proceso es cambiado de forma corrupta cuando está activo, el sistema automáticamente lo
desactiva. La autenticación de código es usado por los llaveros, la aplicación de firewall personal
y la configuración del gestor de clientes-

- 80 -
Leopard también introdujo el servicio de aplicaciones en cuarentena, el cual muestra una
advertencia cuando el usuario intenta abrir una aplicación descargada de una fuente externa. Esto
da al usuario la oportunidad de verificar que se desee abrir una nueva aplicación, o cancelar la
apertura si se sospecha sobre la seguridad de la misma. Mac OS X v10.6 refuerza aún más esta
característica con el mantenimiento de una lista de programas maliciosos conocidos. Si intenta
abrir cualquier software en esta lista, el sistema presentará un cuadro de diálogo de advertencia
que sugiere que tal archivo debe ser suprimido.

Mac OS X distingue entre los usuarios (user), el administrador de sistema root (admin) y el
superusuario (superuser). El usuario no puede realizar cambios en el sistema y solo puede instalar
software en su carpeta persona. Las aplicaciones que ejecuten estos usuarios lo harán con los
permisos propios de este tipo de usuario. Los usuarios administradores tienen más permisos,
aunque no pueden realizar modificaciones que la configuración general del sistema, instalar
software o tener acceso a varios directorios del sistema. Bajo diferentes autenticaciones es posible
realizar cambios al sistema. No existe una cuenta root que tenga permanentemente los permisos
del superusario, después de realizar la instalación del sistema. Aunque hay un usuario "root" que
está deshabilitado por defecto.

A continuación hablaremos de la inclusión de una herramienta de encriptación llamada


FILEVAULT, fue creada a partir de la versión 10.3 de Mac Os. FILEVAULT usa como método
de encriptación AES, Advanced Encryption Standard con claves de 128-bit (AES-128).

Mac OS X usa el nivel básico de seguridad de 128bits, más que suficiente para la mayoría de
los casos.

FileVault permite encriptar la información de la carpeta de inicio de Mac.

Para configurar FileVault lo primero que tenemos que hacer es acceder a las Preferencias del
Sistema, apartado Seguridad, pestaña FileVault. Una vez nos encontremos en este apartado,
principalmente tenemos que hacer dos cosas:

• Configurar una contraseña para la encriptación.

• Activar el sistema FileVault.

La contraseña de la que hablamos está por encima de la contraseña de usuario que ponemos
para acceder a nuestro sistema operativo.

Una vez definida, pasamos a activar la protección con nuestra herramienta. Justo antes de
activar el sistema también podemos seleccionar el borrado seguro de archivos. Una vez activado,
la encriptación se activara y empezará a encriptar nuestro sistema. Esta tarea puede tardar más o
menos tiempo en función del tamaño de nuestro disco.

Esta herramienta tiene un problema bastante significativo, es el de la velocidad, esta se


ralentiza mucho debido a que FileVault encripta todo el sistema operativo y no únicamente las
carpetas que nosotros deseemos.

La desventaja de esto es que AES-128, el método usado por Apple y general todo sistema de
encriptación, ralentiza el sistema ya que tiene que encriptar y desencriptar los archivos y datos
cada vez que se lee o escribe algo en el sistema operativo.

Otro de los problemas que podemos tener es que en caso de perdida de la contraseña principal
no podríamos acceder nunca más al disco y perderíamos todos los datos.

Malware

- 81 -
De los troyanos conocidos para OS X en el 2010, solo 2 fueron calificados como peligrosos.
Puede instalarse en el computador debido a la conducta negligente de los usuarios.

Estos programas se introducen al sistema mediante fraudes como la descarga gratuita de una
versión de OS X sin licencia, sitios para adultos, solicitudes de descarga de códecs para ver videos
y situaciones similares. No existe evidencia de la existencia de virus para el OS X. Los antivirus
para OS X, sirven para evitar la multiplicación de los virus que fueron escritos para otros sistemas
operativos.

A 2010, solo existen 9 prototipos de virus o gusanos malware para OS X conocidos.

Desde la versión 10.5 un firewall todo en uno es incluido en el sistema, el cual permite
configurar cuales pueden recibir tráfico entrante. Los tests iniciales demostraron que el firewall en
el OS X 10.5.0 permite la transmisión de datos, inclusive si la opción "bloquear todas las
conexiones" está activada. En OS X 10.5.1, varias de estas vulnerabilidades fueron corregidas. El
texto de la interfaz de usuario ha sido adaptado para permitir "sólo los servicios necesarios".

5.4 Gestión de la memoria

Cada aplicación que se arranca en Mac OS solicita al Sistema un cierto espacio de memoria
RAM para ejecutarse. Si hay suficiente RAM disponible se reserva ese espacio para la aplicación
que lo solicitó. Teóricamente cada aplicación puede utilizar para leer y escribir esa zona de
memoria reservada, a la que nos referimos también con el nombre de partición, y no debe poder
escribir o leer en las otras particiones. Generalmente si una aplicación invade un espacio que no le
pertenece se produce un error del sistema.

Las particiones de memoria para las aplicaciones son de tamaño fijo una vez que la aplicación
ha arrancado. Las aplicaciones pueden no utilizar todo el espacio reservado. Básicamente utilizan
una parte para la aplicación en sí misma y el resto para los datos y los documentos. Según eso,
cuanto mayor es la partición de memoria de una aplicación, más documentos podremos abrir de la
misma. Se puede ver fácilmente que de este modo es fácil derrochar memoria, ya que una
aplicación podría tenerla reservada y no usarla.

El Sistema por su parte, no reserva un tamaño fijo de memoria, sino que puede crecer según las
necesidades. No sólo varía el espacio que ocupa en función de la cantidad de extensiones o
paneles de control que se puedan cargar en el arranque. Para ciertas tareas, el espacio ocupado por
el Sistema crece.

Para evitar las complicaciones inherentes a este modelo de funcionamiento el Mac asigna la
memoria para el Sistema contando desde la dirección de memoria cero hacia adelante. Para las
aplicaciones lo hace desde la última hacia atrás. De este modo, queda un espacio vacío entre las
aplicaciones y el Sistema que éste puede utilizar para crecer lo necesario.

Este esquema explica lo anteriormente establecido:

El espacio vacío entre la memoria ocupada por el


Sistema (llamada también Pila del Sistema) y la ocupada
por las Aplicaciones es lo que se conoce como Bloque
Mayor sin Utilizar que, como veremos, no coincide
necesariamente con la RAM libre total.

Ahora nos detendremos un instante en el modo en que el Sistema reserva y libera la memoria
de las aplicaciones.

- 82 -
El Sistema va asignando memoria a cada aplicación en el orden en que lo solicita, de modo que
la Aplicación 1 ocupa las direcciones más altas, la Aplicación 2 a continuación, y las demás que
se abran van ocupando posiciones de memoria más próximas al Sistema cada vez.

Veamos el esquema anterior con tres aplicaciones hipotéticas abiertas.

Cuando cerramos las aplicaciones el Sistema libera la


memoria que ocupaban y lo hace en el orden en que las
vamos cerrando, sin modificar la situación en memoria de las
aplicaciones que quedan abiertas.

De este modo, si tenemos tres aplicaciones abiertas y


cerramos la que abrimos primero, su espacio quedará liberado.
En el diagrama se ve muy claro:

Ahora bien, si abrimos una cuarta aplicación, el Sistema sólo


utilizará memoria dentro del Bloque Mayor sin usar, o sea, el
espacio que queda entre la pila del Sistema y las aplicaciones.
Dicho de otro modo, la partición de memoria liberada no queda disponible para abrir más
aplicaciones.

Por esa razón, el Bloque Mayor sin Usar no coincide con el total de memoria RAM libre. El
Bloque Mayor sin Usar es, por tanto, el espacio de memoria RAM libre contigua entre el Sistema
y las Aplicaciones. Es el espacio de memoria en el que se abren nuevas aplicaciones y en el que
crece el Sistema.

Sin embargo, si cerramos las aplicaciones en orden inverso al de apertura, la memoria liberada
sí queda disponible para nuevas aplicaciones y, al abrir la aplicación 4 ésta dispone de más
espacio.

Por esta razón, a veces tenemos mucha memoria


desocupada y el Mac nos indica que no tiene memoria
suficiente para abrir cierta aplicación.

Este problema se conoce como fragmentación de Memoria.


Hay dos formas de evitarlo:

La primera es preventiva: consiste en optimizar el uso de la memoria cerrando las aplicaciones


que hemos abierto en último lugar antes que las otras. En la práctica, si vamos a trabajar con una
aplicación que va a estar abierta todo el tiempo, la abriremos en primer lugar y luego abrimos
otras que vayamos a emplear esporádicamente.

La otra forma es más drástica: salir de todas las aplicaciones y/o reiniciar el Mac para estar más
seguros. De hecho, en ciertas situaciones puede ser la única opción, pues la memoria se ha
desordenado tanto que, incluso con todas las aplicaciones cerradas, el Mac está convencido de que
el Bloque Mayor sin Usar es más pequeño que el espacio real disponible.

Un segundo problema que se puede deducir de esta forma de trabajo puede surgir si ocupamos
demasiada RAM con las aplicaciones y el Bloque Mayor sin Utilizar se vuelve demasiado
pequeño. Además de no poder abrir más aplicaciones, podría ocurrir que el Sistema tuviese que
crecer más que el espacio libre disponible para ello. El resultado es, o bien un mensaje de falta de
memoria del sistema, o bien, en el peor de los casos, un colapso del ordenador que sólo se
soluciona reiniciando.

- 83 -
Esta situación la teníamos hasta la aparición del Mac Os X ya que en este sistema operativo
encontramos un sistema de asignación de memoria dinámica, en este caso cada aplicación pide
memoria al sistema según la va necesitando y la libera cuando no la necesita. Esto es propio de los
sistemas operativos de los que disponemos ahora, como hemos dicho anteriormente, en el caso de
la familia Mac es a partir del Mac Os X cuando tenemos este método de gestión de la memoria.

SI queremos ver como se está empleando nuestra memoria y ver los procesos que se están
ejecutando en el momento y que cantidad de memoria ocupan cada uno, podremos abrir un
terminal y con el comando ``top´´ podremos ver gráficamente lo anteriormente dicho. A
continuación pongo un gráfico de lo que obtendríamos en pantalla:

Se muestra la memoria activa, es decir, la que están ocupando las aplicaciones que se ejecutan
en el sistema.

Podemos observar también la memoria libre, o sea, la que no está siendo ocupada por ninguna
aplicación. La tenemos disponible en cualquier momento.

Por otro lado tenemos la memoria inactiva, es decir, la que ha sido recientemente liberada por
alguna aplicación que hayamos cerrado. Mac OS X la deja reservada por si quisiéramos abrir
nuevamente el proceso que antes la estaba utilizando. En caso de requerirse más RAM para un
programa distinto, el sistema entrega la memoria libre hasta que se agota; una vez ocurrido esto,
entregará la memoria inactiva.

Por último veremos la memoria ‘wired’ que es la que está siendo ocupada por el sistema
operativo. Ningún proceso puede acceder a esta parte de la memoria.

5.5 Procesos y comunicación entre procesos

Destacaremos que el último sistema operativo producido por Apple es el Mac Os X, este ya
está basado en tecnología Unix. Por tanto la gestión y comunicación de procesos que tiene Mac
os es muy parecidaza al de los sistemas Unix.

Un proceso es un programa en ejecución. Como sabemos, varios procesos se pueden ejecutar al


mismo tiempo pero la CPU sólo puede atender uno a la vez. Mientras un proceso corre, los otros
procesos activos esperan. Los procesos son las únicas entidades activas en Unix. Ejecutan un
único programa y tienen un único flujo o hebra (thread) de control. Un proceso sólo puede iniciar
su ejecución (nacer) si es creado por otro proceso. El proceso más antiguo se denomina padre y el
creado, hijo. Un proceso padre puede engendrar varios hijos, pero un hijo únicamente puede tener
un padre. Cuando un proceso padre acaba su ejecución (muere), generalmente mueren con él todos
sus hijos. Todo proceso tiene una tabla de archivos abiertos por procesos

Comunicación entre procesos

Existen varios mecanismos por medio de los cuales los procesos se pueden comunicar. En
primer lugar, es posible crear canales unidireccionales para la comunicación entre dos procesos, de

- 84 -
forma que uno escribe una secuencia de bytes que es leída por otro. Estos canales se llaman pipes
(tuberías). El uso normal de los pipes es la comunicación entre un proceso padre y un proceso
hijo, de forma que uno escribe y el otro lee. Los procesos se pueden sincronizar mediante pipes,
ya que cuando un proceso intenta leer de un pipe vacío, permanece bloqueado hasta que hay
información disponible.

Señales

Las señales son un mecanismo que se usa para notificar a los procesos la ocurrencia de sucesos
asíncronos.

Estos sucesos pueden ser por ejemplo una división por cero, la muerte de un proceso hijo, etc.
Cuando se produce algún suceso de este tipo, el proceso en cuestión recibe una señal, lo que causa
la interrupción de la ejecución del proceso con el fin de que la señal pueda ser tratada. Las señales
pueden ser enviadas por otros procesos o por el sistema operativo. Existe un identificador para
cada tipo de señal. Esto identificadores varían de una versión de Unix a otra.

Los procesos pueden decirle al sistema la acción a tomar cuando reciban una determinada
señal. Las opciones son ignorar la señal, aceptar la señal o dejar que sea el sistema el que trate la
señal, que es la opción por defecto. Si la elección es aceptar la señal, debe especificar un
procedimiento para el tratamiento de la misma. Cuando la señal llega, el flujo de control del
proceso cambia a la rutina manejadora de la señal, y cuando ésta termina, devuelve el control al
proceso.

Entrada / salida

Para que los programas puedan acceder a los dispositivos físicos, Unix los integra dentro del
sistema de archivos mediante los archivos especiales, de forma que a cada dispositivo se le asigna
un archivo que se encuentra, normalmente, en el subdirectorio /dev.

Los archivos especiales son accedidos de la misma forma que los ordinarios. Es decir que se
los puede abrir, leer y escribir. De esta manera no es necesario ningún mecanismo adicional para
realizar la entrada / salida. Otra de las ventajas que posee es que las reglas de protección de
archivos se aplican a los dispositivos, lo que permite controlar los accesos.

Los archivos especiales se dividen en dos categorías: dispositivos de bloques y dispositivos de


caracteres. Los dispositivos de bloques consisten en una secuencia numerada de bloques, de forma
que cada bloque puede ser accedido de forma individual. Se usan para discos. Los dispositivos de
caracteres se usan normalmente para dispositivos que leen o escriben secuencias de bytes, tales
como terminales, impresoras etc.

6 Software libre

6.1 Nacimiento del movimiento GNU

Para cualquier persona normal el nombre de Richard Stallman puede no sonarle o pensar en el
cómo en un actor de Hollywood, pero para los hackers, para los aficionados a Linux, o para la
gente del software libre ese nombre, es una referencia, quizás la palabra que busco es Gurú, o
filosofo, ya que gracias a él nació el movimiento que conocemos como GNU.

- 85 -
Y porque esta persona es tan importante, pues porque hará más de 30 años, en 1984, mientras
trabajaba en el MIT (Instituto Tecnológico de Massachusetts) en un momento dado en el que tenía
que tomar una decisión de irse al mundo del software privado o hacer algo por sí mismo para
mejorar los sistemas operativos de las maquinas de aquel entonces decidió utilizar sus
conocimientos para crear algo que compartir con los demás usuarios.

Decidió crear un sistema operativo parecido a Unix, pero que no fuera Unix (ya que este era
propietario). En aquella época los sistemas operativos incluían: procesadores de comandos,
ensambladores, compiladores, intérpretes, depuradores, editores de texto, programas de correo y
muchos otros.

Y así comenzó con un acrónimo recursivo el movimiento GNU (GNU` s Not Unix).

Después de abandonar el trabajo en el MIT, lo primero que se necesitaba era crear un nuevo
sistema operativo, pero desde cero y una sola persona era difícil, lo primero que aportaron al
nuevo sistema operativo fue un compilador, así nació el GCC.

Stallman creó un primer negocio de Software libre vendiendo lo que estaba realizando de su
GNU, Emacs para PDP-10 original. El intento de crear un sistema global término
precipitadamente y en su lugar se fueron desarrollando componentes de GNU, que podían
migrarse a sistemas Unix. En esta etapa, se consiguieron mas usuarios al poder usar estos
componentes en sistemas Unix y otros, aparte de usuarios también se consiguieron colaboradores
y apoyo, pero también demostró que faltaría mucho tiempo hasta ver terminado un sistema
operativo completo de GNU.

Dado que se estaba compartiendo el código fuente del movimiento GNU, también adopto una
licencia para el uso y distribución. Conocida como Copyleft, (opuesto al copyright) se permitía el
uso, la distribución, la modificación y la copia, pero no el poder poner restricciones nuevas a ese
código.

En 1990 cuando el sistema estaba casi completo, a falta del núcleo se dieron cuenta que lo que
estaban desarrollando con núcleo era muy costoso de implementar, dado que los diversos
componentes del mono núcleo se comunicaban unos con otros con mensajes, y había que
implementar mucho código y depurarlo para que funcionara bien.

Fue en este momento cuando se incorporo al proyecto GNU un núcleo denominado Linux,
llamado así por su creador Linus Torvalds. Este programador había creado anteriormente un
núcleo (kernel) compatible con Unix.

Fue en 1992 cuando al unir Linux con el sistema GNU, se termino creando un sistema
operativo libre que conocemos ahora como GNU/Linux.

6.2 Que es GNU y que es Open Source

La comunidad del Free Software estaba creciendo exponencialmente a finales del siglo pasado,
gracias a empresas que utilizaban programas GNU/Linux o programas de código abierto. Y con tal
cantidad de gente, empezaron a verse movimientos dentro de la comunidad del Free Software.
Uno de esos movimientos fue el que incluyo a Linus Torvalds, Bruce Perens, y otros para crear un
movimiento con una filosofía diferente a la que había en ese momento dominaba, que era la de
Richard Stallman.

Empezó a formarse otro movimiento dentro del software libre, uno que empezó a llamarse
Open Source, <Código Abierto> según uno de sus precursores, el Código abierto es una forma de

- 86 -
colaborar entre los programadores sin tener que verse envueltos en problemas de licencias o
propiedad intelectual.

El movimiento de Código abierto, se centra en las ventajas prácticas, donde una gran
comunidad de programadores colaboran, intercambiando y mejorando el Software, para tener un
software de calidad robusto y potente. Y una de las diferencias filosóficas entre ambos
movimientos es que el Código libre si puede coexistir con el código no libre, mientras que el
movimiento Free Software Fundation piensa que no pueden coexistir, que todo el código tiene
que ser libre.

El movimiento de código libre tomo la definición de su propio nombre de las guías de


Software libre de Debian escritas por Bruce Perens:

El código abierto (Open Source) es el software que te da una lista nueve derechos:

• Libre redistribución: el software debe poder ser regalado o vendido libremente.

• Código fuente: el código fuente debe estar incluido u obtenerse libremente.

• Trabajos derivados: la redistribución de modificaciones debe estar permitida.

• Integridad del código fuente del autor: las licencias pueden requerir que las
modificaciones sean redistribuidas sólo como parches.

• Sin discriminación de personas o grupos: nadie puede dejarse fuera.

• Sin discriminación de áreas de iniciativa: los usuarios comerciales no pueden ser


excluidos.

• Distribución de la licencia: deben aplicarse los mismos derechos a todo el que reciba el
programa

• La licencia no debe ser específica de un producto: el programa no puede licenciarse solo


como parte de una distribución mayor.

• La licencia no debe restringir otro software: la licencia no puede obligar a que algún otro
software que sea distribuido con el software abierto deba también ser de código abierto.

• La licencia debe ser tecnológicamente neutral: no debe requerirse la aceptación de la


licencia por medio de un acceso por clic de ratón o de otra forma específica del medio de soporte
del software.

Hoy en día hay una nueva filosofía, El software libre y de código es el software en el cual
puedes, modificar y mejorar su diseño mediante la disponibilidad de su código fuente. Aunque
este nuevo movimiento no es tan conocido como los otros dos. Ni hay grandes nombres detrás de
este.

6.3 Motivo por el que empezó el software libre

En los años 60-70 la informática se desarrollaba principalmente en el ámbito universitario, allí


los alumnos compartían sus programas junto con su código fuente con sus compañeros. De esta
forma se podía estudiar, modificar, adaptar o ejecutar el programa en cuestión.

- 87 -
Unix era la plataforma principal utilizada. Al no tener un hardware homogéneo muchas veces
era necesario realizar ajustes para que Unix pudiera ser ejecutado en las maquinas de la época,
esto hacia que el código estuviera disponible para todo el mundo.

A partir de 1980, gracias al lenguaje C y el hardware se logro la portabilidad que no era otra
cosa que la posibilidad de ejecutar programas en diferentes plataformas sin apenas modificaciones
en el código. Esto que a primera vista parece un gran avance supuso el cambio al modelo de
código cerrado.

Las computadoras modernas como la VAX o la 68020 venían con sus propios sistemas
operativos pero ninguno era libre, con lo que se debía firmar un acuerdo de no divulgación incluso
para obtener una copia ejecutable. Esto suponía que al utilizar la computadora aceptabas “que no
ayudarías al prójimo”. Esta idea estaba enfrentada a la usada anteriormente en la cual todo el
código o modificación echa estaba disponible para todo el mundo.

Stallman decide crear un sistema compatible con Unix para que los usuarios se pudieran
cambiar con facilidad. La creación del sistema GNU y la manera de compartir los avances con los
demás para que todo el mundo pudiera participar, mejorar o modificar para sus necesidades, es lo
que hoy se conoce como el movimiento del software libre.

6.4 El Salto de Linux gracias a Apache y los gestores de BBDD

Linux fue avanzando pasito a pasito en el mundo de la informática hasta la llegada de Internet
en 1993. A partir de aquí, Linux fue creciendo en aceptación a la par que Internet.

Con una Internet llega de nuevos negocios, comercios electrónicos basados en web, etc. La
combinación Linux+Apache fue fundamental para la primera. Poco a poco la combinación Linux-
Apache se fue instalando como primera opción para el servicio de páginas web. La posibilidad de
realizar las mismas funciones que IIS+Microsoft pero con un coste muy inferior propicio que
numerosas empresas se decantaran por Linux-Apache para sus negocios basados en la web.

Apache fue aumentando su cuota de mercado hasta alcanzar un 66%, superando a cualquier
otra opción de código cerrado porque es más seguro, más flexible y más extensible que es lo que
los webmasters necesitan.

No sería hasta 1998 cuando compañías como IBM, Compaq y Oracle anunciaron su apoyo a
Linux, combinando servicios con otros sistemas operativos. Este movimiento supuso otro salto en
la utilización de Linux ya que la combinación de Linux, Apache, MySQL y PHP/Perl/Python
permitía la creación de cualquier proyecto de Internet, de cualquier tamaño o tipo.

Hasta entonces no existían opciones de código libre para la gestión de Bases de Datos. Este
anuncio supuso una gran noticia para el mundo de software libre ya que se temía que las empresas
de código cerrado crearan algún tipo de problema en la comunicación de Linux y el gestor de las
Bases de Datos.

6.5 Diferencias entre software libre y propietario

Eric S. Raymond nos cuenta en su libro la catedral y el bazar las principales diferencias a la
hora de programar software libre y software propietario.

- 88 -
Por un lado nos cuenta como el software propietario sigue una metodología jerárquica donde
pequeños grupos de programadores desarrollaban el software mediante unas pautas prefijadas por
la dirección. A esta forma de programa la llama la forma clásica o el estilo catedral.

En el lado opuesto nos cuenta como el software libre se basa en la aportación de personas
ajenas entre ellas para formar un trabajo colectivo. El lugar de trabajo es un servidor donde cada
uno aporta su granito de arena por pequeño que sea. Normalmente existe un coordinador para
evitar posibles solapamientos entre tareas. La norma básica de este desarrollo es que todo se
comparte. Al desarrollo del software libre lo llama estilo bazar.

Otra de las diferencias entre en el modelo propietario y el libre es la velocidad con la que se
liberan versiones. Mientras que en el estilo catedral tratan de sacar las versiones con los mínimos
fallos posibles y eso hace que se demoren mucho en el tiempo por las comprobaciones, en el estilo
bazar pretende liberar código lo más rápidamente posible para de esta forma depurarlo entre todos
los usuarios y avanzar de manera más rápida.

Por otra parte la FSF, a través de GNU.org nos explica las cuatro libertades para que un
software sea libre:

- La libertad de usar el programa, con cualquier propósito (libertad 0).

- La libertad de estudiar el funcionamiento del programa, y adaptarlo a las necesidades


(libertad 1). El acceso al código fuente es una condición previa para esto.

- La libertad de distribuir copias, con lo que puede ayudar a otros (libertad 2).

- La libertad de mejorar el programa y hacer públicas las mejoras, de modo que toda la
comunidad se beneficie (libertad 3). De igual forma que la libertad 1 el acceso al código fuente es
un requisito previo.

La libertad 0 establece la libertad para usar el programa, pero ¿cómo puedo usar un programa
si me cuesta mil euros tenerlo? Eso no es libertad, porque no somos libres de usar el programa,
puesto que dependemos de un desembolso económico que algunos tendrán capacidad de realizar y
otros no, y la libertad o es para todos, o no es libertad.

6.6 Hacia dónde va el del software libre

Podemos decir que el futuro del software libre está asegurado ya que posee una serie de
ventajas sobre el software cerrado:

• Beneficios tecnológicos: a lo largo de los años se ha demostrado que el software libre es


seguro, estable y poderoso para aplicaciones de todo tipo. La curva de aprendizaje, talón de
Aquiles en el pasado, se ha ido aminorando gradualmente y las distribuciones con interfaz grafica
permiten a los usuarios novatos introducir en el mundo del software libre sin problemas.

• Beneficios económicos: el software libre es más barato y en la mayoría de los casos, no


tienes que pagar nada por él. De esta forma te ahorras un gran coste en licencias.

• Beneficios culturales: el software libre promueve la mezcla de culturas. El modelo del


bazar comentado anteriormente hace que desarrolladores del todo el mundo se comuniquen y
participen para la creación de software.

- 89 -
Varias personalidades del mundo de la informática piensan que el software libre goza de buena
salud

Mark Driver, vicepresidente de la consultora tecnológica Gartner, durante la conferencia Open


Source Summit 2007 de Las Vegas, pronosticó que "dentro de poco más de 3 años el 80% del
software comercial contendrá cantidades significativas de Código Abierto, seamos o no
conscientes de ello". “El software libre va a entrar en tu red quieras o no; es prácticamente
imposible evitarlo”, dijo Driver. También explicó que el software abierto no es tan malo como
quieren hacer creer sus detractores ni tan bueno como afirman sus defensores. Lo realmente
importante es trazar un plan para determinar en qué campos puede ser útil su aplicación: es mejor
evitar por completo su uso que hacerse el sueco y no supervisar su adopción. Esto significa que
las empresas desarrolladoras de software propietario, aman el software libre, pero no quieren
aceptarlo.

El Director Técnico de Software de Sun Microsystems Ibérica, Efraim Martínez, está


convencido de que el futuro del open source es la convivencia entre el software de código abierto
y el propietario. “No creo que el open source vaya a desplazar completamente al propietario, como
tampoco creo que vaya a ser al revés. Hay áreas en las que puede tener uno más sentido que otro,
o simplemente pueden ser alternativas para hacer lo mismo, y el cliente entendiendo cuáles son las
ventajas que le puede aportar cada uno, puede decidir”.

Algunas empresas pueden preguntarse cómo hacer negocio si liberan todo este capital
intelectual que tienen. Martínez pone el ejemplo de Sun y explica que “a pesar de todo este
entorno y la crisis actual, el área de Software de Sun está creciendo en torno a un 30%
anualmente, es decir, no parece que esto sea un problema, al revés, el hecho de trabajar con open
source da confianza a los usuarios”.

Por otro lado, Efraim Martínez no cree que el open source eclipse los productos propietarios de
la misma compañía. Afirma que esto puede darse con los productos de la competencia que
comercializan software propietario, ya que “el open source ofrece otro tipo de seguridades, de
confianzas, de garantías que un software propietario puede que no ofrezca; pero dentro del mismo
producto, no creo que esté eclipsando el negocio empresarial”. Lo que ofrece el open source es
más confianza para que los clientes lo “prueben antes y de ahí es de donde viene ese número tan
grande de usuarios, de descargas”.

A día de hoy, la calidad que ofrece el software open source y el software propietario es
equivalente. En algunos casos, la calidad del open source puede ser superior a la del propietario y
en otros, ocurrirá al revés, “como puede ocurrir entre otros dos productos que comparemos, es
decir, siempre hay uno mejor que otro, pero no porque se haya desarrollado con una metodología
u otra, sino por el hecho de que pueden tener momentos de evolución distintos”.

Efraim Martínez piensa que una vez que se rompa la barrera cultural que hace que el open
source “parezca algo diferente, raro, un poco extraño o esotérico”, los clientes decidirán en
función de lo que requieran en cada momento.

6.7 Ejemplos de Software Libre / Open Source.

Cuando hablamos de código abierto mucha gente hace referencia a Linux, y a los programas
que se desarrollan para ese sistema operativo, pero hay una gran cantidad de programas que están
creados en código abierto para el sistema operativo Windows, muchos de estos programas ofrecen
más ventajas que los de código propietario, y terminan siendo la opción a escoger cuando no
interesa el software propietario.

- 90 -
Algunas de las más conocidas son:

Thunderbird: Es un cliente de correo electrónico de la Fundación Mozilla. La aplicación


soporta IMAP/POP, correo HTML, noticias, RSS, etiquetas, corrector ortográfico incorporado,
soporte de extensiones y skins, buscadores, cifrado PGP, un filtro bayesiano de spam entre otras
características. Y es una de las claras elecciones frente a Outlook

GIMP: (GNU Image Manipulation Program) es un programa de edición de imágenes digitales


en forma de mapa de bits, tanto dibujos como fotografías. Está englobado en el proyecto GNU y
disponible bajo la Licencia pública general de GNU. Además, está disponible en varios idiomas,
entre ellos: español, catalán, gallego y euskera. Y entre sus características destacan la utilización
de capas, soporte de plug-ins, reconoce múltiples formatos de imágenes (PNG, JPEG, GIF, TIFF,
MNG, BMP, PSD, y un largo etcétera), así como algunos formatos de gráficos vectoriales, como
PostScript o SVG.

FileZilla: Aplicación para la transferencia de archivos por FTP que comenzó como un
proyecto en una clase de computación en enero de 2001. Permite transferir archivos desde una
máquina local, hacia uno o más servidores FTP (y viceversa) de forma sencilla. Y utiliza
protocolos HTTPS, SSH, y FTPS. Fácil de instalar y de usar, que son características muy
recomendables para usuarios sin conocimientos avanzados.

PDFCreator: Es una herramienta para la creación de archivos PDF. Es compatible con una
amplia gama de opciones de Adobe PDF, incluyendo la protección por medio de contraseña,
encriptación de 128 bit, entre muchas otras. La utilización es simple, únicamente hay que hacer
clic en el icono de imprimir y seleccionar la impresora virtual PDFCreator, al instante tendrás tu
archivo en PDF creado.

VLC: Uno de los reproductores multimedia más flexibles que existen actualmente. Soporta un
gran número de formatos de audio y vídeo, incluyendo H.264, Ogg, DivX, TS, MPEG-2, MP3,
MPEG-4 y AAC. Pero no se limita sólo a la visualización de archivos multimedia, sino que
también puede convertir y codificar formatos. Otra de las características que tiene es poder ver los
videos que se descarga de internet de páginas como YouTube, y otras.

Notepad++: Es un editor gratuito de código fuente, que soporta varios lenguajes de


programación y se ejecuta en MS Windows. Una de sus principales ventajas es en la escritura de
código, dado que al soportar varios lenguajes de programación te ofrece una ayuda con las
palabras reservadas, la tabulación, etc.

Pero sin lugar a dudar estos programas conocidos, son aun menos conocidos que otros con un
gran desarrollo y que además de haber tenido una contribución de la comunidad del software libre
también han tenido el apoyo de empresas fuertes en el sector de la Informática.

Dos del más importante software que están desarrollados por empresas son los siguientes:
Open Office y Firefox.

Open Office: en un principio desarrollado por la empresa Sun hasta que fue absorbida por
Oracle. Es una suite Ofimática al estilo de Office de Microsoft que ya va por la versión 3. Cuenta
con varios programas similares a los que incluye Office (un editor de texto, de cálculo, de dibujo,
de base de datos, de presentaciones).

Una de sus ventajas es su coste y su descarga. La descarga se hace a través de FTP y su coste
para los usuarios es gratuito. Otro aspecto es el coste que le supone a la empresa, aunque sea de
código abierto y la comunidad pueda mejorar el código, más del 93 % del código esta
suministrado por la empresa privada.

- 91 -
Firefox: estamos hablando del segundo navegador más usado en el mundo con un gran
aumento de cuota año tras año, aparte de por su rapidez y sencillez también se debe a los aportes
de la comunidad en cuanto a complementos. Estos complementos son pequeñas aplicaciones que
incorporas a tu navegador según preferencias de cada usuario.

6.8 Personas y definiciones

Dentro del mundo del software libre hemos ido viendo como se ha involucrado mucha gente
desde su nacimiento, algunos de ellos considerados GURUS del movimiento y otros no tanto pero
con su gran aporte a la comunidad del Software libre o del código abierto.

Especial relevancia han tenido personas como Richard Stallman del cual hemos hablado en el
nacimiento del movimiento GNU, ahora bien otras personas también deben de estar en el salón de
la fama de esta comunidad.

Linus Torvalds: Si Richard Stallman fue el creador del movimiento GNU, Linus fue el
desarrollador del núcleo del Sistema. El núcleo que llamo Linux y que es utilizado en las
distribuciones que GNU/Linux, a día de hoy aun sigue trabajando en el núcleo de Linux, pero su
aportación es mínima comparada con las primeras versiones, gracias a que el código fuente es
libre y cualquiera puede mejorarlo y aportar nuevas funcionalidades. Paso del movimiento del
Software libre a la comunidad del Open Source.

Bruce Perens quien empezó en el movimiento del software libre, cambio su postura y fue el
creador de la definición ya dada de Código Abierto. Cofundador de la iniciativa Open Source.

Uno de los más importantes miembros de la Comunidad del Open Source y además uno de
los fundadores es Eric Steven Raymond. Autor de la obra “la catedral y el bazar”, con su
publicación en 1997 origino que la compañía Netscape liberara el código fuente de su navegador.

Aunque la contribución de estas personas a sus distintos movimientos o iniciativas es


incontestable, otras muchas personas no tan conocidas o incluso casi anónimas han colaborado
para que el Open Source o la FSF (Free Software Foundation) sean organizaciones más
importantes que simplemente un grupo de programadores de código abierto.

Dada la gran cantidad de gente que colabora nos encontramos con alguna nuevas definiciones
que no podíamos encontrar con el software propietario.

Licencia GPL: un tipo de licencia de software. El autor conserva los derechos de autor
(copyright), y permite la redistribución y modificación bajo términos diseñados para asegurarse de
que todas las versiones modificadas del software permanecen bajo los términos más restrictivos de
la propia GNU GPL. Esto hace que sea imposible crear un producto con partes no licenciadas
GPL: el conjunto tiene que ser GPL.

Licencia BSD: Llamadas así porque se utilizan en gran cantidad de software distribuido junto
a los sistemas operativos BSD. El autor, bajo tales licencias, mantiene la protección de copyright
únicamente para la renuncia de garantía y para requerir la adecuada atribución de la autoría en
trabajos derivados, pero permite la libre redistribución y modificación, incluso si dichos trabajos
tienen propietario. Son muy permisivas, tanto que son fácilmente absorbidas al ser mezcladas con
la licencia GNU GPL con quienes son compatibles. Puede argumentarse que esta licencia asegura
“verdadero” software libre, en el sentido que el usuario tiene libertad ilimitada con respecto al
software, y que puede decidir incluso redistribuirlo como no libre.

- 92 -
GCC: GNU Compiler Collection, (aunque en un principio solo era un Compilador de C) es un
conjunto de compiladores creados dentro del proyecto GNU, bajo licencia GPL.

GNOME: es el acrónimo en inglés de "GNU Network Object Model Environment, se trata de


un entorno de escritorio para las distribuciones Linux, Unix. Se licencia bajo GPL pues el código
contenido es Open Source.

7 Conclusiones

El uso de sistemas distribuidos es más útil que los sistemas multicomputador, ya que no se
limita a una serie de computadores interconectados, como puede ser un laboratorio técnico, sino
que su dominio se expande y los nodos del sistema pueden estar repartidos por todo el mundo sin
restricciones de hardware ni de software, lo que amplía la versatilidad del sistema, pudiendo
crecer extendiéndose sin limites por todo el mundo. Para sacar su máximo rendimiento los
investigadores han desarrollado diferentes algoritmos para la asignación de procesos a los
procesadores, además existen diferentes diseños de sistemas distribuidos pero con la desventaja de
que existan estaciones de trabajo inactivas, lo que disminuye la eficiencia de cualquier diseño.

Otra parte importante dentro de un sistema distribuido son los sistemas de archivos aportan una
diferencia entre archivos locales y archivos remotos invisible para el usuario, lo que crea la ilusión
de un único sistema de archivos global que contiene todos los datos de los sistemas de archivos de
todas las máquinas, estando accesibles estos para todos los nodos del sistema. En el acceso a estos
archivos remotos se proporcionan técnicas muy útiles como el uso de cachés, que proporcionan un
acceso más rápido a los datos, ya que retienen los bloques de disco a los que se ha accedido
recientemente. Así, cuando utilicemos repetidamente un dato que está en un servidor lejano, no
tendremos que traérnoslo una y otra vez a nuestra máquina, solo tendremos que traerlo una vez,
ahorrando mucho tiempo de transferencia. Tambien existen técnicas para la mejora del sistema
distrubuido como el uso de la memoria compartida que nos proporciona un uso de memoria a
través de direcciones en la red, lo que nos permite simular una memoria física en cualquier equipo
conectado a la red. De esta manera, podemos extender el sistema para obtener una mayor cantidad
de recursos y acceder a los bloques de memoria de otros equipos conectados a nuestra red,
consiguiendo un mayor rendimiento, velocidad y reducción de los costos, ya que podemos
combinar distintos equipos en una sola tarea. La única desventaja es organizar la red y su
mantenimiento.

En Windows existe una memoria virtual que facilita la implementación de los procesos y
subprocesos, ya que si existe una falta de espacio en la memoria principal, esta memoria hace que
el espacio sea más que suficiente para crear los procesos que se deseen. Para ello, se utilizan las
tablas de páginas que mejoran el tiempo de acceso a los datos. La paginación de la memoria tiene
mucho que ver con esta mejora de tiempo. Además de la memoria, el sistema operativo tiene
muchos procesos, servicios y funciones que facilitan la interacción del usuario con el hardware de
una manera muy eficiente, para ello Windows debe de realizar la sincronización de hilos, es una
característica importante en los sistema operativos multitarea ya que son capaces de compartir
recursos entre ellos, además aportan rapidez en su comunicación para la realización de una tarea
del sistema operativo; sin esta característica no podríamos hablar de la estructura interna del
sistema de archivos NFTS ya que realizan un envío de información entre distintos controladores
donde el sistema NTFS interactúa con todos ellos para su buen funcionamiento en las tareas
relacionadas con la seguridad, ya que es su gran cualidad comparándolo con la sistemas de
archivos anteriormente existentes y lo hace diferente a ellos.

Para que todas las características del sistema NTFS funcionen correctamente hace falta una
buena organización del disco con la definición de estructuras internas como el volumen, los

- 93 -
bloques… y sobretodo destacar la tabla de archivos maestra que registra los archivos que contiene
el disco y partir de ella se obtiene la información para implementar la estructura del sistema de
archivos. Además de la gran seguridad del sistema de archivos NTFS, también Windows posee
esta cualidad para proteger el sistema de ataques mediante la auditoria de seguridad en la cual
decidimos que usuarios poseen permisos para realizar cambios en el sistema; y la protección de
memoria capaz de filtrar procesos que tengan como petición acceder a memoria. Todo ello se lleva
a cabo mediante componentes que gestiona el sistema operativo. Todas las características
comentadas anteriormente si logran un buen funcionamiento en el sistema operativo podrán
alcanzar cualidades muy importantes de estabilidad ante cualquier fallo y gran seguridad ante
cambios importantes y además de evitar ataques maliciosos.

En Linux, su arquitectura es igual a la de UNIX, pero los procesos tienen ligeros cambios,
como la gestión de subprocesos que es totalmente distinta a UNIX o la calendarización, la
memoria también ha sufrido una gran mejora con respecto a UNIX.

En cuanto a la memoria Linux utiliza compartimento de paginas y copiado al escribir para


minimizar la duplicación de datos compartidos por diferentes procesos. Las páginas se cargan por
demanda cuando se hace la primera referencia a ellas, y se paginan de vuelta al almacenamiento
auxiliar según un algoritmo.

Existen varios modelos de semántica, como la de UNIX, la de sesión, los archivos inmutables
y la de transacción. Cada una tiene su fortaleza y debilidad. La semántica de UNIX es intuitiva y
familiar para la mayoría de los programadores, pero su implantación es cara. La semántica de
sesión es menos determinista, pero más eficiente. Los archivos inmutables no son familiares para
la mayoría de las personas y dificultan la actualización de los archivos. Las transacciones son con
frecuencia redundantes.

La implementación Linux de seguridad y login se ha explicado a través de unos conceptos


generales de seguridad, de su funcionamiento y de aplicaciones particulares, como Shadow
Password, ACL y permisos UGO. También se comentado el modelo de autenticación PAM.

En Linux se han desarrollo una serie de herramientas GNU que tienen la característica de ser
software libre; todo su código fuente puede ser utilizado, modificado y redistribuido libremente
por cualquiera bajo los términos de la GPL. Con el software libre nos beneficiamos de programas
que se bajan libremente de la web sin tener que pagar licencias, adquisición y que nos
proporcionan los servicios que estábamos buscando y que tendríamos que pagar por un software
propietario. Esto hace que haya una competencia haciendo que las empresas mejoren sus
productos y hace que las empresas de código cerrado tengan que sacar sus programas con precios
más competitivos.

Podemos afirmar que las ventajas actuales de programas de código abierto son:

- Los principales beneficios percibidos son la flexibilidad, el ahorro en licencias, la


independencia de proveedores, la posibilidad de reutilización, la existencia de una comunidad
alrededor de los proyectos y las tremendas posibilidades de innovación y desarrollo que ofrece el
ámbito del software de fuentes abiertas.

- El uso de software de fuentes abiertas incrementa considerablemente las posibilidades de


explotación de una tecnología gracias a la disponibilidad de recursos y del código fuente y al
modelo de desarrollo abierto y colaborativo

Eso es una gran ventaja de los programas de código abierto / software libre. Pero desde el
punto de vista del programador de ese código, la cosa cambia.

- 94 -
Desde el punto de vista de las empresas, el modelo bazar a quedado demostrado que es fiable y
consistente para la elaboración de cualquier tipo de programas, desde clientes de correo, hasta
sistemas operativos, pero a las empresas no les sale rentable, a no ser que exploten alguna manera
de poder cobrar por un mantenimiento o una formación, y aun así muchas empresas de código
abierto han visto como esos departamentos eran un pozo sin fondo.

El sistema operativo MAC posee peculiaridades respecto a los demás sistemas operativos
como es un sistema de archivos gobernado por una aplicación llamada finder que gestiona los
archivos de nuestro sistema operativo de tipo Mac. Hemos estudiado la arquitectura desde la base
teniendo el núcleo justo encima del hardware hasta la interfaz de usuario que sirve para
comunicarse con el usuario, que en los últimos sistemas Mac (Mac Os X) es el llamado Aqua.
MAC es un sistema que tiene pocos peligros en cuanto a virus y malware. Hay también distintos
tipos de usuario cada cuál tiene un determinado número de privilegios. Hemos podido ver también
una evolución de la gestión de la memoria en las diferentes versiones de Mac Os hasta la llegada
de la asignación de memoria dinámica.

- 95 -
8 Referencias

• Arquitectura e introducción de Linux disponible en Internet


http://exa.unne.edu.ar/depar/areas/informatica/SistemasOperativos/MonogSO/LINUX99.htm (Universidad
Nacional del Nordeste)

• Carretero, Jesus: Sistemas Operativos, Una Vision Aplicada. Editorial McGraw-Hill. Madrid, 2001

• Custer, H.: El Libro De Windows NT. Editorial Anaya. España, 1993.

• Documental sobre el software libre “Revolution OS”

• Silberchatz, Abraham: Fundamentos de Sistemas Operativos. Editorial Mcgraw-hill. (Séptima edición)

• Solomon, David A.: A Fondo la Arquitectura de Windows NT. Editorial McGraw-Hill. 1999

• Stallings, William: Sistemas Operativos 2º Edicion. Editorial Prentice Hall. Madrid, 1997

• Tanenbaum, Andrew S.: Sistemas Operativos Modernos. Editorial Prentice Hall. (Segunda Edición)

• http://catrip.wordpress.com/2007/12/18/chmod-permisos-en-linux/ [12-3-2010]

• http://comfia.info/noticias/55540.html

• http://cs.uns.edu.ar/~sd/data/apuntes/SD-2009-mod%2006.pdf

• http://dbus.freedesktop.org/doc/ [10-3-2010]

• http://descargas.cervantesvirtual.com/servlet/SirveObras/01048630096709319650035/007326_2.pdf

• http://es.wikibooks.org/wiki/Introducci%C3%B3n_a_Linux/Archivos_y_permisos [12-3-2010]

• http://es.wikipedia.org/wiki/Ext2 [10-3-2010]

• http://es.wikipedia.org/wiki/Ext3 [10-3-2010]

• http://es.wikipedia.org/wiki/Ext4 [10-3-2010]

• http://es.wikipedia.org/wiki/La_Catedral_y_el_Bazar

• http://es.wikipedia.org/wiki/XFS [10-3-2010]

• http://exa.unne.edu.ar/depar/areas/informatica/SistemasOperativos/SO9.htm [20-2-2010]

• http://observatorio.cenatic.es/index.php?option=com_content&view=article&id=476:sun-
microsystems&catid=2:empresas&Itemid=41&limitstart=8

• http://www.baquia.com/noticias.php?id=12864

• http://www.debian-administration.org/article/Filesystems_ext3_reiser_xfs_jfs_comparison_on_Debian_Etch
[10-3-2010]

• http://www.es.gnome.org/

• http://www.escomposlinux.org/iarenaza/articulo-acls/acls-linux-samba.html [12-3-2010]

- 96 -
• http://www.eveliux.com/mx/el-futuro-del-software-libre.php

• http://www.fsf.org/

• http://www.genbeta.com/linux/quien-aporta-mas-al-kernel-de-linux

• http://www.gnu.org/

• http://www.itistmo.edu.mx/Pag%20Informatica/APUNTES_archivos/page0029.htm [10-3-2010]

• http://www.opensource.org/

• http://www.rediris.es/cert/doc/unixsec [10-3-2010]

• http://www.sip.gob.mx/mundo-unix/360-una-breve-historia-de-linux

• http://www.suse.de/~agruen/acl/linux-acls/online/ [12-3-2010]

• http://www.unixsup.com/unixlinux/historiaunixcuxs.html

• http://www.vanemery.com/Linux/ACL/linux-acl.html [12-3-2010]

- 97 -

Вам также может понравиться