AmpliSSOO. Trabajo 2
AmpliSSOO. Trabajo 2
AmpliSSOO. Trabajo 2
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
Resumen.
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
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.
Existen tres modelos de computadora en los que se pueden ejecutar procesos concurrentes:
Por tanto, será real cuando haya más de un procesador. La ejecución de procesos concurrentes
se justifica por:
• Facilitar la programación
-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 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 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
Desventajas
[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.
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)
• 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.
• 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.
• Por el medio de la conexión: Cable(coaxial, par trenzado, fibra óptica ...) o Aire(Wifi,
radio, bluetooth, infrarrojos, láser ...)
• 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.
[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.
[1] Existen varios tipos de sistemas que ofrecen soporte a aplicaciones distribuidas:
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.).
-6-
2.4 Modelos de computación distribuida
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).
2.5 Procesos
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:
• 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:
En un diseño dinámico:
o Un tamaño de pila.
• Un proceso:
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.
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.
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.
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
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.
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.
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.
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.
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.
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.
- 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.
Para diseñar los algoritmos debemos tener en cuenta una serie de criterios.
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.
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
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.
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.
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.
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.
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.
- 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.
[1] Hemos dicho que las redes nos permiten el paso de mensajes entre ordenadores. Existen
dos enfoques de comunicación:
1.1.11 Sockets
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 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:
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.
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.
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:
Este mecanismo es ampliamente usado, incluso en la línea de comandos UNIX (en la shell):
• 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.
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
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.
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.
Este proceso se realiza mediante stubs o suplentes. Se puede resumir mediante los siguientes
pasos:
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.
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 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.
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.
Los ordenadores poseen un circuito que guarda el tiempo conocido. Esto se consigue con un
cristal que oscila al aplicarle una tensión.
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
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.
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).
Teniendo en cuenta todos estos factores se debe calcular, si el emisor debe ir adelantándose
o retrasándose muy lentamente para evitar problemas.
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] 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.
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 ú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.
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.
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.
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.
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”.
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.
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:
- 24 -
• Prevención: Hacer que los bloqueos sean imposibles desde el punto de vista
estructural.
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.
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.
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).
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.
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.
- 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.3 Nomenclatura
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.
- 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.
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.
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.
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.
- 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.
1.1.35 Acceso
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.
- 29 -
1. Cachés de disco: ubicadas en el disco duro, poseen la ventaja que si ocurre un fallo no se
pierden los datos.
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.
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.
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
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.
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.
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.
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 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).
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
Ventajas:
• Menor coste.
Desventajas:
• Administración de la red.
• 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.
• 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.
- 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.
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).
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.
- 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.
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.
- 36 -
Mantenimiento de la coherencia
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
Confiabilidad:
Rendimiento:
Requisitos a considerar:
Transparencia de replicación
Problemas de Consistencia
Problemas:
La idea es que la actualización se realice con una única operación atómica. Se necesitan
sincronizar todas las réplicas.
- 38 -
Modelos de Consistencia
Consistencia Estricta
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
Consistencia Causal
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.
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.
3 Implementación Windows
3.1 Arquitectura
3.1.1 Diseño
- 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.
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
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:
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
- 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.
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.
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.
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
• 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.
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:
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);
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.
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).
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
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.
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.
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.
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.
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.
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
- 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.
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.
- Direcciones para las DLL del sistema (NTDLL, KERNEL32, USER32, GDI32 ...).
- 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
- 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.
A continuación vamos a explicar las principales características del sistema de archivos NTFS:
- 50 -
3.5.2 Estructura Interna
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:
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.
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.
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.1 Características
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.
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.
Los componentes y bases de datos de seguridad del sistema son los siguientes:
5. Base de datos SAM: Contiene los usuarios y grupos definidos, junto con sus
contraseñas y demás atributos.
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
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:
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.
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.
4 Implementación Linux
4.1 Arquitectura
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.
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
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 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.
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
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.
- 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.
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
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
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.
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.
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.
1. Su cuanto llega a 0.
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.
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.
Tipos de sockets
- 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:
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.
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.
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:
Este mecanismo es ampliamente usado, incluso en la línea de comandos (en la shell). Por
ejemplo:
ls | sort | lp
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).
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.
- 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
Memoria compartida es una región de memoria que puede ser accedida por múltiples
procesos.
• 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.
- 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.
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
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.
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.
- 65 -
2. El cache de paginas : Almacena paginas enteras del contenido de los archivos y no esta
limitado a los dispositivos por bloques
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.
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.
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.
Los tipos de sistemas de archivos más conocidos para Linux son: ext2, ext3, ext4, XFS,
ReiserFS y JFS.
1.1.54 ext2
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.
1.1.55 ext3
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
- 67 -
• Soporte de volúmenes de hasta 1024 PiB.
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
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).
1.1.59 JFS
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.
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.
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.
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 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.
- 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.
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
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 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:
- 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.
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:
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:
- 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.
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":
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).
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:
- 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
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.
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.
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.
- 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.
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.
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.
- 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
- 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.
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.
- 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.
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, ...)
• Gestión de energía
- 79 -
• Base de datos de todos los I / O Kit de clases disponibles en un sistema
• API extensa
• 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.
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).
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
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.
Mac OS X usa el nivel básico de seguridad de 128bits, más que suficiente para la mayoría de
los casos.
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:
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.
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.
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".
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.
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.
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.
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.
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.
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.
6 Software libre
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.
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 código abierto (Open Source) es el software que te da una lista nueve derechos:
• Integridad del código fuente del autor: las licencias pueden requerir que las
modificaciones sean redistribuidas sólo como parches.
• Distribución de la licencia: deben aplicarse los mismos derechos a todo el que reciba el
programa
• 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.
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.
- 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.
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.
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 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.
Podemos decir que el futuro del software libre está asegurado ya que posee una serie de
ventajas sobre el software cerrado:
- 89 -
Varias personalidades del mundo de la informática piensan que el software libre goza de buena
salud
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.
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:
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.
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.
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.
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.
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.
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.
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:
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
• Carretero, Jesus: Sistemas Operativos, Una Vision Aplicada. Editorial McGraw-Hill. Madrid, 2001
• 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 -