Download proceso - Inicio - Instituto Tecnológico de Morelia

Document related concepts

Memoria compartida wikipedia , lookup

Protección de memoria wikipedia , lookup

Biblioteca (informática) wikipedia , lookup

Hilo de ejecución wikipedia , lookup

Computación grid wikipedia , lookup

Transcript
Unidad II Métodos para compartir
recursos de Software
M.C. Juan Carlos Olivares Rojas
Temario
2.1 Justificación
2.2 Requisitos
2.3 Procedimientos entrantes
2.4 Recursos compartidos asignados
estáticamente
2.5 Recursos compartidos asignados
dinámicamente
2.1 Justificación
• Compartir un recurso de software significa
que dos o más procesos puedan utilizar una
misma rutina o dato que está en memoria
(habiendo una sola instancia de la rutina o
dato).
• La rutina es el recurso que se comparte en
los procesos.
Justificación
• La compartición de recursos de software
hace que un sistema operativo sea más
flexible y eficiente ya que aumenta la
capacidad de atención de procesos.
• Es necesario la compartición de recursos en
un sistema operativo multiusuario y
multitarea por que generalmente sólo se
tiene un recurso y varios ocupan acceder a
él.
Justificación
• Muchos sistemas como las redes de
computadoras, los sistemas distribuidos, la
Web
y
el
groupware
basan
su
funcionamiento en la compartición de
recursos (procesos, periféricos, etc.).
• También la compartición puede ayudar al
balanceo de carga entre los procesos.
2.2 Requisitos
• Para la compartición de recursos de software
se requiere principalmente que el sistema
operativo
permita
la
repetición
de
apuntadores en las tablas de segmento o de
página (dependiendo del método empleado).
• Cualquier tipo de recurso hace referencia a
memoria.
Requisitos
• Además, si la compartición será dinámica, se
requiere que el sistema operativo soporte
carga/descarga y ligado dinámico, para lo
cual se requiere implementar tablas
auxiliares como:
– ART (Tabla de Referencia Activa),
– AST (Tabla de Segmento Activa),
– SMT (Tabla de Mapeo de Segmentos).
Requisitos
• Los recursos pueden ser:
• Dedicados: se asignan por el tiempo que el
proceso los requiera. El proceso debe liberar
el recurso, generalmente utilizan memoria
estática, pero también se pueden utilizar
memoria
dinámica
o
espacio
de
almacenamiento físico.
Requisitos
• Los recursos asignados dinámicamente son
aquellos que son intercalados para cada uno
de los procesos; es decir, no le pertenecen a
nadie de manera absoluta.
• La compartición de los recursos se asigna de
esta forma de manera predeterminada salvo
en el caso en que el recurso no pueda ser
intercalado dado que se requiera control
absoluto por parte de un proceso.
Requisitos
• Los recursos compartidos pueden
asignados de dos formas básicas:
ser
• Uno a la vez. El recurso es asignado a un
solo proceso/usuario, el uso es intercalado.
Por ejemplo: el recurso procesador es
recuperado por el Sistema Operativo. Los
archivos son liberados por los procesos.
Requisitos
• Muchos a la vez: Es una compartición real,
muchos procesos son asignados a un
recurso. Por ejemplo: una página en
memoria es asignada a muchos programas,
un archivo es asignado a muchos recursos.
• Para realizar compartición de recursos se
necesitan considerar: usuarios (u), derechos
(d) y recursos (r).
Requisitos
• Por este motivo se necesita de una base de
datos de n*m*r
• Al compartir recursos se generan colas (lista
de espera).
• El principal problema de la compartición es la
concurrencia a un recurso
Requisitos
• Los
mecanismos
más
básicos
de
compartición hacen referencia a base de
datos (tablas), semáforos y listas ligadas.
• Cada recurso define su forma de compartir.
• Por ejemplo en una sesión de computadora
un recurso puede estar asignado en un
tiempo, el cual recibe el nombre de quantum.
Requisitos
• Los derechos de los usuarios prevalecen sobre una
sesión.
• Otro requisito indispensable para compartir
recursos es que los procesos sepan que el recurso
está compartido.
• También es requisito indispensable que los
procesos se puedan comunicar entre sí para
compartir cualquier recurso (IPC).
2.3 Procedimientos entrantes
• La base fundamental para que se pueda
compartir recursos es que los procesos
puedan soportarlo.
• Para que sean compartidos eficientemente
en un sistema de multiprogramación, los
procesos deben ser concurrentemente
reutilizables (también llamados procesos
puros).
Procedimientos reentrantes
• Un proceso puro opera solamente sobre
variables que están en registros del CPU o
sobre datos que están en otros segmentos
asociados con la tarea; nunca se modifican a
sí
mismos.
Ejemplo:
Los
Archivos
Ejecutables (EXE). Ejemplo de Archivos No
Reentrantes: Archivos de Comando (COM).
Procedimientos reentrantes
• Otros ejemplos de procesos no reentrantes son el
uso de CGI, mientras que los Servlets son
procesos reentrantes.
• Algunos autores definen los procesos reentrantes
aquellos que pueden obtener datos y memoria
fuera de su segmento.
• Un programa para ser concurrente necesita ser
reentrante, pero esto al revés la implicación no es
necesariamente cierta.
Procedimientos reentrantes
• Los procesos necesitan de mecanismos de
protección y sincronización para el uso
correcto de los recursos.
• Los procesos deben ser bloqueantes (es
decir que puedan detenerse en espera de un
evento) de preferencia para obtener una
buena compartición de los recursos.
Procedimientos reentrantes
• Los procesos deben responsabilizarse de la
compartición de los recursos con la
supervisión del sistema operativo, de lo
contrario un proceso se puede adueñar de
un recurso y jamás dejarlo.
• Cuando dos o más procesos compiten por un
recurso y este no es liberado por los dos se
produce un interbloqueo.
Procedimientos reentrantes
• Las funciones recursivas son un ejemplo
claro de un programa reentrante por que
piden memoria dinámica ubicada en distintas
localidades de memoria.
• Se debe cuidar la consistencia y la integridad
de los recursos como meta principal.
2.4 Recursos compartidos asignados
estáticamente
• Cuando los procesos compartidos se cargan
completamente en memoria desde el inicio
de su ejecución, se dice que la compartición
es estática. Ejemplo: Rutinas del servicio de
Interrupción del BIOS o MS-DOS
2.5 Recursos compartidos asignados
dinámicamente
• La compartición dinámica consiste en cargar
en memoria solo la parte requerida de los
procesos compartidos. Al necesitarse código
que no está en memoria, éste será cargado
durante la ejecución de las tareas. Ejemplo:
Componentes gráficos del sistema operativo
como los cuadros de dialogo de Windows.
Métodos para la Compartición de
Recursos de Software
• Básicamente existen dos Métodos, los
cuales están representado por la forma de
direccionamiento del sistema operativo:
– Segmentos Compartidos
– Paginación Compartida
Segmentación compartida
• Consiste en que cada proceso tiene una
tabla de segmentos asociado con su
PCB (Bloque de Control de Procesos) el
cual es utilizado por el despachador
para definir la tabla de segmentos de
hardware cuando a ese proceso se le
asigne el CPU.
Segmentación compartida
• Los segmentos son compartidos
cuando las entradas en las tablas de
segmentos de dos o más procesos
diferentes apuntan a las mismas
localidades de memoria física.
Segmentación compartida
• Ejemplo: Considérese el uso de un editor de
textos de un sistema de tiempo compartido.
En lugar de cargar 'n' copias del código del
editor, este será cargado una sola vez. Si
hay varios procesos que necesitan usar este
código, sus tablas de segmento contendrán
apuntadores a la misma dirección de
memoria donde está cargado el código.
Páginas compartidas
• Este método utiliza paginación como sistema
base de la administración de la memoria.
Consiste en cargar una sola instancia de las
paginas de código a compartir y colocar
apuntadores a estas páginas en las tablas de
páginas de todos los procesos que utilizan el
recurso.
Páginas compartidas
• Ejemplo: Utilizando el mismo editor de textos
sólo las funciones utilizadas se cargan en
memoria y están residentes en memoria por
si otros procesos las utilizan.
• La memoria no es la única forma de
compartir recursos de software, existen otros
mecanismos
menos
eficientes
que
discutiremos a continuación.
Mecanismos de compartición de
recursos de software
• Una forma sencilla de compartir recursos de
software
es
a
través
de
utilizar
almacenamiento secundario: archivos.
• Un proceso escribe en un archivo y otro lo
lee. Este es el funcionamiento de ciertos
procesos como las tuberías.
Mecanismos de compartición de
recursos de software
• Un tubo es un archivo temporal que enlaza la
salida de un programa con la entrada de
otra.
• El problema radica en cuando dos o más
procesos quieren escribir en el archivo que
simula la memoria compartida.
Mecanismos de compartición de
recursos de software
• Las tuberías en DOS o Linux pueden
manejarse a nivel de sistema con los
operadores de redirección <, >, >> y | que
redirecciona la salida de un programa hacia
la entrada de otro.
• Los tubos a nivel IPC se ejecutan en el
núcleo del sistema operativo.
Mecanismos para compartir recursos
de software
• Las tuberías en POSIX (Portable Operating System
InterconeXion) se crean a través de la siguiente
llamada:
• int tuberia[2]; /*Descriptor de archivos*/
• int pipe(tuberia);
• tuberia[0]; /*Escritura*/
• tuberia[1]; /*Lectura*/
Mecanismos para compartir recursos
de software
• Al dejar de utilizar una tubería, esta se debe
de
cerrar
en
sus
dos
extremos:
close(tubería).
• Se escriben datos en la tubería como
cualquier escritura de archivos con
read(tuberia[1], mensaje, strlen(mensaje)) y
write(tuberia[0], mensaje, strlen(mensaje)).
Mecanismos para compartir recursos
de software
• Las tuberías no son bidireccionales, sólo van
en un sentido, pero se pueden utilizar dos
tuberías para pasar mensajes en ambas
direcciones.
• Las tuberías utilizadas sólo están disponibles
para los descendientes de un proceso que lo
crean. Por este motivo, no están disponible
para otros procesos.
Mecanismos de compartición de
recursos de software
• Otra forma de compartir memoria es a través
de los puertos físicos del sistema, como el
puerto paralelo o serial. Un proceso puede
escribir en un puerto (el cual es una dirección
de memoria conocida) y el otro lee en esa
misma dirección, el proceso puede ser
remoto hacia un periférico.
Mecanismos para compartir recursos
de software
• Los puertos tienen asociados direcciones
físicas, por ejemplo el puerto serial o de
comunicaciones COM1 en una IBM PC tiene
asociado la dirección física 0x3F8-0x3FF
• Escribiendo en esa memoria todos esos
datos pueden ser leídos por otro proceso o
dispositivo. Otros puertos son AUX, LPT1,
CON en DOS. En Linux se manejan otros.
Mecanismos de compartición de
recursos de software
• Otra forma de compartir recursos es a través
de las variables de entorno del sistema
operativo. Un proceso escribe un valor en
una variable y otro proceso lo lee.
• Las variables de entorno %PATH%, $USER
en los sistemas operativos tienen algún valor
especial
Mecanismos para la compartición de
recursos de software
• Las variables de entorno pueden ser a nivel
usuario o sistema. A nivel usuario sólo están
disponibles para ese usuario o terminal (no
son accesibles por otros y por lo tanto no tan
compartibles), a nivel sistema es global.
• SET var=hola;
• ECHO %var%
Mecanismos para compartir recursos
de software
• En sistemas Linux se cuenta con algunas
primitivas para el acceso a variables de
entorno:
• char *valor = getenv(“TERM”);
• char *var1 = “VARIABLE=valor”
• putenv(var1);
Mecanismos de compartición de
recursos de software
• También se puede hacer la compartición en
algunos entornos comunes a las aplicaciones
como lo son variables de entorno de una
máquina virtual como Java o .NET.
• Otra compartición puede ser a través de
procesos remotos usando sockets en
máquinas dispersas geográficamente.
Mecanismos de compartición de
recursos de software
• Los sockets permiten comunicar procesos de
manera remota. Sin embargo, existen sockets que
se manejan local o bien, la dirección de red de un
proceso remoto puede ser la misma máquina por lo
que los remotos se manejan localmente.
• Existen muchas implementaciones de Sockets las
más conocidas la API de Berkeley (Unix y
variantes) y los WinSocks en Windows.
Mecanismos de compartición de
recursos de software
• Otra forma de compartir recursos es la
replicación, la cual hace que un pedazo de
memoria se copie en otro. De alguna forma
se comparten datos y recursos pero sólo es
útil para lectura, ya que para escritura deberá
reintegrarse el contenido siendo en muchos
casos más complicado que compartirlo.
Mecanismos de compartición de
recursos de software
• En sistemas Unix una manera muy fácil de
compartir recurso vía duplicación es a través
de la creación de un subproceso a través de
la llamada del sistema fork().
• Cuando se realiza un fork, el subproceso
hace una réplica del segmento total de
proceso (datos, código, pila, segmento).
Mecanismos de compartición de
recursos de software
#include <sys/types.h>
pid_t pid;
pid = fork()
• Los procesos pueden reemplazar esos
segmentos con la familia de instrucciones
exec.
• Los datos compartidos duran una sóla vez.
Mecanismos de compartición de
recursos de software
if (pid == -1)
perror(“Error al crear proceso”);
else
{
if (pid == 0)
/*Proceso hijo*/
else
/*Proceso padre*/
}
Mecanismos de compartición de
recursos de software
• Otra forma de compartir recursos de software
es a través de mecanismos de señalamiento
como
paso
de
mensajes
(colas),
interrupciones, señales, los cuales son
considerados mecanismos de sincronización
y que se verán en la siguiente unidad.
Mecanismos de compartición de
recursos de software
• Aunque no es una señal un código de estado
de un proceso puede servir para compartir
información entre procesos.
• Al utilizar lenguajes como C, el programador
puede retornar un valor a otro programa vía
el sistema operativo. Útil cuando un
programa depende de otro.
Mecanismos de compartición de
recursos de software
• En Unix, la variable de entorno $? Devuelve
el estado del último proceso, en D.O.S. es la
variable %errorlevel%
• Una forma más eficiente de terminar un
proceso y enviar datos es a través de la
función exit() y atexit() que cierran de forma
segura el sistema
Mecanimos de compartición de
recursos de software
• La forma más eficiente de compartir recursos
es a través de la memoria compartida.
• En sistemas Unix se puede compartir
memoria a través de las primitivas IPC. Las
cuales son:
#include <sys/shm.h>
int shmget(key, size, shmflg);
Mecanismos de compartición de
recursos de software
int shmid;
if((shmid = shmget(llave, 4096, IPC_CREATE |
0600)) == -1)
/*Error al crear memoria compartida*/
int shmctl(shmid, cmd, buf)
• cmd indica la operación la cual puede ser:
IPC_STAT,
IPC_SET,
IPC_RMID,
SHM_LOCK, SHM_UNLOCK.
Mecanismos de compartición de
recursos de software
struct shmid_s *buf
smctl(shmid, IPC_RMID, 0);
char *shmat(shmid, shmaddr, shmflg); /*Liga*/
int shmdt(shmaddr); /*Desliga la memoria*/
• Las llaves son genéricas para todos los IPC e
identifican de manera única dicho objeto en el
núcleo.
Mecanismos de compartición de
recursos de software
key_t llave;
if((llave= ftok(“/etc/ntp.conf”, ‘A’) == (key_t)-1)
/*Error al crear la llave*/
• ipcs se utiliza para ver los mecanismos ipc
asignados (-q, -m, -s, -b)
• ipcrm se utiliza para liberar recursos (-q
msqid, -m shmid, -s semid)
Mecanismos de compartición de
recursos de software
float *memoria;
shmid = shmget(llave, MAX
IPC_CREAT | 0600);
memoria = shmat(shmid, 0, 0);
/*Operar memoria*/
shmdt(memoria);
shmctl(shmid, IPC_RMID, 0);
*
sizeof(float),
Mecanismos de compartición de
recursos de software
• Otra forma de compartir recursos de software
en Windows consiste en utilizar mecanismos
centralizados por el sistema operativo como
lo son el portapapeles (Clipboard) y el
registro.
• El portapapeles es un área de memoria
compartida que sólo puede contener un valor
a la vez.
Mecanismos de compartición de
recursos de softtware
• El portapapeles es de tamaño variable. Se
puede administrar esta zona de memoria
para guardar más datos como lo hace el
portapapeles de office.
• El registro es una base de datos de
configuraciones del sistema. Cualquier
proceso puede leer y actualizar el registro.
Compartición de recursos de
Software en Windows
• Dentro del MFC, no existen APIs directas para la
manipulación del portapapeles, en .NET se
encuentra con la clase Clipboard.
• Afortunadamente existen diversas clases en
Internet que permiten enmascarar la complejidad
del portapapeles de la API Win32, sólo se debe
tener en cuenta que existen métodos para
manipular texto y otros para imágenes.
Compartición de recursos de software
en Windows
• Manipular el registro se hace de forma fácil
utilizando .NET ya que cuenta con el nombre
de espacio microsoft.win32 en la cual se
cuentan con clases de envoltura para el
manejo del registro.
• En visual C++ se tiene que utilizar funciones
como RegCreateKeyEx(), RegSetValue(),
RegOpenKey() y RegCloseKey().
Compartición de recursos de software
Windows
• El término módulo describe una colección
relacionada de código, datos y otros recursos
(por ejemplo, mapas de bits) presentes en
memoria. Normalmente, tal colección
conformará o bien un único programa
ejecutable o una biblioteca de ligado
dinámico (DLL).
Compartición de Recursos de
Software en Windows
• Se debe tener un registro de los módulos
cargados en cada instante, ya que dicho
registro permite detectar que segmentos de
código y recursos (como íconos), ya están en
uso. En lugar de cargar una segunda copia y
ocupar más memoria, Windows crea
referencias adicionales para los recursos que
ya están en uso.
Compartición de Recursos de
Software
• Durante la vida del sistema, Windows
mantiene una cuenta de uso para cada
recurso.
• Cuando las aplicaciones hacen uso de un
recurso, el sistema incrementa la cuenta de
referencia.
Compartición de Recursos de
Software en Windows
• Cuando finaliza la aplicación,
decrementa la cuenta de referencia.
el
sistema
• Una cuenta de referencia con valor 0 indica que el
recurso ya no está en uso y el sistema puede
ocupar la memoria liberada.
• Este esquema es utilizado por los recolectores de
basura en lenguajes POO como Java y C#.
Compartición de recursos de
Software
• Se implementa mediante el uso de unas
estructuras de datos llamadas objetos de
núcleo. Una aplicación Win32 crea, abre y
maneja objetos de núcleo (objetos proceso,
objetos suceso, objetos semáforo, objetos
hilo, etc.) con regularidad.
Compartición de Recursos de
Software
• Cada objeto del núcleo es un bloque de
memoria asignado por el Kernel y al que sólo
puede acceder el Kernel (parecidos a los IPC
de UNIX).
• Este bloque de memoria es una estructura
de datos cuyos elementos contienen
información sobre un objeto.
Compartición de Recursos de
Software
• Dicho bloque de memoria dispone de
algunos campos comunes a todos los tipos
de objeto, por ejemplo, nombre del objeto,
descriptor de seguridad, contador de
utilización, etc., mientras que otros serán
propios de cada tipo de objeto.
Compartición de recursos de software
• Por ejemplo, un objeto-proceso contendrá
una identificación del proceso, una prioridad
de base y un código de salida, mientras que
un
objeto-archivo
contendrá
un
desplazamiento de bytes, un modo de
compartición y un modo de apertura.
Compartición de recursos de software
• Las DLL se pueden crear de manera similar
a lo que es una función estática para ello se
debe de utilizar directivas especiales. Si se
utiliza Visual C++ que hace uso de la API
Win32 a través de la MFC (Microsoft
Foundation Clasess) se seguirá el proceso.
• Crear un proyecto en C++ (se puede escoger
proyecto de DLL pero no es del todo
necesario).
Compartición de Recursos de
Software
• En el archivo *.cpp se agrega el modificador
__declspec(dll) para cada método o función
que se desea este presente en la DLL,
también se pueden exportar datos.
__declspec(dll) int suma(int a, int b) {
return a+b;
}
Compartición de recursos de software
int compartida = 10;
• Si se utiliza este segmento de código (la DLL
generada deberá ser visible al programa que la va
a ocupar, así como tener un archivo de
encabezado .h) se verá que los datos no son
compartidos.
• Se le tiene que
comparta los datos.
indicar
explícitamente
que
Compartición de recursos de software
• La compartición se indica a través de las siguientes
directivas del compilador:
#pragma data_seg(“DataCom”);
int valor = 0;
char cad[30] = NULL;
#pragma
#pragma comment (linker, “SECTION: DataCom,
rws”);
Librerías en Linux
• Las librerías estáticas se crean como
cualquier programa en C, poniendo en un
archivo de encabezado (.h) los prototipos de
función y en el código fuente (.c) la definición
de las funciones sin utilizar una función main
• Después el código se debe compilar a
formato de objeto con: gcc –c libreria.c
libreria.o
Librerías en Linux
• Después se deben crear los módulos con el
comando ar, de la siguiente forma:
ar –r –c –s libreria.a librería.o
• Con el comando nm se pueden visualizar las
dependencias de las diferentes funciones:
nm librería.a
Librerías en Linux
• Para utilizar la librería se utiliza realiza un
programa en el cual se incluye el archivo de
cabecera de la librería.
• Se debe indicar con las opciones –l para
indicar la librería (.h) y –L en donde buscar la
librería compilada:
• gcc –g programa.c –o programa –L. -lerr
Librerías en Linux
• Las librerías dinámicas tienen la extensión
.so y son diferentes a las estáticas .a en que
se cargan en memoria una sola vez y
pueden ser reutilizables por otros procesos.
• El comando ldd permite verificar que librerías
ocupa un programa para ejecutarse. Si se
utiliza los parámetros –d y –r para ver
funciones y objetos faltantes.
Librerías en Linux
• El prefijo .so viene del nombre shareable object
(objeto compartido)
• Las librerías dinámicas son administradas por el
kernel del sistema.
• Por ejemplo las librerías de C están por ejemplo en
libc.so.5.4.46, una pequeña variación podría ser
totalmente diferente a la otra.
Librerías en Linux
• La parte fija de las librerías dinámicas recibe
el nombre de soname, en este caso libc.
• Los programas se relacionan en base a su
libc. Esto se asocia a través de la utilidad
ldconfig.
• ¿Por qué las bibliotecas dinámicas son
incompatibles?
Librerías en Linux
• Se vuelven incompatibles sobre diferentes
vistas:
– han sido modificadas las interfaces de función
exportadas
– han sido añadidas nuevas interfaces de
funciones,
– el comportamiento de ciertas funciones varía
respecto de su especificación original
Librerías en Linux
• Para evitar la problemática de las
dinámicas se debe tener cuidado en:
librerías
• Añadir funciones con nuevos nombres en lugar de
modificar o cambiar funcionalidad
• Añadir estructuras de datos sólo cuando sea
necesario
• Las librerías dinámicas a nivel de implementación
son iguales a las estáticas, difiere la forma de
compilarlas.
Librerías en Linux
• Para crear la librería de forma dinámica se
siguen los siguientes pasos:
• Compilar la librería en formato objeto con la
opción
–fPIC
para
generar
Código
Independiente de la Posición:
gcc –fPIC –g –c librería.c –o librería.o
Librerías en Linux
• No utilizar la opción –fomit-frame-pointer de
gcc para poder realizar depuración.
• Utilizar las opciones –shared –soname y -Wl
de gcc:
• gcc –g –shared –Wl, -soname, libreria.so –o
librería.so.1.0.0.0 librería.o -lc
Librerías en Linux
• Se debe enlazar la librería de C para que
tenga su funcionalidad y no tenga problemas
de versiones:
• ln –s librería.so.1.0.0 librería.so.1
• ln –s librería.so.1.0.0 librería.so
• Los directorios por default en donde se
encuentras las librerías son /lib y /usr/lib
Librerías en Linux
• Para utilizar una librería dinámica se utiliza
de la misma manera que su variante estática
en el programa:
• gcc –g programa.c –o programa –L. –lerr
• Se debe agregar la ruta donde se encuentra
la librería: LD_LIBRARY_PATH =$(pwd)
./libreria
Referencias
• Tutorial de Sistemas Operativos 2. Instituto
Tecnológico
de
la
Paz.
http://sistemas.itlp.edu.mx/tutoriales/sistemas
operativos2/ [agosto 2007]
• Tanebaum, A., Woodhull, A. (1997) Sistemas
Operativos. Diseño e Implementación.
México, Prentice Hall. ISBN: 970-17-0165-8.
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
• Wall, Kurt (2000) “Programación en Linux
con Ejemplos”, Pearson: Buenos Aires,
Argentina, ISBN: 987-9460-09-X, pp- 299318.
¿Preguntas?