Download proceso - Instituto Tecnológico de Morelia
Document related concepts
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. Actividad • Realizar un programa en C que permita obtener 10 elementos desde la entrada estándar redireccionada con los flujos del sistema operativo y muestre por salida estándar direcciona a un archivo denominado salida.txt en una columna el número X separada por un tabulador X^2 y hasta el final en una fila el rótulo total, y el resultado de la sumatoria de los elementos al cuadrado. 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. Tarea • Realizar un programa en ANSI C para sistemas *X que en un programa un usuario introduzca un valor y en el segundo programa se muestre dicho valor. • Se deberán sincronizar programas. utilizar tuberías POSIX y adecuadamente dichos 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); Actividad • Realizar un programa en ANSI C en Sistemas *X que permita compartir un dato introducido por el usuario a través de una llamada a putenv() o bien a través del comando set, hacia otro proceso con la llamada al sistema getenv() o bien el comando echo. 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. Tarea • Compartir datos de un proceso en java a otro a través de variables compartidas de entorno a través de los métodos getProperty() y setProperty() del espacio de nombres System. • ¿Qué método se utiliza en Java para ejecutar un comando del sistema? 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*/ } Actividad • Crear un programa que cree un subproceso con fork() en donde el proceso padre comparta el valor de una variable al proceso hijo, el proceso hijo debe modificarlo y el proceso padre debe de reintegrar ese valor. • La sincronización debe de realizarse con int pid = wait(&estado). 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) Tarea • Realizar un programa que permita manipular matrices utilizando memoria dinámica. Se tienen dos procesos A y B los cuales tiene la matrices para la multiplicación. El proceso C realiza la multiplicación de las matrices y tanto A como B muestran el resultado de la multiplicación. Fecha de entrega: lunes 13 de octubre. 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?