Download mecanismos - Instituto Tecnológico de Morelia

Document related concepts

RTAI wikipedia , lookup

Protección de memoria wikipedia , lookup

Comunicación entre procesos wikipedia , lookup

Hilo de ejecución wikipedia , lookup

Cierre de exclusión mutua wikipedia , lookup

Transcript
Unidad III Mecanismos de
protección
M.C. Juan Carlos Olivares Rojas
Temario
3.1 Introducción
3.2 Funciones de un sistema de protección
3.3 Limitaciones
3.4 Implantación de matrices de derechos
3.5 Mecanismos de protección
3.1 Introducción
• El problema como se había comentado la unidad
anterior, no es la compartición de recursos de
software sino el control de los mismos por la
concurrencia. Por este motivo, todo Sistema
Operativo debe tener implementado un módulo
dedicado a la protección.
• Generalmente esos mecanismos de protección se
encargan de la gestión de los procesos a los
recursos compartidos.
3.2 Funciones de un sistema de
protección
• Las principales actividades de un sistema
operativo son:
1.Protección de los procesos del sistema
contra los procesos de usuario.
2.Protección de los procesos de usuario
contra los de otros procesos de usuario.
3.Protección de Memoria.
4.Protección de los dispositivos.
3.3 Limitaciones
• La función de la protección en un sistema
computacional es la de proveer un mecanismo para
la aplicación de políticas que gobiernen el uso de
los recursos.
• Estas políticas pueden ser establecidas de varias
maneras:
– Definidas durante el diseño del sistema,
– Definidas en la ejecución del sistema.
– Definidas por usuarios individuales para proteger sus
archivos y programas.
Limitaciones
• Las políticas para el uso de recursos puede variar,
dependiendo de la aplicación y pueden estar
sujetas a cambios. Por estas razones, la protección
no puede ser considerada como un problema que
solamente concierne al diseñador de un Sistema
Operativo, sino que debe considerarse, como una
herramienta
para
los
programadores
de
aplicaciones, de manera que los recursos creados
y soportados por un subsistema de aplicación,
puedan ser protegidos contra el mal uso.
Limitaciones
• Un principio importante es la separación entre
política y mecanismo.
• Los mecanismos determinan como será realizado
algo. En contraste, las políticas deciden que es lo
que se realizará.
• Es posible que las políticas cambien de lugar en
lugar o de tiempo en tiempo. En el peor de los
casos, cada cambio en la política requerirá un
cambio en el mecanismo.
Dominio de protección
• Un sistema computacional es una colección de
objetos. Los objetos pueden ser objetos hardware
(como CPU, segmentos de memoria, impresoras,
etc.) y objetos software (como archivos, programas,
semáforos, etc.).
• Cada objeto tiene un nombre único que lo
diferencia de los demás objetos del sistema y cada
una puede ser accedido solamente mediante
operaciones bien definidas.
Dominio de protección
• Obviamente, un proceso tendrá permitido acceder
solamente a aquellos recursos a los que está autorizado
• Este requerimiento comúnmente llamado el principio
"Need_To_Know" es útil en la limitación de la cantidad de
daño que un proceso defectuoso pueda causar al sistema.
• Por ejemplo, cuando un proceso "P" invoque al
procedimiento "A", al procedimiento le será permitido
acceder solamente a sus propias variables y los parámetros
actuales pasados a él; no podrá acceder a todas las
variables del proceso "P".
Dominios de protección
• Para facilitar este esquema se introduce el
concepto de dominio de protección. Un
proceso opera dentro de un dominio de
protección, el cual especifica los recursos
que el proceso puede acceder.
• Cada dominio define un conjunto de objetos
y los tipos de operaciones que pueden ser
realizadas sobre cada objeto.
Dominios de protección
• La capacidad de ejecutar una operación
sobre un objeto es un derecho de acceso.
• Un dominio es una colección de derechos de
acceso, cada uno de los cuales es un par
ordenado
<Nombre_Objeto,
Conjunto_de_Operaciones>.
Dominios de protección
• Por ejemplo, si el dominio "D" tiene derecho
de acceso <Archivo F, {Leer, Escribir}>,
entonces un proceso que se está ejecutando
en el dominio "D" puede tanto leer como
escribir en el archivo F; no podrá realizar
alguna otra operación sobre este objeto.
• Los dominios de protección no necesitan ser
distintos; por el contrario, pueden compartir
derechos de acceso.
Dominios de protección
• ¿Qué pasa en los siguientes casos?
• Se tienen 3 dominios: D1, D2 y D3; y los
siguientes objetos:
• D1:
<O3,
{Leer,
Escribir}><O2,
{Escribir}><01, {Ejecutar}>
• D2: <O1, {Leer, Escribir}><O4, {Imprimir}>
• D3: <O3, {Leer}><O4, {Imprimir}>
3.4 Implantación de matrices de
derechos
• Un modelo de protección puede ser visto
abstractamente como una matriz, llamada matriz
de derecho. Los renglones de la matriz representan
dominios y las columnas representan objetos.
• Cada entrada en la matriz contiene un conjunto de
derechos de acceso. La entrada "Matriz[i, j]" define
el conjunto de operaciones que un proceso
ejecutándose en el dominio "Dj" puede realizar
sobre el objeto "Oj".
Estructuras de Protección Dinámica
• Las matrices de acceso vistas hasta el momento,
en las que no cambian los derechos en cada
dominio durante su ejecución, son un ejemplo de
Estructuras de Protección Estáticas.
• Con el fin de ofrecer flexibilidad y de implementar
eficientemente la protección, un Sistema Operativo
debe soportar cambios en los derechos de acceso.
Para esto se requiere implementar alguna
estructura de protección dinámica.
Estructuras de Protección Dinámica
• En este caso continuaremos considerando
las matrices de acceso, aunque en su
versión dinámica.
• Básicamente se requieren cuatro nuevos
derechos de acceso: Copia, Cambio,
Propietario y Control.
Derechos de acceso de copia
• Este derecho de acceso da la facultad a un
proceso de copiar derechos existentes en un
dominio hacia otro dominio para el objeto en
cuestión; es decir, este derecho genera
copias en columnas.
• Se puede representar este derecho con un
signo + dentro del dominio de protección
Derechos de acceso de copia
• En general se podría hablar de 3 variantes
del derecho "copia": Copia Limitada, Copia
Completa, Translación.
• Copia Limitada: La copia no incluye el
derecho "Copia", con lo que no se podrán
hacer copias sucesivas del derecho. Se
puede indicar con el signo (+).
Derechos de acceso de copia
• Copia completa: la copia incluye el derecho
"Copia", por lo que se pueden realizar copias
sucesivas del derecho. Se puede indicar con el
signo (*).
• Traslación: el derecho en cuestión junto con el
derecho copia se eliminan del dominio original y se
coloca en el nuevo dominio. Esta es una forma
básica de retirar derechos de un dominio para
asignarlo a otro. Se puede indicar con el signo (?).
Derechos de acceso de cambio
• Este derecho de acceso indica la posibilidad
de un proceso para cambiarse de un dominio
a otro.
• La operación cambio actúa sobre dominios;
es decir, en este caso los dominios son los
objetos. Entonces, para considerar este
derecho de acceso se deberán incluir los
dominios como objetos adicionales en la
matriz de acceso.
3.5 Mecanismos de protección
• Protección de memoria: siempre que una
aplicación intenta acceder a una zona de
memoria que no está comprendida dentro de
su mapa actual de memoria, el procesador
386 y posteriores, genera una interrupción y
pasa al sistema operativo un conjunto de
información relativa al problema.
Mecanismos de protección
• La protección de la memoria se logra por
medio de:
– Tablas de paginas que describen exactamente
las áreas de memoria física a las que un
programa puede acceder.
– Un indicador de lectura/escritura para impedir
modificar una página de sólo lectura o de código
de programa.
– Un indicador de usuario/supervisor que permite
al sistema operativo proteger su propia memoria
de cualquier intento de acceso.
Mecanismos de protección
• La mejor protección hacia los recursos se
logra a través del control de los procesos,
dado que estos son los que utilizan los
recursos.
• Existen dos tipos de control de los procesos
para el acceso a los recursos: cooperativos
donde los procesos se ponen de acuerdo y
centralizados a nivel del núcleo del sistema
operativo.
Mecanismos de protección
• La mayoría del control de procesos se hace
a nivel de sistema operativo a través de las
llamadas del sistema, dado que la
cooperación de los procesos no siempre es
justa.
• El sistema de archivo forma parte importante
de las primitivas de sincronización entre
procesos.
IPC
• La comunicación entre procesos (IPC) es
parte fundamental de las primitivas de
sincronización de procesos y de los
mecanismos de protección.
• Los mecanismos de comunicación entre
procesos no sólo aplican a aplicaciones
centralizadas sino también distribuidas.
Procesos
• Son la unidad básica de atención del sistema
operativo.
• Se pueden copiar procesos en diferentes
segmentos del sistema operativo.
• Los procesos son dependientes del sistema
operativo por lo que no se ejecutan en todos
los sistemas.
Terminación de procesos
• A el código de estado de un proceso
formalmente se llama señal.
• Un proceso huérfano es aquel que se ha
quedado sin padre.
• Un proceso zombi es aquel que se ha
quedado ocupando una posición de la tabla
de descriptor de procesos.
wait()
• En algunas ocasiones un proceso padre
necesita esperar a que sus hijos termine.
Para ello necesita sincronizarse los
procesos.
• La función que nos permite parar un proceso
hasta que termine otro es wait
• pid = wait(&estado);
wait()
• Algunas macros que nos ayudan en este
proceso son:
•
•
•
•
•
WIFEXITED
WEXITSTATUS
WIFSIGNALED
WTERMSIG
WCOREDUMP
Más sobre procesos
• Un ejemplo de clonación de procesos es la
ejecución de la función system() que nos
permite ejecutar una llamada al sistema,
generalmente un comando de la shell.
• hijo = getpid();
• Padre = getppid();
• Grupo = getpgrp();
Identificadores de usuario y de
grupo
• En muchas ocasiones no sólo es necesario
conocer los identificadores de procesos sino
conocer los usuarios y los grupos.
•
•
•
•
uid_t getuid(); /*usuario real*/
uid_t geteuid(); /*usuario extendido*/
gid_t getgid();
gid_t getegid();
Procesos bloqueantes y no
bloqueantes
• Para el buen manejo de los recursos, se
necesita en la mayoría de los casos que los
procesos se puedan bloquear, en otros no se
podrá hacerlo.
• La función sleep() permite dormir un proceso
una cantidad determinada de milisegundos,
es un ejemplo de una llamada bloqueante.
Señales
• Las señales permiten a los procesos
comunicarse a través de un evento, dicha
comunicación es la base para una adecuada
protección.
• A continuación se muestran los tipos de
señales más comunes en sistemas Unix, las
cuales se encuentran definidas en signal.h
Señales
1.
2.
3.
4.
5.
6.
7.
8.
9.
SIGHUP
SIGINT
SIGQUIT
SIGILL
SIGTRAP
SIGIOT
SIGEMT
SIGFPE
SIGKILL
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SIGBUS
SIGSEGV
SIGSYS
SIGPIPE
SIGALARM
SIGTERM
SIGUSR1
SIGUSR2
SIGCLD
SIGPWR
Señales
• int kill(pid, sig) sirve para mandar una señal
de un proceso a otro.
• pid > 0 proceso; pid = 0 a todos los procesos
que pertenecen al mismo grupo.
• La función signal sirve para capturar una
señal y realizar una función con ella.
Señales
main() {
void sigint_handler();
if(signal(SIGINT,sigint_handler)== SIG_ERR)
perror(“Error en la señal”);
……..
}
void sigint_handler(int sig) {
printf(“señal recibida”);
}
IPC
• El mecanismo de comunicación entre
procesos más famosos es el IPC (Inter
Process Comunication) de Unix System V.
• Para evitar los problemas de cómo
establecer los mecanismos de comunicación
entre procesos de distintos sistemas
operativos surgió el estándar POSIX
(Portable Operating System Interconection X)
para el mejoramiento de los mismos.
Tuberías
• Las tuberías con nombre se manejan igual
que las tuberías sin nombre con la salvedad
de que presentan un nombre que ocupa una
entrada de directorio.
• Se trabajan igual que un archivo sólo que se
bloquea cuando un proceso escribe en la
tubería.
Tuberías
• Para crear una tubería con nombre desde
shell se debe ejecutar: mknod fifo_1 p
• Desde programación las tuberías con
nombre se crean: mknod(“tubo”, S_IFIFO |
permisos, 0)
• Las comunicaciones vistas hasta ahora son
half-duplex. Se puede utilizar un poll o select
para realizar comunicación full-duplex
3.2.2 Semáforos
• Los semáforos son mecanismos
permiten sincronizar procesos.
que
• Todos los mecanismos IPC tienen una
entrada en una tabla especial con una llave
definida por el usuario.
• Los posibles valores de la llave son
IPC_PRIVATE, IPC_CREATE, IP_EXECL,
entre otros.
Semáforos
• Cada entrada de la tabla tiene un registro de
permisos (rw), información de estado y
llamadas de control.
• Las llaves son del tipo key_t. Para crear una
llave se utiliza:
#include <types.h>
#include <sys/ipc.h>
key_t ftok(path, id)
Semáforos
• Es un mecanismo para prevenir colisiones
cuando uno o más procesos solicitan
simultáneamente un recurso.
• Dijsktra los define como un objeto tipo entero
en los cuales se puede aplicar dos
operaciones: P (Proberen, comprobar) y V
(Verhogen, incrementar), donde P sirve para
obtener el recurso y V para liberarlo.
Semáforos
• Las operaciones sobre un semáforo son
semget para crear un semáforo o habilitar
uno
existente,
semctl
para
realizar
operaciones de control e inicialización,
semop para realizar operaciones P y V.
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semget(key, nsems, semflg)
Semáforos
int llave, semid;
if((llave= ftok(“auxiliar”, ‘K’)) ==(key_t)-1)
/*Tratamiento del error*/
if((semid= semget(llave, 4, IPC_CREAT |
0600)) == -1)
/*Error al crear el semáforo*/
Semáforos
int semctl(semid, semnum, cmd, arg)
union semun{
int val;
struct semid_ds *buf;
ushort *array;
}arg;
• Las opciones de control son: GETVAL,
SETVAL, GETPID, GETNCNT, GETZCNT,
GETALL, SETALL, IPC_STAT, IPC_SET
Semáforos
ushort asem;
asem[0]=5; asem[1]=3; asem[2]=4; asem[3]=8;
semctrl(semid, 0, SETALL, asem)
valor = semctrl(semid, 3, GETVAL, 0)
int semop(semid, sops, nsops)
struct sembuf *sops;
Semáforos
struct sembuf{
ushort sem_num;
short sem_op;
short sem_flg;
};
• Si semop es negativo se decrementará (P), si se
incrementa (V) y si es 0 no hace nada.
• Las banderas son: IPC_WAIT, IPC_NOWAIT,
SEM_UNDO
Semáforos
struct sembuf operacines[4];
Operaciones[0].semnum = 1;
Operaciones[0].sem_op = -1;
Operaciones[0].sem_flg = 0;
Operaciones[1].semnum = 4;
Operaciones[1].sem_op = 1;
Operaciones[1].sem_flg = 0;
semop(semid, operaciones, 2);
3.2.3 Colas (mensaje)
• La filosofía de las colas de mensajes es
similar a las tuberías, pero con mayor
versatilidad.
• Una cola es una estructura de datos
gestionada por el kernel, en la cual varios
procesos pueden escribir sobre ella. El
sincronismo para evitar colisión lo realiza el
kernel.
Colas de mensajes
#include <sys/msg.h>
int msgget(key, msgflg)
If((msqid= msgget(llave, IPC_CREATE | 0600))
== -1)
/*Error al crear la cola de mensajes*/
• msgctrl(msq, cmd, buf) sirve para leer y
modificar la información estadística y de
control de una cola.
Colas de mensajes
• Los comandos de control son: IPC_STAT,
IPC_SET,
IPC_RMID.
Por
ejemplo:
msgctrl(msqid, IPC_RMID, 0);
• Las operaciones básicas de una cola de
mensajes son enviar y recibir los mensajes
que se realizan con las siguientes funciones:
int msgsnd(msqid, msgp, msgsz, msgflg);
int msgrcv(msqid, msqp, msgtyp, msgflag);
Cola de mensajes
• El parámetro msgtyp indica el tipo de
mensaje que se desea leer: 0 para el primer
mensaje, > 0 el primer mensaje de tipo
msgtyp que haya en la cola, <0 lee el primer
mensaje que sea menor o igual al valor
absoluto de msgtyp y además sea el
mensaje más pequeño de los que hay.
Cola de mensajes
struct{
long tipo;
char cadena[20];
}mensaje;
strcpy(mensaje.cadena, “SD1”);
mensaje.tipo = 1;
longitud = strlen(mensaje.cadena)
if(msgsnd(msqid,&mensaje,longitud,0)==-1) /*Err*/
if(msgrcv(msqid,&mensaje,longitud,1,0) ==-1) /*Er*/
3.2.5 Monitores
• Es un procesos que se encarga de verificar
el funcionamiento de algún recurso
garantizando la exclusión mutua (mutex).
• En un monitor los procesos se bloquean y
desbloquean.
• Pueden existir diversas implementaciones no
estandarizadas de un monitor.
Hilos
• Son procesos ligeros ya que no se duplican
completamente, sólo duplican su segmento
de código. Por tal motivo, comparten datos
fácilmente, la desventaja es que ocurren
muchos problemas del tipo “race conditions”,
pero al igual que IPC se soluciona con
mecanismos como regiones críticas, zonas
de exclusión mutua, etc.
Hilos
• PThreads (POSIX Threads) es la biblioteca
para la creación de hilos más implementada
en sistemas *X.
• Se utiliza la biblioteca pthread por lo que
algunos compiladores ya la incluyen de
manera predeterminada sino habrá que
indicar su uso: gcc … -lpthread
Hilos
• Crear hilos:
int
pthread_create(pthread_t
*thread,
pthread_attr_t
*attr,
void
*
(*start_routine)(void *), void *arg)
• Esperar la finalización de hilos:
int
pthread_join(pthread_t
**thread_return)
th,
void
Hilos
• No guardar estado del hilo:
int pthread_detach(pthread_t h)
• Salir de un hilo:
pthread_exit(void *retval)
• Biblioteca a utilizar: #include <pthread.h>
Hilos
typedef struct parametros {
int id;
char *nombre
};
void *funcion(parametros *p) {
printf(“%s %d”, p->cadena, p->id);
pthread_exit(&(p->id))
}
Hilos
• Referencia asi mismo:
Yo = pthread_self(); /*Demás funciones*/
• Enviar una señal a un hilo:
pthread_kill(pthread_t hilo, int señal);
• Los hilos no están tan extendidos por que
existen muchas variantes: hilos mach, hilos
solaris, Gthreads, etc.
Hilos
• Mutex:
pthread_mutex_init(pthread_mutex_t *mutex, const
pthread_mutex_attr_t *attr)
int pthread_mutex_lock(pthread_mutex_t *mutex)
int pthread_mutex_unlock(pthread_mutext_t *mutex)
int pthread_mutex_destroy(pthread_mutext_t *mutex)
4.6. Criptografía
• Viene del griego crypto que significa oculto y
grafía escritura.
• La criptografía es el arte de cifrar la
información.
• El criptoanálisis es el arte de descifrar un
mensaje.
• Criptografía y criptoanálisis van de la mano.
Criptografía
• Los primeros métodos de cifrado fueron el de
transposición (cambiar el orden de las letras)
y el de sustitución (cambiar una letra por
otra).
• En la actualidad los métodos de cifrados son
más robustos pero no indescifrables. Se trata
de que el obtener el mensaje en claro sea
más costoso que obtener el original.
Criptografía
• Los métodos actuales de cifrado basan la
codificación d e la información en base a una
llave, dicha llave puede ser simétrica o
asimétrica.
• Algunos algoritmos importantes
son:
de cifrado
• DES (Data Encryption System) creado por
IBM en 1974 utilizando claves de 64.
Criptografía
• En 1999 DES fue roto, por lo que ya no se
utiliza en sistemas de alta seguridad.
• La firma digital es una clave muy grande
utilizada para cifrar información.
• Otro algoritmo de cifrado importante es RSA
(Rivest-Shamir-Adleman).
• El algoritmo de cifrado más robusto es AES.
Criptografía
• AES (Advanced Encryption System) fue
presentado en 2001, utiliza el algoritmo
RIJNDAEL con llaves de 128, 192 y 256 bits.
Se espera tenga una vida útil de 20 años.
• Existen variaciones de los algoritmos como
3DES, o algoritmos de libre distribución
como PGP (Pretty Good Privacy)
• RSA basa sus llaves en números primos.
4.7. Protección
• La protección de la información en cualquier
sistema sea distribuido o no resulta vital.
• Para la protección se necesita plantearse
metodologías adecuadas que garanticen una
mayor protección.
• Una de las mejoras maneras de tener
protegido un sistema es a través de la
autenticación y autorización de usuarios.
Protección
• La autenticación generalmente se da a
través de esquemas de contraseñas, las
cuales si no cuentan con una política robusta
de generación y mantenimiento se vuelven
fácilmente vulnerables.
• Un esquema de autenticación seguro es
kerberos, el cual se utiliza para autenticar el
uso de servicios como NFS, etc.
Protección
• Kerberos se basa en un esquema de boletos
entregados para la autenticación y de dos
llaves secretas una dada por kerberos y otra
conocida por los usuarios para entrar al
sistema.
• Un buen mecanismo de protección debe
evitar que usuarios roben ciclos de CPUs a
otros, tener más derechos que otros sin
habercelos otorgado previamente, etc.
Protección
• Se debe garantizar la integridad y provacidad
de los datos de los usuarios.
• Se debe proteger la cesión de derechos de
algún recurso en el sistema.
• El esquema básico de protección radica en
una matriz de acceso, en la cual se listan los
recursos y las actividades que se pueden
realizar sobre él.
Protección
• Las matrices de acceso no son tan eficientes
ya que dependen de la cantidad de recursos,
usuarios y accesos.
• Un mejor esquema son las lista de control de
acceso en las cuales se puede especificar el
acceso a cada recurso de una mejor forma.
• Un mejor esquema de protección es el
acceso a través de roles
4.8. Seguridad
• Existen muchos riesgos en los sistemas
distribuidos y en general en cualquier
sistema basado en red, por ejemplo:
•
•
•
•
•
Virus y troyanos
Entrada no autorizada a sistemas
Destrucción o pérdida de información
Alteración de transacciones
Etcétera
Seguridad
• Los principales ataques y vulnerabilidades de
seguridad son los siguientes:
•
•
•
•
Ingeniería social
Spoofing (suplantación)
Denegación de servicio
Uso de sniffers
Seguridad
• Algunas recomendaciones para mejorar la
seguridad de un sistema son:
• Revisar
patrones
de
acceso
y
comportamiento a cuentas de usuarios y
servicios.
• Verificar que las políticas del sistema no
hayan cambiado, de tal forma que no se
permitan muchos puertos abiertos, etc.
Seguridad
• Se debe hacer especial énfasis en la
seguridad física por que muchos problemas
de seguridad vienen desde el interior.
• Las políticas de seguridad deben ser
independientes de la tecnología empleada.
• En general existen dos tipos de ataque:
pasivos y activos, siendo éstos últimos los
más perjudiciales.
Seguridad
• Una buena forma de otorgar seguridad a los
sistemas distribuidos es a través de un
Firewall, el cual se encarga de autorizar o no
el acceso a determinados recursos en base
algunas reglas definidas.
• Otro mecanismo de seguridad son los proxys
que permiten centralizar el tráfico de cierto
servicio pudiendo denegar el acceso o bien
limitarlo para los diferentes usuarios.
Seguridad
• La implantación de políticas de seguridad
puede hacerse desde dispositivos de red
como conmutadores y encaminadores.
• La seguridad es un área con un crecimiento
exponencial en los últimos años. Se
recomienda basar las políticas de seguridad
en estándares internacionales de tecnologías
de la información como ITIL, COBIT, etc.
Referencias
• Tanebaum, A., Woodhull, A. (1997) Sistemas
Operativos. Diseño e Implementación.
México, Prentice Hall. ISBN: 970-17-0165-8.
• Tutorial de Sistemas Operativos 2. Instituto
Tecnológico
de
la
Paz.
http://sistemas.itlp.edu.mx/tutoriales/sistemas
operativos2/ [octubre 2007]
Referencias
• Villegas, Cristobal. Material Curso de
Sistemas Operativos 2 (2002). Instituto
Tecnológico de Morelia, México.
• Silberschatz, Abraham, Galvin, Peter,
Sistemas Operativos, Quinta edición (1999).
México, Pearson.
Referencias
• Tanenbaum, Andrew (1996). Sistemas
Operativos Distribuidos. México, Prentice
Hall.
• Shah,
Steve
(2001).
Manual
de
administración de Linux. Capítulo 18:
Sistema de archivos de red (NFS), pp 375386. España, Osborne McGraw-Hill.
¿Preguntas?