Title: Unidad II Mtodos para compartir recursos de Software
1Unidad II Métodos para compartir recursos de
Software
- M.C. Juan Carlos Olivares Rojas
2Temario
- 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
32.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.
4Justificació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.
5Justificació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.
62.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.
7Requisitos
- 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).
8Requisitos
- 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.
9Requisitos
- Los recursos compartidos pueden ser asignados de
dos formas básicas - 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.
10Requisitos
- 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).
11Requisitos
- Por este motivo se necesita de una base de datos
de nmr - Al compartir recursos se generan colas (lista de
espera). - El principal problema de la compartición es la
concurrencia a un recurso
12Requisitos
- 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.
13Requisitos
- 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).
142.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).
15Procedimientos 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).
16Procedimientos 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.
17Procedimientos 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.
18Procedimientos 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.
19Procedimientos 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.
202.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
212.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.
22Mé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
23Segmentació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.
24Segmentació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.
25Segmentació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.
26Pá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.
27Pá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.
28Mecanismos 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.
29Mecanismos 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.
30Mecanismos 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 lt, gt, gtgt 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.
31Mecanismos para compartir recursos de software
- Las tuberías en POSIX (Portable Operating System
InterconeXion) se crean a través de la siguiente
llamada - int tuberia2 /Descriptor de archivos/
- int pipe(tuberia)
- tuberia0 /Escritura/
- tuberia1 /Lectura/
32Mecanismos 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(tuberia1,
mensaje, strlen(mensaje)) y write(tuberia0,
mensaje, strlen(mensaje)).
33Mecanismos 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.
34Mecanismos 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.
35Mecanismos 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.
36Mecanismos 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
37Mecanismos 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 varhola
- ECHO var
38Mecanismos 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 VARIABLEvalor
- putenv(var1)
39Mecanismos 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.
40Mecanismos 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.
41Mecanismos 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.
42Mecanismos 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).
43Mecanismos de compartición de recursos de software
- include ltsys/types.hgt
- 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.
44Mecanismos de compartición de recursos de software
- if (pid -1)
- perror(Error al crear proceso)
- else
-
- if (pid 0)
- /Proceso hijo/
- else
- /Proceso padre/
45Mecanismos 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.
46Mecanismos 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.
47Mecanismos 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
48Mecanimos 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 ltsys/shm.hgt
- int shmget(key, size, shmflg)
49Mecanismos 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.
50Mecanismos 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.
51Mecanismos 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)
52Mecanismos de compartición de recursos de software
- float memoria
- shmid shmget(llave, MAX sizeof(float),
IPC_CREAT 0600) - memoria shmat(shmid, 0, 0)
- /Operar memoria/
- shmdt(memoria)
- shmctl(shmid, IPC_RMID, 0)
53Mecanismos 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.
54Mecanismos 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.
55Compartició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.
56Compartició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().
57Compartició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).
58Compartició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.
59Compartició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.
60Compartición de Recursos de Software en Windows
- Cuando finaliza la aplicación, el sistema
decrementa la cuenta de referencia. - 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.
61Compartició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.
62Compartició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.
63Compartició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.
64Compartició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.
65Compartició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).
66Compartició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 ab
67Compartició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 indicar explícitamente que
comparta los datos.
68Compartició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 cad30 NULL
- pragma
- pragma comment (linker, SECTION DataCom, rws)
69Librerí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
70Librerí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
71Librerí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
72Librerí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.
73Librerí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.
74Librerí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?
75Librerí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
76Librerías en Linux
- Para evitar la problemática de las librerías
dinámicas se debe tener cuidado en - 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.
77Librerí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
78Librerí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
79Librerí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
80Librerí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
81Referencias
- Tutorial de Sistemas Operativos 2. Instituto
Tecnológico de la Paz. http//sistemas.itlp.edu.mx
/tutoriales/sistemasoperativos2/ agosto 2007 - Tanebaum, A., Woodhull, A. (1997) Sistemas
Operativos. Diseño e Implementación. México,
Prentice Hall. ISBN 970-17-0165-8.
82Referencias
- 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.
83Referencias
- Wall, Kurt (2000) Programación en Linux con
Ejemplos, Pearson Buenos Aires, Argentina,
ISBN 987-9460-09-X, pp- 299-318.
84Preguntas?