810 likes | 1k Views
Unidad III Mecanismos de protección. M.C. Juan Carlos Olivares Rojas. Temario. 3.1 Introducción 3.2 Funciones de un sistema de protección 3.3 Limitaciones 3.4 Implantación de matrices de derechos 3.5 Mecanismos de protección. 3.1 Introducción.
E N D
Unidad III Mecanismos de protección M.C. Juan Carlos Olivares Rojas
Temario 3.1 Introducción 3.2 Funciones de un sistema de protección 3.3 Limitaciones 3.4 Implantación de matrices de derechos 3.5 Mecanismos de protección
3.1 Introducción • El problema como se había comentado la unidad anterior, no es la compartición de recursos de software sino el control de los mismos por la concurrencia. Por este motivo, todo Sistema Operativo debe tener implementado un módulo dedicado a la protección. • Generalmente esos mecanismos de protección se encargan de la gestión de los procesos a los recursos compartidos.
3.2 Funciones de un sistema de protección • Las principales actividades de un sistema operativo son: • Protección de los procesos del sistema contra los procesos de usuario. • Protección de los procesos de usuario contra los de otros procesos de usuario. • Protección de Memoria. • Protección de los dispositivos.
3.3 Limitaciones • La función de la protección en un sistema computacional es la de proveer un mecanismo para la aplicación de políticas que gobiernen el uso de los recursos. • Estas políticas pueden ser establecidas de varias maneras: • Definidas durante el diseño del sistema, • Definidas en la ejecución del sistema. • Definidas por usuarios individuales para proteger sus archivos y programas.
Limitaciones • Las políticas para el uso de recursos puede variar, dependiendo de la aplicación y pueden estar sujetas a cambios. Por estas razones, la protección no puede ser considerada como un problema que solamente concierne al diseñador de un Sistema Operativo, sino que debe considerarse, como una herramienta para los programadores de aplicaciones, de manera que los recursos creados y soportados por un subsistema de aplicación, puedan ser protegidos contra el mal uso.
Limitaciones • Un principio importante es la separación entre política y mecanismo. • Los mecanismos determinan como será realizado algo. En contraste, las políticas deciden que es lo que se realizará. • Es posible que las políticas cambien de lugar en lugar o de tiempo en tiempo. En el peor de los casos, cada cambio en la política requerirá un cambio en el mecanismo.
Dominio de protección • Un sistema computacional es una colección de objetos. Los objetos pueden ser objetos hardware(como CPU, segmentos de memoria, impresoras, etc.) y objetos software (como archivos, programas, semáforos, etc.). • Cada objeto tiene un nombre único que lo diferencia de los demás objetos del sistema y cada una puede ser accedido solamente mediante operaciones bien definidas.
Dominio de protección • Obviamente, un proceso tendrá permitido acceder solamente a aquellos recursos a los que está autorizado • Este requerimiento comúnmente llamado el principio "Need_To_Know" es útil en la limitación de la cantidad de daño que un proceso defectuoso pueda causar al sistema. • Por ejemplo, cuando un proceso "P" invoque al procedimiento "A", al procedimiento le será permitido acceder solamente a sus propias variables y los parámetros actuales pasados a él; no podrá acceder a todas las variables del proceso "P".
Dominios de protección • Para facilitar este esquema se introduce el concepto de dominio de protección. Un proceso opera dentro de un dominio de protección, el cual especifica los recursos que el proceso puede acceder. • Cada dominio define un conjunto de objetos y los tipos de operaciones que pueden ser realizadas sobre cada objeto.
Dominios de protección • La capacidad de ejecutar una operación sobre un objeto es un derecho de acceso. • Un dominio es una colección de derechos de acceso, cada uno de los cuales es un par ordenado <Nombre_Objeto, Conjunto_de_Operaciones>.
Dominios de protección • Por ejemplo, si el dominio "D" tiene derecho de acceso <Archivo F, {Leer, Escribir}>, entonces un proceso que se está ejecutando en el dominio "D" puede tanto leer como escribir en el archivo F; no podrá realizar alguna otra operación sobre este objeto. • Los dominios de protección no necesitan ser distintos; por el contrario, pueden compartir derechos de acceso.
Dominios de protección • ¿Qué pasa en los siguientes casos? • Se tienen 3 dominios: D1, D2 y D3; y los siguientes objetos: • D1: <O3, {Leer, Escribir}><O2, {Escribir}><01, {Ejecutar}> • D2: <O1, {Leer, Escribir}><O4, {Imprimir}> • D3: <O3, {Leer}><O4, {Imprimir}>
3.4 Implantación de matrices de derechos • Un modelo de protección puede ser visto abstractamente como una matriz, llamada matriz de derecho. Los renglones de la matriz representan dominios y las columnas representan objetos. • Cada entrada en la matriz contiene un conjunto de derechos de acceso. La entrada "Matriz[i, j]" define el conjunto de operaciones que un proceso ejecutándose en el dominio "Dj" puede realizar sobre el objeto "Oj".
Estructuras de Protección Dinámica • Las matrices de acceso vistas hasta el momento, en las que no cambian los derechos en cada dominio durante su ejecución, son un ejemplo de Estructuras de Protección Estáticas. • Con el fin de ofrecer flexibilidad y de implementar eficientemente la protección, un Sistema Operativo debe soportar cambios en los derechos de acceso. Para esto se requiere implementar alguna estructura de protección dinámica.
Estructuras de Protección Dinámica • En este caso continuaremos considerando las matrices de acceso, aunque en su versión dinámica. • Básicamente se requieren cuatro nuevos derechos de acceso: Copia, Cambio, Propietario y Control.
Derechos de acceso de copia • Este derecho de acceso da la facultad a un proceso de copiar derechos existentes en un dominio hacia otro dominio para el objeto en cuestión; es decir, este derecho genera copias en columnas. • Se puede representar este derecho con un signo + dentro del dominio de protección
Derechos de acceso de copia • En general se podría hablar de 3 variantes del derecho "copia": Copia Limitada, Copia Completa, Translación. • Copia Limitada: La copia no incluye el derecho "Copia", con lo que no se podrán hacer copias sucesivas del derecho. Se puede indicar con el signo (+).
Derechos de acceso de copia • Copia completa: la copia incluye el derecho "Copia", por lo que se pueden realizar copias sucesivas del derecho. Se puede indicar con el signo (*). • Traslación: el derecho en cuestión junto con el derecho copia se eliminan del dominio original y se coloca en el nuevo dominio. Esta es una forma básica de retirar derechos de un dominio para asignarlo a otro. Se puede indicar con el signo (?).
Derechos de acceso de cambio • Este derecho de acceso indica la posibilidad de un proceso para cambiarse de un dominio a otro. • La operación cambio actúa sobre dominios; es decir, en este caso los dominios son los objetos. Entonces, para considerar este derecho de acceso se deberán incluir los dominios como objetos adicionales en la matriz de acceso.
3.5 Mecanismos de protección • Protección de memoria: siempre que una aplicación intenta acceder a una zona de memoria que no está comprendida dentro de su mapa actual de memoria, el procesador 386 y posteriores, genera una interrupción y pasa al sistema operativo un conjunto de información relativa al problema.
Mecanismos de protección • La protección de la memoria se logra por medio de: • Tablas de paginas que describen exactamente las áreas de memoria física a las que un programa puede acceder. • Un indicador de lectura/escritura para impedir modificar una página de sólo lectura o de código de programa. • Un indicador de usuario/supervisor que permite al sistema operativo proteger su propia memoria de cualquier intento de acceso.
Mecanismos de protección La mejor protección hacia los recursos se logra a través del control de los procesos, dado que estos son los que utilizan los recursos. Existen dos tipos de control de los procesos para el acceso a los recursos: cooperativos donde los procesos se ponen de acuerdo y centralizados a nivel del núcleo del sistema operativo.
Mecanismos de protección La mayoría del control de procesos se hace a nivel de sistema operativo a través de las llamadas del sistema, dado que la cooperación de los procesos no siempre es justa. El sistema de archivo forma parte importante de las primitivas de sincronización entre procesos.
IPC La comunicación entre procesos (IPC) es parte fundamental de las primitivas de sincronización de procesos y de los mecanismos de protección. Los mecanismos de comunicación entre procesos no sólo aplican a aplicaciones centralizadas sino también distribuidas.
Procesos Son la unidad básica de atención del sistema operativo. Se pueden copiar procesos en diferentes segmentos del sistema operativo. Los procesos son dependientes del sistema operativo por lo que no se ejecutan en todos los sistemas.
Terminación de procesos A el código de estado de un proceso formalmente se llama señal. Un proceso huérfano es aquel que se ha quedado sin padre. Un proceso zombi es aquel que se ha quedado ocupando una posición de la tabla de descriptor de procesos.
wait() En algunas ocasiones un proceso padre necesita esperar a que sus hijos termine. Para ello necesita sincronizarse los procesos. La función que nos permite parar un proceso hasta que termine otro es wait pid = wait(&estado);
wait() Algunas macros que nos ayudan en este proceso son: WIFEXITED WEXITSTATUS WIFSIGNALED WTERMSIG WCOREDUMP
Más sobre procesos Un ejemplo de clonación de procesos es la ejecución de la función system() que nos permite ejecutar una llamada al sistema, generalmente un comando de la shell. hijo = getpid(); Padre = getppid(); Grupo = getpgrp();
Identificadores de usuario y de grupo En muchas ocasiones no sólo es necesario conocer los identificadores de procesos sino conocer los usuarios y los grupos. uid_t getuid(); /*usuario real*/ uid_t geteuid(); /*usuario extendido*/ gid_t getgid(); gid_t getegid();
Procesos bloqueantes y no bloqueantes Para el buen manejo de los recursos, se necesita en la mayoría de los casos que los procesos se puedan bloquear, en otros no se podrá hacerlo. La función sleep() permite dormir un proceso una cantidad determinada de milisegundos, es un ejemplo de una llamada bloqueante.
Señales • Las señales permiten a los procesos comunicarse a través de un evento, dicha comunicación es la base para una adecuada protección. • A continuación se muestran los tipos de señales más comunes en sistemas Unix, las cuales se encuentran definidas en signal.h
Señales SIGHUP SIGINT SIGQUIT SIGILL SIGTRAP SIGIOT SIGEMT SIGFPE SIGKILL SIGBUS SIGSEGV SIGSYS SIGPIPE SIGALARM SIGTERM SIGUSR1 SIGUSR2 SIGCLD SIGPWR
Señales int kill(pid, sig) sirve para mandar una señal de un proceso a otro. pid > 0 proceso; pid = 0 a todos los procesos que pertenecen al mismo grupo. La función signal sirve para capturar una señal y realizar una función con ella.
Señales main() { void sigint_handler(); if(signal(SIGINT,sigint_handler)== SIG_ERR) perror(“Error en la señal”); …….. } void sigint_handler(int sig) { printf(“señal recibida”); }
IPC El mecanismo de comunicación entre procesos más famosos es el IPC (Inter Process Comunication) de Unix System V. Para evitar los problemas de cómo establecer los mecanismos de comunicación entre procesos de distintos sistemas operativos surgió el estándar POSIX (Portable Operating System Interconection X) para el mejoramiento de los mismos.
Tuberías Las tuberías con nombre se manejan igual que las tuberías sin nombre con la salvedad de que presentan un nombre que ocupa una entrada de directorio. Se trabajan igual que un archivo sólo que se bloquea cuando un proceso escribe en la tubería.
Tuberías Para crear una tubería con nombre desde shell se debe ejecutar: mknod fifo_1 p Desde programación las tuberías con nombre se crean: mknod(“tubo”, S_IFIFO | permisos, 0) Las comunicaciones vistas hasta ahora son half-duplex. Se puede utilizar un poll o select para realizar comunicación full-duplex
3.2.2 Semáforos Los semáforos son mecanismos que permiten sincronizar procesos. Todos los mecanismos IPC tienen una entrada en una tabla especial con una llave definida por el usuario. Los posibles valores de la llave son IPC_PRIVATE, IPC_CREATE, IP_EXECL, entre otros.
Semáforos Cada entrada de la tabla tiene un registro de permisos (rw), información de estado y llamadas de control. Las llaves son del tipo key_t. Para crear una llave se utiliza: #include <types.h> #include <sys/ipc.h> key_t ftok(path, id)
Semáforos Es un mecanismo para prevenir colisiones cuando uno o más procesos solicitan simultáneamente un recurso. Dijsktra los define como un objeto tipo entero en los cuales se puede aplicar dos operaciones: P (Proberen, comprobar) y V (Verhogen, incrementar), donde P sirve para obtener el recurso y V para liberarlo.
Semáforos Las operaciones sobre un semáforo son semget para crear un semáforo o habilitar uno existente, semctl para realizar operaciones de control e inicialización, semop para realizar operaciones P y V. #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semget(key, nsems, semflg)
Semáforos int llave, semid; if((llave= ftok(“auxiliar”, ‘K’)) ==(key_t)-1) /*Tratamiento del error*/ if((semid= semget(llave, 4, IPC_CREAT | 0600)) == -1) /*Error al crear el semáforo*/
Semáforos int semctl(semid, semnum, cmd, arg) union semun{ int val; struct semid_ds *buf; ushort *array; }arg; Las opciones de control son: GETVAL, SETVAL, GETPID, GETNCNT, GETZCNT, GETALL, SETALL, IPC_STAT, IPC_SET
Semáforos ushort asem; asem[0]=5; asem[1]=3; asem[2]=4; asem[3]=8; semctrl(semid, 0, SETALL, asem) valor = semctrl(semid, 3, GETVAL, 0) int semop(semid, sops, nsops) struct sembuf *sops;
Semáforos struct sembuf{ ushort sem_num; short sem_op; short sem_flg; }; Si semop es negativo se decrementará (P), si se incrementa (V) y si es 0 no hace nada. Las banderas son: IPC_WAIT, IPC_NOWAIT, SEM_UNDO
Semáforos struct sembuf operacines[4]; Operaciones[0].semnum = 1; Operaciones[0].sem_op = -1; Operaciones[0].sem_flg = 0; Operaciones[1].semnum = 4; Operaciones[1].sem_op = 1; Operaciones[1].sem_flg = 0; semop(semid, operaciones, 2);
3.2.3 Colas (mensaje) La filosofía de las colas de mensajes es similar a las tuberías, pero con mayor versatilidad. Una cola es una estructura de datos gestionada por el kernel, en la cual varios procesos pueden escribir sobre ella. El sincronismo para evitar colisión lo realiza el kernel.
Colas de mensajes #include <sys/msg.h> int msgget(key, msgflg) If((msqid= msgget(llave, IPC_CREATE | 0600)) == -1) /*Error al crear la cola de mensajes*/ msgctrl(msq, cmd, buf) sirve para leer y modificar la información estadística y de control de una cola.