La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Unidad II Métodos para compartir recursos de Software

Presentaciones similares


Presentación del tema: "Unidad II Métodos para compartir recursos de Software"— Transcripción de la presentación:

1 Unidad II Métodos para compartir recursos de Software
M.C. Juan Carlos Olivares Rojas

2 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

3 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.

4 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.

5 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.

6 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.

7 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).

8 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.

9 Requisitos 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.

10 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).

11 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

12 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.

13 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).

14 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).

15 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).

16 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.

17 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.

18 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.

19 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.

20 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

21 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.

22 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  

23 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.

24 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.

25 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.

26 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.

27 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.

28 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.

29 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.

30 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.

31 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*/

32 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)). 32

33 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. 33

34 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.

35 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.

36 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

37 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%

38 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);

39 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.

40 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.

41 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.

42 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).

43 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.

44 Mecanismos de compartición de recursos de software
if (pid == -1) perror(“Error al crear proceso”); else { if (pid == 0) /*Proceso hijo*/ /*Proceso padre*/ }

45 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.

46 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.

47 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

48 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);

49 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. 49

50 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. 50

51 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) 51

52 Mecanismos 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); 52

53 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.

54 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.

55 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.

56 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().

57 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).

58 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.

59 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.

60 Compartició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#.

61 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.

62 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.

63 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.

64 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.

65 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).

66 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; }

67 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 indicar explícitamente que comparta los datos.

68 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”);

69 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

70 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

71 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

72 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.

73 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 , una pequeña variación podría ser totalmente diferente a la otra.

74 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?

75 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

76 Librerí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.

77 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

78 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 librería.o -lc

79 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 librería.so.1 ln –s librería.so librería.so Los directorios por default en donde se encuentras las librerías son /lib y /usr/lib

80 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

81 Referencias Tutorial de Sistemas Operativos 2. Instituto Tecnológico de la Paz. [agosto 2007] Tanebaum, A., Woodhull, A. (1997) Sistemas Operativos. Diseño e Implementación. México, Prentice Hall. ISBN:

82 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.

83 Referencias Wall, Kurt (2000) “Programación en Linux con Ejemplos”, Pearson: Buenos Aires, Argentina, ISBN: X, pp

84 ¿Preguntas?


Descargar ppt "Unidad II Métodos para compartir recursos de Software"

Presentaciones similares


Anuncios Google