840 likes | 1.08k Views
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.
E N D
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 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.
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.